changeset 557:05fcb3c553fd 0.4

merged geo-backend/0.4
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:13:50 +0200
parents 80630520e25a (diff) 48121fa4dc95 (current diff)
children 12abbf15f18a
files
diffstat 482 files changed, 42020 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/ChangeLog	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,4593 @@
+2010-01-27  Hans Plum <hans@intevation.de>
+
+	RELEASE 0.4
+
+	* Changes, NEWS, ChangeLog: Summarized activities
+
+2010-01-27  Sascha L. Teichmann <sascha.teichmann@intevation.de>
+
+	* Changes: Reordered items a bit
+
+2010-01-27  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue164
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Applied patch of SLT to remove shape files and directories of out-dated
+	  artifacts. Therefor we need to store the artifact after an 'out' operation 
+	  - which is actually a read only operation - explicitly into the artifact
+	  database to keep the directory path.
+
+2010-01-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Calculate results after reaching the final state and store them in cache.
+	  This avoids long latencies for chart creation or exports.
+
+2010-01-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue158
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Replaced old way to create ChartLabel objects with a method call
+	  'createChartLabels()'.
+
+2010-01-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java:
+	  Set white border (border arround drawing area) as default for 
+	  'Profilschnitte'.
+
+2010-01-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Calculate results after reaching the final state and store them in cache.
+	  This avoids long latencies for chart creation or exports.
+
+2010-01-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue162
+
+	* doc/conf/products/horizontalcrosssection/conf_mesh.xml,
+	  doc/conf/queries.properties: Adapted transition model. Splitted date
+	  selection of 'Horizontalschnitte' into two steps.
+
+2010-01-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/products/verticalcrosssection/conf_mesh.xml: Removed csv export
+	  from product 'Profilschnitt'.
+
+2010-01-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java: Fixed an
+	  ArrayIndexOutOfBounds-exception which occured if there are less than two
+	  data points.
+
+2010-01-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue161
+
+	* doc/conf/products/verticalprofile/conf_mesh.xml: Adapted transition model.
+	  Splitted date selection into two steps.
+
+2010-01-25	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	Fix/Workaround for gnv/issue159
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Deactivated the index buffer by default because applying it gives to
+	  less data points in some circumstances. When processing the 
+	  "horizontalen Schnittprofile", the "Profilschnitte" and the
+	  "Horizontalschnitte" the whole set of mesh cells for
+	  the given parameters are retrieved. This results in much
+	  more traffic from database (~ 10x) but seems not to be much slower.
+	  The memory consumption increases accordingly.
+
+	  To turn the index buffer on again use the boolean system properties:
+
+		  "gnv.horizontal.profile.mesh.cross.index.buffer"
+		  "gnv.vertical.cross.section.index.buffer"
+		  "gnv.horizontal.profile.mesh.cross.index.buffer"
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java: Because much
+	  more data is processed a more sophisticated point culling strategy is
+	  implemented now. 
+	  
+	  If the number of points are higher than a given threshold (system property 
+	  "gnv.interpolation2d.cull.point.threshold", default: 1000) a culling is 
+	  performed. Two cases:
+
+	  a) given a path P ("horizontales Schnittprofil", "Profilschnitt")
+	     Calculates a bounding box B for P and continues with (b).
+
+	  b) a bounding box B ("Horizontalschnitt", and above after (a))
+	     Calculates a bounding box C for the input points. If the
+		 area of B is greater than 80% of the area of C no culling is
+		 performed. Else B is extended by 10% in each direction.
+		 If the new area of B is smaller than 10% of the area of C
+		 B is adjusted to have at least 10% the size of C.
+
+	  All input points that are not inside B are culled. Afterwards the
+	  i/j grid cell units are created and pushed into a spatial index
+	  as described below.
+
+2010-01-25  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue157
+
+	* src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java:
+	  Added method to adjust background color of this chart.
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Set white background as all other charts have.
+	  
+2010-01-25  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue160
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Copied a
+	  method from JFreeChart and adapted date formats.
+
+2010-01-25	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/arcsdeconnectionpool.properties: Set serverRoundtripInterval
+	  to 5 seconds and serverInactiveInterval to 5 minutes.
+
+2010-01-25  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/queries.properties: Splitted date selection into two steps - year
+	  and concreate date in this year. Removed useless option to 
+	  disable/enable data points of chart and export output, because points 
+	  make no sense in such products.
+
+2010-01-25  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/products/horizontalprofile/conf_mesh_cross.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml: Added new state for
+	  splitting the date selection into two parts - selection of year and
+	  selection of a concrete date of this year.
+
+	* doc/conf/queries.properties: Added new sql statement for querying years
+	  and adapted statement to query concrete dates.
+
+2010-01-25  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue156
+
+	* doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_timeseriespoint.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh_cross.xml,
+	  doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/verticalprofile/conf_timeseriespoint.xml,
+	  doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added some
+	  parameter (width, height, and shapes) to output modes svg and pdf. Now,
+	  these parameter will have an effect on svg and pdf exports.
+
+2010-01-24	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Added attribute "fill-color" to
+	  /artifact-database/gnv/vertical-cross-section/ground/ configure
+	  the color of the seabed polygon.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation3D.java:
+	  Adjusted column depth to the deepest interpolated position to
+	  prevent gaps.
+
+	* src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java:
+	  Add ground polygon to the chart.
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/OutputHelper.java:
+	  New. Contains code to create the ground polygon.
+
+	* src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java,
+	  src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java:
+	  Handle temporary vertices more efficiently.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java,
+	  src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  Added configuration to set the color of the seabed polygon.
+
+	* src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java:
+	  Handle the seabad polygon color.
+
+2010-01-24	Sascha L. Teichmann	<sascha.teichmann@intevation.de>fill-color
+
+	* contrib/palette2qgis.xsl: Cosmetic cleanups.
+
+2010-01-23	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Fixed bug when accessing i and j columns of SQL dataset. This
+	  prevented gap detection in "horizontale Schnittprofile" from working.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java:
+	  "horizontale Schnittprofile" are now using the grid cell mechanism
+	  too. This should fix all remaining problems to solve gnv/issue153.
+	  The culling of too much points is controlled with the system property
+	  "gnv.interpolation2d.cull.point.threshold" with the same semantics 
+	  as in 'Profilschnitt' and 'Horizontalschnitt'.
+	  The spatial buffer size estimation code is removed because it is 
+	  not needed any longer.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation3D.java: Moved some
+	  code to Interpolation2D.
+
+	* src/main/java/de/intevation/gnv/math/GridCell.java: Added some
+	  debug information about the number of found cells.
+
+	* src/main/java/de/intevation/gnv/utils/WKTUtils.java:
+	  Cleanup imports.
+
+2010-01-23	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/Interpolation3D.java:
+	  Apply same logic about the number of points to "Profilschnitte"
+	  too. If there are more "gnv.interpolation3d.cull.point.threshold"
+	  points they are culled against a 5% extended bounding box around
+	  the path. Default threshold: 1000.
+
+2010-01-23	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/AreaInterpolation.java:
+	  - The lastest refactoring removed the evaluation of the
+	    depth. Now its back in again. 
+
+	  - If the number of incoming points is greater than
+	    a given threshold (default: 1000) than the bounding box
+		of the interpolation is extend about 5% for a test
+		if the points are in this area. Points outside this
+	    area are culled because its unlikely that they have
+		any influence on the result. Use the system property
+		"gnv.areainterpolation.cull.point.threshold" to modify
+		the threshold value.
+
+	* src/main/java/de/intevation/gnv/math/GridCell.java: When
+	  build the interpolation areas the points are culled against
+	  extented bounding box.
+
+2010-01-23	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* contrib/palette2qgis.xsl: New. XSLT transformation to turn a
+	  palette XML file into a style definition suitable to be used
+	  in QGIS. Tested with QGIS 1.4.0-Enceladus. Usage:
+
+	  $ xsltproc contrib/palette2qgis.xsl       \
+	    doc/conf/palette/water-temperature.xml  \
+		> water-temperature.qml
+
+	  Do similar to process salinity.xml et al.
+
+	  When you've loaded the "Horizontalschnitt" polygon layer 
+	  in QGIS, class it via the "CLASS" attribute, load the
+	  according style and apply it. Voila!
+	  
+2010-01-22	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/Interpolation3D.java:
+	  Make "Profilschnitte" work the same way like "Horzontalschnitte"
+	  again.
+
+2010-01-22	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/GridCell.java: New.
+	  A 4-tupel of neighbored points in the mesh. It is valid
+	  to interpolate in this area.
+
+	* src/main/java/de/intevation/gnv/math/AreaInterpolation.java:
+	  The algorithm how neighbored points in the mesh are determined
+	  has changed. Now all incoming points are tiled into GridCells.
+	  If there are gaps in i,j the corresponding tile is omited.
+	  These tiles are stored in an R tree. To lookup a point in
+	  world coordinates the spatial index is queried. If no result
+	  is found the point is ignore as a gap. If a fitting grid cell
+	  is found the interpolation in done between the four points
+	  of that cell is performed. Special gap checking is not needed any 
+	  longer. This fixes gnv/issue153 because there are no assumptions
+	  about axis aligned points any more.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java: Used
+	  euclid distance to estimate spatial buffer size. TODO: Remove
+	  this code when adjusting the "Profilschnitte" to the same logic
+	  as used in "Horzontalschnitte" now.
+
+	* src/main/java/de/intevation/gnv/math/LinearFunction.java: Added
+	  author's email.
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java: 
+	  Cleanup imports.
+
+2010-01-22  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Removed
+	  debug output which has been checked in by mistake.
+
+2010-01-22  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/meshwidth.xml: 
+	  Added Description of the sense of the different Attributes.
+	  
+2010-01-22  Tim Englich  <tim.englich@intevation.de>
+
+	  Issue93
+
+	* doc/conf/meshwidth.xml: 
+	  Added file for the global Configuration of MeshWidths to the Project.
+	  This file has to be edited if the mean Distance between two MeshPoints has
+	  changed or a new Mesh will be introduced.
+	  
+	* doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml, 
+	  doc/conf/products/horizontalprofile/conf_mesh.xml:
+	  Added Elemet with Link to the MeshWidth-Document to Configurations 
+	  for CoordinateSelectionStates.
+	  
+	* src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java : 
+	  Added the possibility to configure the different width of the Meshes.
+
+2010-01-22  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/TestArtifactDatabase.java (serviceNamesAndDescriptions),(process):
+	  Fixed Compiler-Error after adding further Methods to the Interface ArtifactDatabase.
+
+2010-01-22  Tim Englich  <tim.englich@intevation.de>
+	* src/test/java/de/intevation/gnv/artifacts/util/ShapeFileWriterTestCase.java (testMultiLineStringWriter): 
+	  Fixed Compiler-Error after changes in the Method-Signature.
+
+2010-01-21  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java:
+	  Repaired  revision. Removed try-catch of a never thrown exception.
+
+2010-01-21  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue136 & Issue137
+
+	* src/main/resources/lang/artifactMessages.properties,
+	  src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_en.properties,
+	  src/main/resources/lang/artifactMessages_de.properties: Added templates
+	  to format coordinates to a human readable output.
+
+	* src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java,
+	  src/main/java/de/intevation/gnv/utils/WKTUtils.java: Moved function to
+	  format coordinates from wkt string to human readalbe output to WKTUtils.
+	  Modified the method: Read template out of the i18n files and use a Java
+	  MessageFormatter to fill this template with string objects. A result of 
+	  this is a proper encoding (issue137).
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java:
+	  Use the method described above to format coordinate output and display
+	  this as chart subtitle (issue136). 
+
+2010-01-21  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue100
+
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: If there
+	  are more than one axis, each dataset is mapped to its own dataset after
+	  adding it to the plot (one dataset for each parameter). In this way, we
+	  get a well scaled axis for each parameter which is independent from other
+	  axes (see range of salinity and air-pressure for example).
+
+2010-01-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+	
+	  Issue152
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Removed date
+	  formatting from timeseries charts. Set locale of DateAxis instead to
+	  localize chart axis. Advantage: JFreeChart defines intervals of axis
+	  labels automatically.
+
+2010-01-20	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Trigger the calculation when the state is initialized.
+
+2010-01-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue129
+
+	* src/main/resources/lang/artifactMessages.properties,
+	  src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_en.properties,
+	  src/main/resources/lang/artifactMessages_de.properties: Renamed I-axis to
+	  'West-East-axis' and J-axis to 'North-South-axis'.
+
+2010-01-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue105 The option to enable/disable data points in charts is now 
+	  available in gui.
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Parse optional chart parameter 'points' to adjust rendering of shapes.
+
+	* doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_timeseriespoint.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh_cross.xml,
+	  doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/verticalprofile/conf_timeseriespoint.xml,
+	  doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added an
+	  option to enable/disable data points in charts.
+
+2010-01-20	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Set number of per axis samples to 1024
+	  because generation of "Horizontalschnitte" is much faster
+	  now (60x).
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java:
+	  Added some kind of outlier test when guessing the buffer size
+	  of the spatial index. The speed problem arose from the fact
+	  that to much points are assumed to be neighbors of a given
+	  point. Long distances which differ more than 40% from the 
+	  standard derivation are assumed to be outliers.
+
+	* src/main/java/de/intevation/gnv/math/AreaInterpolation.java: Uses
+	  the outlier aware buffer size guessing now.
+
+	* src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java,
+	  src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java:
+	  Removed needless imports.
+
+2010-01-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue148
+
+	* doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_timeseriespoint.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh_cross.xml,
+	  doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/verticalprofile/conf_timeseriespoint.xml,
+	  doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Removed
+	  mistakes in description and mimetype of svg export nodes.
+
+2010-01-20	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java,
+	  src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java:
+	  Clip against given polygon. BTW: Geotools has problems with
+	  writing clipped polygons in packed 2-tuple form, too. Therefore
+	  polygons are also stores in the packed 3-tuple form. :-/
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Forward clipping polygon to isoline and polygon generator.
+
+2010-01-19	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* trunk/pom.xml: Upgraded Geotools to 2.5.8
+
+	* trunk/src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java:
+	  Ported to Geotools 2.5.8 API. Write parameter id, date and layer
+	  to shape files, too.
+
+	* trunk/src/main/java/de/intevation/gnv/math/AreaInterpolation.java:
+	  Flip upside down again because its not necessary.
+
+	* trunk/src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java:
+	  XXX: There is a Geotools bug when writing multi lines strings
+	  to shape files when the internal data representation are 
+	  packed 2-tuples. 2-tuples are enough in our use case but we
+	  use 3-tuples for multi line line strings. multi polygons work
+	  fine with 2-tuples.
+	  Removed needless bug output.
+	
+	* src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java:
+	  Use packed 3-tuples as the internal representation.
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java,
+	  src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Removed needless imports.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: Write polygons and lines strings to shape files.
+	  
+2010-01-19	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/AreaInterpolation.java:
+	  Removed import to make it compilable again.
+
+2010-01-19  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue142
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Fixed an issue
+	  in timeseries chart caused by parameters with no value. Paid attention on
+	  array length.
+
+2010-01-19	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/RasterToPPM.java: New.
+	  Class to write rasters with palettes to portable pixmaps.
+	  Handy to debug raster outputs.
+
+	* src/main/java/de/intevation/gnv/raster/Raster.java: Added
+	  getValues() to access the backing data.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Read parameter from input data correctly.
+
+	* src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java: Walk
+	  rings of polygons in reversed order to produce correct JTS polygons.
+	  Its not entierly clear why this is necessary.
+
+	* src/main/java/de/intevation/gnv/math/AreaInterpolation.java: Clipp the
+	  input points against an buffered version of the bounding box of
+	  the given polygon to reduce the number of data. TODO: figure out why
+	  upside down rendering in necessary.
+
+2010-01-19  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/schema/externalinterface_testdata.sql,
+	  doc/schema/externalinterface_schema.sql: 
+	  Do some Bugfixes after testing the Schema and Testdata against an Oracle 10.2 DBMS.
+
+2010-01-19  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/State.java,
+	  src/main/java/de/intevation/gnv/state/StateBase.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/NorthSouthEastWestState.java,
+	  src/main/java/de/intevation/gnv/state/OutputStateBase.java: Changed some
+	  method signatures. Use CallContext objects in some methods of the State 
+	  interface instead of CallMeta objects, which are a subset of CallContext.
+	
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Adapted
+	  method calls on State objects to the changes in the interface.
+
+2010-01-19  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java,
+	  src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Sourced creation of a ChartLabel object out to an own method which can be
+	  overwritten in subclasses to adjust the labels in each chart type.
+	
+	* src/main/java/de/intevation/gnv/chart/ChartLabels.java: Added string for
+	  labeling y axis and a parameter used in 'Profilschnitten'.
+
+	* src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java: Read
+	  labels from ChartLabel object and set chart and axes titles according to
+	  these labels.
+	
+	* src/main/resources/lang/artifactMessages.properties,
+	  src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_en.properties,
+	  src/main/resources/lang/artifactMessages_de.properties: Added labels for
+	  x and y axes of 'Profilschnitt' charts.
+
+2010-01-18  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVDefaultArtifact.java: Add an
+	  attribute 'fis' to the fis select node. If this attribute is found in
+	  XSLT, a link to step back and select a new fis will be created.
+
+2010-01-18  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/schema/externalinterface_schema.sql: 
+	  Added Comments and further Informations.
+	
+2010-01-18  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/schema/externalinterface_testdata.sql: 
+	  Added Testdata to demonstrate how the different Tables has to be filled.
+
+	* doc/schema/externalinterface_schema.sql: 
+	  Added Schema for the DB-Schemaextention for providing the Data that is 
+	  required for the external Interface to the Mapviewer
+	
+
+2010-01-18  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVDefaultArtifact.java:
+	  Implements a single method to append the selected fis to ui's static part.
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Inherit
+	  from GNVDefaultArtifact to append the selected fis to static part of the
+	  describe document.
+
+	* src/main/java/de/intevation/gnv/state/StateBase.java: Do not create static
+	  and dynamic nodes of the user interface any longer - fetch these nodes via
+	  xpath expression. The creation of these nodes takes place in the artifact
+	  itself.
+
+	* src/main/resources/lang/artifactMessages.properties,
+	  src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_en.properties,
+	  src/main/resources/lang/artifactMessages_de.propertie: Added label for
+	  fis.
+
+2010-01-18	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* ChangeLog: Fixed indention.
+
+2010-01-18  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_chart.xml,
+	  src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_odv.xml,
+	  src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_csv.xml: 
+	  Removed Files, because they are not required any more.
+	* src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_zip.xml: 
+	  Added new RequestFile for calling for retrieving a Zip-File from the Server.
+	* src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_wms.xml: 
+	  Added new RequestFile for calling for an WMS-Result.
+	* src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_04_feed.xml: 
+	   Added Polygon as WKT into the feed-Request.
+
+2010-01-18  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/TestArtifactDatabase.java (TestArtifactDatabase): 
+	  New: Added an Testimplementation of the ArtifactDatabase to the Tests to use it inside the
+	  TestCallcontext to prevent NPEs during the Testzenarios.
+	  
+	* src/test/java/de/intevation/gnv/artifacts/TestCallContext.java (TestCallContext): 
+	  Added Artifactfactory to the Methodsignature of the Context to use it inside the Context.
+	  Added the Method getDatabase to resolve Compilationerrors.
+	  
+	* src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java (testArtifact),
+	  src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java (testArtifact),
+	  src/test/java/de/intevation/gnv/artifacts/MeshVerticalProfileTestCase.java (testArtifact),
+	  src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java (testArtifact),
+	  src/test/java/de/intevation/gnv/artifacts/MeshTimeSeriesTestCase.java (testArtifact),
+	  src/test/java/de/intevation/gnv/artifacts/MeshHorizontalProfileTestCase.java (testArtifact),
+	  src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java (testArtifact),
+	  src/test/java/de/intevation/gnv/artifacts/InstantaneousPointVerticalProfileTestCase.java (testArtifact),
+	  src/test/java/de/intevation/gnv/artifacts/InstantaneousPointHorizontalProfileTestCase.java (testArtifact),
+	  src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java (createCallContext): 
+	  Changed Methodsignature of createCallContext. Add the Artifactfactory to use it for creating
+	  the CallContext.
+	  
+2010-01-18	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/ExternalIndexConverter.java:
+	  New. Helper to convert the internal palette indices
+	  to the explicit configured external ones.
+
+	* src/main/java/de/intevation/gnv/math/AttributedPoint2ds.java:
+	  Store the JTS geometries too.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Generate JTS multi polygons for parameter regions and multi line strings
+	  for iso lines. TODO: Clip against incoming polygon.
+
+2010-01-18	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/Palette.java:
+	  load <range> attribute "index" as external index. This
+	  is useful to match color classes with external sources.
+	  If no explicit index is given the order of ranges is
+	  used as external index.
+
+	* doc/conf/palette/flow-velocity.xml,
+	  doc/conf/palette/water-levels.xml,
+	  doc/conf/palette/salinity.xml,
+	  doc/conf/palette/water-temperature.xml: Set explicit
+	  external color class indices.
+
+	* doc/conf/conf.xml: Set ground interpolation of "Horizontalschnitte" 
+	  to bilinear.
+
+2010-01-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Reduced number of "Horizontalschnitt"
+	  samples to 256 because its much too slow with higher resolutions.
+	  This has to be improved.
+
+	* doc/conf/queries.properties: Use point data to generate
+	  "Horizontalschnitte". Added parameter id and date to results.
+
+	* src/main/java/de/intevation/gnv/utils/WKTUtils.java: Made
+	  reading to points more fault tolerant.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Call the area interpolation.
+
+	* src/main/java/de/intevation/gnv/math/AreaInterpolation.java:
+	  Fixed bug with calculating points inside bounding box of polygon.
+
+2010-01-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/State.java: Added
+	  support for end of life.
+
+	* src/main/java/de/intevation/gnv/state/StateBase.java: Implemented
+	  end of life trivial.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java:
+	  call end of life when leaving state.
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Used XMLUtils.toStream() instead of own tranformer code. Removed
+	  dead code.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Implemented end of life. Remove shapefile directory from
+	  file system belonging to concrete artifact.
+	  Implemented download as ZIP file. Offer some link for
+	  WMS integration. TODO: implement the real WMS publishing here.
+
+2010-01-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/products/horizontalcrosssection/conf_mesh.xml:
+	  Only offer WMS layers and download ZIPs in output state.
+
+	* src/main/java/de/intevation/gnv/utils/FileUtils.java:
+	  New. Helper class to recursively delete files and directories
+	  and create ZIP archives from files and directories.
+
+	* src/main/java/de/intevation/gnv/utils/WKTUtils.java: Simpilied
+	  signature of worldEnvelopeCoordinatesToIndex().
+
+	* src/main/java/de/intevation/gnv/state/OutputState.java: Cleanup
+	  imports. Made source more readable.
+
+	* src/main/java/de/intevation/gnv/state/OutputStateBase.java:
+	  Cleanup imports. Made source more readable. Moved some
+	  XPath stuff from TimeSeriesOutputState up into this base class.
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Move some XPath stuff into base class. Made source more readable.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Directly inherit from OutputStateBase now to break the implicit
+	  constraints (chart styles, statisctics, etc.) of the 
+	  TimeSeriesOutputStates which not hold for this kind of state.
+	  XXX: Added Workaround to circumvent gnv-intern/issue146
+
+	* src/main/java/de/intevation/gnv/math/AttributedXYColumns.java: Added
+	  e-mail addresses for authors. Made querying for attributes more
+	  robust.
+
+	* src/main/java/de/intevation/gnv/math/AttributedPoint2ds.java:
+	  New. Data carrier for the "Horizontalschnitte". Used for generation
+	  of results and caching
+
+2010-01-15	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java,
+	  src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java,
+	  src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java,
+	  src/main/java/de/intevation/gnv/artifacts/GNVProductArtifactFactory.java,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java,
+	  src/main/java/de/intevation/gnv/math/AreaInterpolation.java:
+	  Cleaned up imports.
+
+2010-01-15  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Added support to step back to the point where the user is able to choose
+	  the product of a FIS.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactFactory.java,
+	  src/main/java/de/intevation/gnv/artifacts/GNVProductArtifactFactory.java:
+	  Cleaned up factories regarding their tasks. GNVArtifactFactory creates
+	  concrete products. GNVProductArtifactFactory handles all FIS and knows 
+	  the products of a FIS.
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java: Removed,
+	  because it is not used anymore.
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java,
+	  src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java:
+	  A Product does no longer save its factory but the name of its factory as
+	  string.
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java:
+	  This artifact will no longer read the config file to get information about
+	  the products of a fis.  The products are set via setter method out of the
+	  ArtifactFactory where this artifact is build.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Added the
+	  possibility to step back to the point where the user can choose a product.
+	  If the target of advance is 'product' we fetch the
+	  GNVProductArtifactFactory from ArtifactDatabase and create a new
+	  SelectProductArtifact, put it into the ProxyArtifact and clean up the ugly
+	  cache.
+
+	* doc/conf/conf.xml: Create top level FIS artifacts with
+	  GNVProductArtifactFactory instead of GNVArtifactFactory.
+
+2010-01-15  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/arcsdeconnectionpool.properties: 
+	  Added the Property serverRoundtripInterval to the Configuration an 
+	  set its Value to 15 Minutes.
+
+2010-01-15  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java (testArtifact): 
+	  Added new Step for querying the Years where measurements has been done into the 
+	  Testcase.
+	
+	* src/test/ressources/verticalprofile/verticalprofile_step_07_out_statistics.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_07_out_odv.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_07_out_csv.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_07_out_chart.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_07_feed.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_07_advance.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_06_feed.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_06_advance.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_05_feed.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_04_advance.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_05_advance.xml: 
+	  Added State-Ressource for the new step Year and modified the other Ressource-Files
+	  so that the new Step is queued in the right direction.
+
+2010-01-13  Ingo Weinzierl <ingo_weinzierl@web.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISSelectArtifact.java,
+	  src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java:
+	  Renamed FISSelectArtifact to SelectProductArtifact which fits better,
+	  because the intent of this artifact is to choose a product - not a FIS.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactFactory.java:
+	  Replaced FISSelectArtifact with SelectProductArtifact.
+
+2010-01-13	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/util/ShapeFileWriterTestCase.java,
+	  src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Removed needless imports.
+
+	* src/main/java/de/intevation/gnv/math/AreaInterpolation.java: New. Interpolates
+	  area for a given bounding box, taking gaps and DEM into account.
+	  Not very fast. Use bilinear interpolation to match the "Profilschnitt".
+	  Possible TODOs: 
+	  - speed up by assuming the grid is not sparse.
+	  - use higher interpolation methods.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java,
+	  src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  Added configuration for ground interpolation.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Add helper functions to access configuration.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java: Simplified Code.
+
+	* src/main/java/de/intevation/gnv/math/L1Comparator.java: add setReference()
+	  method.
+
+2010-01-13  Ingo Weinzierl <ingo_weinzierl@web.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: 'advance'
+	  method will now consider old states. We reset input data of target state
+	  and clean cache from 'future data' before steping back to previous
+	  states.
+
+	  TODO: Refactor caching mechanism which should take care of different 
+	  states' hash values to be able to use the cache more efficiently.
+
+	* src/main/java/de/intevation/gnv/state/State.java: Added method to return
+	  map which stores input data of the current state.
+
+	* src/main/java/de/intevation/gnv/state/describedata/MinMaxDescribeData.java,
+	  src/main/java/de/intevation/gnv/state/describedata/SingleValueDescribeData.java,
+	  src/main/java/de/intevation/gnv/state/describedata/KeyValueDescibeData.java
+	  src/main/java/de/intevation/gnv/state/describedata/DefaultSingleValueDescribeData.java,
+	  src/main/java/de/intevation/gnv/state/describedata/DefaultMinMaxDescribeData.java,
+	  src/main/java/de/intevation/gnv/state/describedata/DefaultKeyValueDescribeData.java:
+	  Add current state's name when initializing new objects of these classes.
+	  The name of a state is added as attribute to a node when creating the 
+	  describe-document. The xsl transformer will read this attribute and create
+	  a link which allows the user to step back to previous states.
+	
+	* src/main/java/de/intevation/gnv/state/SingleInputState.java,
+	  src/main/java/de/intevation/gnv/state/MinMaxState.java,
+	  src/main/java/de/intevation/gnv/state/StateBase.java:
+	  - Add state name when creating objects to store input data.
+	  - Use XMLUtils.ElementCreator to write namespace aware xml elements.
+	  - Add state names as attributes to xform elements.
+	  - Append old states to list of reachable targets in describe-document.
+	  - Remove data from cache which belong to future states after stepping
+	    back to a previous state.
+	  - Remove input data of current state after stepping back.
+
+2010-01-12	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml,
+	  src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java,
+	  src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  Added configuration od file system directory of generate "Horizontalschnitt"
+	  shape files.
+
+2010-01-12	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/WKTUtils.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Code cleanup
+
+2010-01-12  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/SingleInputState.java,
+	  src/main/java/de/intevation/gnv/state/MinMaxState.java,
+	  src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java:
+	  Data, describing the user interface, is stored in a list instead of a
+	  collection, now. This makes it easier to remove the last element if we
+	  advance back.
+
+	* src/main/java/de/intevation/gnv/state/State.java,
+	  src/main/java/de/intevation/gnv/state/StateBase.java: Added a 'reset'
+	  method to clear data which has been inserted before returning to an old
+	  state. This is called when we try to advance into the past.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Now, it's
+	  possible to advance to an earlier state. The 'advance' method first
+	  searches for a given target name in the list of reachable targets. If no
+	  future target has been found, the method looks for an old state with this
+	  target name. The last option is to return to the initial step for choosing
+	  the FIS, if the target name is 'start'.
+
+2010-01-12  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties: 
+	  Added Query for Years in VerticalProfiles in TimeSeriesPoints.
+	  Modified the Query for Dates in VerticalProfiles in TimeSeriesPoints.
+	
+	* doc/conf/products/verticalprofile/conf_timeseriespoint.xml: 
+	  Added State for choosing the year and than it will only display
+	  the Dates which are within the coosen year.
+	  
+	* src/main/resources/lang/artifactMessages*.properties:
+	  Added Ressource for diaplaying year. 
+
+2010-01-12  Tim Englich  <tim.englich@intevation.de>
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java (configureHorizontalCrossSection): 
+	  Added the Method to load the Configurationsettings for horizontal-cross-sections
+	  from the global Configuartion and put it into the Context.
+	  
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java: 
+	  Added static variables to define the Keys used for horizontal-cross-sections
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java (getChartResult): 
+	  Integrated the Possibility to determin the required Snipped of an Mesh
+	  using the ij-Index determined by the given Polygon.
+	  Added the process-method which must still be implemented.
+
+	* src/main/java/de/intevation/gnv/utils/WKTUtils.java (worldEnvelopeCoordinatesToIndex): 
+	  Added worldEnvelopeCoordinatesToIndex-Method for determining the ij-Coodinates
+	  for a given Envelope.
+	  Some refactoring-Work done for reuse some existing Code of this Class.
+
+	* doc/conf/conf.xml: 
+	  Added the Configuration-Node for horizontal-cross-sections in this
+	  File.
+
+	* doc/conf/products/horizontalcrosssection/conf_mesh.xml: 
+	  Added ij-Query Node  to OutputState to make the Querystring
+	  available to this Product.
+
+2010-01-12  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Use XMLUtils to read evaluate xpath expressions. Adapted xpath
+	  expressions regarding namespace and prefix.
+
+2010-01-11  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java (readDocument): 
+	  Set NameSpaceAware to true to get the Unittests work again.
+	  The Out-Calls doesn't work yet!!!
+	
+
+2010-01-11	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* pom.xml: Introduced dependency to GeoTools 2.4.5 (maybe a bit too old)
+	  Needed to write traced polygons and line strings to shape files.
+
+	* src/main/java/de/intevation/gnv/utils/Pair.java: New
+	  simple pair tuple for type safety.
+
+	* src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java:
+	  New. Writes multi polygons and multi line strings to
+	  shapefiles. Writing the multi polygons works. 
+
+	  !! Writing the multi line strings fails!
+	  !! Its not clear by now if its a geotool bug or a
+	  !! misunderstanding of the API. The polygon and
+	  !! the line string export are coded symmetrically
+	  !! but the line string export complains about invalid 
+	  !! FIDs states.
+
+	* src/main/java/de/intevation/gnv/raster/AbstractProducer.java:
+	  New. Abstract base class for multi line string/polygons producers
+	  as backends of the vectorizer.
+
+	* src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java:
+	  Inherits from AbstractProducer now.
+
+	* src/main/java/de/intevation/gnv/raster/IsoProducer.java:
+	  New. Common base class for the iso line producers, inherits
+	  from AbstractProducer.
+
+	* src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java:
+	  Moved some code to new base class IsoProducer.
+
+	* src/main/java/de/intevation/gnv/raster/DemuxRingsHandler.java:
+	  New. Little helper class to demultiplex many ring handlers on
+	  one single vectorizer.
+
+	* src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java:
+	  The implemented AttributeGenerator interface is defined in IsoProducer
+	  now.
+
+	* src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java:
+	  New. Traces regions directly to JTS multi polygons.
+
+	* src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java:
+	  New. Traces iso lines directly to JTS multi line strings.
+
+	* src/main/java/de/intevation/gnv/math/QueriedXYDepth.java,
+	  src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java: 
+	  Removed needless imports.
+
+2010-01-09  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISSelectArtifact.java:
+	  Artifact used for the initial steps when no product is chosen.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactFactory.java: Factory
+	  to create artifacts. It is used to put a new FISSelectArtifact into the 
+	  ProxyArtifact for the initial steps when no product is  chosen.
+
+	* doc/conf/conf.xml: Use the ProxyArtifact instead of FISArtifact and
+	  GNVArtifactFactory to create it.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java:
+	  - Defined XPath expressions at the top of the class instead of directly in
+	    code.
+	  - Use XMLUtils.ElementCreator to create new namespace aware nodes and
+	    attributes.
+	  - Defined 'describe' method to create user interface for initial steps.
+
+	* src/main/java/de/intevation/gnv/profile/horizontalcrosssection/HorizontalCrossSectionMeshArtifact.java,
+	  src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java,
+	  src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java,
+	  src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java,
+	  src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java:
+	  Moved 'describe' methods which had no special code to super class.
+
+	* src/main/java/de/intevation/gnv/state/StateBase.java: Use
+	  XMLUtils.ElementCreator to create new elements in xml documents.
+
+2010-01-09	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Added configuration for vertical cross 
+	  section ground interpolation.
+
+	* src/main/java/de/intevation/gnv/math/QueriedXYDepth.java: Uses configured
+	  interpolation method now.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  Read configuration for vertical cross section ground interpolation.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java:
+	  Added key and default for vertical cross section ground interpolation.
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Forwards vertical cross section ground interpolation to QueriedXYDepth.
+
+2010-01-09	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Prevent NPE if no results are produced by vertical cross sections.
+
+	* src/main/java/de/intevation/gnv/math/QueriedXYDepth.java: Replaced
+	  envelope checking by direct coordinate checking in tile cache.
+	  Store the last used tile explicitly to save it from being collected
+	  by the garbage collector.
+
+2010-01-08  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 137
+
+	* src/main/java/de/intevation/gnv/utils/InputValidator.java (getPointValue),
+	  src/main/java/de/intevation/gnv/timeseries/gap/DefaultTimeGap.java (key),
+	  src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java (getStatisticsGenerator), 
+	  src/main/java/de/intevation/gnv/state/StateBase.java (extractKVP),
+	  src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java (prepareInputData4RegionDBQuery),
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (advance):
+	  Removed Encodingerrors from listed Files. All Files are now UTF-8 compliant.
+	
+2010-01-08  Tim Englich  <tim.englich@intevation.de>
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestSuite.java (suite): 
+	  Added a Testsuit for executing all Testcases at once.
+	
+	* src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_feed.xml,
+	  src/test/ressources/timeseries_mesh/timeseries_step_08_feed.xml,
+	  src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_feed.xml: 
+	  Changed the feeded Datevalues because the Values in the Database
+	  have changed. TODO: Does it have an effect on the IDs?
+	
+	* src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_03_advance.xml,
+	  src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java (testArtifact): 
+	  Switched Testcase to the new Condition that an LineString has to be entered.
+	
+	* src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_*.xml, 
+	  src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java (testArtifact):
+	  Switched Testcase to the new Condition that an Polygon has to be entered. 
+
+2010-01-08  Tim Englich  <tim.englich@intevation.de>
+	
+	* src/main/resources/lang/artifactMessages.properties: 
+	  Added Ressources for the GUI for visualizing the Inputstate for
+	  Polygons.
+	
+	* doc/conf/products/horizontalcrosssection/conf_mesh.xml: 
+	  Added State for the possibility to enter a Polygon which should clip
+	  the data that will be visualized.
+	
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java (getChart): 
+	  Integrated the access to the Polygon which should be used to trim the Data which 
+	  should be visualized.
+
+2010-01-05	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/QueriedXYDepth.java:
+	  - Simplified code
+	  - Search tile cache in reversed order because its more likely
+	    that last loaded tile is used more than once.
+	  - Stores cached tiles under soft references to prevent the
+	    possible case to flood the memory with hires tiles.
+
+2010-01-05  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/QueriedXYDepth.java (depth): 
+	  Added the usage of the new RasterObject integrated in the geo-backend.
+	  Now the Performance is much better accessing the depth to an coordinate.
+
+2010-01-04  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java: Declared
+	  method to create a new xforms element as static to be able to use it
+	  without instantiating an object of this class.
+
+	* src/main/java/de/intevation/gnv/state/StateBase.java: Splitted code pathes
+	  of static and dynamic nodes. Static nodes contain the selected value
+	  only instead of transfering the complete stack of possible values again.
+
+2010-01-04  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java (process): 
+	  Changed the XYDepth-Interface-Implementation to QueriedXYDepth
+
+	* doc/conf/queries.properties: 
+	  Added the Query for Rasterdataaccess.
+
+	* src/main/java/de/intevation/gnv/math/QueriedXYDepth.java (QueriedXYDepth): 
+	  Added Implementation of the XYDepth-Interface for Querying the height
+	  of an Position using the geo-backend interface.
+	  It is only nessesary to add a Query with the id rasterQuery to the query-Properties.
+
+2010-01-04	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/statistics/Statistics.java:
+	  Changed interface to allow general object results as
+	  input for statistic calculation. This is needed because
+	  the vertical cross section produces no SQL like resultsets.
+
+	* src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java:
+	  New. Added common base class for different kind of statistics.
+	  TODO: Move more common code into this class.
+
+	* src/main/java/de/intevation/gnv/statistics/VerticalCrossSectionStatistics.java:
+	  New. Statistics for vertical cross sections. Does nothing
+	  by now.
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Creates a VerticalCrossSectionStatistics object as statistics
+	  generator now.
+
+	* src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java:
+	  Inherits from AbstractStatistics now. Some code moved to new
+	  base class.
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Cleaned up the usage of statistics.
+
+2010-01-04	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/Interpolation3D.java:
+	  Fixed problem with running to max depth on every column.
+
+2010-01-04	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Fix class cast exception to enable PDF export of
+	  vertical cross section charts.
+
+	* ChangeLog: Typo fixes.
+
+2010-01-04	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java:
+	  Uses ValueAxis.valueToJava2D() to transform data values into chart
+	  space. This is slower than doing it via the Java2D matrix stack
+	  but its more the JFreeChart way and prevents transforming of
+	  graphical attributes too. TODO: Speed this up again!
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java:
+	  Forward plot to polygon renderer to make domain and range
+	  axis accessible.
+
+	* src/main/java/de/intevation/gnv/math/XYColumn.java: Moved code a bit.
+
+2010-01-04	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonSeriesLabelGenerator.java:
+	  New. Interface to generate labels for polygon series.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java:
+	  Added logic to generate and render labels of polygons.
+	  The implemented layout algorithm is greedy. For all
+	  polygons with labels the label is placed on the center of
+	  the ring, which center in terms of the indices of the vertices.
+	  If the bounding box of the label intersects the bounding box
+	  of a an already placed one alternative places are tried. 
+	  In level order positions at 1/4, 3/4, 1/8, 3/8, 5/8, 7/8 and 
+	  so on are evaluated for non intersections with former placed labels.
+	  This terminates if a free place is found or all index positions
+	  are exhausted. If no free position is found the label is omitted.
+
+	  The visual result is okay but could be improved by a more clever
+	  algorithm e.g. tension reduction in the graph of labels.
+
+	  TODO: Improve clipping against chart borders.
+
+	* src/main/java/de/intevation/gnv/jfreechart/LevelOrderIndices.java:
+	  New. Little helper class to generate the level order index
+	  traversal used in the label layout. Placed in the jfreechart
+	  package to keep it clean from gnv dependencies.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java:
+	  Added some methods to access the domain and range axis and
+	  there edge position. Mainly C&P from JFreeCahrts XYPlot
+	  to ease the coordinate transformation between Java2D and
+	  the value spaces of the chart. Call the label generation
+	  of the polygon renderer.
+
+	* src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java:
+	  Added an implementation of PolygonSeriesLabelGenerator to
+	  generate localized labels for the iso lines.
+	  
+2010-01-03	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java:
+	  Only add colors to scale which are in the chart.
+
+	* src/main/java/de/intevation/gnv/raster/Palette.java: Added
+	  getter for 'color' field of palette entry.
+
+2010-01-03	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Generate iso line classes according gnv-issues/issue108:
+
+	  - If there are more than nine colors used in the chart
+	    only the borders of the regions are traced.
+	  - If there are less than ten colors each color region
+	    is devided into two sub regions.
+	  - If there are less than five colors each color region
+	    is devided into five sub regions.
+
+	  Generate attribute per iso line class with the parameter value
+	  of the iso line.
+
+	* src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java:
+	  Renamed inner interface from LabelGenerator to AttributeGenerator to
+	  reflect the fact that the concrete label generation is a matter
+	  of i18n too. The concrete label generation should be done when 
+	  the final chart is going to be created. TODO: Add
+	  a JFreeChart style label generator to PolygonRenderer
+
+	* src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java:
+	  New. Implements the AttributeGenerator interface. It takes
+	  the indices of the neighboring regions, uses these values
+	  to look into the iso palette and averages the parameter values
+	  at the touching borders. This should help in cases where 
+	  two regions are neighbored in the chart which are not neighbored
+	  in the palette which may happen by quantification artifacts.
+
+	* src/main/java/de/intevation/gnv/raster/Palette.java: Added
+	  getters to 'from' and 'to' fields.
+
+	* src/main/java/de/intevation/gnv/math/XYColumn.java: Fixed
+	  another silly bug with adding values at surface and ground.
+
+	* ChangeLog: Typo fixes
+
+2010-01-01	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Generate iso lines by dividing palette ranges in two
+	  parts each and trace them. This shows that the ideas described
+	  by K. Jancke in gnv-issues/issue108 are probably not the
+	  right way to go. Applying this strategy there would be
+	  locally too many isolines if there is a steep gradient. 
+	  On the other hand large areas are splitted in too less sections
+	  by too less iso lines. A better way may be a splitting with
+	  a look at the areas and shapes of the regions. Large, round 
+	  regions need more splits. Long, thin regions need less.
+
+	* src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java:
+	  Stabilized iso line hashing a bit. Added line width to
+	  give iso lines a more appealing presentation in the chart.
+	  The according value is stored in "line.width".
+
+	* src/main/java/de/intevation/gnv/raster/Vectorizer.java: Fixed silly
+	  bug when simplifying lines. This prevented iso lines 
+	  from rendering.
+
+	* src/main/java/de/intevation/gnv/raster/Palette.java: Fixed index issue
+	  when generating a divided palette.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonSeries.java:
+	  Do not crash with NPE any more when not having any series.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonDataset.java:
+	  Added method to add a whole collection of series. Useful to add
+	  iso lines to dataset.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java:
+	  Set the "line.width" attribute when rendering lines.
+
+2010-01-01	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Deactivated gauss filter because
+	  it blurs no data areas too.  Moreover gauss filtering does not 
+	  seem to be necessary at all. Possible TODO: Mask the no data
+	  areas while filtering.
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Added generation of polygon data suitable for PolygonPlot.
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Some hacks to display the new Chart. XXX: This class is
+	  a real mess ... but I've said that before.
+
+	* src/main/java/de/intevation/gnv/chart/Chart.java: Made it
+	  serializable.
+
+	* src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java:
+	  New. Chart for vertical cross sections. Mainly a copy of
+	  Ingo's prototype implementation. TODO: parameter based i18n.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation3D.java: Code
+	  simplification. Made it Serializable to be cachable persistently.
+	
+	* src/main/java/de/intevation/gnv/math/AttributedXYColumns.java:
+	  Added fields for the interpolation and the generated PolygonDataset.
+	  Its used as the data carrying object in cache now.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java:
+	  Removed println debug code.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java:
+	  Added a little hack to draw the polygons of the interpolation.
+	  The values are in y-direction all below zero (depth is given
+	  by negative values) so the drawing is mirrored along y axis.
+	  This special behavior is determined by the position of data 
+	  bounding box. At first I suspected a ccw issue here but some
+	  initial tests falsified this hypothesis. We need to have a
+	  deeper look at this but till than it works.
+
+	* ChangeLog: Fixed some typos.
+
+2009-12-30	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Fixed defect XML
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Use configuration to generate JFreeChart compatible polygons.
+
+	* src/main/java/de/intevation/gnv/raster/PaletteManager.java:
+	  Add method to access base palette.
+
+	* src/main/java/de/intevation/gnv/raster/Vectorizer.java:
+	  Added logging and new constructor.
+
+	* src/main/java/de/intevation/gnv/math/ConstantXYDepth.java:
+	  "Simulates" DEM with a constant depth.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java:
+	  Fixed bug with construction of buffer size.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation3D.java:
+	  Some clean ups. New method to calculate max depth.
+
+	* src/main/java/de/intevation/gnv/math/XYColumn.java:
+	  Fixed bug with extrapolation.
+
+2009-12-30	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Added section gnv/vertical-cross-section
+	  to configure the "Profilschnitte".
+	  <samples width="..." height="..."/> configures the size of
+	  the sample area. Defaults to 1024x768.
+	  <filters><filter>...</filter></filters> configures the
+	  list of post processing filters applied to the sample area 
+	  after the interpolation is done. Defaults to empty list.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java:
+	  Added keys for vertical cross section samples and filters.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  Parse the configuration for the new parameters.
+
+2009-12-29	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Added a gnv/horizontal-cross-section-profile
+	  section to configure the "horizontalen Schnittprofile".
+	  <samples number=".."/> gives the number of samples the
+	  interpolation track is divided into. Defaults to 250
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java:
+	  The names of the keys for fetching informations from the 
+	  configuration context are stored here now instead of the factory.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  Removed the lookup keys. Configure the "horizontalen Schnittprofile".
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Fetch number of samples from config now instead of no longer supported
+	  system property.
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  The key from chart template config is now in GNVArtifactContext, too.
+
+2009-12-29	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Moved chart template and palette config
+	  into new section 'gnv'.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  Adjusted to new 'gnv' section in config.
+	  Stores chat template under 'gnv.chart.template' and palettes
+	  under 'gnv.color.palettes'.
+	  Added authors.
+
+	* src/main/java/de/intevation/gnv/utils/StringUtils.java: Fixed
+	  index out of bounds issue.
+
+2009-12-29	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/Filter.java: New.
+	  General filter mechanism raster in -> raster out. Useful
+	  to chain processing. The Filter.Factory takes an 
+	  DOM element to configure itself.
+
+	* src/main/java/de/intevation/gnv/raster/KernelFilter.java:
+	  New. Implements raster filters based on kernel folding. Has
+	  an inner class GaussFactory which acts as a factory to create 
+	  Gauss filters. The attributes "sigma" and "radius" are read
+	  from the configuring DOM element to set up the parameters
+	  of the kernel.
+
+2009-12-28	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java,
+	  src/main/java/de/intevation/gnv/utils/WKTUtils.java: Refactored most 
+	  silly code like inefficent access to input data and redundant 
+	  WKT line string parsing.
+
+	* src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java,
+	  src/main/java/de/intevation/gnv/math/XYColumn.java:
+	  Removed needless imports.
+
+2009-12-28	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/OutputStateBase.java,
+	  src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java:
+	  Bring CallContext down to the chart generation. This is necessary to
+	  access the configuration. BTW: this a much cleaner way than
+	  the omnipresent singletons all around in the code!
+
+	  Observation: All the stuff derived from OutputStateBase is coded very messy 
+	  ... even if your demands are not high about aesthetic :-/
+
+	* src/main/java/de/intevation/gnv/utils/StringUtils.java: New.
+	  Some functions to ease working with strings.
+
+2009-12-28	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/PaletteManager.java: New.
+	  Used to manage several levels of palette subdivsions derived from
+	  base palette. Contains name and description of palette, too.
+	  
+	* src/main/java/de/intevation/gnv/raster/Palette.java: Removed
+	  palette description because it is hold by the PaletteManager now.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  The palettes are not stored under the name of the palette any longer.
+	  Instead the new attribute 'parameter-id' is splitted (comma separated)
+	  into integers which are use as keys now. The values are PaletteManagers.
+	  This should ease the access to an adequate PaletteManager when
+	  generating a chart for a certain parameter.
+
+	* doc/conf/conf.xml: Added the 'parameter-ids' for the four palettes.
+	  The values are extracted from the gdiintern wiki.
+
+	  !!! This have to be in sync with the database parameter ids !!!
+
+2009-12-27	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java:
+	  New. Vectorizer rings callback which produces iso lines in
+	  form of PolygonSeries. These series can be added to PolygonDatasets.
+	  If a IsoPolygonSeriesProducer.LabelGenerator is given
+	  each of the series has an attribute "label" which could be used
+	  to label text on the plot. TODO: Add label rendering to plot.
+
+	  Iso line generation is a bit more sophisticated than pure
+	  region tracing. Along a border of a region there could
+	  be more than one type of neighborhood. This is due to quantification
+	  errors introduced by the fact that steep value gradients
+	  are sampled to less points. The only ways out would be an
+	  increase of the sample resolution or an other algorithm
+	  working directly on the interpolated floating point samples.
+
+	* src/main/java/de/intevation/gnv/raster/Vectorizer.java: Made
+	  line simplification work with open polygons, too.
+
+	* src/main/java/de/intevation/gnv/math/IJKey.java: Added method
+	  to sort (i, j) in place.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java:
+	  Do not close line shapes because iso lines are not closed shapes
+	  in general.
+
+	* src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java:
+	  Added author. Some reformatting.
+
+2009-12-26	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java:
+	  New. Vectorizer rings callback which produces PolygonDatasets suitable
+	  to be fed into PolygonPlot.
+
+	* src/main/java/de/intevation/gnv/raster/Vectorizer.java: 
+	  Forward height to rings callback.
+	  Made simplification of chains an option (default: true).
+	  This should be turn off if generating iso lines.
+	  Made edges hashable (handy to find neighbored edges in
+	  iso line scanning).
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonSeries.java:
+	  Added default constructor. Generate unique comparable long id
+	  in thos constructor.
+	  Added method to add a single ring.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonDataset.java:
+	  Added constructor to construct with a collection of polygon
+	  series.
+
+2009-12-25	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/Palette.java: Added
+	  method subdive(N) to Palette class which creates a new
+	  palette in which each interval is splitted into N
+	  equal sized intervals. Infinity sized intervals are not
+	  splitted. This is useful to fulfill the conditions of
+	  gnv/issue108.
+
+2009-12-23	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java: 
+	  Use local variable debug instead of asking log.isDebugEnabled() 
+	  more than once.
+
+	* src/main/java/de/intevation/gnv/math/XYColumn.java: extrapolate
+	  with boundary values.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation3D.java:
+	  Implements a 3D interpolation called 'Profilschnitt' along a 
+	  track similiar to the 'Horizontaler Schnittprofil' which takes 
+	  all k layers into account. 
+
+	  At the interpolated (x, y) points columns of parameter values 
+	  from surface to ground are interpolated. To do so the four 
+	  next neighbor of that columns are figured out. Four
+	  cubic splines are fitted through these parameter values 
+	  of these neighbors. Now its possible to continuous eval
+	  the parameter on each. Every entry in the interpolated column
+	  is interpolated bilinear from the four cubic spline interpolated
+	  neighbor values at the respective depth.
+
+	  The result is stored into a double valued raster. NaN values
+	  indicate interpolation gaps.
+
+2009-12-23	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/XYColumn.java: Added a method
+	  prepare() which generates an continues interpolator for the
+	  given z values. if only one value is given a constant function
+	  is assumed. If the larger z-value is below zero the
+	  next lower value is supplemented at zero. Symmetrically 
+	  if the lowest z-value is above the depth at the given point
+	  the lowest value is repeated at depth. This should guarantee
+	  that the gradient is vansihing towards the surface and the
+	  bottom of the ocean.
+
+	  If after the supplementation there are less than three points
+	  a linear interpolation is performed. If there are more than three
+	  points a higher degree interpolation is used instead. This defaults
+	  to a cubic spline interpolation. Overwrite the getInterpolator()
+	  function to replace this behavior.
+	  
+	* src/main/java/de/intevation/gnv/math/ConstantFunction.java: New.
+	  Constant function used in interpolation.
+
+	* src/main/java/de/intevation/gnv/math/LinearFunction.java: Added
+	  an inner class Univariate which fits into the interpolation
+	  framework.
+
+	* src/main/java/de/intevation/gnv/math/HeightValue.java: Sort
+	  z-Values in descending order because we are below zero.
+
+	* src/main/java/de/intevation/gnv/math/XYDepth.java: New. Interface
+	  to figure out the depth (negative values below surface) for
+	  a given coordinate. TODO: Implement this by query the DEM grid
+	  of the ocean.
+
+	* src/main/java/de/intevation/gnv/math/AttributedXYColumns.java: Added
+	  authors.
+
+2009-12-23	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  When preprocessing database data only dissemble WKT points if we
+	  have to.
+	  Read z values as double value now.
+	  Commented out CSV export because it takes the database data
+	  as data which is not correct here. TODO: We need to implement some output 
+	  based on the interpolated data.
+	  Added some type safety to better match the 2D code.
+
+	* src/main/java/de/intevation/gnv/math/AttributedXYColumns.java: Stores
+	  XYColumns in ArrayList for better reused of the 2D code.
+
+	* src/main/java/de/intevation/gnv/math/XYColumn.java: Removed toArray()
+	  method because its not needed any longer.
+
+2009-12-23	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/XYColumn.java: Extends from
+	  Point2d now to make some of the code (x/y sorting, envelope, etc.)
+	  reusable in 3D from 2D code.
+
+	* src/main/java/de/intevation/gnv/math/IJKey.java: New: The (i, j) hashing
+	  is now moved to this class because of the new inheritance of XYColumn.
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: 
+	  Adjusted the (i, j) hashing. 
+
+	* src/main/java/de/intevation/gnv/math/Point2d.java: Added a new constructor
+	  to make it easier to extend from it.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java: Made the buffer
+	  extend calculation a static method to be reusable in 3D case.
+
+2009-12-22	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Load salinity palette correctly.
+
+2009-12-22  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Preprocessing of data used for interpolation.
+
+	* src/main/java/de/intevation/gnv/math/AttributedXYColumns.java: Data
+	  wrapper. Contains preprocessed data used for interpolation and some
+	  metadata used for chart creation.
+
+	* src/main/java/de/intevation/gnv/math/XYColumn.java,
+	  src/main/java/de/intevation/gnv/math/HeightValue.java: Made them
+	  serializable and added hashCode() and equals() to XYColumn to use it as
+	  key in HashMaps.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java,
+	  src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java,
+	  src/main/java/de/intevation/gnv/state/OutputStateBase.java: Changed some 
+	  method signatures.
+
+	* src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java:
+	  Improved error handling. Return empty statistic set if there are no input
+	  data.
+
+2009-12-22  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/products/verticalcrosssection/conf_mesh.xml: Adjusted
+	  configuration for verticalcrosssection ('Profilschnitt') products.
+
+	* doc/conf/queries.properties: Adjusted sql query for chart generation of 
+	  verticalcrosssection products.
+
+	* src/main/java/de/intevation/gnv/state/StateBase.java,
+	  src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java: Code
+	  refactoring and better error handling.
+
+2009-12-22  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/HeightValue.java,
+	  src/main/java/de/intevation/gnv/math/XYColumn.java: Added model classes to
+	  store information for interpolation.
+
+2009-12-22	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Added config section for palettes.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  load palettes at start up.
+	  They are stored in a hash map under the key 'color.palettes'. The keys of
+	  the map are the names from the configuration, the values are 
+	  de.intevation.gnv.raster.Palette objects.
+	  Put configuration of chart template into own method.
+
+	* src/main/java/de/intevation/gnv/raster/Palette.java: Added a palette
+	  description.
+
+2009-12-21	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Ignore invalid interpolations correctly.
+
+2009-12-21	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/raster/Raster.java: New. Models 2D double 
+	  rasters. Has some support for filtering with gauss kernels, building
+	  iso classes, etc.
+
+	* src/main/java/de/intevation/gnv/raster/Palette.java: New. Maps double
+	  values to integer indices and colors.
+
+	* src/main/java/de/intevation/gnv/raster/Vectorizer.java: New. Simple
+	  vectorizer which traces regions in integer rasters.
+
+	* pom.xml: Added dependency to GNU Trove 2.1.1 which is needed by the
+	  vectorizer.
+
+2009-12-21  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/WKTUtils.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Moved some methods back to old place.
+
+2009-12-21	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	Added Ingo Weinzierl's special JFreeChart classes.
+
+	* src/main/java/de/intevation/gnv/jfreechart: New package.
+	  Should contain general JFreeChart stuff.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java: New.
+	  New type of plot to display multi-polygons with holes.
+
+	* src/main/java/de/intevation/gnv/jfreechart/CompactXYItems.java: New.
+	  Basic vertex data model: a ring of a polygon. ccw = shell, cw = hole.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonSeries.java: New.
+	  Attributes a set of rings with key/value pairs.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonDataset.java: New
+	  List of PolygonSeries which makes it a multi-polygon.
+
+	* src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java: New
+	  A renderer to draw PolygonDatasets into a PolygonPlot.
+	
+2009-12-21  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/products/verticalcrosssection/conf_mesh.xml: Prepared states and
+	  transitions of verticalcrosssection (german 'Profilschnitt').
+
+2009-12-21  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+a
+	* src/main/java/de/intevation/gnv/utils/WKTUtils.java
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Outsourcing of some methods to prepare results for chart creation.
+
+2009-12-21	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/palette/flow-velocity.xml:
+	  color palette for flow velocity "Fliessgeschwindigkeit".
+	* doc/conf/palette/water-levels.xml:
+	  color palette for water levels "Wasserstaende".
+	* doc/conf/palette/salinity.xml:
+	  color palette for salinity "Salzgehalt".
+	* doc/conf/palette/water-temperature.xml:
+	  color palette for water temperature "Wassertemperatur".
+
+2009-12-21	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Added some code to prevent needless null inserts if interpolating 
+	  over large gaps.
+
+2009-12-21  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/HorizontalCrossProfileChart.java:
+	  Removed warning, which told the user that gap detection is not implemented
+	  yet.
+
+2009-12-21  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java,
+	  src/main/java/de/intevation/gnv/math/Interpolation2D.java: Add 'null'
+	  values for gap detection to result collection instead of omitting them.
+	  
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.jav:
+	  Handle null values - don't throw an exception.
+
+2009-12-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	RELEASE 0.3
+
+	* Changes, NEWS, ChangeLog: Summarized activities
+
+2009-12-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Bind REST server to localhost.
+
+2009-12-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/test/ressources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_de.properties:
+	  s/Modeldaten/Modelldaten
+
+2009-12-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_de.properties: Removed
+	  wkt line strings.
+
+2009-12-17  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/queries.properties: Added K-position to sql statement for
+	  verticalprofile charts on meshes.
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Changed
+	  the depending axis for gap detection on meshes for verticalprofile charts.
+
+2009-12-17  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	Issue 106
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  Fixed a file-leak bug while reading chart template. Sourced parsing of xml
+	  file out to XMLUtils of de.intevation.artifactdatabase.XMLUtils.
+
+009-12-17  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java,
+	  src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Added column labels for csv export.
+
+2009-12-17  Hans Plum <hans@intevation.de>
+
+	Issue 129: Release 0.2: Verbesserung der �bersetzungen
+
+	* src/main/resources/lang/artifactMessages_de_DE.properties,
+	src/main/resources/lang/artifactMessages_de.properties:
+	Fixed i18n strings for german language
+
+2009-12-16	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java:
+	  Fixed index error in i-gab detection between neighbors.
+
+2009-12-16  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Override method to create chart. Fixed some bugs for interpolation.
+
+	* src/main/java/de/intevation/gnv/chart/HorizontalCrossProfileChart.java:
+	  Chart class for generating horizontal crossprofile charts. Horizontal
+	  crossprofile charts are a subclass of horizontal profile charts.
+
+	* src/main/java/de/intevation/gnv/math/Point2d.java: Changed epsilon value.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java: Fixed some bugs
+	  regarding buffer size to limit data for interpolation.
+
+	  TODO: At the moment, there is no gap detection for horizontal crossprofile
+	  charts.
+
+2009-12-16  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue100
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java,
+	  src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java:
+	  Workarround: Store information about max range of data for each parameter
+	  while iterating over all data values. Set the max range at the end of 
+	  chart generation.
+
+	  NOTE: NumberAxis.setAutoRange(true) doesn't seem to work properly.
+
+2009-12-16  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java:
+	  Removed useless import of VerticalCrossSectionChartFactory.
+
+	* src/main/java/de/intevation/gnv/chart/HorizontalCrossSectionChartFactory.java,
+	  src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java,
+	  src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChartFactory.java,
+	  src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java,
+	  src/main/java/de/intevation/gnv/chart/ChartFactory.java: Removed useless
+	  chart factory classes.
+
+2009-12-16	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/DistanceCalculator.java:
+	  Added method to calculate distance of path.
+	  TODO: Move this class into math package and and add
+	  an slerp interpolator so it can be used as a metric inside
+	  the interpolation code.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Added code to disassemble the incoming result set, interpolate
+	  along a given path and returns an adjusted result set.
+	  The (i, j) got lost on this track because we don't travel along
+	  the main axis of the grid any more. The test for gaps has to be
+	  adjusted because, because the dx/dy on the path depends on how
+	  many steps are made on the way [*]. This is controlled by the system
+	  property 'interpolation.step.width'. It is set in meters
+	  and defaults to 100m. TODO: This should be configurable
+	  in the conf.xml file.
+
+	  [*] I opt strongly for integration of the outlier test based gap
+	  detection to overcome this problem.
+
+2009-12-15	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/LinearToMap.java:
+	  Uses JTS Coordinate as geometry model now.
+
+	* src/main/java/de/intevation/gnv/math/Metrics.java,
+	  src/main/java/de/intevation/gnv/math/Interpolator.java: New.
+	  Moved from inner class of LinearToMap to top level class
+	  to be more reusable. Uses JTS Coordinate as geometry model now.
+
+	* src/main/java/de/intevation/gnv/math/Point2d.java: New.
+	  Extends JTS Coordinate to have an additional (i, j)
+	  to model the topological neighborhood within the mesh, too.
+
+	* src/main/java/de/intevation/gnv/math/Interpolation2D.java: New.
+	  Has a method interpolate() which takes a path line string in form
+	  of a list of JTS Coordinates, a list of grid points (Point2d
+	  to carry the topology, too), a linear range in diagram coordinate
+	  space, a metric to cope with the projection. It reports
+	  interpolated points to an implementor of the new inner interface
+	  Consumer as a JTS Coordinate. (x, y) of this coordinate is the
+	  postion on the map, the z value is the interpolated attribute.
+
+	  To speed up the search for the neighbors the input points are
+	  sorted into a quadtree and are queried first level with a buffer of
+	  size (max(abs(p[i].x - p[i+1].x)), max(abs(p[i].y - p[i+1].y)))
+	  around the point to be interpolated. The second level filter 
+	  is performed by an inverse L1-ordering with region coding, so 
+	  that only the nearest four neighbors are taken into acount. 
+	  Only if all four neighbors are present and no
+	  i- or j-gaps exist the interpolation is performed. TODO: Create
+	  a better extrapolation strategy in these cases were these conditions
+	  are not fulfilled.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  Added a process() method to perform the interpolation. It does
+	  nothing by now. TODO: bring it to life.
+	  
+2009-12-15	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/math/LinearToMap.java: Map linear
+	  coordinates (from, to) to world coordinates (x, y) along a line string
+	  given by a set of java.awt.geom.Point2D points.
+
+	* src/main/java/de/intevation/gnv/math/LinearMetrics.java: Implements
+	  Euclidean metric used by LinearToMap.	TODO: Do same for WGS84 to
+	  be more precise.
+
+2009-12-15  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java (calculateStatistics): 
+	  Issue96 Resloved big that one entry is missiing in the Statitic.
+	  The last row of the ResultSet was never used.
+
+2009-12-15  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue106
+
+	* doc/conf/conf.xml: Added charttemplate to global configuration.
+
+	* src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java: Made
+	  method static to call it without initiating an object of its class.
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	  Create ChartTheme at startup of artifact server and put it into global
+	  context. The theme is created one time on this way.
+
+	* src/main/java/de/intevation/gnv/state/OutputState.jav,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Changed
+	  signature of 'out'-method. Call 'out' with CallContext instead of
+	  CallMeta, which is contained in CallContext. CallContext is needed to
+	  fetch the ChartTheme out of it.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java:
+	  Changed signature of 'getChart'-method which now gets the CallContext
+	  containing the ChartTheme.
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Get ChartTheme from CallContext instead of reading the XML file here.
+
+2009-12-15	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java:
+	  If a few (i, j) values are not available (gaps in the grid) try
+	  to fill the holes with guessing the values by the ones which could
+	  be fetched. We are using a componentwise linear function here.
+	  This is surely slightly wrong because world coordinates are
+	  in WGS84 which is ellipsoid in nature. TODO: Look at the errors
+	  and if needed compensate them by using cubic polynonial or ellipsoid 
+	  function terms.
+
+	* src/main/java/de/intevation/gnv/math/LinearFunction.java: New.
+	  Linear function to be used in curve fitting process.
+
+2009-12-15  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties: 
+	  Added the Unit of the Parameter to the Query for Parameters in 
+	  all Parameterqueries where it was still missing. Now the Unit will 
+	  be displaied in the Combobox and in the Diagramm-Axis-Description. 
+
+2009-12-15	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* pom.xml: Upgraded to Apache Commons Math 2.0. Needed for
+	  curve fitting (splines e.g)
+
+	* src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java:
+	  Use 'new DescriptiveStatistics()' instead of 
+	  'DescriptiveStatistics().newInstance()' to be compatible with new
+	  math api.
+
+2009-12-15  Tim Englich  <tim.englich@intevation.de>
+
+	Added the Unit of the Parameter to the Query for Parameters in 
+	TimeSeries. Now teh Unit will be displaied in the Combobox and
+	in the Diagramm-Axis-Description.
+
+	* src/main/resources/lang/artifactMessages*.properties: 
+	  Added the name Productname for "horizontale Schnittprofile". to the
+	  Resources so that it could be displaied properly in the GUI
+
+2009-12-15  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/resources/lang/artifactMessages*.properties:
+	  Added the required Resources for the Outputelements of "horizontale Schnittprofile".
+	* doc/conf/queries.properties: 
+	  Added the specialized Queries for getting the Data and the depths for 
+	  generating "horizontale Schnittprofile".
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java (log): 
+	  Added an new OutputTransition to handle the special Way to d detremine the required
+	  Data for generating "horizontale Schnittprofile".
+	* doc/conf/conf.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh_cross.xml,
+	  src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshCrossArtifact.java: 
+	  Added Support for "Horizontales Schnittprofil"-Artifacts to the Project
+	  
+2009-12-15  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue102
+	
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java:
+	  Reset 'nextColor' at the beginning of chart creation. Now, color of lines
+	  in charts are stable, which means, that an export will look like the chart
+	  in the gui itself.
+
+2009-12-14  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue101
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Changed date
+	  representation in timeseries charts. Date format is sourced out to
+	  ressource files. German date representation is now 'dd-MMM-yyyy' (eg
+	  31-12-2009) and the english date representation is 'yyyy-MMM-dd' (eg
+	  2009-12-31). 
+
+	* src/main/resources/lang/artifactMessages.properties,
+	  src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_en.properties,
+	  src/main/resources/lang/artifactMessages_de.properties: Added date format
+	  strings for timeseries charts.
+
+2009-12-14	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/IndexBuffer.java:
+	Creates SQL-WHERE clauses for buffers around a list of 
+	line segments in index (i, j) space.
+
+2009-12-11  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java:
+	  Exception handling while creating subtitle of horizontalprofile charts.
+	  Included the case, that there is no start and no end date.
+
+2009-12-11	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java,
+	  src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java:
+	  Removed needless imports.
+
+2009-12-11  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties: 
+	  Added Z-Value to verticalcrosssection_mesh_chart_data.
+
+2009-12-11  Tim Englich  <tim.englich@intevation.de>	
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java,
+	  src/test/java/de/intevation/gnv/artifacts/InstantaneousPointHorizontalProfileTestCase.java, 
+	  src/test/java/de/intevation/gnv/artifacts/InstantaneousPointVerticalProfileTestCase.java, 
+	  src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java, 
+	  src/test/java/de/intevation/gnv/artifacts/MeshHorizontalProfileTestCase.java, 
+	  src/test/java/de/intevation/gnv/artifacts/MeshTimeSeriesTestCase.java, 
+	  src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java, 
+	  src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java, 
+	  src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java,
+	  src/test/java/de/intevation/gnv/artifacts/MeshVerticalProfileTestCase.java:
+	  Split all Unittestcases in separat Classes. Now it is easier to uses the UnitTests with Maven.
+	  
+2009-12-11  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Fade out
+	  gridlines of range axis in charts if there are more than one axis.
+
+2009-12-11  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/resources/lang/artifactMessages.properties,
+	  src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_en.properties,
+	  src/main/resources/lang/artifactMessages_de.properties: Added axis labels
+	  for horizontalprofile, verticalprofile, horizontalcrosssection and
+	  verticalcrosssection charts.
+
+	* src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java,
+	  src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java:
+	  Read axis labels from ressources instead of hard coded strings in code.
+
+2009-12-11  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Cleared Issue104.
+
+	* src/main/resources/lang/artifactMessages.properties,
+	  src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_en.properties,
+	  src/main/resources/lang/artifactMessages_de.properties: Added axis label
+	  for timeseries charts.	
+
+	* src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java:
+	  Removed hard coded axis label of timeseries charts. Read label from 
+	  ressources.
+
+2009-12-09  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Added
+	  gap detection for horizontal and vertical profile charts.
+
+2009-12-09	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* doc/conf/conf.xml: Expanded the time to live of inactive artifacts
+	  to 3600000ms (= 1h). Dead artifacts are removed from databasse
+	  only every 15mins now. Improved the description on the artifact
+	  factories.
+
+2009-12-08  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties: 
+	  Added the Unit of the Parameter to the Query for Parameters in 
+	  TimeSeries. Now teh Unit will be displaied in the Combobox and
+	  in the Diagramm-Axis-Description.
+	  
+2009-12-08  Tim Englich  <tim.englich@intevation.de>	
+	* src/main/java/de/intevation/gnv/transition/profile:
+	  Removed empty needless package.
+	* src/main/java/de/intevation/gnv/transition/TransitionFactory.java:
+	  src/main/java/de/intevation/gnv/transition/ValueCompareTransition.java, 
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java, 
+	  src/main/java/de/intevation/gnv/transition/Transition.java,
+	  src/main/java/de/intevation/gnv/transition/DefaultTransition.java:
+	  The new Transitions which has the only job to provide the connectios between
+	  the different States and look if it is Possible to go the different Ways.
+	* src/main/java/de/intevation/gnv/state/StateBase.java,
+	  src/main/java/de/intevation/gnv/state/State.java: 
+	  Removed the Logic to descide which State is be reacable as next.
+	  Now the Transition configured in the Artifacts will do that according
+	  to the modified TransitionModel.
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (transitions): 
+	  Added the Transitions to the Artifact and changed the Logic.
+	  Now the Transition is able to decide if it could be uses or not.
+	* doc/conf/products/verticalprofile/*.xml:
+	  Modified the Configuration. Splitted States and Transitions into 
+	  different XML-Fragments according to the modified Transitionmodel.
+
+2009-12-08  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/queries.properties: Added marker ('DATAID') for different data
+	  sources.
+
+2009-12-08  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/products/*.xml: 
+	  Switched all Package and Classnames to the new Names.
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: 
+	  Switched Imports from de.intevation.gnv.transition to de.intevation.gnv.state
+	  and renamed all Mebers and local Variables from *transition* to *state*
+	* src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java: 
+	  Changed the Class for the loggeer from TimeseriesoutputTransition
+	  to ArtifactXMLUtilities because it was wrong.
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java, 
+	  src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java,
+	  src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java, 
+	  src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java, 
+	  src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java, 
+	  src/main/java/de/intevation/gnv/statistics/Statistics.java, 
+	  src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java, 
+	  src/main/java/de/intevation/gnv/exports/SimpleOdvDataCollector.java, 
+	  src/main/java/de/intevation/gnv/exports/ShapeDataCollector.java, 
+	  src/main/java/de/intevation/gnv/exports/Export.java, 
+	  src/main/java/de/intevation/gnv/exports/DefaultExport.java, 
+	  src/main/java/de/intevation/gnv/exports/DefaultDataCollector.java, 
+	  src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java, 
+	  src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, 
+	  src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChartFactory.java, 
+	  src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java, 
+	  src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java, 
+	  src/main/java/de/intevation/gnv/chart/HorizontalCrossSectionChartFactory.java, 
+	  src/main/java/de/intevation/gnv/chart/ChartFactory.java, 
+	  src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: 
+	  Changed import from de.intevation.gnv.transition.* to de.intevation.gnv.state.*
+	  according to refactoring Work in the Transitionsmodel.
+	* de.intevation.gnv.transition.* 
+	  Moved to de.intevation.gnv.state.* 
+	  and renamed all Mebers,  local Variables, and Methodsignatures from *transition* to *state*
+
+2009-12-07  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Remove unselected parameters from parameters list before initiating
+	  charts. Parameter names are used as axis labels.
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java,
+	  src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Changed
+	  the way of adding data to charts: same parameters are stored in the same 
+	  dataset. Now, each parameter has only one axis. Axes and renderer are 
+	  adjusted one time after collecting data - not after creating every 
+	  single series.
+
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Added some
+	  more colors to distinguish between different parameters/attributes.
+	  Changed method to adjust rendering options regarding the changes of 
+	  datasets described above.
+
+2009-12-07  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Changed method
+	  generateChart to initChart, which just created a new timeseries chart.
+	  General chart stuff is done in AbstractXYLineChart.
+
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Sourced
+	  ChartFactory call out to a new initChart method. This has been done,
+	  because TimeSeriesCharts needs to initiate another type of chart than
+	  horizontal or vertical charts.
+
+2009-12-04  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java:
+	  Added method to fetch a string from ressource bundle with a specified
+	  locale. Before, there just have been existing a method to fetch string 
+	  from ressource bundle on basis of the first locale in a list of locales.
+
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java:
+	  Added method to fetch strings from ressource bundle from RessourceFactory
+	  with a specified locale, a key and a default value, if there is no string
+	  matching key in bundle.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Added methods for creating title and subtitle of charts. FIS name is
+	  fetched from ressource bundle with best locale (regarding supported server 
+	  and client locales) instead of first locale in list of supported locales 
+	  of the server.
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java:
+	  Changed title of charts. The main title contains FIS and station name. The
+	  subtitle contains the time period, the cruise, the depth and the position 
+	  of a chart.
+
+	* src/main/java/de/intevation/gnv/chart/ChartLabels.java: Added subtitle as
+	  parameter in class and constructor.
+
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Added a
+	  subtitle to charts. Titles and subtitles are stored in a ChartLabels
+	  object.
+
+	* src/main/resources/lang/artifactMessages.properties,
+	  src/main/resources/lang/artifactMessages_de_DE.properties,
+	  src/main/resources/lang/artifactMessages_en.properties,
+	  src/main/resources/lang/artifactMessages_de.properties: Added strings for
+	  chart title.
+
+2009-12-04	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* ChangeLog: Cleaned up a bit.
+
+2009-12-02  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Added time gap
+	  detection. If a time gap is detected, a null value will be inserted to
+	  break the current line.
+
+2009-12-02  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* pom.xml: Added JBoss repository for JFreeChart 1.0.13 and removed explicit
+	  JCommon dependency which is now needless. Now, it is no more necessary to
+	  install JFreeChart into the local maven repository on your own.
+
+2009-12-02  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/charttemplate.xml: Added lines to configure rendering of lines
+	  and points in charts (visibility of lines/points and size of points).
+
+	* src/main/java/de/intevation/gnv/chart/XMLChartTheme.java: Added method
+	  parsing the rendering options for lines and points in charts.
+
+	* src/main/java/de/intevation/gnv/chart/AbstractChart.java: Added boolean
+	  member attributes which are used to control the visibility of lines and
+	  points in charts.
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java,
+	  src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java:
+	  Constructor needs two further boolean parameter to control the visibility
+	  of lines and points in charts.
+
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: The
+	  renderer controlling the style of a series is adjusted after adding a
+	  new series to the chart.
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.jav,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Adjusted method calls regarding the constructor changes in *Chart classes.
+
+	  TODO: Lines and points in charts will both always be rendered at the
+	  moment. This needs to be changed as soon as a new gui option is
+	  implemented to control the visibility of lines/points.
+
+2009-12-01  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java:
+	  Added one more Transitionstep to each Testcase according to the refactored Transitionmodel.
+	* src/test/ressources/verticalprofile/verticalprofile_step_*_advance.xml,
+	  src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_*_advance.xml,
+	  src/test/ressources/verticalprofile_mesh/verticalprofile_step_*_advance.xml,
+	  src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_*_advance.xml,
+	  src/test/ressources/timeseries_mesh/timeseries_step_*_advance.xml,
+	  src/test/ressources/timeseries/timeseries_step_*_advance.xml,
+	  src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_*_advance.xml,
+	  src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_*_advance.xml,
+	  src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_*_advance.xml:
+	  Moved each Adancedocument plus one according to the refactored Transitionmodel.
+	  Added the first advanced Call for the Product-Artifact
+
+2009-12-01  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java:
+	  All Data which is required to generate the Charts is now fetched using the
+	  Method getChartResult. The Method advance and initialize now have nothing to do.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out):
+	  Removed the advance call because all Data which is required to generate the Charts is
+	  fetched using the Method getChartResult.
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java (initialize):
+	  Use Method instantiate instead of Advance to add the required Data for describe
+	  and feed this Transition.
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (initialize),
+	  src/main/java/de/intevation/gnv/transition/Transition.java (initialize):
+	  Added new Method Initaialize which will be callcall to Initailize the current
+	  Transition. In this step all Data will be fetched which is required  to Ddescribe and
+	  feed each Transition.
+	  Also the AlternativeTransition was removed  because it is not longer required.
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (advance):
+	  Switched to the usage of the Method initialize instead of Advance while instantiating
+	  a new Productartifact, according to the Refactoring work wich is done in the
+	  TransitionModel.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (initialize):
+	  Added new Function Initialize so that it is possible to Initialize an Artifact
+	  without doing this in the Constructor. That is nessessary because some Artifacts need
+	  some Metadata (e.g. SourceID) befor it can be initialized.
+
+	* doc/conf/products/verticalprofile/conf_timeseriespoint.xml,
+	  doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/verticalprofile/conf_instantaneouspoint.xml,
+	  doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_timeseriespoint.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml,
+	  doc/conf/products/horizontalcrosssection/conf_mesh.xml:
+	  Some Refactoring work done according to the Refactoring Work wich
+	  was done in the Transitionmodel.
+
+2009-11-30  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java,
+	  src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java:
+	  Removed needless imports.
+
+2009-11-30  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* pom.xml: Updated batik dependencies to 1.7
+
+	* src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: Use
+	  java native DOMImplementation instead of Batik's SVGDOMImplementation,
+	  which is not present in batik 1.7 libs.
+
+2009-11-30  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/products/horizontalcrosssection/conf_mesh.xml,
+	  doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_timeseriespoint.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml,
+	  doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/verticalprofile/conf_timeseriespoint.xml,
+	  doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added svg
+	  to output modes (MimeType image/svg+xml).
+
+	* pom.xml: Added batik 1.6.1 dependencies which are used to create svg
+	  exports.
+
+	* src/main/java/de/intevation/gnv/exports/ChartExportHelper.java:
+	  Implemented chart export to svg.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Output mode 'svg' will call svg export of ChartExportHelper.
+
+2009-11-30  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* pom.xm: Added iText 2.1.7 dependency (to create pdf's).
+
+	* src/main/java/de/intevation/gnv/exports/ChartExportHelper.java:
+	  Implemented chart export to pdf using iText library. The chart fills the
+	  complete page. A boolean system property "export.pdf.landscape" can be
+	  used to adjust the page orientation (portrait or landscape, default is
+	  landscape).
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Added method for exporting chart to pdf. Calls the new method of
+	  ChartExportHelper.
+
+2009-11-27  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java
+	  (testHorizontalProfileInstantaneousPointArtifact),
+	  src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_*.xml:
+	  Added new stapes using the RegionFilter into the Tescase of HorizontalProfiles Instantaneous Point.
+	* src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_feed.xml,
+	  src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_feed.xml:
+	  Bugfix: Removed second dateid. horizontalcrosssection and verticalcrosssection  only provide the usage of one dateid.
+	* doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml:
+	  Added the RegionFilters into the configuration of the Products for
+	  Horizontalprofiles IntantaneousPoints.
+	* doc/conf/queries.properties:
+	  Query to select only Ships, Cruises, Tracks  which are within an Region.
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (extractKVP):
+	  Added Row-Number lookup for ColumnNames for Performanceimprofements.
+
+2009-11-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: Helper
+	  class to export charts. Dependencies on JFreeChart and iText are capsuled
+	  here, no further dependencies in OutputTransitions. Export methods for
+	  images and pdf already implemented.
+
+	* src/main/java/de/intevation/gnv/chart/Chart.java,
+	  src/main/java/de/intevation/gnv/chart/AbstractChart.java: Outsourcing of
+	  export methods to ChartExportHelper.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Adapted current export of charts.
+
+2009-11-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/products/horizontalcrosssection/conf_mesh.xml,
+	  doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_timeseriespoint.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml,
+	  doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/verticalprofile/conf_timeseriespoint.xml,
+	  doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added pdf
+	  as export format.
+
+2009-11-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* TODO: Added point in TODO regarding tick units and distance between tick
+	  units in timeseries charts.
+
+2009-11-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Localized
+	  chart axis. Two method have been added - method to localize y-axis of
+	  charts, abstract method to localize x-axis of charts.
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Override
+	  abstract method to localize x-axis.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Call algorithm to determine the best locale regarding intersection of
+	  supported server and browser locales. This locale is used to create
+	  localized charts.
+
+2009-11-26  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java:
+	  New method getLocales() which returns an array of locales which are
+	  supported by the server.
+
+	* src/main/resources/lang/lang.conf: Config-file for supported languages.
+	  The resource bundles for localized text should be configured here. It is
+	  used to determine the best locale regarding the supported locales by
+	  server and browser.
+
+2009-11-25  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Override
+	  method generateChart to instantiate TimeSeries charts instead of XY
+	  charts. Before these changes, timeseries charts did not have a valid date
+	  axis.
+
+2009-11-24  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/chart/AbstractChart.java,
+	  src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java,
+	  src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Added
+	  timegap definitions, adapted constructors.
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Adapted creation of charts regarding changes of constructors.
+
+2009-11-24  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_feed.xml,
+	  src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_feed.xml,
+	  src/test/ressources/timeseries_mesh/timeseries_step_08_feed.xml,
+	  src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_feed.xml,
+	  src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_feed.xml,
+	  src/test/ressources/timeseries/timeseries_step_06_out_chart.xml:
+	  Added new Timevalues because the Data in the DWH has changed.
+
+2009-11-24  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* pom.xml: Added dependencies for esri and ibm libraries required for unit
+	  tests.
+
+2009-11-24  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/timeseries/timeseries_step_06_out_chart.xml:
+	  Added mime-type to get a propper output-result and not an NPE
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java (findValueTitle):
+	  Added null-value check to prevent NPEs.
+	* src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java (getChart),
+	  src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (getChart),
+	  src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java (getChart),
+	  src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java (getChart):
+	  Changed Method-Signature to this one which the base method provide.
+	  Now the Methods will be used again.
+
+2009-11-24  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/TestCallContext.java (TestCallContext):
+	  Removed Compilationerrors that were triggert by API-Changes in
+	  Module Artifact-Database.
+
+	* doc/conf/queries.properties,
+	  doc/conf/products/timeseries/conf_mesh.xml:
+	  Removed Meshpoint from SQL-Query because the same value will be
+	  insert by using the depthid.
+	  depthid on layer 1 = featureid
+	  In the old configuration only Charts on Layer 1 were drawn.
+	  issue91
+
+2009-11-23  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java:
+	  Remove chart from cache when data which is displayed has changed.
+
+2009-11-23  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/charttemplate.xml: Added configuration file for chart themes.
+
+	* src/main/java/de/intevation/gnv/chart/XMLChartTheme.java: Theme class for
+	  reading xml files which describe chart styles. It extends the
+	  StandardChartTheme class of JFreeChart which defines default values for
+	  chart parameters. It is possible to apply different xml configurations for
+	  different charts.
+
+	* src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Before creating a new chart, an instance of XMLChartTheme is initialized
+	  which is responsible for the chart style.
+
+	  NOTE: 'charttemplate.xml' is used by artifact server and has to be placed
+	  in the config directory.
+
+2009-11-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Export format of charts (png, jpeg, gif) depends on mime-type.
+
+	* src/main/java/de/intevation/gnv/chart/Chart.java,
+	  src/main/java/de/intevation/gnv/chart/AbstractChart.java: Renamed export
+	  method, because it doesn't export just png anymore, but jpeg or gif as
+	  well.
+
+2009-11-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_out_chart.xml,
+	  src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_chart.xml,
+	  src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_out_chart.xml,
+	  src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_out_chart.xml,
+	  src/test/ressources/timeseries_mesh/timeseries_step_08_out_chart.xml,
+	  src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_out_chart.xml,
+	  src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_out_chart.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_06_out_chart.xml:
+	  Removed mistake in xml structure of artifact protocol. Mime-type node was
+	  called 'out' instead of 'mime-type'.
+
+2009-11-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java,
+	  src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java,
+	  src/main/java/de/intevation/gnv/chart/AbstractChart.java,
+	  src/main/java/de/intevation/gnv/exports/Export.java,
+	  src/main/java/de/intevation/gnv/exports/ShapeDataCollector.java,
+	  src/main/java/de/intevation/gnv/exports/SimpleOdvDataCollector.java,
+	  src/main/java/de/intevation/gnv/exports/DefaultProfile.java,
+	  src/main/java/de/intevation/gnv/exports/DefaultExport.java,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Removed duplicated and needless imports.
+
+2009-11-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java:
+	  Added methods for caching charts.
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Changed chart generation. Charts will now be generated in a central place
+	  in TimeSeriesOutputTransition which is the parent class of other
+	  OutputTransitions. Each OutputTransition got a new method to serve its own
+	  special chart class.
+
+	* TODO: Added hint for caching charts. Verticalcrosssection and
+	  orizontalcrosssection charts aren't implemented yet.
+
+	  NOTE: Charts can be cached. This could be useful if the user exports
+	  charts as svg, png or pdf. The caching of charts is configured via system
+	  property 'cache.chart' at the moment.
+
+2009-11-19  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java,
+	  src/main/java/de/intevation/gnv/transition/OutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Changed parameter of 'out'-method of OutputTransition. Now, the
+	  OutputTransition gets the complete xml document of the request (before
+	  just the target name). The mime type of this xml ist used to distinguish
+	  between different output formats of charts (png, jpeg).
+
+2009-11-19  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java,
+	  src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java,
+	  src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java:
+	  Classes for creating charts of different output transitions, inherit from
+	  AbstractXYLineChart. The subclasses should only implement special code.
+	  General configurations should be done in AbstractChart or
+	  AbstractXYLineChart.
+
+	  TODO: Take care of gaps between two values.
+
+2009-11-19  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/Chart.java: Interface, which
+	  declares basic method to create charts and export it in different formats.
+
+	* src/main/java/de/intevation/gnv/chart/AbstractChart.java,
+	  src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Abstract
+	  chart classes which declare basic methods for chart creation and implement
+	  general methods used by subclasses.
+
+2009-11-19  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/DistanceCalculator.java: Declared a
+	  method as static, which can be used without instantiating an object of its
+	  class.
+
+2009-11-17  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* pom.xml: Changed version of JFreeChart from 1.0.12 to 1.0.13 and added
+	  dependency of JCommon 1.0.15, which is used by JFreeChart.
+
+	  NOTE: The JFreeChart 1.0.13 jar has to be installed on your own for the
+	  time the central maven repository is broken.
+
+2009-11-17  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* pom.xml: Changed version of JFreeChart from 1.0.7 to 1.0.12, which
+	  includes the template mechanism to configure the style of charts.
+
+	  NOTE: JFreeChart 1.0.13 is the newest release, but the maven repository
+	  does not contain a pom.xml file. Created an issue on
+	  (http://jira.codehaus.org/browse/MEV-647).
+
+2009-11-16  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* bin/run.sh: Added start-script to version control.
+
+2009-11-13  Hans Plum <hans@intevation.de>
+
+	* RELEASE 0.2:
+	Summarized activities in NEWS, Changes
+
+2009-11-13  Hans Plum <hans@intevation.de>
+
+	* ChangeLog:
+	Unified style of ChangeLog descriptions refering to issues.
+
+2009-11-13  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/products/timeseries/conf_timeseriespoint.xml:
+	  Moved Comment according to Instantiationerrors loading Artifact.
+
+2009-11-13  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/log4j.properties,,
+	  doc/conf/conf.xml,
+	  doc/conf/arcsdeconnectionpool.properties,
+	  doc/conf/products/timeseries/conf_timeseriespoint.xml:
+	  Added Documentation of Configuration-Files.
+
+2009-11-13  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/products/horizontalcrosssection/conf_mesh.xml:
+	  Removed statistics as possible out-Variant from Configuration
+	  according to TG_0030.061
+
+	* src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_out_statistics.xml,
+	  src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_out_statistics.xml,
+	  src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalCrossSectionMeshArtifact),
+	  (testVerticalCrossSectionMeshArtifact):
+	  Removed Statistics-Test on This Artifact-Test because no Statistic is required
+	  for this Producttyp.
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/
+	HorizontalCrossSectionMeshOutputTransition.java (createCSV):
+	  No Statistics for this Output is required.
+
+	* src/main/java/de/intevation/gnv/statistics/HorizontalCrossSectionStatistics.java:
+	  Removed becaus the Statistics for ths product is not required.
+
+2009-11-12  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/statistics/HorizontalCrossSectionStatistics.java (calculateXOrdinateValue),
+	  src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java (calculateXOrdinateValue),
+	  src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java (calculateXOrdinateValue),
+	  src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java :
+	  Added the previous Row to the Method for calculating the GAP between
+	  those Rows. Also added Calculation of the Distance between two Points in
+	  HorizontalProfileStatistic and returning the Depth in VerticalProfileStatistics.
+	  Also added the Metjod clearStatistics to restet the Object if an new Calculation
+	  will started.
+
+2009-11-12  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (extractKVP):
+	  Translated "Keine Auswahl" to "No Selection" according to the Specification that
+	  the primary Language is english. Please note that the Values  that are currently
+	  displaied are almost in german.
+
+2009-11-12  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (writeStatistics2XML):
+	  Changed XML-Syntaxt according to the new Structure of StatisticValues.
+	  (out):
+	  Changed Call of calculateStatistics according to the new Methodsignature.
+
+	* src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java,
+	  src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java.
+	  src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java,
+	  src/main/java/de/intevation/gnv/statistics/Statistics.java:
+	  Extended Methods calculateStatistics to put Lable-Values into the
+	  Calculation. Now for each Group of Statistics is it possible
+	  to calclulate a separat name which is simmilar to the name of
+	  the Diagramm-Series-Name.
+	  Also the Representation of the Statistics has changed so each Group
+	  will be stored in one StatisticSet
+
+	* src/main/java/de/intevation/gnv/statistics/StatisticSet.java:
+	  Bean for Storing the Statistic to one Group and also storing the
+	  Name of the Statistic.
+
+2009-11-11  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 19: Validation of max. min value order
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (putInputData):
+	  Added Validation if a given maxvalue is greater than a given minvalue issue19
+	* src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid):
+	  Added new Method for validating if a maxvalue is greater than a minvalue. issue19
+
+2009-11-11  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 81: Keeping input values in coordinate input fields
+
+	* src/main/java/de/intevation/gnv/transition/describedata/DefaultSingleValueDescribeData.java
+	  (setValue), src/main/java/de/intevation/gnv/transition/describedata/SingleValueDescribeData.java:
+	  Added setValue-Method
+	  for setting the Value which was sent back to the Server using the feed-request. issue81
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (getDescribeData):
+	  Added SingleValueDescribeData to the method for storing InputValues for
+	  Describeoutput issue81
+
+2009-11-11  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/describedata/MinMaxDescribeData.java,
+	  src/main/java/de/intevation/gnv/transition/describedata/DefaultMinMaxDescribeData.java:
+	  Added getName and added Constants for minValue and maxValue Id to
+	  enable the storage of this Values which would be put using the
+	  feed command.
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe):
+	  Changed the usage of the Name of the MinMaxTransition from getMinName to getName.
+
+	* src/main/java/de/intevation/gnv/transition/MinMaxTransition.java (purifyResult):
+	  Changed the Constructor of MinMaxTransition according to API-Changes of
+	  DefaultMinMaxDescribeData
+
+2009-11-11  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 76: Improving XML config documents
+
+	* doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/verticalprofile/conf_instantaneouspoint.xml,
+	  doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml,
+	  doc/conf/products/horizontalcrosssection/conf_mesh.xml:
+	  Removed unnecessary characters 'v' from the Documents. issue76
+
+2009-11-10  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/resources/lang/artifactMessages_*.properties:
+	  Added Ressources for the AreaFilter Ids areaid and subareid
+
+2009-11-10  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 68: Improving ODV Export
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (TIMESERIES_ODV_PROFILE_NAMES):
+	  Sort Columns to the given order of the ODV-Specification
+	  and added the Columns DATAVALUE and PARAMETER to the output
+	  according to issue68
+
+	* doc/conf/queries.properties:
+	  Changed Column-alias in Query for HorizontalProfile ODV-Exports in Meshes
+	  from PARAMETERID to PARAMETER to be able to use in only on ODV-Export-Profile
+
+2009-11-10  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalCrossSectionMeshArtifact):
+	  Added the ODV-Export to the Unit-Testcase for VerticalCrossSection-Mesh.
+	  Some Refactoring Work done.
+	* doc/conf/products/verticalcrosssection/conf_mesh.xml:
+	  Added QueryID for ODV-Exports to the Configuration of an
+	  Mesh-VerticalCrossSection-Artifacts
+	* doc/conf/queries.properties:
+	  Added Query for VerticalCrossSection ODV-Exports in Meshes.
+	* src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_feed.xml:
+	  Changed Datevalue, because the old value was out of range to the Data.
+	* src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_out_odv.xml:
+	  Added Out-Request for ODV-Export to the JUnitTest Configuration for
+	  VerticalCrossSection Mesh.
+
+2009-11-10  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalCrossSectionMeshArtifact):
+	  Added the ODV-Export to the Unit-Testcase for HorizontalCrossSection-Mesh.
+	  Some Refactoring Work done.
+	* doc/conf/queries.properties:
+	  Added Query for HorizontalCrossSection ODV-Exports in Meshes.
+	* doc/conf/products/horizontalcrosssection/conf_mesh.xml:
+	  Added QueryID for ODV-Exports to the Configuration of an
+	  Mesh-HorizontalCrossSection-Artifacts
+	* src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_feed.xml:
+	  Changed Datevalue, because the old value was out of range to the Data.
+	* src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_out_odv.xml:
+	  Added Out-Request for ODV-Export to the JUnitTest Configuration for
+	  HorizontalCrossSection Mesh.
+
+2009-11-10  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileInstantaneousPointArtifact):
+	  Added the ODV-Export to the Unit-Testcase for HorizontalProfile-InstantaneousPoint.
+	  Some Refactoring Work done.
+	* src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_out_odv.xml:
+	  Added Out-Request for ODV-Export to the JUnitTest Configuration for
+	  HorizontalProfiles InstantaneousPoint.
+	* doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml:
+	  Added QueryID for ODV-Exports to the Configuration of an
+	  InstantaneousPoint-HorizontalProfile-Artifacts
+	* doc/conf/queries.properties:
+	  Added Query for HorizontalProfile ODV-Exports in InstantaneousPoint
+
+2009-11-10  Tim Englich  <tim.englich@intevation.de>
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileInstantaneousPointArtifact):
+	  Added the ODV-Export to the Unit-Testcase for VerticalProfile-InstantaneousPoint.
+	  Some Refactoring Work done.
+	* doc/conf/products/verticalprofile/conf_instantaneouspoint.xml:
+	  Added QueryID for ODV-Exports to the Configuration of an
+	  InstantaneousPoint-VerticalProfile-Artifacts
+	* doc/conf/queries.properties:
+	  Added Query for VerticalProfile ODV-Exports in InstantaneousPoint
+	* src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_odv.xml:
+	  Added Out-Request for ODV-Export to the JUnitTest Configuration for VerticalProfiles InstantaneousPoint.
+
+2009-11-10  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileMeshPointArtifact):
+	  Added the ODV-Export to the Unit-Testcase for HorizontalProfile-Mesh.
+	  Some Refactoring Work done.
+	* doc/conf/products/horizontalprofile/conf_mesh.xml:
+	  Added QueryID for ODV-Exports to the Configuration of an
+	  Mesh-HorizontalProfile-Artifacts
+	* doc/conf/queries.properties:
+	  Added Query for HorizontalProfile ODV-Exports in Meshes
+	* src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_out_odv.xml:
+	  Added Out-Request for ODV-Export to the JUnitTest Configuration for HorizontalProfiles Mesh.
+	* src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_feed.xml:
+	  BugFix: Changed missspelled Input-Name
+
+2009-11-09  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (TIMESERIES_ODV_PROFILE_NAMES):
+	  Changed the Order of Columnlookup for ODV-Exports and added column "Depth" to the Export
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesMeshArtifact):
+	  Added the ODV-Export to the Unit-Testcase for TimeSeries-Mesh.
+	  Some Refactoring Work done.
+	* doc/conf/queries.properties:
+	  Added Query for VerticalProfile ODV-Exports in Meshes
+	* doc/conf/products/verticalprofile/conf_mesh.xml:
+	  Added QueryID for ODV-Exports to the Configuration of an
+	  Mesh-VerticalProfile-Artifacts
+	* src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_out_odv.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_06_out_odv.xml:
+	  Added Out-Request for ODV-Export to the JUnitTest Configuration for VerticalProfiles.
+
+2009-11-09  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesMeshArtifact):
+	Added the ODV-Export to the Unit-Testcase for TimeSeries-Mesh.
+	Some Refactoring Work done.
+
+	* src/test/ressources/timeseries_mesh/timeseries_step_08_out_odv.xml:
+	Added Out-request for ODV-Export to the JUnitTest Configuration for TimeSeries Mesh.
+
+	* doc/conf/products/timeseries/conf_mesh.xml:
+	Added QueryID for ODV-Exports to the Configuration of an Mesh-TimeSeries-Artifacts
+
+	* doc/conf/queries.properties: Added Query for TimeSeries ODV-Exports in Meshes
+
+2009-11-09  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/exports/Export.java
+	  src/main/java/de/intevation/gnv/exports/DefaultProfile.java
+	  src/main/java/de/intevation/gnv/exports/DefaultExport.java: Added the
+	  possibility to print column labels in the first line of an export.
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Adjusted instantiation of the DefaultExport object and added column labels
+	  for odv export.
+
+2009-11-09  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/exports/SimpleOdvDataCollector.java:
+	  Implemented a DataCollector for Odv exports.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  OEV-export uses a SimpleOdvDataCollector to collect export data.
+
+2009-11-09  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/exports/ShapeDataCollector.java,
+	  src/main/java/de/intevation/gnv/exports/HorizontalProfileDataCollector.java:
+	  Renamed HorizontalProfileDataCollector into ShapeDataCollector, because it
+	  will be used by other transitions as well.
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java:
+	  Adjusted class name of DataCollector after renaming.
+
+2009-11-09  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/exports/HorizontalProfileDataCollector.java:
+	  Special DataCollector for fetching data used for horizontal profile
+	  exports.
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java:
+	  Uses the an exporter for csv export.
+
+2009-11-09  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/exports/Export.java,
+	  src/main/java/de/intevation/gnv/exports/DefaultDataCollector.java:
+	  Implemented a DataCollector to collect all data used to create exports.
+	  DefaultCollector fetches data with help of its headers. For special
+	  exports, where a header returns more than one value, special
+	  DataCollectors needs to be implemented (overwritung the 'getData' method).
+
+	* src/main/java/de/intevation/gnv/exports/DefaultProfile.java,
+	  src/main/java/de/intevation/gnv/exports/DefaultExport.java: Export now
+	  uses a DataCollector to get the data.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Adjusted exports of csv export.
+
+2009-11-09  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties:
+	  Added SQLStatemenet for ODV-Data for VerticalProfiles
+	  on TimeSeriesPoints.
+	* doc/conf/products/verticalprofile/conf_timeseriespoint.xml:
+	  Added QueryID for ODV-Data-Query
+
+2009-11-09  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/timeseries/timeseries_step_06_out_*.xml:
+	  Added the missing out-Modes to the Testcase and rename it to
+	  the common used way in this TestCases.
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesArtifact):
+	  Added the ODV-Export to the Unit-Testcase.
+	  Some Refactoring Work done.
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out):
+	  The Method for generating ODV-Export now reads its Data from
+	  the special Method which delivers the adapted Data.
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (generateFilterValuesFromInputData):
+	  Extracted the Generation of the FilterValues for the geo-backend
+	  to use it in several methods.
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java (getODVResult):
+	  Added Method for getting the rquired Data for ODV-Exports
+	* doc/conf/products/timeseries/conf_timeseriespoint.xml:
+	  Added separat QueryID Lookup for ODV-Data-Queryies
+	* doc/conf/queries.properties:
+	  DB-Queries for ODV-Support TimeSeries on TimeSeriesPoints added.
+
+2009-11-06  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/exports,
+	  src/main/java/de/intevation/gnv/exports/Export.java,
+	  src/main/java/de/intevation/gnv/exports/DefaultProfile.java,
+	  src/main/java/de/intevation/gnv/exports/DefaultExport.java: Implemented an
+	  Exporter for odv and csv exports. Each exports just needs a Profile, which
+	  describes the output.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Added an exemplary export for CSV and ODV formats of
+	  TimeSeriesOutputTransition.
+
+	  TODO: ODV exporter exports the same data as CSV exporter does. This needs
+	  to be adapted.
+
+2009-11-06  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java:
+	  Added and moved Workflowsteps because of changes in the Workflow of these Artifacts.
+	  Now the Region-Filter is added to the Workflow an can be tested using
+	  this UnitTestCases.
+
+	* src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_*.xml,
+	  src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_*.xml,
+	  src/test/ressources/timeseries/timeseries_step_*.xml,
+	  src/test/ressources/timeseries_mesh/timeseries_step_*.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_*.xml,
+	  src/test/ressources/verticalprofile_mesh/verticalprofile_step_*.xml:
+	  Added and moved Files because of changes in the Workflow of these Artifacts.
+	  Now the Region-Filter is added to the Workflow an can be tested using
+	  the UnitTestCases.
+
+2009-11-06  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* doc/conf/products/horizontalcrosssection/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_timeseriespoint.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml,
+	  doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/verticalprofile/conf_timeseriespoint.xml,
+	  doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added odv
+	  as output format.
+
+2009-11-06  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/ChartFactory.java (calculateMaxGap):
+	  Bugfix Gap-Calculation moved maxGap into negative Valies because of
+	  overflow of Long-Variable.
+
+2009-11-05  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties:
+	  Query to select only those TimeSeriesPoints
+	  which are within an Region
+
+	* doc/conf/products/timeseries/conf_timeseriespoint.xml,
+	doc/conf/products/verticalprofile/conf_timeseriespoint.xml:
+	Added the RegionFilters into the configuration of the Products
+	for TimeSeriesPoints.
+
+2009-11-05  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties:
+	  Added new Queries to fill the Lists for the
+	  Regionfilters and one Query to select only those Meshes
+	  which are within an Region.
+
+	* doc/conf/products/verticalprofile/conf_mesh.xml,
+	  doc/conf/products/verticalcrosssection/conf_mesh.xml,
+	  doc/conf/products/timeseries/conf_mesh.xml,
+	  doc/conf/products/horizontalprofile/conf_mesh.xml,
+	  doc/conf/products/horizontalcrosssection/conf_mesh.xml:
+	  Added the RegionFilters into the configuration of the Products
+	  for Meshes.
+
+2009-11-05  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/*_describe.xml:
+	  Added the DescribeRequestBodies to each TestCaseData.
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java:
+	  Added the DescribeRequestBody to Describe-Calls in the Test
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java:
+	  Added the possibility to switch to an alternative Transition if no value was choosen.
+
+	* src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid):
+	  Added that the Inputvalue is valid if it fullfills the confitions of "no value choosen" (n/n)
+
+	* src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java (calculateXOrdinateValue):
+	   Added Dummyvalue for X-OrdinateValue
+	  src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java (describe),
+	  src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java (describe),
+	  src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java (describe),
+	  src/main/java/de/intevation/gnv/profile/horizontalcrosssection/HorizontalCrossSectionMeshArtifact.java (describe),
+	  src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java (describe),
+	  src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (describe),
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (createDescibeOutput):
+	  Added the possibility to exclude the UI from the DescribeRequest.
+
+2009-11-03  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/ChartFactory.java (getTimeGapValue):
+	  Integrated special case for TimeGaps in Meshes. There is no Gap defined in
+	  Meshes so we have to use Long.MAXVALE to define a Gap for a Mesh which value
+	  canno be reached.
+
+2009-11-02  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java
+	  (createCSV): Code Cleanup: Removed obsoled TODO Flag
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (setSelection):
+	  Changed the Value of the min and maxvalue of the Request to the Value which is unsed to name
+	  the Inputfields in the DescribeOutput.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java,
+	  src/main/java/de/intevation/gnv/transition/Transition.java,
+	  src/main/java/de/intevation/gnv/transition/SingleInputTransition.java,
+	  src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java,
+	  src/main/java/de/intevation/gnv/transition/MinMaxTransition.java,
+	  src/main/java/de/intevation/gnv/transition/DefaultTransition.java,
+	  src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (advance),
+	  CodeCleanup: Removed needless Method validate from Transition,
+	  because it had always returned true
+
+2009-10-30  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_*.xml:
+	  Added the Testdata for the Unittest for HorizontalCrossSectionMeshArtifacts.
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalCrossSectionMeshArtifact):
+	  Added the UnitTest-Case for HorizontalCrossSectionMeshArtifacts
+
+2009-10-30  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties:
+	  Added the Query for selecting the Data for generating Outputs of
+	  HorizontalCrossSectionMeshOutputTransition
+	* doc/conf/products/horizontalcrosssection/conf_mesh.xml:
+	  Added the configuration for the HorizontalCrossSectionMeshOutputTransition
+	* src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java:
+	  Added the OutputTransition for generating /HorizontalCrossSections.
+	* src/main/java/de/intevation/gnv/statistics/HorizontalCrossSectionStatistics.java:
+	  The Class for generating the Statistics to HorizontalCrossSections
+	* src/main/java/de/intevation/gnv/chart/HorizontalCrossSectionChartFactory.java:
+	  The Class Stub for generating HorizontalCrossSections Charts.
+
+2009-10-29  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 45: Defining gaps for spatial and temporal gaps
+
+	* doc/conf/products/timeseries/timegap_definition.xml,
+	  doc/conf/products/timeseries/conf_timeseriespoint.xml:
+	  Added the Configuration for TimeGaps to the TimeSeries-Configurations. issue45
+
+	* doc/conf/queries.properties:
+	  Added TimeGapIp to the Queries for the Resultdata of TimeSeriesArtifacts. issue45
+
+	* src/main/java/de/intevation/gnv/timeseries/gap/DefaultTimeGap.java,
+	  src/main/java/de/intevation/gnv/timeseries/gap/TimeGap.java,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (setup):
+	  src/main/java/de/intevation/gnv/chart/ChartFactory.java (calculateMaxGap):
+	  Added configurable TimeGap Support to the TimeSeries-Chart-Generation. issue45
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java,
+	  src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java (readConfiguration):
+	  Moved Method from GNVArtifactBase to make it assesible for more Objects. issue45
+
+2009-10-28  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/profile/horizontalcrosssection/
+	HorizontalCrossSectionMeshArtifact.java (HorizontalCrossSectionMeshArtifact),
+	doc/conf/queries.properties, doc/conf/conf.xml,
+	doc/conf/products/horizontalcrosssection/conf_mesh.xml,
+	src/main/resources/lang/artifactMessages* .properties:
+	Added Workflow for determining the Query-Parameters for  Horizontal cross-sections.
+
+2009-10-28  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/conf.xml:
+	  Added Configuration for two new FIS. Current Meter and Ice Station Reports
+
+	* src/main/resources/lang/artifactMessages*.properties:
+	  Added Ressources for two new FIS. Current Meter and Ice Station Reports
+
+2009-10-27  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/conf.xml:
+	  Added Configuration for two new FIS. Sea State and SEACAT
+
+	* src/main/resources/lang/artifactMessages*.properties:
+	  Added Ressources for two new FIS. Sea State and SEACAT
+
+2009-10-27  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 61: Vertical profile (Meshes): Selection of minimal and maximal
+	depths zones
+
+	* src/main/resources/lang/artifactMessages*.properties:
+	  Added Ressources for the minimal and maximal Layer to use in VerticalProfiles of Meshes issue61
+
+	* doc/conf/products/verticalprofile/conf_mesh.xml:
+	  Added two new Transitions for selecting the min and max-Layer to use. issue61
+
+	* doc/conf/queries.properties:
+	  Added Queries for Selecting the Depth for selecting the minimum and the maximum Layer to use
+	  Drawing the Chart. issue61
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileMeshArtifact):
+	  Integrated two further Transitions-Steps according to changes in Workflow of
+	  VerticalProfiles in Meshes. issue61
+
+	* src/test/ressources/verticalprofile_mesh/verticalprofile_step_*.xml:
+	  New Testdata generated according to changes in Workflow of VerticalProfiles in Meshes. issue61
+
+2009-10-26  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 31: TG_0020.018: Input of manual depth zones
+
+	* src/main/resources/lang/artifactMessages_de_DE.properties:
+	  Added Ressources for the minimal and maximal value of the depth
+
+	* src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_statistics.xml (renamed),
+	  src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_csv.xml (renamed),
+	  src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_chart.xml(renamed),
+	  src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_feed.xml,
+	  src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_advance.xml,
+	  src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_advance.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_05_out_statistics.xml(renamed),
+	  src/test/ressources/verticalprofile/verticalprofile_step_05_out_csv.xml(renamed),
+	  src/test/ressources/verticalprofile/verticalprofile_step_05_out_chart.xml(renamed),
+	  src/test/ressources/verticalprofile/verticalprofile_step_05_feed.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_04_advance.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_03_advance.xml,
+	  src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java:
+	  Edited the RestCases for VerticalProfiles according to the requirement that
+	  the user should be able to enter the minimal and maximal Value of the depth that
+	  should be show n in the charts. issue31
+
+	* doc/conf/queries.properties,
+	  doc/conf/products/verticalprofile/conf_timeseriespoint.xml,
+	  doc/conf/products/verticalprofile/conf_instantaneouspoint.xml:
+	  Adding required Configuration-Parts to get the possible to enter the minmum
+	  and maximum depth value that should be shown in the charts. issue31
+
+2009-10-23  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/timeseries_mesh/timeseries_step_07_feed.xml:
+	  The Timeperiod of the Modeldata has changed. so it was nessessarry to change
+	  the Unittest to get propper Results
+
+2009-10-23  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties:
+	  Some Queryimproofments done. Inner-Selects has been removed where it was possible.
+
+2009-10-23  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 3: Artifact: Storing the internal state instead of results
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java,
+	  src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java (describe),
+	  src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java (describe),
+	  src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java (describe),
+	  src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java (describe):
+	  Use super.identifier as uuid. issue3
+
+2009-10-23  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/verticalprofile/verticalprofile_step_04_feed.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_03_advance.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_04_out_*.xml,
+	  src/test/ressources/timeseries_mesh/timeseries_step_07_out_*.xml,
+	  src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_out_*.xml:
+	  Changed the uuid because the new Storage shows that there were different ones in one Testcase
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Put the UUID into the Resultlookup
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java:
+	  Removed the Storage of Results in the Object and put them into the ehcache
+
+	* src/main/java/de/intevation/gnv/transition/Transition.java:
+	  Removed some needless Methods that were not longer Required
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java
+	(advance), src/main/java/de/intevation/gnv/transition/SingleInputTransition.java
+	(purifyResult),	src/main/java/de/intevation/gnv/transition/MinMaxTransition.java
+	(purifyResult),	src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java
+	(extractKVP), src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java
+	(describe), src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java
+	(describe), src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java
+	(describe), src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java
+	(describe), src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (uuid):
+	Lookup the Results from ehcache and centralize the Lookup to one methode.
+
+2009-10-23  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/queries.properties:
+	  Optimized Query horizontalprofile_instantaneouspoint_cruise because it is not warranted
+	  that the name of an cruise is set. issue60
+
+2009-10-22  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java
+	(extractKVP): Added the possiblility to fetch an further Column with
+	the alias Value to display it together with the Coordinatevalues
+
+	* doc/conf/queries.properties:
+	  Added the Coordinates to an Measuementpoint to display it.
+
+	* doc/conf/products/verticalprofile/conf_instantaneouspoint.xml:
+	  Change TransitionType for displaying Coordinatevalues aditionaly to
+	  the Time of an Measurement
+
+2009-10-22  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 40: Instantiation of artifacts slow
+
+	* doc/conf/conf.xml, doc/conf/products/*/conf_*.xml:
+	  Split the Configuration of the ArtifactDatabase in several Configurationfiles.
+	  For Each Product-Artifact one single File to make it easier to administer the System.
+
+	* src/main/java/de/intevation/gnv/transition/TransitionFactory.java (createTransition),
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java (setup),
+	  src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java (setup),
+	  src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (setup):
+	  Lookup of XML-Attributes was changed from XPath-lookup to direct
+	  Access on the fetched Element to speed up the Artifactinstantiation issue40
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (getConfigurationFragment):
+	  Read Configuration information for the Productartifact from a separat folder if an xlink:href
+	  Attribute exists in tne Configurationnode of the Artifact.
+	  This was inserted to speed up the Artifactinstantiation and to split the Configuration
+	  in several Configurationfiles that where smallaer issue40
+	  Also the lookup of XML-Attributes was changed from XPath-lookup to direct
+	  Access on the fetched Element
+
+2009-10-21  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 59: Added relative pathnames to central config document
+
+	* doc/conf/conf.xml:
+	  Added relative locations for further required configurationfiles . issue59
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java (createArtifactContext):
+	 Added the prossibility to configure the location of required configurationfiles not absolute. issue59
+
+2009-10-21  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf/arcsdeconnectionpool.properties:
+	  Added separat ConnectionPoolProperties to this Project.
+	* doc/conf/*:
+	  Moved ConfigurationFiles from src/test/ressources to doc/conf
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (configurationDir):
+	  Changed Configuration Folder to doc/conf
+
+2009-10-20  Tim Englich  <tim.englich@intevation.de>
+
+	* doc/conf:
+	Added Folder for the Configuration of the gnv-artifacts.
+
+2009-10-20  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalCrossSectionMeshArtifact):
+	  Added Testcase for testing the Workflow for generating VerticalCrossSections.
+	* src/test/ressources/queries.properties:
+	  Added the required Queries for providing VerticalCrossSection using Meshes.
+	* src/test/ressources/conf.xml:
+	  Added the Configuration for an VerticalCrossSection using Meshes.
+	* src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_*.xml:
+	  Adding Requestdocuments for testing the Workflow of Generating an VerticalCrossSection.
+	* src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java :
+	  Added an OutputTransition for renedering the Data of VerticalCrossSections.
+	* src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java:
+	  Added Class for the Representation of VerticalCrossSection Artifacts into the Project.
+	* src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChartFactory.java (createProfileChart):
+	  Put Class-Sub for the Chart generation of VerticalCrossSections into the Project.
+
+2009-10-20  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 54: Errors in diagramms for time series in IMIS
+
+	* src/test/ressources/queries.properties:
+	Bugfix for TIMESERIESPOINT the first and the last value weren't used
+	in the Query which was integrated from the Prototyp to the Project
+	ussue54
+
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 55: Harmoization of coordinate values for input fields
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe):
+	Added uniform Visualization of Single Input-Elements to MinMax-Elements. issue55
+
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 56: Error - Behavior of a form without constraint values
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (feed):
+	  Catch Exception that the Calling Program could not put no InputData
+	  into the feed Request.issue56
+
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 19: Validation of date and double values
+
+	* src/main/java/de/intevation/gnv/chart/ChartFactory.java (createDataset),
+	  src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java (createDataset):
+	  Adding empty Series into Chart to prevent NPE issue 19
+
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 35: Wrong date values force the panel to start from beginning
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (putInputData):
+	  Correct misspelled Exception-Message as an Result of fixing issue35
+
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 50: Adding the layer number for depth information
+
+	* src/test/ressources/queries.properties:
+	  Changed the Value of Layer and Depth range visualization of Meshes
+	  according to issue50
+
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 47: Translation of strings for time series
+
+	* src/main/resources/lang/artifactMessages*.properties:
+	  Changed the displayed-Values as defined in issue47
+	* src/test/ressources/conf.xml:
+	  Changed the Key for the DataName of MIN-Max-Transitions to put a propper Name
+	  into the UI-Describeoutput issue47
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe):
+	  Added the X-Forms-Group-Element to surround the MinMaxDescibeObject-output to Give the
+	  Group of Objects a propper Name issue47
+	* src/main/java/de/intevation/gnv/transition/MinMaxTransition.java (purifyResult):
+	  Added the name of the Data to the MinMaxDescibeObject to put it into the UI-output
+
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 53: Changing of strings in parameter panel
+
+	* src/test/ressources/timeseries_mesh/timeseries_step_05_feed.xml:
+	  src/test/ressources/conf.xml:
+	  src/main/resources/lang/artifactMessages*.properties:
+	  Conformation to the tanslation of the MeshObjects  issue53
+
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 49: Integration of FIS to Meshes
+
+	* src/test/ressources/queries.properties:
+	  There are different FIS in the Relation Median.Mesh so it is
+	  nessessary to sepcify which FIS should be selected by using the sourceid
+	  issue49
+	* src/test/ressources/conf.xml:
+	  Adding two further FIS to the Configuration which are based on Meshes.
+	  Added the Sourceid to the ModelData issue49
+	* src/main/resources/lang/artifactMessages*.properties:
+	  Adding the Names of the two new FIS to the  Propertiesfiles issue49
+
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java (createXYSeries):
+	  Adding 5% bigger Valuearea to the Chart according to GT0030.011
+
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (VerticalProfileOutputTransition):
+	  Changed Domainlable for Verticalprofiles according to the Specification GT_0030.005
+	* src/test/java/de/intevation/gnv/artifacts/util/DistanceCalculatorTestCase.java (testDistanceCalculator):
+	  Added Testcase for the DistanceCalculation
+	* src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java (createXYSeries):
+	* src/main/java/de/intevation/gnv/utils/DistanceCalculator.java (calculateDistance):
+	  Added Calculation of the Distance in the unit km for Geodetic-Coordinates according to the Specification GT_0030.005
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java (HorizontalProfileOutputTransition):
+	  Changed Domainlable for Horizintalprofiles according to the Specification GT_0030.005
+
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties:
+	  The Levelnumber of Meshes will also be visualized in the choose of depth GT_0020.0020
+
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/conf.xml:
+	  Added Coordinate-Values to Title of the TimeseriesDiagramm for Meshes
+
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java (putInputData):
+	  Bugfix ChartValues were not Recalculated after feed was called second Time.
+
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/conf.xml:
+	  Bugfix in MinMaxTransition the Maxvalue was not the correct Value.
+
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 38: Horizontal profiles: Visualization of distances in km
+
+	* src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java (convert2DisplayCoordinate):
+	  Added Transformation from WKT-Coordinate Reperesentation to BSH-Coordinate Representation. issue38
+
+2009-10-15  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java,
+	src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java,
+	src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java,
+	src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java,
+	src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java,
+	src/test/ressources/queries.properties, src/test/ressources/conf.xml:
+	Added missing Class Description Values to the Horizontal Profile Charts
+
+2009-10-15  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (getFisName):
+	  Added Method for lookup FIS Names
+	* src/main/resources/lang/artifactMessages*.properties:
+	  Added further Key-Value-Pairs for FIS
+	* src/test/ressources/conf.xml:
+	  Changed Configuratioon to get the ID of an FIS to the Chartgeneration
+
+2009-10-15  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileMeshPointArtifact):
+	  Activate Tests for CSV and Statistics on HorizontalProfiles
+
+	*
+	src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java
+	(createCSV),
+	src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java
+	(createCSV):
+	Integrated special CSV-Export for HorizontalProfiles
+
+2009-10-14  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java (createXYSeries):
+	  Load WKT from ResultSet and calculate Distance to last point.
+	* src/test/ressources/queries.properties:
+	  Switch Chart-Queries to Spatial-Queries.
+
+2009-10-13  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 33: Improved logging for time-interval queries
+
+	* src/test/ressources/queries.properties,
+	  src/test/ressources/conf.xml:
+	  Added Parameter-Usage in Time-Interval-Query ISSUE-33
+
+2009-10-13  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/verticalprofile_mesh/verticalprofile_step_*_feed.xml,
+	  src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_*_feed.xml:
+	  Switched to Szenario where it is possible to select Data using the Coordinate.
+	* src/test/ressources/conf.xml,
+	  src/test/ressources/queries.properties:
+	  Switched to SFS-Conformant-Queries in HorzintalProfile- and VerticalProfile-Mesh
+
+2009-10-13  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/resources/lang/artifactMessages_*.properties:
+	Switched to better Description of an Coordinate-Input-Field
+
+	* src/test/ressources/timeseries_mesh/timeseries_*_feed.xml:
+	Switched to Szenario where it is possible to select Data using the Coordinate.
+
+	* src/test/ressources/queries.properties, src/test/ressources/conf.xml:
+	Switched to SFS-Conformant-Queries in Timeseries-Mesh
+
+	* pom.xml:
+	Added dependency to JTS 1.9
+
+	* src/main/java/de/intevation/gnv/utils/exception/ValidationException.java
+	(ValidationException), src/main/java/de/intevation/gnv/utils/InputValidator.java
+	(getPointValue), src/main/java/de/intevation/gnv/transition/TransitionBase.java
+	(prepareInputData4RegionDBQuery):
+	Added the Support for specialized Handling of InputValues of type Coordinate.
+
+	* src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java:
+	Added Transition for the Support of Coordinateinput handling.
+
+2009-10-12	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java:
+	Closed small file descriptor leak.
+
+2009-10-09  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/**/*.java Edited:
+	Code Formatting and Cleanup.
+
+2009-10-09  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties Edited:
+	  Add Parameters to the Queries to select only the Dates where
+	  the Parameters has been measured.
+	* src/test/ressources/conf.xml Edited:
+	  Set that the ParameterIds should be used in the Query of the Dates.
+
+2009-10-07	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	RELEASE 0.1
+
+	* Changes, NEWS: Summarized changes.
+
+2009-10-06  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java (HorizontalProfileOutputTransition) Edited :
+	  Switch Lable-Value for Domain-Axis.
+	* src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java (getRessource) Edited:
+	  Added missing Import
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java (advance) Edited:
+	  Added i18n Support
+	* src/main/resources/lang/artifactMessages*.properties Edited:
+	  Added some missing RessourceValues
+
+2009-10-06	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_out_csv.xml,
+	  src/test/ressources/conf.xml,
+	  src/test/ressources/timeseries_mesh/timeseries_step_07_out_csv.xml,
+	  src/test/ressources/verticalprofile_mesh/verticalprofile_step_06_out_csv.xml,
+	  src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_08_out_csv.xml,
+	  src/test/ressources/verticalprofile/verticalprofile_step_04_out_csv.xml:
+	  s@test/plain@text/plain@g to correct MIME type of CSV export
+
+2009-10-06	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/ressource/*.properties:
+	Deleted.
+
+	* src/main/resources/lang/*.properties: Re-inserted here. Maven now
+	includes them in the jar package.
+
+	* src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java:
+	Make code more robust. TODO: We need a better implementation here.
+
+	* Changelog -> ChangeLog: To make eclipse happy. Unified changelog style.
+
+	* pom.xml: xmllint-ed and set encoding of filtered resources to UTF-8
+
+2009-10-06  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties Edited:
+	  Bugfix in Query for getting Data for the Output.
+	  Now the Values will be sorted Correcly. Timevalue
+	  has been removed from the Query because it is not a
+	  Parameter which could be choosen from the User.
+	  Also dummies for XCOORD-Value and YCOORD-Value integrated so
+	  that is now Possible to visualize the Profile
+	  gnv/issue21
+
+2009-10-05	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/ressource/artifactMessages*.properties Edited:
+	  Added further Ressourec Values.
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileInstantaneousPointArtifact) Edited:
+	  Changed ArtifactName to real FIS.
+	* src/test/ressources/timeseries_mesh/timeseries_step_01_feed.xml Edited:
+	  Changed Product-Name from timeSeriesMesh to timeSeries to provide a General-Naming-Structure
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (setup) Edited,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java Edited,
+	  src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java Edited:
+	  Added Configurationsupport for the Labeling Data. Now it is possible do define the
+	  value-names in the Configurationfile.
+	* src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_feed.xml Edited,
+	  src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_02_feed.xml Edited,
+	  src/test/ressources/queries.properties Edited:
+	  Changed the Queries for the VerticalProfileInstantaneusPoint to the FIS-Query Mode.
+	  This Mode was send by Mr. Schulz-Ohlberg.
+	* src/test/ressources/conf.xml:
+	  Changed the Workflow for the VerticalProfileInstantaneusPoint to the FIS-Query Mode.
+	  This Mode was send by Mr. Schulz-Ohlberg.
+	  Also Added the support for value-names to the Configuration of VerticalProfileInstantaneusPoint.
+
+2009-10-05	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/ressource/artifactMessages_en.properties Renamed:
+	  Renamed from artifactMessages_en_EN.properties to artifactMessages_en.properties to get a
+	  propper support for PreferedLocale
+	* src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java (getRessource) Edited,
+	* src/test/java/de/intevation/gnv/artifacts/ressource/RessourceFactoryTestCase.java (setUp) Edited,
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe) Edited,
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (createSelectBox) Edited:
+	  Changed Method Signature from Locale to PreferedLocale[] to put all Useable Languages to
+	  the RessourceFactory
+
+2009-10-02	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/ressource/RessourceFactoryTestCase.java Added:
+	  TestCase for Testing the RessourceFactory
+
+	* src/main/java/de/intevation/gnv/artifacts/ressource/artifactMessages*.properties Added,
+	  src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java Added:
+	  Added Factory and Propertiesfiles for getting the localized Values
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Edited,
+	  src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java Edited,
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited,
+	  src/main/java/de/intevation/gnv/transition/Transition.java Edited,
+	  src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Edited,
+	  src/main/java/de/intevation/gnv/transition/OutputTransition.java Edited,
+	  src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited,
+	  src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java Edited,
+	  src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java Edited,
+	  src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited:
+	  LanguageSupport Integrated
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (createCallContext) Edited:
+	  Extracted Method and Put CallMeta with Language German to the CallContext. Otherwise
+	  TestCase will produce NPEs.
+	* src/test/java/de/intevation/gnv/artifacts/TestCallContext.java Edited:
+	  Added Real CallMeta to the Method for usage in Artifacts. Otherwise
+	  TestCase will produce NPEs.
+	* src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_feed.xml Edited,
+	  src/test/ressources/timeseries_mesh/timeseries_step_02_feed.xml Edited,
+	  src/test/ressources/verticalprofile_mesh/verticalprofile_step_02_feed.xml Edited,
+	  src/test/ressources/conf.xml Edited:
+	  Changed som Identifiers for Localisation.
+
+2009-10-02	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/conf.xml Edited:
+	  Added the Configuration of the Horizontal-Profile.Mesh.
+	  Also Edited the Workflowq for HorizontalProfile-Instantaneouspoint and
+	  Put three n ew FIS into the Configuration which represents HorizontalProfile-Instantaneouspoint.
+	* src/test/ressources/horizontalProfile_instantaneouspoint/*.xml Edited,
+	  src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileInstantaneousPointArtifact) Edited:
+	  Edited the Workflowlogic given by new Specification of the BSH.
+	* src/test/ressources/horizontalProfile_mesh/*.xml Added:
+	  The Request for do an Workflow for an HorizontalProfile-Mesh
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileMeshPointArtifact) Edited:
+	  Added TestCase for HorizontalProfiles of Type Mesh.
+	* src/test/java/de/intevation/gnv/artifacts/TestCallContext.java (getMeta) Edited:
+	  Added new Method which is defined in the implemented Interface.
+	* src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid) Edited:
+	  Added the Validation of InputValues from Type AttributeName which should represent
+	  an QueryValue of Type String which must not put into "'".
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java Added:
+	  Transition to provide the possibility of choosing the axis of an Grid that should be used.
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (dataMultiSelect) Edited:
+	  Changed from private to protected so that this mMeber could be accessed by within extending Classes.
+	* src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshArtifact.java Added:
+	  Class for the Representation of Horizontal Profiles for the Type Mesh.
+	* src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java (HorizontalProfileChartFactory) Edited:
+	  Changed PlotOrientation so that the Profile is displayed correctly.
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (advance) Edited:
+	  Added Log-Message for better Workflowanalyzis.
+
+2009-10-01	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java,
+	src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java,
+	src/main/java/de/intevation/gnv/utils/ArtifactFactoryUtilities.java,
+	src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java,
+	src/main/java/de/intevation/gnv/transition/MinMaxTransition.java,
+	src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java,
+	src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java:
+	Removed needless imports.
+
+	* src/main/java/de/intevation/gnv/utils/InputValidator.java:
+	Import org.apache.commons.validator.GenericValidator instead of
+	absolute usage in methods.
+
+2009-09-30	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties Edited:
+	  Added the Queries for HorizontalProfiles of InstantaneousPoints.
+	* src/test/ressources/conf.xml Edited:
+	  Added the Configuration for HorizontalProfilArtifact for InstantaneousPoints
+	* src/test/ressources/horizontalProfile_instantaneouspoint/*.xml Added:
+	  Added XML-Requests for the TestCase of HorizontalProfiles of InstantaneousPoints.
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileInstantaneousPointArtifact) Edited:
+	  Added TestCase for HorizontalProfiles of InstantaneousPoints.
+
+2009-09-30	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid) Edited:
+	  Added the Validation for Double-Values.
+	* src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (createChart) Edited:
+	  The Name of the Method for generaing Charts has changed.
+	* src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java Added:
+	  New outputTransition for HorizontalProfiles
+	* src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java Added:
+	  Class which calculates the Statistics for Horizontal Profiles.
+	* src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileInstantaneousPointArtifact.java Added,
+	* src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java Added:
+	  Classes which represents HorizontalProfileArtifacts
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java (plotOrientation) Edited:
+	  Added Member for the representation of the Plotorientation to overwrite it in
+	  extende Classes
+	  Rename Method for generatim the Charts in a common Name.
+	* src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java Added:
+	  Class for drawing Horzontal Profiles
+
+2009-09-30	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/test/ressources/conf.xml: s@test/xml@text/xml@g
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (doNextStep) Edited:
+	  Add Responsevalidation for feed-Requests.
+	* pom.xml Edited:
+	  Add required Library ORO to the Dependencies which is required by Commons-Validator
+	  to do matchRegexp Requests.
+	* src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid) Edited:
+	  Add a Validator for the type Point
+	* src/test/ressources/conf.xml Edited:
+	  Changed mesh_coordinate from type Integer to type Point
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java (findValueTitle):
+	   Key of KeyValueDescribeData is a String. So it is not nessessary to parse the
+	   id into an Integer Value.
+	   Also some NP-Access removed.
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited:
+	  Some Coderedundances refactored.
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties Edited:
+	  Bug fixed: Mesh TimeSeries will now Handle Charts with multiple Depth-Values properly.
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/timeseries_mesh/*.xml Added :
+	  TestCaseRequests for Timeseries FIS Mesh
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesMeshArtifact) Edited:
+	  Add Testcase for Timeseries Mesh
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (check4ExceptionReport) edited:
+	  ExceptionTest for Responsdocuments added.
+	  UnitTest will now fail if the Artifact delivers an ExceptionReport using the advance Request.
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileMeshArtifact) Edited:
+	  Added TestCase for Vertical Profiles for Mesh
+	* src/test/ressources/verticalprofile_mesh/*.xml Added:
+	  TestCaseRequests for VerticalProfile FIS Mesh
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid) Edited:
+	  Bugfix: Remove leading- and trailingwhitspaces from Date- and Integervalues
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileArtifact):
+	(testVerticalProfileInstantaneousPointArtifact) Edited:
+	 Added Testcases for VerticalProfile and VerticalProfile Instantaneouspoint
+	* src/test/ressources/verticalprofile_instantaneouspoint/*.xml Added:
+	   TestCaseRequests for VerticalProfile Instantaneouspoint
+	* src/test/ressources/verticalprofile/*.xml Added:
+	  TestCaseRequests for VerticalProfile FIS Marnet
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties Edited:
+	  Remove to_date from TimeSeries-Quueries becaus of Changes in the conf.xml-File
+	* src/test/ressources/conf.xml Edited:
+	  Correct Types for min- and max-Values from Integer to Date
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesArtifact) Edited:
+	  Add CallContext to the Tests.
+	* src/test/java/de/intevation/gnv/artifacts/TestCallContext.java Add:
+	  A CallContext used only in Junit-Tests
+
+2009-09-29	Tim Englich	<tim.englich@intevation.de>
+
+	* pom.xml Edited:
+	  Added the dependency to Apache-Commons-Validator Version 1.3.1 which is
+	  used for the InputValoue-validation.
+	* src/main/java/de/intevation/gnv/utils/InputValidator.java Added :
+	  An InputValidator for Validating InputValues.
+	  At this Moment only Integer, String and Date is supported.
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (putInputData) Edited:
+	  Add the InputValidator to validate the incomming Values from the Clients.
+
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/ChartFactory.java (createTimeSeries) Edited:
+	  Performanceimprovement: The Loop will be interrupted if the Pointer is bigger than the
+	  last Pointer of the Value that must be visualised.
+
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* pom.xml Edited:
+	  Added the Dependeny to the ehcache-Library
+	* src/test/ressources/ehcache.xml Added:
+	 The ehcache-Configuration.
+	* src/test/ressources/conf.xml Edited:
+	  Added the Link to the ehcache-Configuration.
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java (createArtifactContext) Edited:
+	  Added the Initialisation of the CacheManager.
+
+	* src/main/java/de/intevation/gnv/artifacts/cache/CacheFactory.java Added:
+	  An Fractoryimplementation for the central access to the Cache.
+
+	* src/main/java/de/intevation/gnv/transition/MinMaxTransition.java (purifyResult) Edited,
+	* src/main/java/de/intevation/gnv/transition/SingleInputTransition.java (purifyResult) Edited,
+	* src/main/java/de/intevation/gnv/transition/Transition.java Edited,
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited,
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited:
+	  Signature of Methods purifyResults, advanced and feed Changed to put the uuid to the Transition
+	* src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (createChart) Edited:
+	  Methodsignatur of getChartResult change for putting the uuid of an Artifact into it
+	* src/main/java/de/intevation/gnv/transition/OutputTransition.java (out) Edited,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out) Edited:
+	  Method Signature Changed for putting the uuid of an Artifact to the Transition.
+	  stored
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Edited:
+	  removed the persitence of the Chartresults and put them into an Cache instance.
+
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (getStatisticsGenerator) Edited:
+	 Extracted the Instantiation of the Statistics-object to an protected Methode
+	 to make it possible that extending Classes could change it.
+	* src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (getStatisticsGenerator) Edited:
+	Overwrite  getStatisticsGenerator to instantiate the VerticalProfileStatistics-
+	* src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java Added:
+	  Class for Calculating Statistics for VerticalProfiles- The Only thing whisch differs to
+	  TimeSeriesStatists is that the XoordinateValue is an double and not an Date-Value
+	* src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java (calculateXOrdinateValue) Edited:
+	 Added the Methode calculateXOrdinateValue to this Class to switch is Values in extending Classes.
+	* src/main/java/de/intevation/gnv/statistics/Statistics.java (calculateStatistics) Edited:
+	  Added methodsignature to Interface for usage in different Implementations of Statistics.
+
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java (calculateStatistics) Edited:
+	  Bug fixed. Now all Values will be used to calculate the Statistics
+
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/conf.xml Edited :
+	  Changed the Output-format of Statistics from text/plain to text/xml.
+
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java Edited:
+	  Moved the calculating-Methods from the Conmstructor to an separat Method.
+	  Switched the ResultContainer from Array to Collection
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out) Edited:
+	  Added the Output-Variante for generating Statistics
+
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* pom.xml Edited:
+	  Added Link to Apache-Commons-Math to get the required Classes for the calculation
+	  of Statistics.
+	* src/main/java/de/intevation/gnv/statistics/exception/StatisticsException.java Added:
+	  Specified ExceptionClass for the Statistics Part of the gnv-artifacts
+	* src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java Edited:
+	  Remove compileErrors and switch to new Datastructure
+
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/statistics/Statistic.java Added ,
+	  src/main/java/de/intevation/gnv/statistics/Statistics.java Added ,
+	  src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java Added:
+	  Imported Statistics-Classes from old Project. Revision: 3101 Does not compile
+
+2009-09-25	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/conf.xml Edited:
+	  Added with and height Inputparameter to each Chart-OutputMode.
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out) Edited:
+	 Added the usage of the Parameters revieved from the client for the ChartRendering
+
+	* src/main/java/de/intevation/gnv/transition/DefaultInputValue.java (DefaultInputValue) (getDefaultValue) Edited ,
+	  src/main/java/de/intevation/gnv/transition/InputValue.java (getDefaultValue) Edited:
+	  Added the Method getDefaultValue to the Interface for getting the
+	  deafultvalue of an Parameter.
+
+	* src/main/java/de/intevation/gnv/transition/DefaultOutputMode.java Edited,
+	 src/main/java/de/intevation/gnv/transition/OutputMode.java (getInputParameters) Edited:
+	  Added the Method  getInputParameters to the OutputMode for Handling the required Parameters
+	  of an OutputMode.
+
+	* src/main/java/de/intevation/gnv/transition/OutputTransition.java (out) Edited:
+	  Put the InputParameter recived from the Client to the Methodsignature so that
+	  they can be used during the outputprocessing.
+
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Edited:
+	  Read rquired Outputparameters from the Configuration
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited:
+	  Added support for Parameters in OutputNode of Describe-Artifact
+
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* pom.xml Edited:
+	  Added Library for CSV-Support
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out) Edited:
+	  Add support for CSV-Export
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (out) Edited:
+	  Add Fag on Context for storing the Artifact status after out.
+
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java (createSuccessReport) Edited:
+	  Added a centraL Method for creating an Successreoprt.
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited,
+	  src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited:
+	  Add ResultReporting to the different Metshods of an Artifact
+
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java Edited:
+	 Obsolet TODOs removed
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited,
+	  src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited,
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited:
+	  Create Exception Report added
+	* src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java (createExceptionReport) Edited:
+	  Method for creating Exceptionreports added.
+
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties Edited:
+	  Queries formatted so that they can be analysed and extended easier.
+	  Some Bugs removed
+
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java  Edited,
+	  src/main/java/de/intevation/gnv/chart/ChartLabels.java Edited,
+	  src/main/java/de/intevation/gnv/chart/ChartFactory.java Edited:
+	  Removed obsolet Parameters an Methods.
+	  Use the ChartLable to put the DomainAxisLable into the Chart.
+
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Edited:
+	  Some more Loggingoutput integrated.
+	  Some Performanceimprovements done. The ResultData will only be refreshed if
+	  the InputValues has changed.
+	  Some Refactoring Work done. Move some Members into from extending Classes
+	  into this implementation.
+	* src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java Edited,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Edited:
+	 Dummywerte fuer Diagrammgenerierung durch Echtwerte ersetzt.
+	 Obsolete Uebergabeparameter entfernt.
+
+2009-09-23	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties Edited:
+	  Statements for InstantaneousPoint Vertical Profiles added
+	* src/test/ressources/conf.xml Edited:
+	  Configuration for Vertikal Profiles for InstantaneousPoints added
+	* src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileInstantaneousPointArtifact.java (VerticalProfileInstantaneousPointArtifact) Added:
+	 New Artifact-Class Reperesenting Artifacts for InstantaneousPoints Creating VerticalProfiles added.
+
+2009-09-23	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (prepareInputData4DateDBQuery) Edited:
+	  Bug Fixed, now all Inputvalues of String and Date will be put into the Query
+
+2009-09-23	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java (createXYSeries) Edited:
+	  Bug fixed. Now all Values will be Renderd to the Chart
+	* src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileMeshArtifact.java Added:
+	  Artifact-class for VerticalProfile Mesh added
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited:
+	  Support for StringQuieries and OracleDateQueries added
+	* src/test/ressources/queries.properties Edited:
+	  Queries for VerticalProfile Mesh integrated
+	* src/test/ressources/conf.xml Edited:
+	  Artifact for VerticalProfile Mesh integrated
+
+2009-09-22	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties Edited:
+	  Added Queries for the Workfloe of collecting the
+	  required Information to generate a vertical Profile
+	* src/test/ressources/conf.xml Edited:
+	  Added the Configuration of the VerticalProfileArtifact
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (getCollection) Edited:
+	  Some Codrefactoring done for reuse of Functionality in extended Classes.
+	* src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java Added:
+	Outputtransition for the Support of VerticalPropfiles
+	* src/main/java/de/intevation/gnv/transition/describedata/KeyValueDescibeData.java (getKey),
+	  src/main/java/de/intevation/gnv/transition/describedata/DefaultKeyValueDescribeData.java (getKey) Edietd,
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java (purifyResult) Edited:
+	 Change KEY-Attribute of KeyValueDescribeData from Integer to String for the required
+	 Representation of Date-KeyValue-Pairs
+	* src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java Added:
+	 ArtifactClass for the representation of VerticalProfiles
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (createSelectBox) Edited:
+	  Added support for selected Products in static UI.
+	* src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java Added:
+	  Factory for producing VerticalCharts added.
+	* src/main/java/de/intevation/gnv/chart/ChartFactory.java Edited:
+	  Names of Getter for Columns Changed.
+
+2009-09-21	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/queries.properties Edited:
+	 Queryie for TimeSeriesMesh added.
+	* src/test/ressources/conf.xml Edited:
+	  New Artifact representing the TimeSeries-Mesh added to the Configuration.
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Edited:
+	 Inputdata for the Chartgeneration will now be allocated by name and not by position in Transitionorder.
+	* src/main/java/de/intevation/gnv/transition/describedata/SingleValueDescribeData.java Added,
+	  src/main/java/de/intevation/gnv/transition/describedata/DefaultSingleValueDescribeData.java Added,
+	  src/main/java/de/intevation/gnv/transition/SingleInputTransition.java Added:
+	  New Class for Representing a single Input Transition
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited:
+	  Added support of usage inputValues none or multiple times in Queries.
+	  Added support for SingleInputTransitions in Describe-Output
+	* src/main/java/de/intevation/gnv/transition/InputValue.java Edited,
+	  src/main/java/de/intevation/gnv/transition/DefaultInputValue.java Edited:
+	  An InputValue now is possible to use none or multiple times in Queries.
+	* src/main/java/de/intevation/gnv/timeseries/TimeSeriesMeshArtifact.java Added:
+	  ArtifactClass for the Representation of an Mesh-Timeseries-Artifact
+
+2009-09-17	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/conf.xml Edited:
+	  Database Cleanup Interval set to 5 minutes.
+
+2009-09-17	Tim Englich	<tim.englich@intevation.de>
+	* src/test/ressources/conf.xml Edited:
+	  Some structurechanges done.
+
+	* src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java Edited:
+	  Fixed Bug supporting UTF-8 Documents properly.
+	* src/main/java/de/intevation/gnv/transition/describedata/DefaultKeyValueDescribeData.java Edited,
+	* src/main/java/de/intevation/gnv/transition/describedata/KeyValueDescibeData.java Edited,
+	 Added Methods for setting and getting the selection-state of this objects.
+
+	* src/main/java/de/intevation/gnv/transition/describedata/DefaultMinMaxDescribeData.java Edited,
+	  src/main/java/de/intevation/gnv/transition/describedata/MinMaxDescribeData.java Edited:
+	  Added setter for min an max-Values and getters an setters for minName  and maxName
+
+	* src/main/java/de/intevation/gnv/transition/describedata/NamedCollection.java Added,
+	  src/main/java/de/intevation/gnv/transition/describedata/NamedArrayList.java Added:
+	  Collection ans an Implementation of this Collection for Storing Name of the Collection and if
+	  the Values in it are multiselectable.
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java :
+	 Static UI-Support and valid SelectionStorage added.
+	 I added also an imporvement of the multiselect Methods for Datasets
+	* src/main/java/de/intevation/gnv/transition/MinMaxTransition.java Edited:
+	  Storage of changed Values added
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited:
+	  Static UI Support Added
+
+
+2009-09-16	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/conf.xml Edited,
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe) Edited,
+	  src/main/java/de/intevation/gnv/transition/InputValue.java (isMultiselect) Edited,
+	  src/main/java/de/intevation/gnv/transition/InputData.java (concartValue) Edited,
+	  src/main/java/de/intevation/gnv/transition/DefaultInputValue.java (isMultiselect) Edited,
+	  src/main/java/de/intevation/gnv/transition/DefaultInputData.java (concartValue)Edited,
+	  src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (createUserInterface) Edited,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (parseInputData) Edited:
+	   Added Multiselectsupport for InputValues
+
+2009-09-16	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (setup) Edited:
+	  Bug Fixed because of Infrastructure Changes in the Artifact-Module
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited:
+	  Put only the last DescribeData to the UI-Output bnecause auf Renderingproblems in the Client
+
+	* src/main/java/de/intevation/gnv/transition/describedata/DefaultKeyValueDescribeData.java Edited,
+	  src/main/java/de/intevation/gnv/transition/describedata/DefaultMinMaxDescribeData.java Edited,
+	  src/main/java/de/intevation/gnv/transition/describedata/KeyValueDescibeData.java Edited:
+	  Made Interface Serializable, add UIDs to the Implementations of the Interface
+
+2009-09-15	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (createUserInterface) Edited:
+	  Integrate UI-Representation for Describe into the FISArtifact.
+	* src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java (createXFormElement) Refactoring,
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe) Refactoring:
+	  Extract the Element-Creation of XForms Nodes into a Common Class to make them available for
+	  other Classes which have to create XForm-Fragments
+
+2009-09-14	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/Transition.java Edited,
+	  src/main/java/de/intevation/gnv/transition/InputData.java Edited,
+	  src/main/java/de/intevation/gnv/transition/OutputMode.java Edited,
+	  src/main/java/de/intevation/gnv/transition/InputValue.java Edited,
+	  src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java Edited,
+	  src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java Edited,
+	  src/main/java/de/intevation/gnv/transition/describedata/DescribeData.java Edited:
+	  Make the Interfaces Serializable to make them usable in the Artifactdatabase
+
+2009-09-14	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited,
+	  src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Edited,
+	  src/main/java/de/intevation/gnv/transition/OutputTransition.java Edited ,
+	  src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited,
+	  src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited:
+	  Refactoring Work depending on Infrastructurchanges in the Artifact-Module
+
+2009-09-10	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited,
+	  src/test/ressources/timeseries/timeseries_step_01_feed.xml Edited,
+	  src/test/ressources/timeseries/timeseries_step_01_advance.xml Edited,
+	  src/test/ressources/conf.xml Edited:
+	  TestCase moced from TimeSeriesArtifact to FISArtifact. Used FIS: Marnet
+
+2009-09-10	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java Added:
+	  Utilities-Class for some XML-Stuff that is only for gnv-artifacts
+
+	* src/main/java/de/intevation/gnv/utils/ArtifactFactoryUtilities.java Added:
+	 Factory to Instantiiate an ArtifactFactory (TODO: Should be moved to Artifact-database)
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java Added,
+	  src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java Added:
+	  Interfcaedefinition and Defaultimplementation for the Representation of the different
+	  Products in an FIS.
+
+	* src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Added:
+	  Artifact to Repersent an FIS. This Artifact is able to switch between different
+	  SubArtifacts for handling the different Products  of an FIS.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited:
+	  Refactoring Work done because of changes in the artifact-modules
+
+2009-09-10	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited,
+	  src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited:
+	  Refactoringwork done because of changes in the artifact-module
+
+2009-09-10	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited:
+	  src/test/ressources/conf.xml Renamed:
+	  Project Structure changed in artifact-database. So we have to rename
+	  the Testconfigurationfile in conf.xml.
+
+	* src/test/ressources/results Added:
+	  Integrated Folder for temporal storing Resultfiles of the TestCases
+
+	* src/test/ressources/queries.properties Edited:
+	  Further Queries for Testcases integrated
+	* src/test/ressources/timeseries/timeseries_step_05_out.xml Added,
+	  src/test/ressources/timeseries/timeseries_step_05_feed.xml Added:
+	  Integrated the last step of the TimeSeries-Workflow.
+	  Now the TestCase is able to render Charts.
+
+	* src/test/ressources/timeseries/timeseries_step_04_feed.xml Edited,
+	  src/test/ressources/timeseries/timeseries_step_03_feed.xml Edited:
+	  Names of the feed-Parametes changed to the Syntax of BSH-Spelling
+
+2009-09-09	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java:
+	  Chart Rendering completed with some Fixes to do
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java:
+	  Integrated usage of KeyValueDescibeData
+	* src/main/java/de/intevation/gnv/transition/OutputTransition.java (getOutputModes):
+	 Errorhandling integrated
+	* src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited,
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited:
+	Refactored out-Method from Extending Class
+
+2009-09-09	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/exception/TechnicalChartException.java Added,
+	  src/main/java/de/intevation/gnv/chart/ChartFactory.java Edited:
+	  Refactoring of the ChartFactory so that it colud be use and it is possible to compile
+	  this class.
+
+	* src/main/java/de/intevation/gnv/transition/describedata/KeyValueDescibeData.java Added,
+	  src/main/java/de/intevation/gnv/transition/describedata/DefaultKeyValueDescribeData.java Added:
+	  Added an new Representation of Describedata for Key Value Pairs using for the Parameter Lists
+	  of the Transitions an put it into the Chartgeneration
+
+2009-09-09	Tim Englich	<tim.englich@intevation.de>
+
+	* pom.xml Edited:
+	Added JfreeChart Dependency to pom-file
+
+2009-09-09	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/chart/Insets.java Added,
+	  src/main/java/de/intevation/gnv/chart/ChartStyle.java Added,
+	  src/main/java/de/intevation/gnv/chart/ChartLabels.java Added,
+	  src/main/java/de/intevation/gnv/chart/ChartFactory.java Added:
+	  Insert Chart-Classes from OLD-Repository Revision: 3101 Does not compile
+
+2009-09-09	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Added:
+	  The specifed OutputTransition for the Product TimeSeries.
+
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited:
+	  Integration of the OutputModes in the DescriberesultDocument.
+
+	* src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Added,
+	  src/main/java/de/intevation/gnv/transition/OutputTransition.java Added:
+	  The Interface and the abstract Basicimplementation of an Transition which
+	  can produce different outputs.
+
+	* src/main/java/de/intevation/gnv/transition/DefaultOutputMode.java Added,
+	  src/main/java/de/intevation/gnv/transition/OutputMode.java Added:
+	  Interfacestructur and Defaultimplementation for the Representation of the
+	  Different OutputModes given in an Artifact.
+
+2009-09-09	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe) Edited:
+	  Changed DateoutputFormat from German- to Anericanstyle
+
+2009-09-09	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/timeseries/timeseries_step_04_feed.xml Added,
+	* src/test/ressources/timeseries/timeseries_step_04_advance.xml Added:
+	  Two more ArtifactCommands for the next Step in TimeSeriesArtifactTestCase
+	* src/test/ressources/queries.properties Edited:
+	  New Queries for timeseries_timeinterval added.
+	  Also use KEY ,VALUE, MIN and MAX as Identifiers for the different Columns.
+	* src/test/ressources/GNVArtifactsTestCase_Configuration.xml Edited,
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited:
+	   Modified the TimeseriesArtifact and added one further TransitionStep
+
+2009-09-09	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/describedata/DefaultMinMaxDescribeData.java ,
+	* src/main/java/de/intevation/gnv/transition/describedata/MinMaxDescribeData.java,
+	* src/main/java/de/intevation/gnv/transition/describedata/DescribeData.java Added:
+	  Interface Structure and Defaultimplementation for Representing DescribeData of an
+	  Transition added. In this Way we are able to switch between different Renderingmethods
+	  for descibe.
+	* src/main/java/de/intevation/gnv/transition/MinMaxTransition.java Added:
+	  Added MinMaxTransition for representing Min-/Max-Value Results in a Tansition
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited:
+	  Integrated Min- / MAX-Value Support for Describe. Also done some Refactoring Work
+	  for easy creating Extensions of this Class.
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited:
+	  Userinterface Informations were integrated in the wrong Method. Now the
+	  Informations are put into the ui-Node
+
+2009-09-08	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/timeseries/timeseries_step_01_advance.xml Edited,
+	  src/test/ressources/timeseries/timeseries_step_01_feed.xml Edited,
+	  src/test/ressources/timeseries/timeseries_step_02_advance.xml Added,
+	  src/test/ressources/timeseries/timeseries_step_02_feed.xml Added,
+	  src/test/ressources/timeseries/timeseries_step_03_advance.xml Added,
+	  src/test/ressources/timeseries/timeseries_step_03_feed.xml Added,
+	  src/test/ressources/GNVArtifactsTestCase_Configuration.xml: Edited,
+	  src/test/ressources/queries.properties Added,
+	  src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited:
+	  TestCase implemented until Choosing the TimeInetval of an TimeSeries
+
+	  One Entry is Missing
+
+2009-09-08	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited,
+	  src/main/java/de/intevation/gnv/transition/Transition.java Edited,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited,
+	  src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited,
+	  src/test/ressources/GNVArtifactsTestCase_Configuration.xml Edited,
+	  src/test/ressources/timeseries/timeseries_step_01_feed.xml Added ,
+	  src/test/ressources/timeseries/timeseries_step_01_advance.xml Added :
+	  Artifact.advance initial implementiert
+
+2009-09-08	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited,
+	  src/main/java/de/intevation/gnv/transition/DefaultInputData.java Added,
+	  src/main/java/de/intevation/gnv/transition/InputData.java Added,
+	  src/main/java/de/intevation/gnv/transition/exception/TransitionException.java Added,
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited,
+	  src/main/java/de/intevation/gnv/transition/Transition.java Edited,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited:
+	  Funktionalitat Feed initial bereitgestellt.
+
+2009-09-08	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/GNVArtifactsTestCase_Configuration.xml,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java,
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java,
+	  src/main/java/de/intevation/gnv/transition/DefaultInputValue.java Edited:
+	  Required Inputelements integrated in BasicArtifact-Descibe-Output
+
+2009-09-08	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/transition/DefaultInputValue.java Added,
+	  src/main/java/de/intevation/gnv/transition/InputValue.java Added,
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited,
+	  src/main/java/de/intevation/gnv/transition/Transition.java Edited,
+	  src/test/ressources/GNVArtifactsTestCase_Configuration.xml Edited:
+	  Constructs for the required Inputvalues for an Transition created
+
+2009-09-08	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java,
+	* src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java:,
+	* src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Edited
+	Added Output for Describe to the Artifactimplementation
+
+2009-09-08	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/GNVArtifactsTestCase_Configuration.xml,
+	  src/main/java/de/intevation/gnv/transition/Transition.java (getDescription),
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java (setup), (getDescription):
+	  Added Description to a Transition
+
+2009-09-07	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/ressources/GNVArtifactsTestCase_Configuration.xml,
+	  src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java: ADD
+	  TestClass for GNV-Artifacts an TimeSeriesArtifacs
+
+	* src/main/java/de/intevation/gnv/transition/TransitionFactory.java,
+	  src/main/java/de/intevation/gnv/transition/TransitionBase.java,
+	  src/main/java/de/intevation/gnv/transition/Transition.java,
+	  src/main/java/de/intevation/gnv/transition/DefaultTransition.java: ADD
+	  Transitionimplementation for handling the substeps of an Artifact Livecycle
+
+	* src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java: ADD
+	  The Artifact for handling the TimeSeries
+	* src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java,
+	  src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java,
+	  src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java:
+	  The Basic-Classes for providing GNC Artifacts. this Classes should be the Fundament
+	  for the Implementation of Specialized Artifacts e.g. TimeSeries
+	  * pom: Edited Projectreferences to the other GNV-Projects added
+
+2009-09-04	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifacts/ArtifactFactoryBase.java:
+	  Implementation of the General ArtifactFactory
+
+2009-09-04	Tim Englich	<tim.englich@intevation.de>
+
+	* pom.xml: Created with maven and put the Moduledependencies into it
+	* target | .settings | .project | .classpath: Add to SVN-Ignore
+	* Changes | Changelog | NEWS | README | TODO: Added
+	* src/**: Added to the Project
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/Changes	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,118 @@
+2010-01-27  RELEASE 0.4
+
+    New:
+
+    * Added entire infrastructure for interpolation pipeline:
+        * Rasterizers on a configurable grid resolution (x and y).
+        * Vectorizer producing geoemetries from rasterized data
+          (introducting dependency to GNU Trove 2.2.1)
+        * Color palette handling
+        * Support for using DEM (seabed) in interpolation
+        * helper script for converting color palettes to 
+          QGIS 1.4 styling format
+
+    * Diagrams:
+
+        * 'Profilschnitte'     (via JFreeChart compatible Vectorizer output)
+        * 'Horizontalschnitte' (via JTS compatible Vectorizer output)
+           * Multi-polygons:    Classes determined by palette values
+           * Multi-linestrings: Iso lines determined with rules of #108
+    
+        * Support for 2D diagrams with multi-polygons (with shells and holes)
+          and multi-linestrings (essentially what is called "Simple Feature")
+        * Improved labeling (heading, subheading) of all diagrams
+
+    * Added support for ProxyArtifact to support access to history of states
+    * Added support for writing Shapefiles with GeoTools (introducing
+      dependency to GeoTools 3.5.8)
+
+    Fixed:
+
+    * Generation of vertical profiles failed on Marnet (#142)
+    * Using correct MIME-type for SVG-Export in configuration (#148)
+    * Enabling/Disabling points in GUI (#105)
+    * Reanming values for selcting the direction of an axis (#129)
+    * Adapting granularity for labels for timeseries (#152)
+    * adapting range of values for data series with identical name
+      and different time ranges (#136/137)i
+    * Corrected interpolation based on horizontal cross-section (#153)
+    * Enabling/Disabling points in diagrams with PDF export (#156)
+    * Harmonized background color in 2D diagrams (#157)
+    * Adding label for axis for 2D diagrams (#158)
+
+
+2009-12-17  RELEASE 0.3
+
+    New:
+
+    * SVG export for charts (introducing Apache Batik dependency)
+    * PDF export for charts. (introducing iText dependency)
+    * style templating for charts via XML.
+    * Units are now localized and added to the charts
+    * Gap detection for horizontal and vertical profile charts.
+
+    * 'Horizontale Schnittprofile'
+
+    * Added region filters
+
+    Fixed:
+
+    * Various i18n messages. (Issue 129)
+    * problems with verticalprofile charts.
+    * TG_0030.008: "Unterscheidung bei Farben wechselt 
+      zwischen verschiedenen Ausgabeprodukten bei gleicher Parameterwahl"
+    * TG_0030.004: "Jahreszahlen an der Abszisse werden nicht angezeigt"
+    * TG_0030.004 : i18n funktioniert an Abzissenbeschriftung noch nicht (Issue 104)
+
+    Changed:
+
+    * The configuration system to define the workflows 
+      with artifacts. Cleaner separation states vs. transistions.
+
+    * Default configuration of ttl of artifacts is more realistic now.
+
+    * Used more recent versions of JFreeChart and Apache Common Math.
+
+    * Local caching of data is now used more consequently
+
+    Removed:
+
+    * Old conterra charting code.
+
+2009-11-13  RELEASE 0.2
+
+    * Adding support for relative pathnames relating to central 
+      config document (issue 59)
+
+    * Splitting of configuration documents (Issue 40)
+
+    * Corrected data model of artifacs (issue 3)
+
+    * Added FIS Sea State, SEACAT, Current Meter, Ice Station Reports 
+
+    * Implemented gaps for spatial and temportal gaps (issue 45)
+
+    * TG_0040.005: Added a first ODV support
+
+    * Added more input validation to make it more user-friendly
+
+    * Added a first documentation of configuration documents
+
+
+2009-10-07  RELEASE 0.1
+
+    * Initial release of the artifacts special for the
+      BSH Generic Viewer. They are to be configured to live
+      inside an artifact database via conf.xml.
+    
+    * The collection of parameters is modelled by transistions
+      inside the XML.
+    
+    * src/test/ressources/conf.xml gives a setup to use all
+      the provided artifacts.
+    
+    * Products can be produced for following FIS:
+      Marnet, IMIS, STAUN, Modeldata, Delphin, Thermosalinograph,
+      Chemusurvey, GTS, CTD, CBT in form of time series,
+      vertical profiles and horizontal profiles on meshes
+      and instantaneous points.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/NEWS	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,106 @@
+2010-01-27  RELEASE 0.4
+    
+    Processing:
+    * Added central support for the entire interpolation infrastructure
+    with a lot of configuration capabilities:
+      * rasterizing input data sets
+      * calculating interpolation paying attention to different boundary
+      conditions: Less than 3 point, extrapolating to the ground, water
+      surface, ...
+      * tracing isolines
+      * clipping geometries
+      * exporting interpolated polygons and isolines
+      * rendering of 2D-diagrams and export of Shapefiles
+      
+      for "Horizontales Schnittprofil", Vertical- and Horizontal Cross
+    Section. Made parts of the interpolation configurable like
+    resolution of interpolation raster; color palettes.
+
+    * Optimizing of runtime of interpolations
+
+    * Diagramm specific:
+        * Made color paletts configurable for rendering Vertical-Cross
+        Sections. Added helper script to convert same palettes to QGIS (at
+        least version 1.4 supported) styling format
+
+        * Support for 2D diagrams with multipolygons with holes and shells
+
+        * Made color of seabed configurable for vertical cross-sections
+
+        * Added special renderer for labeling isolines in dense areas 
+        in order to avoid overlaps
+
+
+    * Dependency to GUI generation:
+        * Splitting date selections in a 2 step transition: year, exact
+        point of time as required in the webclient
+
+
+        * Cleaning up internal model of steps to correspond to internal
+        objects in cache
+
+
+        * Add support for a wizard-based model of states in order to support
+        a 1-step back history in a first step; preparation for
+        multistep-history done.
+
+
+    * Configuration:
+        * Configuration: Enhanced configuration for connection testing of
+        SDE. So fare, now stable for reusing connections.
+
+        * Configurability of Mesh-Width per data model
+
+    * Others:
+        * Added support for exporting shapefiles and integrating into
+        artefact-lifecycle in order to remove files/directories after
+        end-of-life
+
+        * Support for a MapViewer interfaced based on a database-based
+        configuration
+
+        * Added support for raster data to taking into account sea
+        topography
+
+
+2009-12-17  RELEASE 0.3
+
+    * PDF export
+
+    * SVG export
+
+    * Chart Templating
+
+    * 'Horizontale Schnittprofile'
+
+    * various i18n fixes
+
+2009-11-13  RELEASE 0.2
+
+    * Added support for all required FIS:
+      Marnet, IMIS, STAUN, Modelldaten, Eisklimatologie, Eismeldungen, SST,
+      Delphin, Thermosalinograph, Chemusurvey, GTS, CTD, XBT, SeaCat,
+      Seegangsarchiv, Strommesser (Req. TG_0020.001)
+
+    * Added support for vertical profiles (Chapter 3.3.3.2.2)
+
+    * Added support for horizontal profiles (Chapter 3.3.3.2.3);
+      part independent of MapViewer
+
+    * Added a first support for ODV format (Req. TG_0040.005)
+
+    * Enabling client for multi-instances (Req. 00_0000.007)
+
+    * Adding of support of internal area filter (Req. TG_0020.012 b)
+
+    * Added more support for internationalization (TG_0050.004)
+
+    * Improved error handling with more user-friendly messages
+
+    * Added required statistical support (Chapter 3.3.3.3.1)
+
+
+2009-10-07  RELEASE 0.1
+
+    * Initial release of the artifacts special for the Generic BSH Viewer.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/TODO	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+TODO:
+    * Caching of charts is configured via system property. This should be done
+      in another way. (Property: -Dcache.chart)
+    * charts for verticalcrosssection and horizontalcrosssection need to be
+      implemented
+    * distance of tick units in timeseries charts are in form of "dd-MMM". This 
+      needs to be adapted depending on range of x-axis.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/bin/run.sh	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+DIR=`dirname $0`/..
+CLASSPATH=
+for l in `find -name \*.jar -print`; do
+   CLASSPATH=$CLASSPATH:$l
+done
+
+export CLASSPATH
+
+exec java -Xmx256m \
+     -server \
+     -Djava.io.tmpdir=/tmp/ \
+     -Dartifact.database.dir="$DIR/conf" \
+     de.intevation.artifactdatabase.App \
+     2>&1 > /dev/null
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/contrib/palette2qgis.xsl	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+  <!--
+    palette2qgis.xsl
+    ================
+    Transforms palette XML files into QGIS style files. Useful
+    to display "Horizontalschnitte" with the right colors.
+
+    Tested with Quantum GIS 1.4.0-Enceladus.
+
+    usage: xsltproc palette2qgis.xsl palette.xml > style.qml
+
+    Author: Sascha L. Teichmann (sascha.teichmann@intevation.de)
+    -->
+  <xsl:output
+       method="xml"
+       doctype-system="PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'"/>
+
+  <xsl:template name="hex2number">
+    <xsl:param name="hex"/>
+    <xsl:choose>
+        <xsl:when test="string-length($hex) &lt; 1">
+            <xsl:value-of select="0"/>
+        </xsl:when>
+        <xsl:otherwise>
+            <xsl:variable
+                name="x" 
+                select="translate(substring($hex, string-length($hex), 1), 'ABCDEF', 'abcdef')"/>
+            <xsl:variable name="last">
+              <xsl:choose>
+                <xsl:when test="$x = 'a'">10</xsl:when>
+                <xsl:when test="$x = 'b'">11</xsl:when>
+                <xsl:when test="$x = 'c'">12</xsl:when>
+                <xsl:when test="$x = 'd'">13</xsl:when>
+                <xsl:when test="$x = 'e'">14</xsl:when>
+                <xsl:when test="$x = 'f'">15</xsl:when>
+                <xsl:otherwise>
+                  <xsl:value-of select="$x"/>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <xsl:variable name="rest">
+              <xsl:call-template name="hex2number">
+                 <xsl:with-param
+                      name="hex"
+                      select="substring($hex, 1, string-length($hex)-1)"/>
+              </xsl:call-template>
+            </xsl:variable>
+            <xsl:value-of select="number($last) + 16*$rest"/>
+        </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="/ranges/range">
+    <symbol>
+      <lowervalue><xsl:value-of select="@index"/></lowervalue>
+      <uppervalue><xsl:value-of select="@index"/></uppervalue>
+      <label><xsl:value-of select="@description"/></label>
+      <pointsymbol>hard:circle</pointsymbol>
+      <pointsize>2</pointsize>
+      <pointsizeunits>pixels</pointsizeunits>
+      <rotationclassificationfieldname/>
+      <scaleclassificationfieldname/>
+      <symbolfieldname/>
+      <outlinecolor red="0" blue="0" green="0"/>
+      <outlinestyle>NoPen</outlinestyle>
+      <outlinewidth>0.26</outlinewidth>
+      <xsl:variable name="rgb">
+        <xsl:call-template name="hex2number">
+          <xsl:with-param name="hex" select="substring(@rgb, 2)"/>
+        </xsl:call-template>
+      </xsl:variable>
+      <xsl:variable name="red" select="floor(($rgb div (256*256)) mod 256)"/>
+      <xsl:variable name="green" select="floor(($rgb div 256) mod 256)"/>
+      <xsl:variable name="blue" select="floor($rgb mod 256)"/>
+      <fillcolor red="{$red}" blue="{$blue}" green="{$green}"/>
+      <fillpattern>SolidPattern</fillpattern>
+      <texturepath null="1"/>
+    </symbol>
+  </xsl:template>
+  <xsl:template match="/">
+    <qgis version="1.4.0-Enceladus" minimumScale="1" maximumScale="1e+08" minLabelScale="1" maxLabelScale="1e+08" hasScaleBasedVisibilityFlag="0" scaleBasedLabelVisibilityFlag="0">
+      <transparencyLevelInt>255</transparencyLevelInt>
+      <classificationattribute>CLASS</classificationattribute>
+      <symbol>
+        <lowervalue null="1"/>
+        <uppervalue null="1"/>
+        <label>Andere</label>
+        <pointsymbol>hard:circle</pointsymbol>
+        <pointsize>2</pointsize>
+        <pointsizeunits>pixels</pointsizeunits>
+        <rotationclassificationfieldname/>
+        <scaleclassificationfieldname/>
+        <symbolfieldname/>
+        <outlinecolor red="0" blue="0" green="0"/>
+        <outlinestyle>DashDotDotLine</outlinestyle>
+        <outlinewidth>0.26</outlinewidth>
+        <fillcolor red="59" blue="81" green="179"/>
+        <fillpattern>SolidPattern</fillpattern>
+        <texturepath null="1"/>
+      </symbol>
+      <uniquevalue>
+        <classificationfield>CLASS</classificationfield>
+        <xsl:apply-templates/>
+      </uniquevalue>
+      <edittypes>
+        <edittype type="0" name="CLASS"/>
+        <edittype type="0" name="DATE"/>
+        <edittype type="0" name="LAYER"/>
+        <edittype type="0" name="PARAMETER"/>
+      </edittypes>
+      <editform/>
+      <editforminit/>
+      <displayfield>PARAMETER</displayfield>
+      <label>0</label>
+      <attributeactions/>
+      <labelattributes>
+        <label fieldname="" text="Beschriftung"/>
+        <family fieldname="" name="Sans Serif"/>
+        <size fieldname="" units="pt" value="12"/>
+        <bold fieldname="" on="0"/>
+        <italic fieldname="" on="0"/>
+        <underline fieldname="" on="0"/>
+        <color fieldname="" red="0" blue="0" green="0"/>
+        <x fieldname=""/>
+        <y fieldname=""/>
+        <offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
+        <angle fieldname="" value="0" auto="0"/>
+        <alignment fieldname="" value="center"/>
+        <buffercolor fieldname="" red="255" blue="255" green="255"/>
+        <buffersize fieldname="" units="pt" value="1"/>
+        <bufferenabled fieldname="" on=""/>
+        <multilineenabled fieldname="" on=""/>
+      </labelattributes>
+    </qgis>
+  </xsl:template>
+  <xsl:template match="text()"/>
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/arcsdeconnectionpool.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,35 @@
+###############################################################################
+###############################################################################
+# In this File it is possible to configure the Connectionpool to the the 
+# ArcSDE-DataBackend.
+# maxActive: Number of maximal Connection which can be used.
+# testOnBorrow: Should the Pool test the Connection which will be borrowed
+#               if it is Valid
+# testOnReturn: Should the Pool test the Connection which will be returned
+#               if it is Valid
+# testWhileIdle: Should the Pool test the Connection while it is Idl
+#                if it is Valid
+# timeBetweenEvictionRunsMillis : Time in Milliseconds which is allowed
+#                                 to reused a returned Connection.
+# serverRoundtripInterval : The Timea ArcSDE-Connection must nor be used until 
+#                           the Connection will test if it is valid.
+# server: The URL of the Server where the Database is reachable.
+# username: The Username which should be used to Connect to the Databackend.
+# credentials: The Credentials to the given username
+# port: The Communicationport which must be used to connect to the Databackend
+# database: The Name of the Instance which should be connected to.
+###############################################################################
+###############################################################################
+
+maxActive=2
+testOnBorrow=true
+testOnReturn=false
+testWhileIdle=false
+timeBetweenEvictionRunsMillis=360000
+serverRoundtripInterval=5
+serverInactiveInterval=300
+server=localhost
+username=gast
+credentials=gast
+port=22119
+database=esri_sde
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/charttemplate.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<theme>
+    <name value="Default Theme" />
+    <!-- ========================= chart =======================!-->
+    <chart>
+        <background>
+            <color value="0xFFFFFF" />
+        </background>
+    </chart>
+    <!-- ========================= title ==========================!-->
+    <title>
+        <font>
+            <size value="20" />
+            <type value="Tahoma" />
+            <color value="0x000000" />
+            <bold value="true" />
+        </font>
+    </title>
+    <!-- ========================= subtitle =======================!-->
+    <subtitle>
+        <font>
+            <size value="14" />
+            <type value="Tahoma" />
+            <color value="0x000000" />
+            <bold value="false" />
+        </font>
+    </subtitle>
+    <!-- ========================= legend =======================!-->
+    <legend>
+        <font>
+            <size value="12" />
+            <color value="0x000000" />
+        </font>
+        <background>
+            <color value="0xFFFFFF" />
+        </background>
+    </legend>
+    <!-- ========================= plot =======================!-->
+    <plot>
+        <background>
+            <color value="0xDDDDDD" />
+        </background>
+        <outline>
+            <color value="0xAAAAAA" />
+        </outline>
+        <domaingridline>
+            <color value="0xFFFFFF" />
+        </domaingridline>
+        <rangegridline>
+            <color value="0xFFFFFF" />
+        </rangegridline>
+        <domaincrosshair>
+            <visible value="true" />
+        </domaincrosshair>
+        <rangecrosshair>
+            <visible value="true" />
+        </rangecrosshair>
+        <offset>
+            <top>5</top>
+            <bottom>5</bottom>
+            <left>5</left>
+            <right>5</right>
+        </offset>
+        <itemrenderer>
+            <width value="4" />
+            <height value="4" />
+            <renderLines value="true" />
+            <renderPoints value="true" />
+        </itemrenderer>
+    </plot>
+    <!-- ========================= axis =======================!-->
+    <axis>
+        <label>
+            <color value="0x000000" />
+        </label>
+        <ticklabel>
+            <color value="0x000000" />
+        </ticklabel>
+    </axis>
+</theme>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/conf.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,473 @@
+<artifact-database>
+    <factories>
+        <context-factory>de.intevation.gnv.artifacts.context.GNVArtifactContextFactory</context-factory>
+        <artifact-factories>
+            <artifact-factory name="fis_marnet" description="Factory to create an artifact to be used with the FIS Marnet"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_imis" description="Factory to create an artifact to be used with the FIS IMIS"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_staun" description="Factory to create an artifact to be used with the FIS STAUN"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_modeldata" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_eisklimatologie" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_icestations" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_sst" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_delphin" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_thermosalinograph" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_chemusurvey" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_gts" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_bsh_ctd" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_bsh_xbt" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_seacat" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_seastate" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+            <artifact-factory name="fis_currentmeter" description="Factory to create an artifact to be used with the FIS Modeldata"  
+                              ttl="3600000" artifact="de.intevation.artifactdatabase.ProxyArtifact">de.intevation.gnv.artifacts.GNVProductArtifactFactory</artifact-factory>
+        </artifact-factories>
+    </factories>
+    
+    <!--  Artifacts which represent one FIS. Each FIS can have several Products 
+          which will be Access using separate Artifacts.
+          Those Artifacts are configured below these Section.-->
+    <artifacts>
+        <artifact name="fis_marnet">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeries" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="4"/>
+                        <parameter name="fisname" value="fis_marnet"/>
+                    </parameters>
+                </product>
+                 <product name= "verticalProfile">
+                    <artifact-factory name="verticalProfile" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.vertical.VerticalProfileArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="4"/>
+                        <parameter name="fisname" value="fis_marnet"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_seacat">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeries" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="30"/>
+                        <parameter name="fisname" value="fis_seacat"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_currentmeter">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeries" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="33"/>
+                        <parameter name="fisname" value="fis_currentmeter"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_seastate">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeries" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="20"/>
+                        <parameter name="fisname" value="fis_seastate"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_imis">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeries" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                              ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="18"/>
+                        <parameter name="fisname" value="fis_imis"/>
+                    </parameters>
+                </product>
+                <product name= "verticalProfile">
+                    <artifact-factory name="verticalProfile" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.vertical.VerticalProfileArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="18"/>
+                        <parameter name="fisname" value="fis_imis"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_staun">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeries" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                              ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="17"/>
+                        <parameter name="fisname" value="fis_staun"/>
+                    </parameters>
+                </product>
+                <product name= "verticalProfile">
+                    <artifact-factory name="verticalProfile" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.vertical.VerticalProfileArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="17"/>
+                        <parameter name="fisname" value="fis_staun"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_modeldata">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeriesMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                              ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                         <parameter name="sourceid" value="2"/>
+                         <parameter name="fisname" value="fis_modeldata"/>
+                    </parameters>
+                </product>
+                <product name= "verticalProfile">
+                    <artifact-factory name="verticalProfileMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.vertical.VerticalProfileMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="2"/>
+                        <parameter name="fisname" value="fis_modeldata"/>
+                    </parameters>
+                </product>
+                <product name= "horizontalProfile">
+                    <artifact-factory name="horizontalProfilehorizontalProfileMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontal.HorizontalProfileMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="2"/>
+                        <parameter name="fisname" value="fis_modeldata"/>
+                    </parameters>
+                </product>
+                 <product name= "horizontalProfileCross">
+                    <artifact-factory name="horizontalProfilehorizontalProfileMeshCross" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontal.HorizontalProfileMeshCrossArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="2"/>
+                        <parameter name="fisname" value="fis_modeldata"/>
+                    </parameters>
+                </product>
+                 <product name= "verticalcrosssection">
+                    <artifact-factory name="verticalCrossSectionMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.verticalcrosssection.VerticalCrossSectionMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="2"/>
+                        <parameter name="fisname" value="fis_modeldata"/>
+                    </parameters>
+                </product>
+                <product name= "horizontalCrossSection">
+                    <artifact-factory name="horizontalCrossSectionMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontalcrosssection.HorizontalCrossSectionMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="2"/>
+                        <parameter name="fisname" value="fis_modeldata"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+
+        <artifact name="fis_eisklimatologie">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeriesMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                              ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                         <parameter name="sourceid" value="38"/>
+                         <parameter name="fisname" value="fis_eisklimatologie"/>
+                    </parameters>
+                </product>
+                <product name= "horizontalProfile">
+                    <artifact-factory name="horizontalProfilehorizontalProfileMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontal.HorizontalProfileMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="38"/>
+                        <parameter name="fisname" value="fis_eisklimatologie"/>
+                    </parameters>
+                </product>
+                <product name= "horizontalCrossSection">
+                    <artifact-factory name="horizontalCrossSectionMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontalcrosssection.HorizontalCrossSectionMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="38"/>
+                        <parameter name="fisname" value="fis_eisklimatologie"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_icestations">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeries" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                              ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="38"/>
+                        <parameter name="fisname" value="fis_icestations"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_sst">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeriesMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                              ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                         <parameter name="sourceid" value="39"/>
+                         <parameter name="sourceid" value="40"/>
+                         <parameter name="sourceid" value="41"/>
+                         <parameter name="sourceid" value="42"/>
+                         <parameter name="fisname" value="fis_sst"/>
+                    </parameters>
+                </product>
+                <product name= "horizontalProfile">
+                    <artifact-factory name="horizontalProfilehorizontalProfileMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontal.HorizontalProfileMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                         <parameter name="sourceid" value="39"/>
+                         <parameter name="sourceid" value="40"/>
+                         <parameter name="sourceid" value="41"/>
+                         <parameter name="sourceid" value="42"/>
+                         <parameter name="fisname" value="fis_sst"/>
+                    </parameters>
+                </product>
+                 <product name= "horizontalCrossSection">
+                    <artifact-factory name="horizontalCrossSectionMesh" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontalcrosssection.HorizontalCrossSectionMeshArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="39"/>
+                         <parameter name="sourceid" value="40"/>
+                         <parameter name="sourceid" value="41"/>
+                         <parameter name="sourceid" value="42"/>
+                        <parameter name="fisname" value="fis_sst"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_delphin">
+            <products>
+                <product name= "horizontalProfile">
+                    <artifact-factory name="horizontalProfileInstantaneousPoint" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontal.HorizontalProfileInstantaneousPointArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="34"/>
+                        <parameter name="fisname" value="fis_delphin"/>
+                    </parameters>
+                </product>
+                
+            </products>
+        </artifact>
+        
+        <artifact name="fis_thermosalinograph">
+            <products>
+                <product name= "horizontalProfile">
+                    <artifact-factory name="horizontalProfileInstantaneousPoint" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontal.HorizontalProfileInstantaneousPointArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="35"/>
+                        <parameter name="fisname" value="fis_thermosalinograph"/>
+                    </parameters>
+                </product>
+                
+            </products>
+        </artifact>
+        
+        <artifact name="fis_chemusurvey">
+            <products>
+                <product name= "horizontalProfile">
+                    <artifact-factory name="horizontalProfileInstantaneousPoint" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.horizontal.HorizontalProfileInstantaneousPointArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="37"/>
+                        <parameter name="fisname" value="fis_chemusurvey"/>
+                    </parameters>
+                </product>
+                
+            </products>
+        </artifact>
+        
+        <artifact name="fis_gts">
+            <products>
+                <product name= "timeSeries">
+                    <artifact-factory name="timeSeries" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.timeseries.TimeSeriesArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="5"/>
+                        <parameter name="fisname" value="fis_gts"/>
+                    </parameters>
+                </product>
+                <product name= "verticalProfile">
+                    <artifact-factory name="verticalProfileInstantaneousPoint" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.vertical.VerticalProfileInstantaneousPointArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="5"/>
+                        <parameter name="fisname" value="fis_gts"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_bsh_ctd">
+            <products>
+                <product name= "verticalProfile">
+                    <artifact-factory name="verticalProfileInstantaneousPoint" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.vertical.VerticalProfileInstantaneousPointArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="32"/>
+                        <parameter name="fisname" value="fis_bsh_ctd"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <artifact name="fis_bsh_xbt">
+            <products>
+                <product name= "verticalProfile">
+                    <artifact-factory name="verticalProfileInstantaneousPoint" description="Artiefactfactory for Instantiating the Artifact for the FIS Modeldata"  
+                             ttl="300000" artifact="de.intevation.gnv.profile.vertical.VerticalProfileInstantaneousPointArtifact">de.intevation.gnv.artifacts.GNVArtifactFactory</artifact-factory>
+                    <parameters>
+                        <parameter name="sourceid" value="36"/>
+                        <parameter name="fisname" value="fis_bsh_xbt"/>
+                    </parameters>
+                </product>
+            </products>
+        </artifact>
+        
+        <!--  Product specific Artifacts which are referenced by the Artifacts
+              of the FIS above.
+              The product-Artifacts can be configured here or can be referenced
+              using an xlink:href-Attribute. -->
+              
+        <artifact name="timeSeries" xlink:href="${artifacts.config.dir}/products/timeseries/conf_timeseriespoint.xml" />
+        <artifact name="timeSeriesMesh" xlink:href="${artifacts.config.dir}/products/timeseries/conf_mesh.xml" />
+        
+        <artifact name="verticalProfile" xlink:href="${artifacts.config.dir}/products/verticalprofile/conf_timeseriespoint.xml" />
+        <artifact name="verticalProfileMesh" xlink:href="${artifacts.config.dir}/products/verticalprofile/conf_mesh.xml" />
+        <artifact name="verticalProfileInstantaneousPoint" xlink:href="${artifacts.config.dir}/products/verticalprofile/conf_instantaneouspoint.xml" />
+        
+        <artifact name="horizontalProfileMesh" xlink:href="${artifacts.config.dir}/products/horizontalprofile/conf_mesh.xml" />
+        <artifact name="horizontalProfileMeshCross" xlink:href="${artifacts.config.dir}/products/horizontalprofile/conf_mesh_cross.xml" />
+        <artifact name="horizontalProfileInstantaneousPoint" xlink:href="${artifacts.config.dir}/products/horizontalprofile/conf_instantaneouspoint.xml" />
+        
+        <artifact name="verticalCrossSectionMesh" xlink:href="${artifacts.config.dir}/products/verticalcrosssection/conf_mesh.xml" />
+        
+        <artifact name="horizontalCrossSectionMesh" xlink:href="${artifacts.config.dir}/products/horizontalcrosssection/conf_mesh.xml" />
+    </artifacts>
+    <gnv>
+        <!-- This section configures special parameters 
+             of the GNV artifacts. -->
+        <charttemplate>
+            <!--    This section configures the path to the template used to create
+                    charts. -->
+            <configuration>${artifacts.config.dir}/charttemplate.xml</configuration>
+        </charttemplate>
+        <palettes>
+            <!-- This section configures the palettes used in 2D diagrams. -->
+            <palette name="flow-velocity" 
+                     parameter-ids="11"
+                     description="Palette for flow velocity"
+                     file="${artifacts.config.dir}/palette/flow-velocity.xml"/>
+            <palette name="salinity"
+                     parameter-ids="2"
+                     description="Palette for salinity"
+                     file="${artifacts.config.dir}/palette/salinity.xml"/>
+            <palette name="water-levels"
+                     parameter-ids="35"
+                     description="Palette for water levels"
+                     file="${artifacts.config.dir}/palette/water-levels.xml"/>
+            <palette name="water-temperature"
+                     parameter-ids="1"
+                     description="Palette for water temperature"
+                     file="${artifacts.config.dir}/palette/water-temperature.xml"/>
+        </palettes>
+
+        <horizontal-cross-section-profile>
+            <!-- This section configures the "horizontales Schnittprofil" -->
+            <samples number="200"/>
+        </horizontal-cross-section-profile>
+
+        <horizontal-cross-section>
+            <!-- This section configures the HorizontalCrossSection ("Horizontalschnitt") -->
+            <samples number="1024"/>
+            <ground interpolation="bilinear" />
+            <result-shapefile-directory path="${artifacts.config.dir}/../shapefiles/"/>
+        </horizontal-cross-section>
+
+        <vertical-cross-section>
+            <!-- This section configures the "Profilschnitt" -->
+            <samples width="1024" height="768"/>
+            <ground interpolation="bilinear" fill-color="#6d7067"/>
+            <!--
+            <filters>
+                <filter factory="de.intevation.gnv.raster.KernelFilter$GaussFactory" 
+                        sigma="1"
+                        radius="5"/>
+            </filters>
+            -->
+        </vertical-cross-section>
+    </gnv>
+
+    <ehcache>
+        <!--  In this Section the Path to Configurationfile for the EHCache,
+              which is unsed to store the Results of the Artifacts ,
+              is given.-->
+        <configuration>${artifacts.config.dir}/ehcache.xml</configuration>
+    </ehcache>
+
+    <geo-backend>
+        <!--  In this Section the required Configuration for the geo-backend is
+              given. It is possible to configue the Path of the  ConnectionPool-
+              Properties and the Query-Properties-File where all required 
+              Queries of the System are stored. -->
+        <backend-configuration>${artifacts.config.dir}/arcsdeconnectionpool.properties</backend-configuration>
+        <query-configuration>${artifacts.config.dir}/queries.properties</query-configuration>
+    </geo-backend>
+    <rest-server>
+        <!--  at this Point it is possible to Change the Port the ArtifactDatabase will bind to.-->
+        <port>8181</port>
+        <listen>localhost</listen>
+    </rest-server>
+    <!-- garbage collection of outdated artifacts -->
+    <cleaner>
+        <sleep-time>900000</sleep-time>
+    </cleaner>
+    <database>
+        <user>SA</user>
+        <password></password>
+        <!--url>jdbc:h2:src/test/ressources/artifacts.db</url>
+        <driver>org.h2.Driver</driver> 
+        <sql></sql> -->
+    </database>
+</artifact-database>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/ehcache.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache>
+    <defaultCache maxElementsInMemory="1000"
+        eternal="true"
+        overflowToDisk="false"
+        memoryStoreEvictionPolicy="FIFO"
+         />
+</ehcache>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/log.conf	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,4 @@
+.level=FINEST
+handlers=java.util.logging.ConsoleHandler
+java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
+java.util.logging.FileHandler.pattern=rest-%u-%g.log
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/log4j.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,17 @@
+###############################################################################
+# Developmentconfiguration for the Loggingengine.
+# The Configuration will only log the Information to the Console.
+# For Test- and Productionenviroment it is necessary to create a
+# separate Configuration which will be log the Informations e.g. into
+# a File (RolingFileAppender).
+###############################################################################
+
+# Set root logger level to DEBUG and its only appender to A1.
+log4j.rootLogger=DEBUG, A1
+
+# A1 is set to be a ConsoleAppender.
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# A1 uses PatternLayout.
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/meshwidth.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mesh-widths>
+    <!-- 
+        id = ID des Meshes in der Datenbank
+        width = Durchschnittlicher Abstand zwischen zwei Netzpunkten in Grad
+     -->
+    <mesh id="1" width="0.03" description="Küstenmodell"/>
+    <mesh id="2" width="0.30" description="Ostseemodell"/>
+    <mesh id="3" width="0.15" description="SST"/>
+    <mesh id="4" width="0.03" description="Küstenmodell Tagesmittel"/>
+    <mesh id="5" width="0.16" description="Nord-Ostseemodell Tagesmittel"/>
+    <mesh id="321" width="0.30" description="SST"/>
+    <mesh id="641" width="0.30" description="Eisdaten"/>
+</mesh-widths>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/palette/flow-velocity.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<ranges>
+  <range index="0"  from="-inf"  to="0.025" rgb="#38a800" description="&lt; 0.025"/>
+  <range index="1"  from="0.025" to="0.05"  rgb="#56b800" description="0.025 - 0.05"/>
+  <range index="2"  from="0.05"  to="0.1"   rgb="#74c700" description="0.05 - 0.1"/>
+  <range index="3"  from="0.1"   to="0.3"   rgb="#96d600" description="0.1 - 0.3"/>
+  <range index="4"  from="0.3"   to="0.5"   rgb="#bfe600" description="0.3 - 0.5"/>
+  <range index="5"  from="0.5"   to="0.7"   rgb="#e9f500" description="0.5 - 0.7"/>
+  <range index="6"  from="0.7"   to="0.9"   rgb="#ffea00" description="0.7 - 0.9"/>
+  <range index="7"  from="0.9"   to="1.1"   rgb="#ffbb00" description="0.9 - 1.1"/>
+  <range index="8"  from="1.1"   to="1.3"   rgb="#ff8c00" description="1.1 - 1.3"/>
+  <range index="9"  from="1.3"   to="1.5"   rgb="#ff5e00" description="1.3 - 1.5"/>
+  <range index="10" from="1.5"   to="1.7"   rgb="#ff2f00" description="1.5 - 1.7"/>
+  <range index="11" from="1.7"   to="inf"   rgb="#ff0000" description="&gt; 1.7"/>
+</ranges>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/palette/salinity.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<ranges>
+  <range index="0"  from="-inf" to="2.0"  rgb="#02db00" description="&lt; 2.0"/>
+  <range index="1"  from="2.0"  to="3.0"  rgb="#01e600" description="2.0 - 3.0"/>
+  <range index="2"  from="3.0"  to="4.0"  rgb="#02f200" description="3.0 - 4.0"/>
+  <range index="3"  from="4.0"  to="5.0"  rgb="#00ff00" description="4.0 - 5.0"/>
+  <range index="4"  from="5.0"  to="6.0"  rgb="#23fd22" description="5.0 - 6.0"/>
+  <range index="5"  from="6.0"  to="7.0"  rgb="#47fe46" description="6.0 - 7.0"/>
+  <range index="6"  from="7.0"  to="8.0"  rgb="#5afd59" description="7.0 - 8.0"/>
+  <range index="7"  from="8.0"  to="9.0"  rgb="#6ffe6e" description="8.0 - 9.0"/>
+  <range index="8"  from="9.0"  to="10.0" rgb="#89fd88" description="9.0 - 10.0"/>
+  <range index="9"  from="10.0" to="12.0" rgb="#a5fea4" description="10.0 - 12.0"/>
+  <range index="10" from="12.0" to="14.0" rgb="#b3feb3" description="12.0 - 14.0"/>
+  <range index="11" from="14.0" to="16.0" rgb="#c2fec2" description="14.0 - 16.0"/>
+  <range index="12" from="16.0" to="18.0" rgb="#e0fee0" description="16.0 - 18.0"/>
+  <range index="13" from="18.0" to="20.0" rgb="#ffffff" description="18.0 - 20.0"/>
+  <range index="14" from="20.0" to="24.0" rgb="#fef5ef" description="20.0 - 24.0"/>
+  <range index="15" from="24.0" to="28.0" rgb="#feede0" description="24.0 - 28.0"/>
+  <range index="16" from="28.0" to="30.0" rgb="#fee5d1" description="28.0 - 30.0"/>
+  <range index="17" from="30.0" to="32.0" rgb="#fdd8ba" description="30.0 - 32.0"/>
+  <range index="18" from="32.0" to="34.0" rgb="#fecca4" description="32.0 - 34.0"/>
+  <range index="19" from="34.0" to="34.5" rgb="#fdbe8b" description="34.0 - 34.5"/>
+  <range index="20" from="34.5" to="35.0" rgb="#feb073" description="34.5 - 35.0"/>
+  <range index="21" from="35.0" to="35.2" rgb="#fda35b" description="35.0 - 35.2"/>
+  <range index="22" from="35.2" to="35.4" rgb="#fe9846" description="35.2 - 35.4"/>
+  <range index="23" from="35.4" to="35.6" rgb="#fd8422" description="35.4 - 35.6"/>
+  <range index="24" from="35.6" to="35.8" rgb="#fe7100" description="35.6 - 35.8"/>
+  <range index="25" from="35.8" to="36.0" rgb="#fe6900" description="35.8 - 36.0"/>
+  <range index="26" from="36.0" to="37.0" rgb="#fe6100" description="36.0 - 37.0"/>
+  <range index="27" from="37.0" to="inf"  rgb="#fe5900" description="&gt; 37.0"/>
+</ranges>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/palette/water-levels.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<ranges>
+  <range index="0"  from="-inf" to="5"    rgb="#870087" description="&lt; 5"/>
+  <range index="1"  from="-5.0" to="-4.5" rgb="#c700c7" description="-5.0 - -4.5"/>
+  <range index="2"  from="-4.5" to="-4.0" rgb="#ff00ff" description="-4.5 - -4.0"/>
+  <range index="3"  from="-4.0" to="-3.5" rgb="#bb00ff" description="-4.0 - -3.5"/>
+  <range index="4"  from="-3.5" to="-3.0" rgb="#7700ff" description="-3.5 - -3.0"/>
+  <range index="5"  from="-3.0" to="-2.5" rgb="#0000ff" description="-3.0 - -2.5"/>
+  <range index="6"  from="-2.5" to="-2.0" rgb="#0000e8" description="-2.5 - -2.0"/>
+  <range index="7"  from="-2.0" to="-1.5" rgb="#0082d9" description="-2.0 - -1.5"/>
+  <range index="8"  from="-1.5" to="-1.0" rgb="#00b2ff" description="-1.5 - -1.0"/>
+  <range index="9"  from="-1.0" to="-0.5" rgb="#00ddff" description="-1.0 - -0.5"/>
+  <range index="10" from="-0.5" to="0.0"  rgb="#00ffff" description="-0.5 - 0.0"/>
+  <range index="11" from="0.0"  to="0.5"  rgb="#49d1cd" description="0.0 - 0.5"/>
+  <range index="12" from="0.5"  to="1.0"  rgb="#20b0a9" description="0.5 - 1.0"/>
+  <range index="13" from="1.0"  to="1.5"  rgb="#14c76d" description="1.0 - 1.5"/>
+  <range index="14" from="1.5"  to="2.0"  rgb="#09e03b" description="1.5 - 2.0"/>
+  <range index="15" from="2.0"  to="2.5"  rgb="#00ff1a" description="2.0 - 2.5"/>
+  <range index="16" from="2.5"  to="3.0"  rgb="#aeff00" description="2.5 - 3.0"/>
+  <range index="17" from="3.0"  to="3.5"  rgb="#f2ff00" description="3.0 - 3.5"/>
+  <range index="18" from="3.5"  to="4.0"  rgb="#ffc800" description="3.5 - 4.0"/>
+  <range index="19" from="4.0"  to="4.5"  rgb="#ff8800" description="4.0 - 4.5"/>
+  <range index="20" from="4.5"  to="5.0"  rgb="#ff4400" description="4.5 - 5.0"/>
+  <range index="21" from="5.0"  to="5.5"  rgb="#ff0000" description="5.0 - 5.5"/>
+  <range index="22" from="5.5"  to="6.0"  rgb="#c70000" description="5.5 - 6.0"/>
+  <range index="23" from="6.0"  to="inf"  rgb="#870000" description="&gt; 6.0"/>
+</ranges>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/palette/water-temperature.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<ranges>
+  <range index="0"  from="-inf" to="-1"  rgb="#ff33ff" description="&lt; -1"/>
+  <range index="1"  from="-1"   to="0"   rgb="#ff98ff" description="-1 - 0"/>
+  <range index="2"  from="0"    to="1"   rgb="#3300cc" description="0 - 1"/>
+  <range index="3"  from="1"    to="2"   rgb="#3366ff" description="1 - 2"/>
+  <range index="4"  from="2"    to="3"   rgb="#3399ff" description="2 - 3"/>
+  <range index="5"  from="3"    to="4"   rgb="#33ccff" description="3 - 4"/>
+  <range index="6"  from="4"    to="5"   rgb="#33ffff" description="4 - 5"/>
+  <range index="7"  from="5"    to="6"   rgb="#007800" description="5 - 6"/>
+  <range index="8"  from="6"    to="7"   rgb="#009900" description="6 - 7"/>
+  <range index="9"  from="7"    to="8"   rgb="#00ba00" description="7 - 8"/>
+  <range index="10" from="8"    to="9"   rgb="#00de00" description="8 - 9"/>
+  <range index="11" from="9"    to="10"  rgb="#00ff00" description="9 - 10"/>
+  <range index="12" from="10"   to="11"  rgb="#ffff33" description="10 - 11"/>
+  <range index="13" from="11"   to="12"  rgb="#ffee33" description="11 - 12"/>
+  <range index="14" from="12"   to="13"  rgb="#ffdd33" description="12 - 13"/>
+  <range index="15" from="13"   to="14"  rgb="#ffcc33" description="13 - 14"/>
+  <range index="16" from="14"   to="15"  rgb="#ffbb33" description="14 - 15"/>
+  <range index="17" from="15"   to="16"  rgb="#ffaa00" description="15 - 16"/>
+  <range index="18" from="16"   to="17"  rgb="#ff9900" description="16 - 17"/>
+  <range index="19" from="17"   to="18"  rgb="#ff7700" description="17 - 18"/>
+  <range index="20" from="18"   to="19"  rgb="#ff0000" description="18 - 19"/>
+  <range index="21" from="19"   to="20"  rgb="#ed0000" description="19 - 20"/>
+  <range index="22" from="20"   to="21"  rgb="#cc0000" description="20 - 21"/>
+  <range index="23" from="21"   to="22"  rgb="#ba0000" description="21 - 22"/>
+  <range index="24" from="22"   to="23"  rgb="#ab0000" description="22 - 23"/>
+  <range index="25" from="23"   to="24"  rgb="#990000" description="23 - 24"/>
+  <range index="26" from="24"   to="25"  rgb="#870000" description="24 - 25"/>
+  <range index="27" from="25"   to="inf" rgb="#ab0089" description="&gt; 25"/>
+</ranges>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/horizontalcrosssection/conf_mesh.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="horizontalCrossSectionMesh">
+    <states>
+        <state id="horizontalcrosssection_area" description="horizontalcrosssection_area_one" state="de.intevation.gnv.state.DefaultState">
+            <queryID>area_filter</queryID>
+            <dataname>areaid</dataname>
+            <data-multiselect>false</data-multiselect>
+             <data-noselect>true</data-noselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="horizontalcrosssection_area"/>
+            <to state="horizontalcrosssection_subarea"/>
+            <condition inputvalue="areaid" value="n/n" operator="notequal"/>
+        </transition>
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="horizontalcrosssection_area"/>
+            <to state="horizontalcrosssection_mesh_without_geom"/>
+            <condition inputvalue="areaid" value="n/n" operator="equal"/>
+        </transition>
+        
+        <state id="horizontalcrosssection_subarea" description="horizontalcrosssection_area_one" state="de.intevation.gnv.state.DefaultState">
+            <queryID>subarea_filter</queryID>
+            <dataname>subareaid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="horizontalcrosssection_subarea"/>
+            <to state="horizontalcrosssection_mesh"/>
+        </transition>
+        
+        <state id="horizontalcrosssection_mesh_without_geom" description="horizontalcrosssection_mesh" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_mesh</queryID>
+            <dataname>meshid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="horizontalcrosssection_mesh_without_geom"/>
+            <to state="verticalcrosssection_mesh_polygon"/>
+        </transition>
+        
+        <state id="horizontalcrosssection_mesh" description="horizontalcrosssection_mesh" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_mesh_with_area</queryID>
+            <dataname>meshid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="horizontalcrosssection_mesh"/>
+            <to state="verticalcrosssection_mesh_polygon"/>
+        </transition>
+        
+        <state id="verticalcrosssection_mesh_polygon" description="verticalcrosssection_mesh_polygon" state="de.intevation.gnv.state.SingleInputState">
+           <dataname>mesh_polygon</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mesh_polygon" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="verticalcrosssection_mesh_polygon"/>
+            <to state="horizontalcrosssection_meshpoint_depth"/>
+        </transition>
+        
+        <state id="horizontalcrosssection_meshpoint_depth" description="horizontalcrosssection_meshpoint_depth" state="de.intevation.gnv.state.DefaultState">
+            <queryID>horizontalcrosssection_meshpoint_depth</queryID>
+            <dataname>depthid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="depthid" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="mesh_polygon" type="String" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="horizontalcrosssection_meshpoint_depth"/>
+            <to state="horizontalcrosssection_meshpoint_parameter"/>
+        </transition>
+        
+        <state id="horizontalcrosssection_meshpoint_parameter" description="horizontalcrosssection_meshpoint_parameter" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_mesh_parameter</queryID>
+            <dataname>parameterid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="depthid" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="parameterid" type="Integer" multiselect="false" usedinquery="0" />
+                 <inputvalue name="mesh_polygon" type="String" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="horizontalcrosssection_meshpoint_parameter"/>
+            <to state="horizontalcrosssection_mesh_year"/>
+        </transition>
+        
+        <state id="horizontalcrosssection_mesh_year" description="horizontalcrosssection_mesh_year" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalcrosssection_mesh_year</queryID>
+           <dataname>yearid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="depthid" type="Integer" multiselect="false" usedinquery="0"/>
+               <inputvalue name="parameterid" type="Integer" multiselect="false" usedinquery="1" />
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="yearid" type="String" multiselect="true" usedinquery="0" />
+               <inputvalue name="mesh_polygon" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="horizontalcrosssection_mesh_year"/>
+            <to state="horizontalcrosssection_mesh_date"/>
+        </transition>
+        
+        <state id="horizontalcrosssection_mesh_date" description="horizontalcrosssection_mesh_date" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalcrosssection_mesh_date</queryID>
+           <dataname>dateid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="depthid" type="Integer" multiselect="false" usedinquery="0"/>
+               <inputvalue name="parameterid" type="Integer" multiselect="false" usedinquery="1" />
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="yearid" type="String" multiselect="true" usedinquery="1" />
+               <inputvalue name="dateid" type="Date" multiselect="false" usedinquery="0" />
+               <inputvalue name="mesh_polygon" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="horizontalcrosssection_mesh_date"/>
+            <to state="horizontalcrosssection_mesh_calculate_results"/>
+        </transition>
+        
+        <state id="horizontalcrosssection_mesh_calculate_results" description="horizontalcrosssection_mesh_calculate_results" state="de.intevation.gnv.state.profile.horizontalcrosssection.HorizontalCrossSectionMeshOutputState">
+            <queryID>horizontalcrosssection_mesh_data</queryID>
+            <queryID-ijk>horizontalprofile_meshpoint_cross_ij</queryID-ijk>
+            <queryID-odv>horizontalcrosssection_mesh_odv_data</queryID-odv>
+            <inputvalues>
+                <inputvalue name="parameterid" type="Integer" multiselect="false" usedinquery="1" />
+                <inputvalue name="dateid" type="Date" multiselect="false" usedinquery="1" />
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="depthid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mesh_polygon" type="String" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+            <value-names>
+                <value-name name="feature" value="meshid"></value-name>
+                <value-name name="parameter" value="parameterid"></value-name>
+                <value-name name="measurement" value="depthid"></value-name>
+            </value-names>
+            <outputsModes>
+                <outputsMode name="zip" description="Export als ZIP-Archiv" mime-type="application/zip"/>
+                <outputsMode name="wms" description="WMS-Layer bereitstellen" mime-type="text/url"/>
+            </outputsModes>
+        </state>
+        
+    </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="horizontalProfileInstantaneousPoint">
+   <states>
+        <state id="horizontalprofile_instantaneouspoint_area" description="horizontalprofile_instantaneouspoint_area" state="de.intevation.gnv.state.DefaultState">
+            <queryID>area_filter</queryID>
+            <dataname>areaid</dataname>
+            <data-multiselect>false</data-multiselect>
+             <data-noselect>true</data-noselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="horizontalprofile_instantaneouspoint_area"/>
+            <to state="horizontalprofile_instantaneouspoint_subarea"/>
+            <condition inputvalue="areaid" value="n/n" operator="notequal"/>
+        </transition>
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="horizontalprofile_instantaneouspoint_area"/>
+            <to state="horizontalprofile_instantaneouspoint_vehicle_without_geom"/>
+            <condition inputvalue="areaid" value="n/n" operator="equal"/>
+        </transition>
+        
+        <state id="horizontalprofile_instantaneouspoint_subarea" description="horizontalprofile_instantaneouspoint_subarea" state="de.intevation.gnv.state.DefaultState">
+            <queryID>subarea_filter</queryID>
+            <dataname>subareaid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_subarea"/>
+           <to state="horizontalprofile_instantaneouspoint_vehicle"/>
+       </transition>
+        
+        <!-- Anfang Sonderfall Ablaufsteuerung mit Anwendung des Gebietsfilters  -->
+       <state id="horizontalprofile_instantaneouspoint_vehicle" description="horizontalprofile_instantaneouspoint_vehicle" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_instantaneouspoint_vehicle_with_area</queryID>
+           <dataname>vehicleid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="sourceid" type="Integer" multiselect="false"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="vehicleid" type="Integer" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_vehicle"/>
+           <to state="horizontalprofile_instantaneouspoint_cruise_with_area"/>
+       </transition>
+       
+       <state id="horizontalprofile_instantaneouspoint_cruise_with_area" description="horizontalprofile_instantaneouspoint_cruise_with_area" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_instantaneouspoint_cruise_with_area</queryID>
+           <dataname>cruiseid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="sourceid" type="Integer" multiselect="false"/>
+               <inputvalue name="vehicleid" type="Integer" multiselect="false"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="cruiseid" type="Integer" multiselect="false" usedinquery="0" />
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_cruise_with_area"/>
+           <to state="horizontalprofile_instantaneouspoint_track_with_area"/>
+       </transition>
+       
+       <state id="horizontalprofile_instantaneouspoint_track_with_area" description="horizontalprofile_instantaneouspoint_track_with_area" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_instantaneouspoint_track_with_area</queryID>
+           <dataname>trackid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="cruiseid" type="Integer" multiselect="false" usedinquery="1" />
+               <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="trackid" type="Integer" multiselect="false" usedinquery="0" />
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_track_with_area"/>
+           <to state="horizontalprofile_instantaneouspoint_surveyinfo"/>
+       </transition>
+       <!-- Ende Sonderfall Ablaufsteuerung mit Anwendung des Gebietsfilters  -->
+       
+       <state id="horizontalprofile_instantaneouspoint_vehicle_without_geom" description="horizontalprofile_instantaneouspoint_vehicle_without_geom" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_instantaneouspoint_vehicle</queryID>
+           <dataname>vehicleid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <reachablestates>
+               <state>horizontalprofile_instantaneouspoint_cruise</state>
+           </reachablestates>
+           <inputvalues>
+               <inputvalue name="sourceid" type="Integer" multiselect="false"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="vehicleid" type="Integer" multiselect="false"  usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_vehicle_without_geom"/>
+           <to state="horizontalprofile_instantaneouspoint_cruise"/>
+       </transition>
+       
+       <state id="horizontalprofile_instantaneouspoint_cruise" description="horizontalprofile_instantaneouspoint_cruise" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_instantaneouspoint_cruise</queryID>
+           <dataname>cruiseid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="vehicleid" type="Integer" multiselect="false"/>
+               <inputvalue name="sourceid" type="Integer" multiselect="false"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="cruiseid" type="Integer" multiselect="false" usedinquery="0" />
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_cruise"/>
+           <to state="horizontalprofile_instantaneouspoint_track"/>
+       </transition>
+       
+       <state id="horizontalprofile_instantaneouspoint_track" description="horizontalprofile_instantaneouspoint_track" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_instantaneouspoint_track</queryID>
+           <dataname>trackid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="cruiseid" type="Integer" multiselect="false" usedinquery="1" />
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="trackid" type="Integer" multiselect="false" usedinquery="0" />
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_track"/>
+           <to state="horizontalprofile_instantaneouspoint_surveyinfo"/>
+       </transition>
+       
+       <state id="horizontalprofile_instantaneouspoint_surveyinfo" description="horizontalprofile_instantaneouspoint_surveyinfo" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_instantaneouspoint_surveyinfo</queryID>
+           <dataname>surveyid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="cruiseid" type="Integer" multiselect="false" usedinquery="0" />
+               <inputvalue name="trackid" type="Integer" multiselect="false" usedinquery="1" />
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="surveyid" type="Integer" multiselect="false" usedinquery="0" />
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_surveyinfo"/>
+           <to state="horizontalprofile_instantaneouspoint_parameter"/>
+       </transition>
+       
+       <state id="horizontalprofile_instantaneouspoint_parameter" description="horizontalprofile_instantaneouspoint_parameter" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_instantaneouspoint_parameter</queryID>
+           <dataname>parameterid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+               <inputvalue name="cruiseid" type="Integer" multiselect="false" usedinquery="0" />
+               <inputvalue name="trackid" type="Integer" multiselect="false" usedinquery="0" />
+               <inputvalue name="surveyid" type="Integer" multiselect="false" usedinquery="1" />
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="0" />
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_parameter"/>
+           <to state="horizontalprofile_instantaneouspoint_depth"/>
+       </transition>
+       
+       <state id="horizontalprofile_instantaneouspoint_depth" description="horizontalprofile_instantaneouspoint_depth" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_instantaneouspoint_depth</queryID>
+           <dataname>measurementid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+               <inputvalue name="cruiseid" type="Integer" multiselect="false" usedinquery="0" />
+               <inputvalue name="trackid" type="Integer" multiselect="false" usedinquery="0" />
+               <inputvalue name="surveyid" type="Integer" multiselect="false" usedinquery="1" />
+               <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="0" />
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="measurementid" type="Double" multiselect="true" usedinquery="0" />
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_instantaneouspoint_depth"/>
+           <to state="horizontalprofile_instantaneouspoint_calculate_results"/>
+       </transition>
+       
+       <state id="horizontalprofile_instantaneouspoint_calculate_results" description="horizontalprofile_instantaneouspoint_calculate_results" state="de.intevation.gnv.state.profile.horizontal.HorizontalProfileOutputState">
+           <queryID>horizontalprofile_instantaneouspoint_chart_data</queryID>
+           <queryID-odv>horizontalprofile_instantaneouspoint_odv_data</queryID-odv>
+           <inputvalues>
+               <inputvalue name="cruiseid" type="Integer" multiselect="false" usedinquery="0" />
+               <inputvalue name="trackid" type="Integer" multiselect="false" usedinquery="0" />
+               <inputvalue name="surveyid" type="Integer" multiselect="false" usedinquery="1" />
+               <inputvalue name="measurementid" type="Double" multiselect="true" usedinquery="1" />
+               <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1" />
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+           <value-names>
+               <value-name name="feature" value="trackid"></value-name>
+               <value-name name="parameter" value="parameterid"></value-name>
+               <value-name name="measurement" value="measurementid"></value-name>
+           </value-names>
+           <outputsModes>
+               <outputsMode name="chart" description="Chartrepresentation of the Values" mime-type="image/png">
+                   <parameters>
+                       <inputvalue name="width" type="Integer" value="600"/>
+                       <inputvalue name="height" type="Integer" value="400"/>
+                       <inputvalue name="points" type="Boolean" value="false"/>
+                   </parameters>
+               </outputsMode>
+               <outputsMode name="pdf" description="PDF-Export der Daten" mime-type="application/pdf">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+               <outputsMode name="svg" description="SVG-Export der Daten" mime-type="image/svg+xml">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+               <outputsMode name="csv" description="CSV-Export der Daten" mime-type="text/plain"/>
+               <outputsMode name="odv" description="ODV-Export der Daten" mime-type="text/plain"/>
+               <outputsMode name="statistics" description="Statistik zu den Daten" mime-type="text/xml"/>
+           </outputsModes>
+       </state>
+   </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/horizontalprofile/conf_mesh.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="horizontalProfileMesh">
+  <states>
+        <state id="horizontalprofile_mesh_area" description="horizontalprofile_mesh_area_one" state="de.intevation.gnv.state.DefaultState">
+               <queryID>area_filter</queryID>
+               <dataname>areaid</dataname>
+               <data-multiselect>false</data-multiselect>
+                <data-noselect>true</data-noselect>
+               <inputvalues>
+                   <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="0"/>
+               </inputvalues>
+          </state>
+          
+          <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+              <from state="horizontalprofile_mesh_area"/>
+              <to state="horizontalprofile_mesh_subarea"/>
+              <condition inputvalue="areaid" value="n/n" operator="notequal"/>
+          </transition>
+          <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+              <from state="horizontalprofile_mesh_area"/>
+              <to state="horizontalprofile_mesh_without_geom"/>
+              <condition inputvalue="areaid" value="n/n" operator="equal"/>
+          </transition>
+        
+          <state id="horizontalprofile_mesh_subarea" description="horizontalprofile_mesh_subaera" state="de.intevation.gnv.state.DefaultState">
+               <queryID>subarea_filter</queryID>
+               <dataname>subareaid</dataname>
+               <data-multiselect>false</data-multiselect>
+               <inputvalues>
+                   <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="1"/>
+                   <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+               </inputvalues>
+         </state>
+         
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+             <from state="horizontalprofile_mesh_subarea"/>
+             <to state="horizontalprofile_mesh"/>
+         </transition>
+         
+         <state id="horizontalprofile_mesh_without_geom" description="horizontalprofile_mesh_without_geom" state="de.intevation.gnv.state.DefaultState">
+              <queryID>verticalprofile_mesh</queryID>
+              <dataname>meshid</dataname>
+              <data-multiselect>false</data-multiselect>
+              <inputvalues>
+                  <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                  <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                  <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+              </inputvalues>
+         </state>
+          
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+             <from state="horizontalprofile_mesh_without_geom"/>
+             <to state="horizontalprofile_mesh_coordinate"/>
+         </transition>
+          
+        <state id="horizontalprofile_mesh" description="horizontalprofile_mesh" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_with_area</queryID>
+           <dataname>meshid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh"/>
+           <to state="horizontalprofile_mesh_coordinate"/>
+       </transition>
+       
+       <state id="horizontalprofile_mesh_coordinate" description="horizontalprofile_mesh_coordinate" state="de.intevation.gnv.state.SingleInputState">
+           <dataname>mesh_coordinate</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mesh_coordinate" type="Coordinate" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh_coordinate"/>
+           <to state="horizontalprofile_mesh_point"/>
+       </transition>
+       
+       <state id="horizontalprofile_mesh_point" description="horizontalprofile_mesh_point" state="de.intevation.gnv.state.CoordinateSelectionState">
+           <queryID>verticalprofile_mesh_point</queryID>
+           <dataname>mesh_point</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false"/>
+                <inputvalue name="mesh_coordinate" type="Coordinate" multiselect="false"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+           <mesh-width xlink:href="${artifacts.config.dir}/meshwidth.xml"/>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh_point"/>
+           <to state="horizontalprofile_mesh_axis"/>
+       </transition>
+       
+       <state id="horizontalprofile_mesh_axis" description="horizontalprofile_mesh_point" state="de.intevation.gnv.state.profile.horizontal.NorthSouthEastWestState">
+          <dataname>axisid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false"/>
+                <inputvalue name="mesh_point" type="Integer" multiselect="false"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="axisid" type="AttributeName" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh_axis"/>
+           <to state="horizontalprofile_meshpoint_parameter"/>
+       </transition>
+       
+       <state id="horizontalprofile_meshpoint_parameter" description="horizontalprofile_meshpoint_parameter" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_parameter</queryID>
+           <dataname>parameterid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="axisid" type="AttributeName" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" useinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_meshpoint_parameter"/>
+           <to state="horizontalprofile_meshpoint_depth"/>
+       </transition>
+       
+        <state id="horizontalprofile_meshpoint_depth" description="horizontalprofile_meshpoint_depth" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_meshpoint_depth</queryID>
+           <dataname>depthid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="2"/>
+                <inputvalue name="axisid" type="AttributeName" multiselect="false" usedinquery="0"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" useinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="depthid" type="Integer" multiselect="true"  usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_meshpoint_depth"/>
+           <to state="horizontalprofile_mesh_year"/>
+       </transition>
+
+        <state id="horizontalprofile_mesh_year" description="horizontalprofile_mesh_year" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_year</queryID>
+           <dataname>yearid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+               <inputvalue name="axisid" type="AttributeName" multiselect="false" usedinquery="0"/>
+               <inputvalue name="parameterid" type="Integer" multiselect="true"  usedinquery="1"/>
+               <inputvalue name="depthid" type="Integer" multiselect="true"  usedinquery="0"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="yearid" type="String" multiselect="true" usedinquery="0"/>
+           </inputvalues>
+       </state>
+
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh_year"/>
+           <to state="horizontalprofile_mesh_date"/>
+       </transition>
+       
+       <state id="horizontalprofile_mesh_date" description="horizontalprofile_mesh_date" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_date</queryID>
+           <dataname>dateid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+               <inputvalue name="axisid" type="AttributeName" multiselect="false" usedinquery="0"/>
+               <inputvalue name="parameterid" type="Integer" multiselect="true"  usedinquery="1"/>
+               <inputvalue name="depthid" type="Integer" multiselect="true"  usedinquery="0"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="yearid" type="String" multiselect="true" usedinquery="1"/>
+               <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh_date"/>
+           <to state="horizontalprofile_mesh_calculate_results"/>
+       </transition>
+       
+       <state id="horizontalprofile_mesh_calculate_results" description="horizontalprofile_mesh_calculate_results" state="de.intevation.gnv.state.profile.horizontal.HorizontalProfileOutputState">
+           <queryID>horizontalprofile_mesh_chart_data</queryID>
+           <queryID-odv>horizontalprofile_mesh_odv_data</queryID-odv>
+           <inputvalues>
+               <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+               <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="1"/>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="2"/>
+               <inputvalue name="depthid" type="Integer" multiselect="true"  usedinquery="1"/>
+               <inputvalue name="axisid" type="AttributeName" multiselect="false" usedinquery="2"/>
+               <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="1"/> 
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+           <value-names>
+               <value-name name="feature" value="mesh_point"></value-name>
+               <value-name name="parameter" value="parameterid"></value-name>
+               <value-name name="measurement" value="depthid"></value-name>
+           </value-names>
+           <outputsModes>
+               <outputsMode name="chart" description="Chartrepresentation of the Values" mime-type="image/png">
+                   <parameters>
+                       <inputvalue name="width" type="Integer" value="600"/>
+                       <inputvalue name="height" type="Integer" value="400"/>
+                       <inputvalue name="points" type="Boolean" value="false"/>
+                   </parameters>
+               </outputsMode>
+               <outputsMode name="pdf" description="PDF-Export der Daten" mime-type="application/pdf">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+               <outputsMode name="svg" description="SVG-Export der Daten" mime-type="image/svg+xml">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+               <outputsMode name="csv" description="CSV-Export der Daten" mime-type="text/plain"/>
+               <outputsMode name="odv" description="ODV-Export der Daten" mime-type="text/plain"/>
+               <outputsMode name="statistics" description="Statistik zu den Daten" mime-type="text/xml"/>
+           </outputsModes>
+       </state>
+    </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/horizontalprofile/conf_mesh_cross.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="horizontalProfileMeshCross">
+  <states>
+        <state id="horizontalprofile_mesh_area" description="horizontalprofile_mesh_area_one" state="de.intevation.gnv.state.DefaultState">
+               <queryID>area_filter</queryID>
+               <dataname>areaid</dataname>
+               <data-multiselect>false</data-multiselect>
+                <data-noselect>true</data-noselect>
+               <inputvalues>
+                   <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="0"/>
+               </inputvalues>
+          </state>
+          
+          <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+              <from state="horizontalprofile_mesh_area"/>
+              <to state="horizontalprofile_mesh_subarea"/>
+              <condition inputvalue="areaid" value="n/n" operator="notequal"/>
+          </transition>
+          <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+              <from state="horizontalprofile_mesh_area"/>
+              <to state="horizontalprofile_mesh_without_geom"/>
+              <condition inputvalue="areaid" value="n/n" operator="equal"/>
+          </transition>
+        
+          <state id="horizontalprofile_mesh_subarea" description="horizontalprofile_mesh_subaera" state="de.intevation.gnv.state.DefaultState">
+               <queryID>subarea_filter</queryID>
+               <dataname>subareaid</dataname>
+               <data-multiselect>false</data-multiselect>
+               <inputvalues>
+                   <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="1"/>
+                   <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+               </inputvalues>
+         </state>
+         
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+             <from state="horizontalprofile_mesh_subarea"/>
+             <to state="horizontalprofile_mesh"/>
+         </transition>
+         
+         <state id="horizontalprofile_mesh_without_geom" description="horizontalprofile_mesh_without_geom" state="de.intevation.gnv.state.DefaultState">
+              <queryID>verticalprofile_mesh</queryID>
+              <dataname>meshid</dataname>
+              <data-multiselect>false</data-multiselect>
+              <inputvalues>
+                  <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                  <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                  <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+              </inputvalues>
+         </state>
+          
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+             <from state="horizontalprofile_mesh_without_geom"/>
+             <to state="horizontalprofile_mesh_linestring"/>
+         </transition>
+          
+        <state id="horizontalprofile_mesh" description="horizontalprofile_mesh" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_with_area</queryID>
+           <dataname>meshid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh"/>
+           <to state="horizontalprofile_mesh_linestring"/>
+       </transition>
+       
+       <state id="horizontalprofile_mesh_linestring" description="horizontalprofile_mesh_coordinate" state="de.intevation.gnv.state.SingleInputState">
+           <dataname>mesh_linestring</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh_linestring"/>
+           <to state="horizontalprofile_meshpoint_parameter"/>
+       </transition>
+       
+       <!-- mesh_point -->
+       
+       
+       <state id="horizontalprofile_meshpoint_parameter" description="horizontalprofile_meshpoint_parameter" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_parameter</queryID>
+           <dataname>parameterid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" useinquery="0"/>
+                <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_meshpoint_parameter"/>
+           <to state="horizontalprofile_meshpoint_depth"/>
+       </transition>
+       
+        <state id="horizontalprofile_meshpoint_depth" description="horizontalprofile_meshpoint_depth" state="de.intevation.gnv.state.DefaultState">
+           <queryID>horizontalprofile_meshpoint_depth</queryID>
+           <dataname>depthid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" useinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="depthid" type="Integer" multiselect="true"  usedinquery="0"/>
+                <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_meshpoint_depth"/>
+           <to state="horizontalprofile_mesh_year"/>
+       </transition>
+
+       <state id="horizontalprofile_mesh_year" description="horizontalprofile_mesh_year" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_year</queryID>
+           <dataname>yearid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+               <inputvalue name="parameterid" type="Integer" multiselect="true"  usedinquery="1"/>
+               <inputvalue name="depthid" type="Integer" multiselect="true"  usedinquery="0"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="yearid" type="String" multiselect="true" usedinquery="0"/>
+               <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh_year"/>
+           <to state="horizontalprofile_mesh_date"/>
+       </transition>
+       
+       <state id="horizontalprofile_mesh_date" description="horizontalprofile_mesh_date" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_date</queryID>
+           <dataname>dateid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="parameterid" type="Integer" multiselect="true"  usedinquery="1"/>
+               <inputvalue name="depthid" type="Integer" multiselect="true"  usedinquery="0"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="yearid" type="String" multiselect="true" usedinquery="1"/>
+               <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="0"/>
+               <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="horizontalprofile_mesh_date"/>
+           <to state="horizontalprofile_mesh_calculate_results"/>
+       </transition>
+       
+       <state id="horizontalprofile_mesh_calculate_results" description="horizontalprofile_mesh_calculate_results" state="de.intevation.gnv.state.profile.horizontal.HorizontalProfileMeshCrossOutputState">
+           <queryID>horizontalprofile_mesh_cross_chart_data</queryID>
+           <queryID-ijk>horizontalprofile_meshpoint_cross_ij</queryID-ijk>
+           <queryID-odv>horizontalprofile_mesh_odv_data</queryID-odv>
+           <inputvalues>
+               <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+               <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="1"/>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="depthid" type="Integer" multiselect="true"  usedinquery="1"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+           <value-names>
+               <value-name name="feature" value="mesh_point"></value-name>
+               <value-name name="parameter" value="parameterid"></value-name>
+               <value-name name="measurement" value="depthid"></value-name>
+           </value-names>
+           <outputsModes>
+               <outputsMode name="chart" description="Chartrepresentation of the Values" mime-type="image/png">
+                   <parameters>
+                       <inputvalue name="width" type="Integer" value="600"/>
+                       <inputvalue name="height" type="Integer" value="400"/>
+                       <inputvalue name="points" type="Boolean" value="false"/>
+                   </parameters>
+               </outputsMode>
+               <outputsMode name="pdf" description="PDF-Export der Daten" mime-type="application/pdf">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+               <outputsMode name="svg" description="SVG-Export der Daten" mime-type="image/svg+xml">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+               <outputsMode name="csv" description="CSV-Export der Daten" mime-type="text/plain"/>
+               <outputsMode name="odv" description="ODV-Export der Daten" mime-type="text/plain"/>
+               <outputsMode name="statistics" description="Statistik zu den Daten" mime-type="text/xml"/>
+           </outputsModes>
+       </state>
+    </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/timeseries/conf_mesh.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="timeSeriesMesh">
+    <states>
+        <state id="timeseries_mesh_area" description="timeseries_mesh_area_one" state="de.intevation.gnv.state.DefaultState">
+            <queryID>area_filter</queryID>
+            <dataname>areaid</dataname>
+            <data-multiselect>false</data-multiselect>
+             <data-noselect>true</data-noselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="timeseries_mesh_area"/>
+            <to state="timeseries_mesh_subarea"/>
+            <condition inputvalue="areaid" value="n/n" operator="notequal"/>
+        </transition>
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="timeseries_mesh_area"/>
+            <to state="timeseries_mesh_without_geom"/>
+            <condition inputvalue="areaid" value="n/n" operator="equal"/>
+        </transition>
+        
+        <state id="timeseries_mesh_subarea" description="timeseries_mesh_subaera" state="de.intevation.gnv.state.DefaultState">
+            <queryID>subarea_filter</queryID>
+            <dataname>subareaid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_mesh_subarea"/>
+            <to state="timeseries_mesh"/>
+        </transition>
+        
+         <state id="timeseries_mesh_without_geom" description="timeseries_mesh_without_geom" state="de.intevation.gnv.state.DefaultState">
+             <queryID>verticalprofile_mesh</queryID>
+             <dataname>meshid</dataname>
+             <data-multiselect>false</data-multiselect>
+             <inputvalues>
+                 <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+             </inputvalues>
+         </state>
+         
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_mesh_without_geom"/>
+            <to state="timeseries_mesh_coordinate"/>
+         </transition>
+                
+        <state id="timeseries_mesh" description="timeseries_mesh" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_mesh_with_area</queryID>
+            <dataname>meshid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_mesh"/>
+            <to state="timeseries_mesh_coordinate"/>
+         </transition>
+         
+        <state id="timeseries_mesh_coordinate" description="timeseries_mesh_coordinate" state="de.intevation.gnv.state.SingleInputState">
+            <dataname>mesh_coordinate</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="mesh_coordinate" type="Coordinate" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_mesh_coordinate"/>
+            <to state="timeseries_meshpoint"/>
+         </transition>
+         
+        <state id="timeseries_meshpoint" description="timeseries_meshpoint" state="de.intevation.gnv.state.CoordinateSelectionState">
+            <queryID>timeseries_meshpoint</queryID>
+            <dataname>mesh_point</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                 <inputvalue name="meshid" type="Integer" multiselect="false"/>
+                 <inputvalue name="mesh_coordinate" type="Coordinate" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+            <mesh-width xlink:href="${artifacts.config.dir}/meshwidth.xml"/>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_meshpoint"/>
+            <to state="timeseries_meshpoint_depth"/>
+         </transition>
+         
+        <state id="timeseries_meshpoint_depth" description="timeseries_meshpoint_depth" state="de.intevation.gnv.state.DefaultState">
+            <queryID>timeseries_meshpoint_depth</queryID>
+            <dataname>depthid</dataname>
+            <data-multiselect>true</data-multiselect>
+            <inputvalues>
+                 <inputvalue name="meshid" type="Integer" multiselect="false"/>
+                 <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="2"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="depthid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_meshpoint_depth"/>
+            <to state="timeseries_meshpoint_parameter"/>
+         </transition>
+         
+        <state id="timeseries_meshpoint_parameter" description="timeseries_meshpoint_parameter" state="de.intevation.gnv.state.DefaultState">
+            <queryID>timeseries_mesh_parameter</queryID>
+            <dataname>parameterid</dataname>
+            <data-multiselect>true</data-multiselect>
+            <inputvalues>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="depthid" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="parameterid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_meshpoint_parameter"/>
+            <to state="timeseries_meshpoint_interval"/>
+         </transition>
+        
+        <state id="timeseries_meshpoint_interval" description="timeseries_interval" state="de.intevation.gnv.state.MinMaxState">
+            <queryID>timeseries_mesh_interval</queryID>
+            <dataname>timeinterval</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="depthid" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+                  <inputvalue name="minvalue" type="Date" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="maxvalue" type="Date" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_meshpoint_interval"/>
+            <to state="timeseries_meshpoint_calculate_results"/>
+         </transition>
+        
+        <state id="timeseries_meshpoint_calculate_results" description="timeseries_interval" state="de.intevation.gnv.state.timeseries.TimeSeriesOutputState">
+            <queryID>timeseries_mesh_chart_data</queryID>
+            <queryID-odv>timeseries_mesh_odv_data</queryID-odv>
+            <inputvalues>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+                 <inputvalue name="depthid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="minvalue" type="Date" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="maxvalue" type="Date" multiselect="false" usedinquery="1"/>
+            </inputvalues>
+            <value-names>
+                <value-name name="feature" value="mesh_point"></value-name>
+                <value-name name="parameter" value="parameterid"></value-name>
+                <value-name name="measurement" value="depthid"></value-name>
+            </value-names>
+            <outputsModes>
+                <outputsMode name="chart" description="Chartrepresentation of the Values" mime-type="image/png">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+                <outputsMode name="svg" description="SVG-Export der Daten" mime-type="image/svg+xml">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+                <outputsMode name="pdf" description="PDF-Export der Daten" mime-type="application/pdf">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+                <outputsMode name="csv" description="CSV-Export der Daten" mime-type="text/plain"/>
+                <outputsMode name="odv" description="ODV-Export der Daten" mime-type="text/plain"/>
+                <outputsMode name="statistics" description="Statistik zu den Daten" mime-type="text/xml"/>
+            </outputsModes>
+        </state>
+        
+    </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/timeseries/conf_timeseriespoint.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="timeSeries">
+<!--  This is the Artifact which represents the required Businesslogic to
+      collect the required Data for rendering specified OutputFormats
+      for TimeSeries on TimeSeriesPoint-Data.
+      * Charts
+      * Statistics
+      * CSV
+      * ODV -->
+    <states>
+        
+        <!--  The required statesteps which must be done until rendering
+              the OutputFormats. Each state is represented one required 
+              Step. One Steps can consume specified InputParameters an after 
+              that it can calculate new Data which will be used as possible 
+              InputValues in the next state-Step from each state it 
+              is only possible to move to those states which are Configured 
+              in the rechablestates-Tag  -->
+              
+         <!-- Description of the state-Attributes:
+              * id: The id of the state. This must be unique in one Artifact.
+                    It is used to reference the state eg. in 
+                    reachablestates.
+              * description: A short description which should describe the state
+              * state: The Class which must be load to handle the required logic,
+                            This class will be load using reflection. -->
+              
+        <state id="timeseries_area" description="timeseries_area_one" state="de.intevation.gnv.state.DefaultState">
+            
+            <!-- The QueryID which identifies the Query which is configured in 
+                 the Queries-Properties-File.
+                 It is possible to define no Query. 
+                 In this case you have to remove this Element from the 
+                 Configuration.-->
+            <queryID>area_filter</queryID>
+            
+            <!-- The ID of the Data which will be fetched using this state.
+                 The Name must be unique in one Artifact.
+                 The Name is used for the localization and must be set into the
+                 several PropertiesFiles for the localization.  -->
+            <dataname>areaid</dataname>
+            
+            <!-- This Flag will be used to switch between single and
+                 multiselect possibility of the Data which will be fetched 
+                 using this state.  -->
+            <data-multiselect>false</data-multiselect>
+            
+            <!-- Optional Flag which can be used to set that is is possible 
+                 to select no entry in the Data which will be fetched using
+                 this state. -->
+            <data-noselect>true</data-noselect>
+            
+            <inputvalues>
+                <!-- At this place it is necessary to configure the Elements
+                     which must be feed and can be used in this state.
+                     It is possible to set if the Values should be used in 
+                     the DatabaseQuery of this state and how often it
+                     must be used.
+                     The order of the Elements is also the Order of usage setting
+                     the Values into the SQL-Query. -->
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="timeseries_area"/>
+            <to state="timeseries_subarea"/>
+            <condition inputvalue="areaid" value="n/n" operator="notequal"/>
+        </transition>
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="timeseries_area"/>
+            <to state="timeseries_without_geom"/>
+            <condition inputvalue="areaid" value="n/n" operator="equal"/>
+        </transition>
+        
+        <state id="timeseries_subarea" description="timeseries_subaera" state="de.intevation.gnv.state.DefaultState">
+            <queryID>subarea_filter</queryID>
+            <dataname>subareaid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_subarea"/>
+            <to state="timeseries_timeseriespoint"/>
+        </transition>
+        
+        <state id="timeseries_without_geom" description="timeseries_mesh_without_geom" state="de.intevation.gnv.state.DefaultState">
+           <queryID>timeseries_timeseriespoint</queryID>
+           <dataname>featureid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="featureid" type="Integer" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_without_geom"/>
+            <to state="timeseries_parameter"/>
+        </transition>
+       
+        <state id="timeseries_timeseriespoint" description="timeseries_timeseriespoint" state="de.intevation.gnv.state.DefaultState">
+            <queryID>timeseries_timeseriespoint_with_area</queryID>
+            <dataname>featureid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="featureid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_timeseriespoint"/>
+            <to state="timeseries_parameter"/>
+        </transition>
+        
+        <state id="timeseries_parameter" description="timeseries_parameter" state="de.intevation.gnv.state.DefaultState">
+            <queryID>timeseries_parameter</queryID>
+            <dataname>parameterid</dataname>
+            <data-multiselect>true</data-multiselect>
+            <inputvalues>
+                <inputvalue name="featureid" type="Integer" multiselect="false"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_parameter"/>
+            <to state="timeseries_depth_height"/>
+        </transition>
+        
+         <state id="timeseries_depth_height" description="timeseries_depth_height" state="de.intevation.gnv.state.DefaultState">
+            <queryID>timeseries_depth_height</queryID>
+            <dataname>measurementid</dataname>
+            <data-multiselect>true</data-multiselect>
+            <inputvalues>
+                <inputvalue name="featureid" type="Integer" multiselect="false"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="measurementid" type="Integer" multiselect="true" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_depth_height"/>
+            <to state="timeseries_interval"/>
+        </transition>
+        
+        <state id="timeseries_interval" description="timeseries_interval" state="de.intevation.gnv.state.MinMaxState">
+            <queryID>timeseries_interval</queryID>
+            <dataname>timeinterval</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true"/>
+                <inputvalue name="measurementid" type="Integer" multiselect="true"/>
+                <inputvalue name="minvalue" type="Date" multiselect="false" usedinquery="0"/>
+                <inputvalue name="maxvalue" type="Date" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="timeseries_interval"/>
+            <to state="timeseries_calculate_results"/>
+        </transition>
+        
+        <!--  Last state is the Output-state. At this place the differen OutputModes are configured.
+              For each OutputMode it might be necessary to configure separat Databasequery which collect the
+              Data. -->
+        <state id="timeseries_calculate_results" description="timeseries_interval" state="de.intevation.gnv.state.timeseries.TimeSeriesOutputState">
+            <queryID>timeseries_chart_data</queryID>
+            <queryID-odv>timeseries_odv_data</queryID-odv>
+            <inputvalues>
+                <inputvalue name="parameterid" type="Integer" multiselect="true"/>
+                <inputvalue name="measurementid" type="Integer" multiselect="true"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="minvalue" type="Date" multiselect="false"/>
+                <inputvalue name="maxvalue" type="Date" multiselect="false"/>
+            </inputvalues>
+            <outputsModes>
+                <outputsMode name="chart" description="Chartrepresentation of the Values" mime-type="image/png">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+                <outputsMode name="pdf" description="PDF-Export der Daten" mime-type="application/pdf">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+                <outputsMode name="svg" description="SVG-Export der Daten" mime-type="image/svg+xml">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+                <outputsMode name="csv" description="CSV-Export der Daten" mime-type="text/plain"/>
+                <outputsMode name="odv" description="ODV-Export der Daten" mime-type="text/plain"/>
+                <outputsMode name="statistics" description="Statistik zu den Daten" mime-type="text/xml"/>
+            </outputsModes>
+            <!--  Definition of the TimeGaps which are required to render the Charts properly.
+                  each Parameter in each FIS can have   -->
+            <time-gap-definition xlink:href="${artifacts.config.dir}/products/timeseries/timegap_definition.xml" />
+        </state>
+        
+    </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/timeseries/timegap_definition.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<time-gaps>
+    <time-gap key = "1" gap="1" unit = "m"/>
+    <time-gap key = "2" gap="2" unit = "m"/>
+    <time-gap key = "3" gap="3" unit = "m"/>
+    <time-gap key = "4" gap="4" unit = "m"/>
+    <time-gap key = "5" gap="5" unit = "m"/>
+    <time-gap key = "6" gap="10" unit = "m"/>
+    <time-gap key = "7" gap="15" unit = "m"/>
+    <time-gap key = "8" gap="20" unit = "m"/>
+    <time-gap key = "9" gap="30" unit = "m"/>
+    <time-gap key = "10" gap="1" unit = "h"/>
+    <time-gap key = "11" gap="2" unit = "h"/>
+    <time-gap key = "12" gap="3" unit = "h"/>
+    <time-gap key = "13" gap="4" unit = "h"/>
+    <time-gap key = "14" gap="6" unit = "h"/>
+    <time-gap key = "15" gap="8" unit = "h"/>
+    <time-gap key = "16" gap="12" unit = "h"/>
+    <time-gap key = "17" gap="1" unit = "D"/>
+    <time-gap key = "18" gap="1" unit = "W"/>
+    <time-gap key = "19" gap="1" unit = "M"/>
+    <time-gap key = "20" gap="1" unit = "Y"/>
+</time-gaps>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/verticalcrosssection/conf_mesh.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="verticalCrossSectionMesh">
+     <states>
+        <state id="verticalcrosssection_mesh_area" description="verticalcrosssection_mesh_area_one" state="de.intevation.gnv.state.DefaultState">
+               <queryID>area_filter</queryID>
+               <dataname>areaid</dataname>
+               <data-multiselect>false</data-multiselect>
+                <data-noselect>true</data-noselect>
+               <inputvalues>
+                   <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="0"/>
+               </inputvalues>
+          </state>
+          
+          <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+              <from state="verticalcrosssection_mesh_area"/>
+              <to state="verticalcrosssection_mesh_subarea"/>
+              <condition inputvalue="areaid" value="n/n" operator="notequal"/>
+          </transition>
+          <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+              <from state="verticalcrosssection_mesh_area"/>
+              <to state="verticalcrosssection_mesh_without_geom"/>
+              <condition inputvalue="areaid" value="n/n" operator="equal"/>
+          </transition>
+          
+          <state id="verticalcrosssection_mesh_subarea" description="verticalcrosssection_mesh_area_one" state="de.intevation.gnv.state.DefaultState">
+               <queryID>subarea_filter</queryID>
+               <dataname>subareaid</dataname>
+               <data-multiselect>false</data-multiselect>
+               <inputvalues>
+                   <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="1"/>
+                   <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+               </inputvalues>
+         </state>
+         
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="verticalcrosssection_mesh_subarea"/>
+            <to state="verticalcrosssection_mesh"/>
+        </transition>
+         
+         <state id="verticalcrosssection_mesh_without_geom" description="verticalcrosssection_mesh" state="de.intevation.gnv.state.DefaultState">
+              <queryID>verticalprofile_mesh</queryID>
+              <dataname>meshid</dataname>
+              <data-multiselect>false</data-multiselect>
+              <inputvalues>
+                  <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                  <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                   <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+              </inputvalues>
+          </state>
+          
+          <transition transition="de.intevation.gnv.transition.DefaultTransition">
+              <from state="verticalcrosssection_mesh_without_geom"/>
+              <to state="verticalcrosssection_mesh_linestring"/>
+          </transition>
+         
+         <state id="verticalcrosssection_mesh" description="verticalcrosssection_mesh" state="de.intevation.gnv.state.DefaultState">
+             <queryID>verticalprofile_mesh_with_area</queryID>
+             <dataname>meshid</dataname>
+             <data-multiselect>false</data-multiselect>
+             <inputvalues>
+                 <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+             </inputvalues>
+         </state>
+         
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+              <from state="verticalcrosssection_mesh"/>
+              <to state="verticalcrosssection_mesh_linestring"/>
+          </transition>
+         
+        <state id="verticalcrosssection_mesh_linestring" description="verticalcrosssection_mesh_linestring" state="de.intevation.gnv.state.SingleInputState">
+           <dataname>mesh_linestring</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+        </state>
+         
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+              <from state="verticalcrosssection_mesh_linestring"/>
+              <to state="verticalcrosssection_mesh_parameter"/>
+         </transition>
+         
+         <state id="verticalcrosssection_mesh_parameter" description="verticalcrosssection_mesh_parameter" state="de.intevation.gnv.state.DefaultState">
+             <queryID>verticalprofile_mesh_parameter</queryID>
+             <dataname>parameterid</dataname>
+             <data-multiselect>false</data-multiselect>
+             <inputvalues>
+                  <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                  <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                  <inputvalue name="parameterid" type="Integer" multiselect="false"  usedinquery="0"/>
+                  <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+             </inputvalues>
+         </state>
+
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+              <from state="verticalcrosssection_mesh_parameter"/>
+              <to state="verticalcrosssection_mesh_year"/>
+         </transition>
+         
+         <state id="verticalcrosssection_mesh_year" description="verticalcrosssection_mesh_year" state="de.intevation.gnv.state.DefaultState">
+             <queryID>verticalcrosssection_mesh_year</queryID>
+             <dataname>yearid</dataname>
+             <data-multiselect>false</data-multiselect>
+             <inputvalues>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="axisid" type="AttributeName" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="parameterid" type="Integer" multiselect="true"  usedinquery="1"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="yearid" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+             </inputvalues>
+         </state>
+         
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+              <from state="verticalcrosssection_mesh_year"/>
+              <to state="verticalcrosssection_mesh_date"/>
+         </transition>
+         
+         <state id="verticalcrosssection_mesh_date" description="verticalcrosssection_mesh_date" state="de.intevation.gnv.state.DefaultState">
+             <queryID>verticalcrosssection_mesh_date</queryID>
+             <dataname>dateid</dataname>
+             <data-multiselect>false</data-multiselect>
+             <inputvalues>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="axisid" type="AttributeName" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="parameterid" type="Integer" multiselect="true"  usedinquery="1"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="yearid" type="String" multiselect="true" usedinquery="1"/>
+                 <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="0"/>
+                 <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+             </inputvalues>
+         </state>
+         
+         <transition transition="de.intevation.gnv.transition.DefaultTransition">
+              <from state="verticalcrosssection_mesh_date"/>
+              <to state="verticalcrosssection_mesh_calculate_results"/>
+         </transition>
+         
+         <state id="verticalcrosssection_mesh_calculate_results" description="verticalcrosssection_mesh_calculate_results" state="de.intevation.gnv.state.profile.verticalcrosssection.VerticalCrossSectionOutputState">
+             <queryID>verticalcrosssection_mesh_chart_data</queryID>
+             <queryID-odv>verticalcrosssection_mesh_odv_data</queryID-odv>
+             <inputvalues>
+                 <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+                 <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="1"/>
+                 <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                 <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="mesh_linestring" type="String" multiselect="false" usedinquery="0"/>
+             </inputvalues>
+             <value-names>
+                 <value-name name="feature" value="mesh_point"></value-name>
+                 <value-name name="parameter" value="parameterid"></value-name>
+                 <value-name name="measurement" value="depthid"></value-name>
+             </value-names>
+             <outputsModes>
+                 <outputsMode name="chart" description="Chartrepresentation of the Values" mime-type="image/png">
+                     <parameters>
+                         <inputvalue name="width" type="Integer" value="600"/>
+                         <inputvalue name="height" type="Integer" value="400"/>
+                     </parameters>
+                 </outputsMode>
+                 <outputsMode name="pdf" description="PDF-Export der Daten" mime-type="application/pdf">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                    </parameters>
+                </outputsMode>
+                 <outputsMode name="svg" description="SVG-Export der Daten" mime-type="image/svg+xml">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                    </parameters>
+                </outputsMode>
+             </outputsModes>
+         </state>
+     </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/verticalprofile/conf_instantaneouspoint.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="verticalProfileInstantaneousPoint">
+   <states>
+     <state id="verticalprofile_instantaneouspoint_series" description="verticalprofile_instantaneouspoint_series" state="de.intevation.gnv.state.DefaultState">
+         <queryID>verticalprofile_instantaneouspoint_series</queryID>
+         <dataname>seriesid</dataname>
+         <data-multiselect>false</data-multiselect>
+         <inputvalues>
+             <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+              <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+              <inputvalue name="seriesid" type="Integer" multiselect="false" usedinquery="0"/>
+         </inputvalues>
+     </state>
+     
+     <transition transition="de.intevation.gnv.transition.DefaultTransition">
+          <from state="verticalprofile_instantaneouspoint_series"/>
+          <to state="verticalprofile_instantaneouspoint_point"/>
+     </transition>
+     
+     <state id="verticalprofile_instantaneouspoint_point" description="verticalprofile_instantaneouspoint_point" state="de.intevation.gnv.state.CoordinateSelectionState">
+         <queryID>verticalprofile_instantaneouspoint_point</queryID>
+         <dataname>instantaneouspoint_point</dataname>
+         <data-multiselect>false</data-multiselect>
+         <inputvalues>
+              <inputvalue name="seriesid" type="Integer" multiselect="false" usedinquery="1"/>
+              <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+              <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+              <inputvalue name="instantaneouspoint_point" type="Integer" multiselect="false" usedinquery="0"/>
+         </inputvalues>
+     </state>
+     
+     <transition transition="de.intevation.gnv.transition.DefaultTransition">
+          <from state="verticalprofile_instantaneouspoint_point"/>
+          <to state="verticalprofile_instantaneouspoint_parameter"/>
+     </transition>
+     
+     <state id="verticalprofile_instantaneouspoint_parameter" description="verticalprofile_instantaneouspoint_parameter" state="de.intevation.gnv.state.DefaultState">
+         <queryID>verticalprofile_instantaneouspoint_parameter</queryID>
+         <dataname>parameterid</dataname>
+         <data-multiselect>true</data-multiselect>
+         <inputvalues>
+              <inputvalue name="seriesid" type="Integer" multiselect="false" usedinquery="0" />
+              <inputvalue name="instantaneouspoint_point" type="Integer" multiselect="false" usedinquery="1"/>
+              <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+              <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="0"/>
+         </inputvalues>
+     </state>
+     
+     <transition transition="de.intevation.gnv.transition.DefaultTransition">
+          <from state="verticalprofile_instantaneouspoint_parameter"/>
+          <to state="verticalprofile_instantaneouspoint_minmaxdepth"/>
+     </transition>
+     
+     <state id="verticalprofile_instantaneouspoint_minmaxdepth" description="verticalprofile_instantaneouspoint_minmaxdepth" state="de.intevation.gnv.state.MinMaxState">
+         <queryID>verticalprofile_instantaneouspoint_minmaxdepth</queryID>
+         <dataname>depthrange</dataname>
+         <data-multiselect>true</data-multiselect>
+         <inputvalues>
+              <inputvalue name="seriesid" type="Integer" multiselect="false" usedinquery="0" />
+              <inputvalue name="instantaneouspoint_point" type="Integer" multiselect="false" usedinquery="1"/>
+              <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+              <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+              <inputvalue name="minvalue" type="Double" multiselect="false" usedinquery="0"/>
+              <inputvalue name="maxvalue" type="Double" multiselect="false" usedinquery="0"/>
+         </inputvalues>
+     </state>
+     
+     <transition transition="de.intevation.gnv.transition.DefaultTransition">
+          <from state="verticalprofile_instantaneouspoint_minmaxdepth"/>
+          <to state="verticalprofile_instantaneouspoint_calculate_results"/>
+     </transition>
+     
+     <state id="verticalprofile_instantaneouspoint_calculate_results" description="verticalprofile_mesh_calculate_results" state="de.intevation.gnv.state.profile.vertical.VerticalProfileOutputState">
+         <queryID>verticalprofile_instantaneouspoint_chart_data</queryID>
+         <queryID-odv>verticalprofile_instantaneouspoint_odv_data</queryID-odv>
+         <inputvalues>
+             <inputvalue name="seriesid" type="Integer" multiselect="false" usedinquery="0" />
+             <inputvalue name="instantaneouspoint_point" type="Integer" multiselect="false" usedinquery="1"/>
+             <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+             <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+             <inputvalue name="minvalue" type="Double" multiselect="false" usedinquery="1"/>
+             <inputvalue name="maxvalue" type="Double" multiselect="false" usedinquery="1"/>
+         </inputvalues>
+         <value-names>
+             <value-name name="feature" value="instantaneouspoint_point"></value-name>
+             <value-name name="parameter" value="parameterid"></value-name>
+             <value-name name="measurement" value="dateid"></value-name>
+         </value-names>
+         <outputsModes>
+             <outputsMode name="chart" description="Chartrepresentation of the Values" mime-type="image/png">
+                 <parameters>
+                     <inputvalue name="width" type="Integer" value="600"/>
+                     <inputvalue name="height" type="Integer" value="400"/>
+                     <inputvalue name="points" type="Boolean" value="false"/>
+                 </parameters>
+             </outputsMode>
+             <outputsMode name="pdf" description="PDF-Export der Daten" mime-type="application/pdf">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+             <outputsMode name="svg" description="SVG-Export der Daten" mime-type="image/svg+xml">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+             <outputsMode name="csv" description="CSV-Export der Daten" mime-type="text/plain"/>
+             <outputsMode name="odv" description="ODV-Export der Daten" mime-type="text/plain"/>
+             <outputsMode name="statistics" description="Statistik zu den Daten" mime-type="text/xml"/>
+         </outputsModes>
+     </state>
+  </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/verticalprofile/conf_mesh.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="verticalProfileMesh">
+   <states>
+       <state id="verticalprofile_mesh_area" description="verticalprofile_mesh_area_one" state="de.intevation.gnv.state.DefaultState">
+           <queryID>area_filter</queryID>
+           <dataname>areaid</dataname>
+           <data-multiselect>false</data-multiselect>
+            <data-noselect>true</data-noselect>
+           <inputvalues>
+               <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+           <from state="verticalprofile_mesh_area"/>
+           <to state="verticalprofile_mesh_subarea"/>
+           <condition inputvalue="areaid" value="n/n" operator="notequal"/>
+       </transition>
+       <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+           <from state="verticalprofile_mesh_area"/>
+           <to state="verticalprofile_mesh_without_geom"/>
+           <condition inputvalue="areaid" value="n/n" operator="equal"/>
+       </transition>
+       
+       <state id="verticalprofile_mesh_subarea" description="verticalprofile_mesh_subaera" state="de.intevation.gnv.state.DefaultState">
+           <queryID>subarea_filter</queryID>
+           <dataname>subareaid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_mesh_subarea"/>
+           <to state="verticalprofile_mesh"/>
+       </transition>
+       
+        <state id="verticalprofile_mesh_without_geom" description="timeseries_mesh_without_geom" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_mesh</queryID>
+            <dataname>meshid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_mesh_without_geom"/>
+           <to state="verticalprofile_mesh_coordinate"/>
+       </transition>
+       
+       <state id="verticalprofile_mesh" description="verticalprofile_mesh" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_with_area</queryID>
+           <dataname>meshid</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+               <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_mesh"/>
+           <to state="verticalprofile_mesh_coordinate"/>
+       </transition>
+       
+       <state id="verticalprofile_mesh_coordinate" description="verticalprofile_mesh_coordinate" state="de.intevation.gnv.state.SingleInputState">
+           <dataname>mesh_coordinate</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mesh_coordinate" type="Coordinate" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_mesh_coordinate"/>
+           <to state="verticalprofile_mesh_point"/>
+       </transition>
+       
+       <state id="verticalprofile_mesh_point" description="verticalprofile_mesh_point" state="de.intevation.gnv.state.CoordinateSelectionState">
+           <queryID>verticalprofile_mesh_point</queryID>
+           <dataname>mesh_point</dataname>
+           <data-multiselect>false</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="mesh_coordinate" type="Coordinate" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+           </inputvalues>
+           <mesh-width xlink:href="${artifacts.config.dir}/meshwidth.xml"/>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_mesh_point"/>
+           <to state="verticalprofile_mesh_mindepth"/>
+       </transition>
+       
+        <state id="verticalprofile_mesh_mindepth" description="verticalprofile_mesh_mindepth" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_mesh_mindepth</queryID>
+            <dataname>mindepthid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="2"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mindepthid" type="Double" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_mesh_mindepth"/>
+           <to state="verticalprofile_mesh_maxdepth"/>
+        </transition>
+        
+        <state id="verticalprofile_mesh_maxdepth" description="verticalprofile_mesh_maxdepth" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_mesh_maxdepth</queryID>
+            <dataname>maxdepthid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <reachablestates>
+                <state>verticalprofile_meshpoint_parameter</state>
+            </reachablestates>
+            <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="2"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mindepthid" type="Double" multiselect="false" usedinquery="1"/>
+                <inputvalue name="maxdepthid" type="Double" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_mesh_maxdepth"/>
+           <to state="verticalprofile_meshpoint_parameter"/>
+        </transition>
+        
+        <state id="verticalprofile_meshpoint_parameter" description="verticalprofile_meshpoint_parameter" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_parameter</queryID>
+           <dataname>parameterid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+                <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="mindepthid" type="Double" multiselect="false" usedinquery="0"/>
+                <inputvalue name="maxdepthid" type="Double" multiselect="false" usedinquery="0"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="0" />
+           </inputvalues>
+       </state>
+
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_meshpoint_parameter"/>
+           <to state="verticalprofile_mesh_year"/>
+        </transition>
+       
+       <state id="verticalprofile_mesh_year" description="verticalprofile_mesh_year" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_year</queryID>
+           <dataname>yearid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+               <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1" />
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="mindepthid" type="Double" multiselect="false" usedinquery="0"/>
+               <inputvalue name="maxdepthid" type="Double" multiselect="false" usedinquery="0"/>
+               <inputvalue name="yearid" type="String" multiselect="true" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_mesh_year"/>
+           <to state="verticalprofile_mesh_date"/>
+        </transition>
+       
+       <state id="verticalprofile_mesh_date" description="verticalprofile_mesh_date" state="de.intevation.gnv.state.DefaultState">
+           <queryID>verticalprofile_mesh_date</queryID>
+           <dataname>dateid</dataname>
+           <data-multiselect>true</data-multiselect>
+           <inputvalues>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="1"/>
+               <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="0"/>
+               <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1" />
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="mindepthid" type="Double" multiselect="false" usedinquery="0"/>
+               <inputvalue name="maxdepthid" type="Double" multiselect="false" usedinquery="0"/>
+               <inputvalue name="yearid" type="String" multiselect="true" usedinquery="1"/>
+               <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="0"/>
+           </inputvalues>
+       </state>
+       
+       <transition transition="de.intevation.gnv.transition.DefaultTransition">
+           <from state="verticalprofile_mesh_date"/>
+           <to state="verticalprofile_mesh_calculate_results"/>
+        </transition>
+       
+       <state id="verticalprofile_mesh_calculate_results" description="verticalprofile_mesh_calculate_results" state="de.intevation.gnv.state.profile.vertical.VerticalProfileOutputState">
+           <queryID>verticalprofile_mesh_chart_data</queryID>
+           <queryID-odv>verticalprofile_mesh_odv_data</queryID-odv>
+           <inputvalues>
+               <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+               <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="1"/>
+               <inputvalue name="meshid" type="Integer" multiselect="false" usedinquery="2"/>
+               <inputvalue name="mesh_point" type="Integer" multiselect="false" usedinquery="2"/> 
+               <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+               <inputvalue name="mindepthid" type="Double" multiselect="false" usedinquery="1"/>
+               <inputvalue name="maxdepthid" type="Double" multiselect="false" usedinquery="1"/>
+           </inputvalues>
+           <value-names>
+               <value-name name="feature" value="mesh_point"></value-name>
+               <value-name name="parameter" value="parameterid"></value-name>
+               <value-name name="measurement" value="dateid"></value-name>
+           </value-names>
+           <outputsModes>
+               <outputsMode name="chart" description="Chartrepresentation of the Values" mime-type="image/png">
+                   <parameters>
+                       <inputvalue name="width" type="Integer" value="600"/>
+                       <inputvalue name="height" type="Integer" value="400"/>
+                       <inputvalue name="points" type="Boolean" value="false"/>
+                   </parameters>
+               </outputsMode>
+               <outputsMode name="pdf" description="PDF-Export der Daten" mime-type="application/pdf">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+               <outputsMode name="svg" description="SVG-Export der Daten" mime-type="image/svg+xml">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+               <outputsMode name="csv" description="CSV-Export der Daten" mime-type="text/plain"/>
+               <outputsMode name="odv" description="ODV-Export der Daten" mime-type="text/plain"/>
+               <outputsMode name="statistics" description="Statistik zu den Daten" mime-type="text/xml"/>
+           </outputsModes>
+       </state>
+   </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/products/verticalprofile/conf_timeseriespoint.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<artifact name="verticalProfile">
+    <states>
+        <state id="verticalprofile_area" description="verticalprofile_area_one" state="de.intevation.gnv.state.DefaultState">
+            <queryID>area_filter</queryID>
+            <dataname>areaid</dataname>
+            <data-multiselect>false</data-multiselect>
+             <data-noselect>true</data-noselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                 <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="verticalprofile_area"/>
+            <to state="verticalprofile_subarea"/>
+            <condition inputvalue="areaid" value="n/n" operator="notequal"/>
+        </transition>
+        <transition transition="de.intevation.gnv.transition.ValueCompareTransition">
+            <from state="verticalprofile_area"/>
+            <to state="verticalprofile_without_geom"/>
+            <condition inputvalue="areaid" value="n/n" operator="equal"/>
+        </transition>
+        
+        <state id="verticalprofile_subarea" description="verticalprofile_subaera" state="de.intevation.gnv.state.DefaultState">
+            <queryID>subarea_filter</queryID>
+            <dataname>subareaid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="0"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="areaid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="verticalprofile_subarea"/>
+            <to state="verticalprofile_timeseriespoint"/>
+        </transition>
+        
+        <state id="verticalprofile_without_geom" description="verticalprofile_without_geom" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_point</queryID>
+            <dataname>featureid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="featureid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="verticalprofile_without_geom"/>
+            <to state="verticalprofile_parameter"/>
+        </transition>
+        
+        <state id="verticalprofile_timeseriespoint" description="timeseries_timeseriespoint" state="de.intevation.gnv.state.DefaultState">
+            <queryID>timeseries_timeseriespoint_with_area</queryID>
+            <dataname>featureid</dataname>
+            <data-multiselect>false</data-multiselect>
+            <inputvalues>
+                <inputvalue name="sourceid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="subareaid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="featureid" type="Integer" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="verticalprofile_timeseriespoint"/>
+            <to state="verticalprofile_parameter"/>
+        </transition>
+        
+        <state id="verticalprofile_parameter" description="timeseries_parameter" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_parameter</queryID>
+            <dataname>parameterid</dataname>
+            <data-multiselect>true</data-multiselect>
+            <inputvalues>
+                <inputvalue name="featureid" type="Integer" multiselect="false"  usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true"  usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="verticalprofile_parameter"/>
+            <to state="verticalprofile_year"/>
+        </transition>
+        
+         <state id="verticalprofile_year" description="verticalprofile_year" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_year</queryID>
+            <dataname>yearid</dataname>
+            <data-multiselect>true</data-multiselect>
+            <inputvalues>
+                <inputvalue name="featureid" type="Integer" multiselect="false"  usedinquery="1"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="yearid" type="String" multiselect="true" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="verticalprofile_year"/>
+            <to state="verticalprofile_date"/>
+        </transition>
+        
+        <state id="verticalprofile_date" description="verticalprofile_date" state="de.intevation.gnv.state.DefaultState">
+            <queryID>verticalprofile_date</queryID>
+            <dataname>dateid</dataname>
+            <data-multiselect>true</data-multiselect>
+            <inputvalues>
+                <inputvalue name="featureid" type="Integer" multiselect="false"  usedinquery="1"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+                 <inputvalue name="yearid" type="String" multiselect="true" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="verticalprofile_date"/>
+            <to state="verticalprofile_minmaxdepth"/>
+        </transition>
+        
+        <state id="verticalprofile_minmaxdepth" description="verticalprofile_minmaxdepth" state="de.intevation.gnv.state.MinMaxState">
+            <queryID>verticalprofile_minmaxdepth</queryID>
+            <dataname>depthrange</dataname>
+            <data-multiselect>true</data-multiselect>
+            <inputvalues>
+                <inputvalue name="featureid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="1"/>
+                <inputvalue name="minvalue" type="Double" multiselect="false" usedinquery="0"/>
+                <inputvalue name="maxvalue" type="Double" multiselect="false" usedinquery="0"/>
+            </inputvalues>
+        </state>
+        
+        <transition transition="de.intevation.gnv.transition.DefaultTransition">
+            <from state="verticalprofile_minmaxdepth"/>
+            <to state="verticalprofile_calculate_results"/>
+        </transition>
+        
+        <state id="verticalprofile_calculate_results" description="verticalprofile_calculate_results" state="de.intevation.gnv.state.profile.vertical.VerticalProfileOutputState">
+            <queryID>verticalprofile_chart_data</queryID>
+            <queryID-odv>verticalprofile_odv_data</queryID-odv>
+            <inputvalues>
+                <inputvalue name="featureid" type="Integer" multiselect="false" usedinquery="1"/>
+                <inputvalue name="parameterid" type="Integer" multiselect="true" usedinquery="1"/>
+                <inputvalue name="dateid" type="Date" multiselect="true" usedinquery="1"/>
+                <inputvalue name="fisname" type="String" multiselect="false" usedinquery="0"/>
+                <inputvalue name="minvalue" type="Double" multiselect="false" usedinquery="1"/>
+                <inputvalue name="maxvalue" type="Double" multiselect="false" usedinquery="1"/>
+            </inputvalues>
+            <value-names>
+                <value-name name="feature" value="featureid"></value-name>
+                <value-name name="parameter" value="parameterid"></value-name>
+                <value-name name="measurement" value="dateid"></value-name>
+            </value-names>
+            <outputsModes>
+                <outputsMode name="chart" description="Chartrepresentation of the Values" mime-type="image/png">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+                <outputsMode name="pdf" description="PDF-Export der Daten" mime-type="application/pdf">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+                <outputsMode name="svg" description="SVG-Export der Daten" mime-type="image/svg+xml">
+                    <parameters>
+                        <inputvalue name="width" type="Integer" value="600"/>
+                        <inputvalue name="height" type="Integer" value="400"/>
+                        <inputvalue name="points" type="Boolean" value="false"/>
+                    </parameters>
+                </outputsMode>
+                <outputsMode name="csv" description="CSV-Export der Daten" mime-type="text/plain"/>
+                <outputsMode name="odv" description="ODV-Export der Daten" mime-type="text/plain"/>
+                <outputsMode name="statistics" description="Statistik zu den Daten" mime-type="text/xml"/>
+            </outputsModes>
+        </state>
+    </states>
+</artifact>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/conf/queries.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,1193 @@
+#############################################
+#############################################
+##########     Zeitserie       ##############
+#############################################
+#############################################
+
+timeseries_timeseriespoint=SELECT DISTINCT \
+        tsp.FEATUREID KEY, \
+        tsp.NAME VALUE \
+    FROM MEDIAN.TIMESERIESPOINT tsp, \
+         MEDIAN.MEASUREMENT mmt \
+    WHERE tsp.FEATUREID =  mmt.FEATUREID AND \
+          mmt.SOURCEID = ? \
+    order by tsp.name
+
+timeseries_timeseriespoint_with_area=SELECT \
+        MEDIAN.TIMESERIESPOINT.FEATUREID KEY, \
+        MEDIAN.TIMESERIESPOINT.NAME VALUE \
+    FROM MEDIAN.TIMESERIESPOINT, \
+         MEDIAN.MEASUREMENT MMT \
+    WHERE MEDIAN.TIMESERIESPOINT.FEATUREID =  MMT.FEATUREID AND \
+          MMT.SOURCEID = ? AND \
+          INTERSECTS(SHAPE, \
+                      (SELECT st_astext(SHAPE) \
+                       FROM MEDIAN.FEATUREAREA \
+                       WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \
+                              FEATURECODE = ? )\
+                      )\
+    ORDER BY MEDIAN.TIMESERIESPOINT.NAME
+
+timeseries_parameter=SELECT DISTINCT \
+        p.PARAMETERID KEY, \
+        p.GERMANNAME || '  ['|| p.UNIT ||']' VALUE, \
+        p.GERMANNAME \
+    FROM MEDIAN.PARAMETER P, \
+         MEDIAN.TIMESERIES TS, \
+         MEDIAN.TIMESERIESVALUE TSV, \
+         MEDIAN.MEASUREMENT M, \
+         MEDIAN.TIMESERIESPOINT TSP \
+    WHERE M.FEATUREID = TSP.FEATUREID AND \
+          M.MEASUREMENTID = TSV.MEASUREMENTID AND \
+          TS.TIMESERIESID = TSV.TIMESERIESID AND \
+          P.PARAMETERID = TS.PARAMETERID AND \
+          TSP.FEATUREID = ? \
+    ORDER BY P.GERMANNAME
+    
+timeseries_depth_height=SELECT DISTINCT \
+        M.MEASUREMENTID KEY, \
+        M.ZLOCATION VALUE \
+    FROM MEDIAN.MEASUREMENT M, \
+         MEDIAN.TIMESERIESVALUE TSV, \
+         MEDIAN.TIMESERIES T, \
+         MEDIAN.PARAMETER P \
+    WHERE M.MEASUREMENTID = TSV.MEASUREMENTID AND \
+          TSV.TIMESERIESID = T.TIMESERIESID AND \
+          T.PARAMETERID = P.PARAMETERID AND \
+          M.FEATUREID = ? AND \
+          P.PARAMETERID IN (?)\
+    ORDER BY m.ZLOCATION DESC
+
+timeseries_interval=select min(tv.TIMEVALUE) MIN, \
+        max(tv.TIMEVALUE) MAX \
+    from MEDIAN.TIMESERIES t, \
+         MEDIAN.TIMESERIESVALUE tv \
+    where tv.TIMESERIESID = t.TIMESERIESID AND \
+          t.PARAMETERID IN ( ? ) AND \
+          tv.MEASUREMENTID IN ( ? )
+          
+timeseries_chart_data=SELECT tv.TIMEVALUE XORDINATE, \
+        tv.DATAVALUE YORDINATE, \
+        t.PARAMETERID GROUP1, \
+        tv.MEASUREMENTID GROUP2, \
+        tv.TIMESERIESID GROUP3, \
+        t.TIMEINTERVAL GAPID \
+    FROM MEDIAN.TIMESERIESVALUE tv, \
+         MEDIAN.TIMESERIES t \
+    WHERE tv.TIMESERIESID = t.TIMESERIESID AND \
+          t.PARAMETERID IN ( ? ) AND \
+          tv.MEASUREMENTID IN ( ? ) AND \
+          tv.TIMEVALUE >= ? AND \
+          tv.TIMEVALUE <= ? \
+    ORDER BY tv.MEASUREMENTID, \
+             tv.TIMESERIESID, \
+             t.PARAMETERID, \
+             tv.TIMEVALUE
+             
+timeseries_odv_data = SELECT SI.NAME CRUISE, \
+            MEDIAN.TIMESERIESPOINT.NAME STATION, \
+            '*' TYPE, \
+            ST_ASTEXT(SHAPE), \
+            0 BOTDEPTH, \
+            (M.ZLOCATION *-1) DEPTH, \
+            TSV.TIMEVALUE, \
+            TSV.DATAVALUE, \
+            TS.PARAMETERID PARAMETER, \
+            TSV.MEASUREMENTID, \
+            TSV.TIMESERIESID \
+     FROM MEDIAN.TIMESERIESPOINT, \
+          MEDIAN.TIMESERIESVALUE TSV, \
+          MEDIAN.TIMESERIES TS, \
+          MEDIAN.MEASUREMENT M, \
+          MEDIAN.SOURCEINFO SI \
+     WHERE SI.SOURCEID = M.SOURCEID AND \
+           M.FEATUREID = MEDIAN.TIMESERIESPOINT.FEATUREID AND \
+           M.MEASUREMENTID = TSV.MEASUREMENTID AND \
+           TSV.TIMESERIESID = TS.TIMESERIESID AND \
+           TS.PARAMETERID IN ( ? ) AND \
+           TSV.MEASUREMENTID IN ( ? ) AND \
+           TSV.TIMEVALUE >= ? AND \
+           TSV.TIMEVALUE <= ? \
+     ORDER BY TSV.MEASUREMENTID, \
+              TSV.TIMESERIESID, \
+              TS.PARAMETERID, \
+              TSV.TIMEVALUE
+
+#############################################
+#############################################
+##########   Zeitserie Mesh    ##############
+#############################################
+#############################################
+
+timeseries_mesh = SELECT OBJECTID KEY, \
+        m.NAME VALUE \
+    FROM MEDIAN.MESH m \
+    WHERE SOURCEID IN (?) \
+    ORDER BY m.NAME
+timeseries_meshpoint = SELECT MEDIAN.MESHPOINT.FEATUREID, \
+        ST_ASTEXT(SHAPE) \
+    FROM MEDIAN.MESHPOINT, \
+         MEDIAN.MESH M \
+    WHERE MEDIAN.MESHPOINT.MESHID = M.MESHID AND \
+         KPOSITION = 1 AND \
+         M.OBJECTID = ? AND \
+         INTERSECTS(SHAPE,"?")
+
+timeseries_meshpoint_depth = SELECT MP.FEATUREID KEY, \
+        'Layer ' || ML.KPOSITION || ': ' || -ML.UPPERZLOCATION || ' - '|| -ML.LOWERZLOCATION VALUE \
+    from MEDIAN.MESHLAYER ML, \
+         MEDIAN.MESHPOINT MP, \
+         MEDIAN.MESH M \
+    WHERE ML.KPOSITION = MP.KPOSITION AND \
+          ML.MESHID = MP.MESHID AND \
+          M.OBJECTID = ? AND \
+          MP.MESHID = M.MESHID  AND \
+          IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) AND \
+          JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) \
+    ORDER BY ML.UPPERZLOCATION DESC
+
+timeseries_mesh_parameter=SELECT distinct \
+        p.PARAMETERID KEY, \
+        p.GERMANNAME || '  ['|| p.UNIT ||']' VALUE, \
+        p.GERMANNAME \
+    from MEDIAN.PARAMETER p, \
+         MEDIAN.MESHSCALARVALUE msc, \
+         MEDIAN.MESH m \
+    where m.OBJECTID = ? AND \
+          msc.PARTID = m.PARTIDMIN AND \
+          msc.PARAMETERID = p.PARAMETERID \
+    order by p.GERMANNAME
+timeseries_mesh_interval=select /*+ parallel(TIMEVALUE,5) */ \
+        min(TIMEVALUE) MIN, \
+        max(TIMEVALUE) MAX \
+    from MEDIAN.MESHSCALARVALUE msc, \
+         MEDIAN.MESH m \
+    where m.OBJECTID = ? AND \
+          msc.PARTID >= m.PARTIDMIN AND \
+          msc.PARTID <= m.PARTIDMAX AND \
+          msc.PARAMETERID IN (?)
+
+timeseries_mesh_chart_data=select /*+ parallel(timevalue,10) */ \
+        msv.TIMEVALUE XORDINATE, \
+        msv.DATAVALUE YORDINATE, \
+        msv.PARAMETERID GROUP1, \
+        msv.FEATUREID GROUP2, \
+        mp.FEATUREID GROUP3, \
+        -1 GAPID \
+    from MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.MESHPOINT mp, \
+         MEDIAN.MESH m \
+    where (m.OBJECTID = ? AND \
+           msv.PARTID >= m.PARTIDMIN AND \
+           msv.PARTID <= m.PARTIDMAX ) AND \
+          msv.FEATUREID = mp.FEATUREID AND \
+          msv.PARAMETERID in ( ? ) AND \
+          mp.FEATUREID in ( ? ) AND \
+          msv.TIMEVALUE >= ? AND \
+          msv.TIMEVALUE <= ? \
+    order by mp.FEATUREID, \
+             msv.FEATUREID, \
+             msv.PARAMETERID, \
+             msv.TIMEVALUE
+             
+timeseries_mesh_odv_data = select /*+ parallel(timevalue,10) */ \
+        SI.NAME CRUISE, \
+        m.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \
+        '*' TYPE, \
+        ST_ASTEXT(SHAPE), \
+        0 BOTDEPTH, \
+        (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \
+        msv.TIMEVALUE, \
+        msv.DATAVALUE, \
+        msv.PARAMETERID PARAMETER \
+    from MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.MESHPOINT, \
+         MEDIAN.MESH m, \
+         MEDIAN.SOURCEINFO SI, \
+         MEDIAN.MESHLAYER ML \
+    where (m.OBJECTID = ? AND \
+           msv.PARTID >= m.PARTIDMIN AND \
+           msv.PARTID <= m.PARTIDMAX ) AND \
+          m.SOURCEID = SI.SOURCEID AND \
+          ML.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+          ML.KPOSITION = MEDIAN.MESHPOINT.KPOSITION AND \
+          msv.FEATUREID = MEDIAN.MESHPOINT.FEATUREID AND \
+          msv.PARAMETERID in (? ) AND \
+          MEDIAN.MESHPOINT.FEATUREID in ( ? ) AND \
+          msv.TIMEVALUE >= ? AND \
+          msv.TIMEVALUE <= ? \
+    order by MEDIAN.MESHPOINT.FEATUREID, \
+             msv.FEATUREID, \
+             msv.PARAMETERID, \
+             msv.TIMEVALUE
+
+
+#############################################
+#############################################
+##########   Vertikalprofil    ##############
+#############################################
+#############################################
+
+verticalprofile_point=SELECT DISTINCT \
+           tsp.FEATUREID KEY, \
+           tsp.NAME VALUE \
+    FROM MEDIAN.TIMESERIESPOINT tsp, \
+           MEDIAN.MEASUREMENT mmt \
+    WHERE tsp.FEATUREID =  mmt.FEATUREID AND \
+           mmt.SOURCEID = ? \
+    order by tsp.name
+
+verticalprofile_parameter=SELECT DISTINCT \
+           p.PARAMETERID KEY, \
+           p.GERMANNAME || '  ['|| p.UNIT ||']' VALUE, \
+           p.GERMANNAME \
+    from MEDIAN.PARAMETER p, \
+           MEDIAN.TIMESERIES ts, \
+           MEDIAN.TIMESERIESVALUE tsv, \
+           MEDIAN.MEASUREMENT m \
+    where ts.PARAMETERID = p.PARAMETERID and \
+          ts.TIMESERIESID = tsv.TIMESERIESID and \
+          m.MEASUREMENTID = tsv.MEASUREMENTID and \
+          m.FEATUREID = ? \
+    ORDER BY p.GERMANNAME
+    
+verticalprofile_minmaxdepth= SELECT min(M.ZLOCATION) MIN, \
+           max(M.ZLOCATION) MAX \
+    FROM MEDIAN.MEASUREMENT M, \
+         MEDIAN.TIMESERIES TS, \
+         MEDIAN.TIMESERIESVALUE TSV \
+    WHERE TS.TIMESERIESID = TSV.TIMESERIESID and \
+          M.MEASUREMENTID = TSV.MEASUREMENTID and \
+          M.FEATUREID = ? and \
+          TS.PARAMETERID IN ( ? )
+          
+          
+verticalprofile_year=select distinct \
+        to_char(tsv.TIMEVALUE,'YYYY') KEY, \
+        to_char(tsv.TIMEVALUE,'YYYY') VALUE \
+    from MEDIAN.TIMESERIES ts, \
+         MEDIAN.TIMESERIESVALUE tsv, \
+         MEDIAN.MEASUREMENT m \
+    where ts.TIMESERIESID = tsv.TIMESERIESID and \
+          m.MEASUREMENTID = tsv.MEASUREMENTID and \
+          m.FEATUREID = ? and \
+          ts.PARAMETERID IN ( ? ) \
+    order by to_char(tsv.TIMEVALUE,'YYYY')
+          
+verticalprofile_date=select distinct \
+           tsv.TIMEVALUE KEY, \
+           tsv.TIMEVALUE VALUE \
+    from MEDIAN.TIMESERIES ts, \
+         MEDIAN.TIMESERIESVALUE tsv, \
+         MEDIAN.MEASUREMENT m \
+    where ts.TIMESERIESID = tsv.TIMESERIESID and \
+          m.MEASUREMENTID = tsv.MEASUREMENTID and \
+          m.FEATUREID = ? and \
+          ts.PARAMETERID IN ( ? ) and \
+          to_char(tsv.TIMEVALUE,'YYYY') IN (?) \
+    order by tsv.TIMEVALUE 
+
+verticalprofile_chart_data= SELECT M.ZLOCATION XORDINATE, \
+           TSV.DATAVALUE YORDINATE, \
+           TS.PARAMETERID GROUP1, \
+           TSV.TIMEVALUE GROUP2, \
+           1 GROUP3, \
+           1 DATAID \
+    from MEDIAN.TIMESERIES TS, \
+         MEDIAN.TIMESERIESVALUE TSV, \
+         MEDIAN.MEASUREMENT M \
+    where TS.TIMESERIESID = TSV.TIMESERIESID AND \
+          M.MEASUREMENTID = TSV.MEASUREMENTID AND \
+          M.FEATUREID = ? AND \
+          TS.PARAMETERID IN ( ? ) AND \
+          TSV.TIMEVALUE IN (?) AND \
+          M.ZLOCATION >= ? AND \
+          M.ZLOCATION <= ? \
+    ORDER BY TSV.TIMEVALUE, \
+             TSV.TIMESERIESID, \
+             TS.PARAMETERID, \
+             TSV.TIMEVALUE
+             
+verticalprofile_odv_data = SELECT SI.NAME CRUISE, \
+            MEDIAN.TIMESERIESPOINT.NAME STATION, \
+            '*' TYPE, \
+            ST_ASTEXT(SHAPE), \
+            0 BOTDEPTH, \
+            (M.ZLOCATION *-1) DEPTH, \
+            TSV.TIMEVALUE, \
+            TSV.DATAVALUE, \
+            TS.PARAMETERID PARAMETER, \
+            TSV.MEASUREMENTID, \
+            TSV.TIMESERIESID \
+     FROM MEDIAN.TIMESERIESPOINT, \
+          MEDIAN.TIMESERIESVALUE TSV, \
+          MEDIAN.TIMESERIES TS, \
+          MEDIAN.MEASUREMENT M, \
+          MEDIAN.SOURCEINFO SI \
+     WHERE SI.SOURCEID = M.SOURCEID AND \
+           M.FEATUREID = MEDIAN.TIMESERIESPOINT.FEATUREID AND \
+           M.MEASUREMENTID = TSV.MEASUREMENTID AND \
+           TSV.TIMESERIESID = TS.TIMESERIESID AND \
+           M.FEATUREID = ? AND \
+           TS.PARAMETERID IN ( ? ) AND \
+           TSV.TIMEVALUE IN (?) AND \
+           M.ZLOCATION >= ? AND \
+           M.ZLOCATION <= ? \
+     ORDER BY TSV.MEASUREMENTID, \
+              TSV.TIMESERIESID, \
+              TS.PARAMETERID, \
+              TSV.TIMEVALUE
+             
+#############################################
+#############################################
+########## Vertikalprofil Mesh ##############
+#############################################
+#############################################
+
+verticalprofile_mesh = SELECT OBJECTID KEY, \
+        m.NAME VALUE \
+    FROM MEDIAN.MESH m \
+    WHERE SOURCEID IN (?) \
+    order by m.NAME
+    
+verticalprofile_mesh_with_area = SELECT M.OBJECTID KEY, \
+         M.NAME VALUE \
+     FROM MEDIAN.MESHPOINT, \
+          MEDIAN.MESH M \
+     WHERE M.SOURCEID IN (?) AND \
+           M.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+           INTERSECTS(SHAPE, \
+                      (SELECT st_astext(SHAPE) \
+                       FROM MEDIAN.FEATUREAREA \
+                       WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \
+                              FEATURECODE = ? )\
+                      ) \
+     order by M.NAME
+    
+verticalprofile_mesh_point = SELECT FEATUREID, \
+        ST_ASTEXT(SHAPE) \
+    FROM MEDIAN.MESHPOINT \
+    WHERE MESHID  in \
+        (SELECT DISTINCT MESHID \
+         FROM MEDIAN.MESH \
+         WHERE OBJECTID = ?) AND \
+         KPOSITION = 1 AND \
+         INTERSECTS(SHAPE,"?")
+          
+verticalprofile_mesh_mindepth = SELECT MP.KPOSITION KEY, \
+        'Layer ' || ML.KPOSITION || ': ' || -ML.UPPERZLOCATION || ' - '|| -ML.LOWERZLOCATION VALUE \
+    from MEDIAN.MESHLAYER ML, \
+         MEDIAN.MESHPOINT MP, \
+         MEDIAN.MESH M \
+    WHERE ML.KPOSITION = MP.KPOSITION AND \
+          ML.MESHID = MP.MESHID AND \
+          M.OBJECTID = ? AND \
+          MP.MESHID = M.MESHID  AND \
+          IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) AND \
+          JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) \
+    ORDER BY ML.UPPERZLOCATION DESC
+
+verticalprofile_mesh_maxdepth = SELECT MP.KPOSITION KEY, \
+        'Layer ' || ML.KPOSITION || ': ' || -ML.UPPERZLOCATION || ' - '|| -ML.LOWERZLOCATION VALUE \
+    from MEDIAN.MESHLAYER ML, \
+         MEDIAN.MESHPOINT MP, \
+         MEDIAN.MESH M \
+    WHERE ML.KPOSITION = MP.KPOSITION AND \
+          ML.MESHID = MP.MESHID AND \
+          M.OBJECTID = ? AND \
+          MP.MESHID = M.MESHID  AND \
+          IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) AND \
+          JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) AND \
+          MP.KPOSITION < ? \
+    ORDER BY ML.UPPERZLOCATION DESC
+    
+verticalprofile_mesh_parameter=SELECT distinct \
+        p.PARAMETERID KEY, \
+        p.GERMANNAME || '  ['|| p.UNIT ||']' VALUE, \
+        p.GERMANNAME \
+    from MEDIAN.PARAMETER p, \
+         MEDIAN.MESHSCALARVALUE msc, \
+         MEDIAN.MESH m  \
+    where m.OBJECTID = ? AND \
+          m.PARTIDMIN = msc.PARTID AND \
+          msc.PARAMETERID = p.PARAMETERID \
+    order by p.GERMANNAME
+
+verticalprofile_mesh_year= select  distinct \
+        to_char(msv.TIMEVALUE,'YYYY') KEY, \
+        to_char(msv.TIMEVALUE,'YYYY') VALUE \
+    from MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.MESH m \
+    where m.OBJECTID = ?  AND \
+          msv.PARTID >= m.PARTIDMIN AND \
+          msv.PARTID <= m.PARTIDMAX AND \
+          msv.PARAMETERID in (?) \
+    order by to_char(msv.TIMEVALUE, 'YYYY')
+          
+verticalprofile_mesh_date= select  distinct \
+        msv.TIMEVALUE KEY, \
+        msv.TIMEVALUE VALUE \
+    from MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.MESH m \
+    where m.OBJECTID = ?  AND \
+          msv.PARTID >= m.PARTIDMIN AND \
+          msv.PARTID <= m.PARTIDMAX AND \
+          msv.PARAMETERID in (?) AND \
+          to_char(msv.TIMEVALUE,'YYYY') in (?) \
+    order by msv.TIMEVALUE
+
+verticalprofile_mesh_chart_data=select ml.UPPERZLOCATION XORDINATE, \
+           msv.DATAVALUE YORDINATE, \
+           mp.KPOSITION KPOSITION, \
+           msv.PARAMETERID GROUP1, \
+           msv.TIMEVALUE GROUP2, \
+           1 GROUP3, \
+           2 DATAID \
+    from MEDIAN.MESHLAYER ml, \
+         MEDIAN.MESHPOINT mp, \
+         MEDIAN.MESH m, \
+         MEDIAN.MESHSCALARVALUE msv \
+    where msv.FEATUREID = mp. FEATUREID AND \
+          ml.KPOSITION = mp.KPOSITION and \
+          ml.MESHID = mp.MESHID and \
+          m.MESHID = mp.MESHID AND \
+          m.PARTIDMIN <= msv.PARTID AND \
+          m.PARTIDMAX >= msv.PARTID AND \
+          msv.PARAMETERID in (?) AND \
+          msv.TIMEVALUE in (?) AND \
+          m.OBJECTID = ? AND \
+          mp.FEATUREID in \
+            ( select FEATUREID \
+              from MEDIAN.MESHPOINT mp, \
+                   MEDIAN.MESH m \
+              where m.OBJECTID = ? AND \
+                    mp.MESHID = m.MESHID  AND \
+                    IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) and \
+                    JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?)) AND \
+          mp.KPOSITION <= ? AND \
+          mp.KPOSITION >= ? \
+   order by msv.PARAMETERID, \
+            msv.TIMEVALUE, \
+            ml.UPPERZLOCATION
+            
+verticalprofile_mesh_odv_data=select SI.NAME CRUISE, \
+        m.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \
+        '*' TYPE, \
+        ST_ASTEXT(SHAPE), \
+        0 BOTDEPTH, \
+        (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \
+        msv.DATAVALUE, \
+        msv.PARAMETERID PARAMETER, \
+        msv.TIMEVALUE \
+    from MEDIAN.MESHLAYER ml, \
+         MEDIAN.MESHPOINT, \
+         MEDIAN.MESH m, \
+         MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.SOURCEINFO SI \
+    where m.SOURCEID = SI.SOURCEID AND \
+          msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \
+          ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \
+          ml.MESHID = MEDIAN.MESHPOINT.MESHID and \
+          m.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+          m.PARTIDMIN <= msv.PARTID AND \
+          m.PARTIDMAX >= msv.PARTID AND \
+          msv.PARAMETERID in (?) AND \
+          msv.TIMEVALUE in (?) AND \
+          m.OBJECTID = ? AND \
+          MEDIAN.MESHPOINT.FEATUREID in \
+                          ( select FEATUREID \
+                            from MEDIAN.MESHPOINT mp, \
+                                 MEDIAN.MESH m \
+                             where m.OBJECTID = ? AND \
+                                   mp.MESHID = m.MESHID  AND \
+                                  IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) and \
+                                  JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?)) AND \
+          MEDIAN.MESHPOINT.KPOSITION <= ? AND \
+          MEDIAN.MESHPOINT.KPOSITION >= ? \
+    order by msv.PARAMETERID, \
+             msv.TIMEVALUE, \
+             ml.UPPERZLOCATION
+            
+#############################################
+#############################################
+##### Vertikalprofil InstantaneousPoint #####
+#############################################
+#############################################
+
+verticalprofile_instantaneouspoint_series = SELECT DISTINCT \
+        S.SERIESID KEY, \
+        S.DESCRIPTION VALUE \
+    FROM MEDIAN.SERIES S, \
+         MEDIAN.INSTANTANEOUSPOINT I, \
+         MEDIAN.MEASUREMENT M \
+    WHERE S.SERIESID = I.SERIESID AND \
+          I.POINTSPEC = 4 AND \
+          I.FEATUREID = M.FEATUREID AND \
+          M.SOURCEID= ? \
+    ORDER BY S.DESCRIPTION
+    
+verticalprofile_instantaneouspoint_series_with_area = SELECT \
+        S.SERIESID KEY, \
+        S.DESCRIPTION VALUE \
+    FROM MEDIAN.INSTANTANEOUSPOINT, \
+         MEDIAN.SERIES S, \
+         MEDIAN.MEASUREMENT M \
+    WHERE S.SERIESID = MEDIAN.INSTANTANEOUSPOINT.SERIESID AND \
+          MEDIAN.INSTANTANEOUSPOINT.POINTSPEC = 4 AND \
+          MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \
+          M.SOURCEID= ? AND \
+          INTERSECTS(SHAPE, \
+                     (SELECT st_astext(SHAPE) \
+                      FROM MEDIAN.FEATUREAREA \
+                      WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \
+                             FEATURECODE = ? )\
+                     ) \
+    ORDER BY S.DESCRIPTION
+    
+verticalprofile_instantaneouspoint_point = SELECT \
+        MEDIAN.INSTANTANEOUSPOINT.FEATUREID, \
+        to_char(MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE,'DD.MM.YYYY HH24:MI') VALUE, \
+        MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE, \
+         ST_ASTEXT(SHAPE) \
+    FROM MEDIAN.INSTANTANEOUSPOINT, \
+         MEDIAN.MEASUREMENT M \
+    WHERE MEDIAN.INSTANTANEOUSPOINT.SERIESID = ? AND \
+          MEDIAN.INSTANTANEOUSPOINT.POINTSPEC = 4 AND \
+          MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \
+          M.SOURCEID = ? \
+    ORDER BY MEDIAN.INSTANTANEOUSPOINT.FEATUREID, \
+             MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE
+
+verticalprofile_instantaneouspoint_parameter = SELECT DISTINCT \
+        P.PARAMETERID KEY, \
+        p.GERMANNAME || '  ['|| p.UNIT ||']' VALUE, \
+        p.GERMANNAME \
+    FROM MEDIAN.PARAMETER P, \
+         MEDIAN.INSTANTANEOUSPOINT IP, \
+         MEDIAN.MEASUREMENT M, \
+         MEDIAN.MEASUREDSCALARVALUE MSV \
+    WHERE IP.FEATUREID = M.FEATUREID AND \
+          M.MEASUREMENTID = MSV.MEASUREMENTID AND \
+          MSV.PARAMETERID = P.PARAMETERID AND \
+          IP.FEATUREID = ? \
+    ORDER BY P.GERMANNAME
+    
+verticalprofile_instantaneouspoint_minmaxdepth = SELECT min(M.ZLOCATION) MIN, \
+        max(M.ZLOCATION) MAX  \
+    FROM MEDIAN.INSTANTANEOUSPOINT IP, \
+         MEDIAN.MEASUREMENT M, \
+         MEDIAN.MEASUREDSCALARVALUE MSV \
+    WHERE IP.FEATUREID = M.FEATUREID AND \
+          M.MEASUREMENTID = MSV.MEASUREMENTID AND \
+          IP.FEATUREID = ? AND \
+          MSV.PARAMETERID in (?)
+          
+verticalprofile_instantaneouspoint_chart_data = SELECT M.ZLOCATION XORDINATE, \
+        MSV.DATAVALUE  YORDINATE, \
+        MSV.PARAMETERID GROUP1, \
+        IP.TIMEVALUE GROUP2, \
+        1 GROUP3, \
+        3 DATAID \
+    FROM MEDIAN.INSTANTANEOUSPOINT IP, \
+         MEDIAN.MEASUREMENT M, \
+         MEDIAN.MEASUREDSCALARVALUE MSV \
+    WHERE IP.FEATUREID = M.FEATUREID AND \
+          M.MEASUREMENTID = MSV.MEASUREMENTID AND \
+          IP.FEATUREID = ? AND \
+          MSV.PARAMETERID in (?) AND \
+          M.ZLOCATION >= ? AND \
+          M.ZLOCATION <= ? \
+    ORDER BY IP.TIMEVALUE, \
+          MSV.PARAMETERID, \
+          M.ZLOCATION
+          
+verticalprofile_instantaneouspoint_odv_data = SELECT S.DESCRIPTION CRUISE, \
+        MEDIAN.INSTANTANEOUSPOINT.FEATUREID STATION, \
+        '*' TYPE, \
+        ST_ASTEXT(SHAPE), \
+        0 BOTDEPTH, \
+        (M.ZLOCATION * -1) DEPTH, \
+        MSV.DATAVALUE, \
+        MSV.PARAMETERID PARAMETER, \
+        MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE \
+    FROM MEDIAN.SERIES S, \
+         MEDIAN.INSTANTANEOUSPOINT, \
+         MEDIAN.MEASUREMENT M, \
+         MEDIAN.MEASUREDSCALARVALUE MSV \
+    WHERE S.SERIESID = MEDIAN.INSTANTANEOUSPOINT.SERIESID AND \
+          MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \
+          M.MEASUREMENTID = MSV.MEASUREMENTID AND \
+          MEDIAN.INSTANTANEOUSPOINT.FEATUREID = ? AND \
+          MSV.PARAMETERID in (?) AND \
+          M.ZLOCATION >= ? AND \
+          M.ZLOCATION <= ? \
+    ORDER BY MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE, \
+          MSV.PARAMETERID, \
+          M.ZLOCATION
+          
+#############################################
+#############################################
+#### Horizontalprofil InstantaneousPoint ####
+#############################################
+#############################################
+horizontalprofile_instantaneouspoint_vehicle = SELECT DISTINCT \
+        V.VEHICLEID KEY, \
+        V.NAME VALUE \
+    FROM MEDIAN.VEHICLE V, \
+         MEDIAN.CRUISE C, \
+         MEDIAN.TRACK T, \
+         MEDIAN.SURVEYINFO S, \
+         MEDIAN.INSTANTANEOUSPOINT I, \
+         MEDIAN.MEASUREMENT M \
+    WHERE V.VEHICLEID = C.VEHICLEID AND \
+          C.CRUISEID = T.CRUISEID AND \
+          T.TRACKID = S.TRACKID AND \
+          S.SURVEYID  = I.SURVEYID AND \
+          I.FEATUREID =  M.FEATUREID AND \
+          M.SOURCEID = ? \
+    ORDER BY V.NAME
+
+horizontalprofile_instantaneouspoint_vehicle_with_area = SELECT V.VEHICLEID KEY, \
+                V.NAME VALUE \
+    FROM MEDIAN.TRACK, \
+         MEDIAN.VEHICLE V, \
+         MEDIAN.CRUISE C \
+    WHERE V.VEHICLEID = C.VEHICLEID AND \
+          C.CRUISEID = MEDIAN.TRACK.CRUISEID AND \
+          MEDIAN.TRACK.TRACKID IN \
+                      (SELECT DISTINCT S.TRACKID \
+                       FROM MEDIAN.MEASUREMENT M ,\
+                            MEDIAN.INSTANTANEOUSPOINT I, \
+                            MEDIAN.SURVEYINFO S \
+                       WHERE M.SOURCEID = ? AND \
+                             I.FEATUREID = M.FEATUREID AND \
+                             S.SURVEYID = I.SURVEYID)AND \
+                             INTERSECTS(SHAPE, \
+                                        (SELECT st_astext(SHAPE) \
+                                         FROM MEDIAN.FEATUREAREA \
+                                         WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \
+                                                FEATURECODE = ? )\
+                                         ) \
+    ORDER BY V.NAME
+horizontalprofile_instantaneouspoint_cruise = SELECT DISTINCT \
+        C.CRUISEID KEY, \
+        V.NAME || ' ' || \
+        C.NAME || ' ' || \
+        TO_CHAR(C.STARTDATE,'DD.MM.YYYY') || ' - ' || \
+        TO_CHAR(C.ENDDATE,'DD.MM.YYYY') VALUE, \
+        V.NAME, \
+        C.NAME \
+     FROM MEDIAN.CRUISE C, \
+         MEDIAN.VEHICLE V, \
+         MEDIAN.TRACK T, \
+         MEDIAN.SURVEYINFO S, \
+         MEDIAN.INSTANTANEOUSPOINT I, \
+         MEDIAN.MEASUREMENT M \
+    WHERE C.VEHICLEID = V.VEHICLEID AND \
+          C.CRUISEID = T.CRUISEID AND \
+          T.TRACKID = S.TRACKID AND \
+          S.SURVEYID  = I.SURVEYID AND \
+          I.FEATUREID =  M.FEATUREID AND \
+          C.VEHICLEID  = ? AND \
+          M.SOURCEID = ? \
+    ORDER BY V.NAME, C.NAME
+
+horizontalprofile_instantaneouspoint_cruise_with_area = SELECT C.CRUISEID KEY, \
+        V.NAME || ' ' || \
+        C.NAME || ' ' || \
+        TO_CHAR(C.STARTDATE,'DD.MM.YYYY') || ' - ' || \
+        TO_CHAR(C.ENDDATE,'DD.MM.YYYY') VALUE, \
+        V.NAME, \
+        C.NAME \
+    FROM MEDIAN.TRACK, \
+         MEDIAN.VEHICLE V, \
+         MEDIAN.CRUISE C \
+    WHERE V.VEHICLEID = C.VEHICLEID AND \
+          C.CRUISEID = MEDIAN.TRACK.CRUISEID AND \
+          MEDIAN.TRACK.TRACKID IN \
+                      (SELECT DISTINCT S.TRACKID \
+                       FROM MEDIAN.MEASUREMENT M ,\
+                            MEDIAN.INSTANTANEOUSPOINT I, \
+                            MEDIAN.SURVEYINFO S \
+                       WHERE M.SOURCEID = ? AND \
+                             C.VEHICLEID  = ? AND \
+                             I.FEATUREID = M.FEATUREID AND \
+                             S.SURVEYID = I.SURVEYID)AND \
+                             INTERSECTS(SHAPE, \
+                                        (SELECT st_astext(SHAPE) \
+                                         FROM MEDIAN.FEATUREAREA \
+                                         WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \
+                                                FEATURECODE = ? )\
+                                         ) \
+    ORDER BY V.NAME
+horizontalprofile_instantaneouspoint_track= SELECT \
+        T.TRACKID KEY, \
+        to_char(T.STARTDATE,'DD.MM.YYYY HH24:MI') || ' - '|| to_char(T.ENDDATE,'DD.MM.YYYY HH24:MI') || ' - '|| T.NAME VALUE \
+    FROM MEDIAN.TRACK T \
+    WHERE T.CRUISEID = ? \
+    ORDER BY T.STARTDATE, \
+             T.ENDDATE, \
+             T.NAME
+             
+horizontalprofile_instantaneouspoint_track_with_area = SELECT \
+        MEDIAN.TRACK.TRACKID KEY, \
+        to_char(STARTDATE,'DD.MM.YYYY HH24:MI') || ' - '|| to_char(ENDDATE,'DD.MM.YYYY HH24:MI') || ' - '|| NAME VALUE, \
+        NAME \
+    FROM MEDIAN.TRACK \
+    WHERE MEDIAN.TRACK.CRUISEID = ? AND \
+          INTERSECTS(SHAPE, \
+                    (SELECT st_astext(SHAPE) \
+                     FROM MEDIAN.FEATUREAREA \
+                     WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \
+                            FEATURECODE = ? )\
+                     ) \
+    ORDER BY STARTDATE, \
+             ENDDATE, \
+             NAME
+horizontalprofile_instantaneouspoint_surveyinfo = SELECT \
+        SURVEYID KEY, \
+        to_char(STARTDATE,'DD.MM.YYYY HH24:MI') || ' - '|| to_char(ENDDATE,'DD.MM.YYYY HH24:MI') || ' - '|| DESCRIPTION VALUE \
+    FROM MEDIAN.SURVEYINFO \
+    WHERE TRACKID = ? \
+    ORDER BY STARTDATE, \
+             ENDDATE, \
+             DESCRIPTION
+horizontalprofile_instantaneouspoint_parameter = SELECT DISTINCT \
+        P.PARAMETERID KEY, \
+        p.GERMANNAME || '  ['|| p.UNIT ||']' VALUE, \
+        p.GERMANNAME \
+    FROM MEDIAN.PARAMETER P, \
+         MEDIAN.MEASUREMENT M, \
+         MEDIAN.INSTANTANEOUSPOINT IP, \
+         MEDIAN.MEASUREDSCALARVALUE MSV \
+    WHERE P.PARAMETERID = MSV.PARAMETERID AND \
+          MSV.MEASUREMENTID = M.MEASUREMENTID AND \
+          M.FEATUREID = IP.FEATUREID AND \
+          IP.SURVEYID = ? \
+    ORDER BY P.GERMANNAME
+horizontalprofile_instantaneouspoint_depth = SELECT DISTINCT \
+        M.ZLOCATION KEY, \
+        M.ZLOCATION VALUE \
+    FROM MEDIAN.MEASUREMENT M, \
+         MEDIAN.INSTANTANEOUSPOINT IP \
+    WHERE M.FEATUREID = IP.FEATUREID AND \
+          IP.SURVEYID = ? \
+    ORDER BY M.ZLOCATION
+horizontalprofile_instantaneouspoint_chart_data = SELECT ST_ASTEXT(SHAPE), \
+        MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE TIME, \
+        MSV.DATAVALUE  YORDINATE, \
+        MSV.PARAMETERID GROUP1, \
+        ZLOCATION GROUP2, \
+        1 GROUP3, \
+        3 DATAID \
+    FROM MEDIAN.INSTANTANEOUSPOINT, \
+         MEDIAN.MEASUREMENT M, \
+         MEDIAN.MEASUREDSCALARVALUE MSV \
+    WHERE MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \
+          M.MEASUREMENTID = MSV.MEASUREMENTID AND \
+          MEDIAN.INSTANTANEOUSPOINT.SURVEYID = ? AND \
+          M.ZLOCATION IN (?) AND \
+          MSV.PARAMETERID in (?) \
+    ORDER BY MSV.PARAMETERID, \
+             M.ZLOCATION, \
+             MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE
+horizontalprofile_instantaneouspoint_odv_data = SELECT V.NAME || ' ' || C.NAME  CRUISE, \
+        MEDIAN.InstantaneousPoint.FEATUREID STATION, \
+        '*' TYPE, \
+        0 BOTDEPTH, \
+        (M.ZLOCATION * -1) DEPTH, \
+        ST_ASTEXT(SHAPE), \
+        MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE, \
+        MSV.DATAVALUE, \
+        MSV.PARAMETERID PARAMETER \
+    FROM MEDIAN.INSTANTANEOUSPOINT, \
+         MEDIAN.VEHICLE V, \
+         MEDIAN.CRUISE C, \
+         (SELECT TRACKID,CRUISEID FROM MEDIAN.TRACK) T, \
+         MEDIAN.SURVEYINFO S, \
+         MEDIAN.MEASUREMENT M, \
+         MEDIAN.MEASUREDSCALARVALUE MSV \
+    WHERE V.VEHICLEID = C.VEHICLEID AND \
+          C.CRUISEID = T.CRUISEID AND \
+          T.TRACKID = S.TRACKID AND \
+          S.SURVEYID = MEDIAN.INSTANTANEOUSPOINT.SURVEYID AND \
+          MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \
+          M.MEASUREMENTID = MSV.MEASUREMENTID AND \
+          MEDIAN.INSTANTANEOUSPOINT.SURVEYID = ? AND \
+          M.ZLOCATION IN (?) AND \
+          MSV.PARAMETERID in (?) \
+    ORDER BY MSV.PARAMETERID, \
+             M.ZLOCATION, \
+             MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE
+             
+#############################################
+#############################################
+########### Horizontalprofil MESH ###########
+#############################################
+#############################################
+horizontalprofile_meshpoint_depth = SELECT DISTINCT \
+         mp.KPOSITION KEY, \
+        'Layer ' || ml.KPOSITION || ': ' || -ml.UPPERZLOCATION || ' - '|| -ml.LOWERZLOCATION VALUE \
+    from MEDIAN.MESHLAYER ml, \
+         MEDIAN.MESHPOINT mp \
+    where ml.KPOSITION = mp.KPOSITION and \
+          ml.MESHID = mp.MESHID and \
+          mp.FEATUREID in \
+    ( select FEATUREID \
+      from MEDIAN.MESHPOINT mp, \
+           MEDIAN.MESH m \
+      where m.OBJECTID = ? AND \
+            mp.MESHID = m.MESHID  AND \
+            IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) and \
+            JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?)) \
+    order by mp.KPOSITION
+    
+horizontalprofile_mesh_chart_data =  SELECT ST_ASTEXT(SHAPE), \
+           msv.DATAVALUE YORDINATE, \
+           msv.PARAMETERID GROUP1, \
+           MEDIAN.MESHPOINT.KPOSITION GROUP2, \
+           msv.TIMEVALUE GROUP3, \
+           MEDIAN.MESHPOINT.JPOSITION, \
+           MEDIAN.MESHPOINT.IPOSITION, \
+           2 DATAID \
+    from MEDIAN.MESHLAYER ml, \
+         MEDIAN.MESHPOINT, \
+         MEDIAN.MESH m, \
+         MEDIAN.MESHSCALARVALUE msv \
+    where msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \
+          ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \
+          ml.MESHID = MEDIAN.MESHPOINT.MESHID and \
+          m.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+          m.PARTIDMIN <= msv.PARTID AND \
+          m.PARTIDMAX >= msv.PARTID AND \
+          msv.PARAMETERID in (?) AND \
+          msv.TIMEVALUE in (?) AND \
+          m.OBJECTID = ? AND \
+          MEDIAN.MESHPOINT.FEATUREID in \
+            ( select FEATUREID \
+              from MEDIAN.MESHPOINT mp, \
+                   MEDIAN.MESH m \
+              where m.OBJECTID = ? AND \
+                    mp.MESHID = m.MESHID  AND \
+                    KPOSITION in ( ? ) and \
+                    ? = (select ? from MEDIAN.MESHPOINT where FEATUREID = ?)) \
+   order by msv.TIMEVALUE, \
+            MEDIAN.MESHPOINT.KPOSITION, \
+            msv.PARAMETERID, \
+            MEDIAN.MESHPOINT.JPOSITION, \
+            MEDIAN.MESHPOINT.IPOSITION
+            
+horizontalprofile_mesh_odv_data =  SELECT SI.NAME CRUISE, \
+          m.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \
+          '*' TYPE, \
+          ST_ASTEXT(SHAPE), \
+          0 BOTDEPTH, \
+          (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \
+          msv.DATAVALUE, \
+          msv.PARAMETERID PARAMETER, \
+          msv.TIMEVALUE, \
+          MEDIAN.MESHPOINT.JPOSITION, \
+          MEDIAN.MESHPOINT.IPOSITION \
+    from MEDIAN.MESHLAYER ml, \
+         MEDIAN.MESHPOINT, \
+         MEDIAN.MESH m, \
+         MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.SOURCEINFO SI \
+    where msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \
+          ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \
+          ml.MESHID = MEDIAN.MESHPOINT.MESHID and \
+          m.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+          m.SOURCEID = SI.SOURCEID AND \
+          m.PARTIDMIN <= msv.PARTID AND \
+          m.PARTIDMAX >= msv.PARTID AND \
+          msv.PARAMETERID in (?) AND \
+          msv.TIMEVALUE in (?) AND \
+          m.OBJECTID = ? AND \
+          MEDIAN.MESHPOINT.FEATUREID in \
+            ( select FEATUREID \
+              from MEDIAN.MESHPOINT mp, \
+                   MEDIAN.MESH m \
+              where m.OBJECTID = ? AND \
+                    mp.MESHID = m.MESHID  AND \
+                    KPOSITION in ( ? ) and \
+                    ? = (select ? from MEDIAN.MESHPOINT where FEATUREID = ?)) \
+   order by msv.TIMEVALUE, \
+            MEDIAN.MESHPOINT.KPOSITION, \
+            msv.PARAMETERID, \
+            MEDIAN.MESHPOINT.JPOSITION, \
+            MEDIAN.MESHPOINT.IPOSITION
+            
+#############################################
+#############################################
+########### Horizontalprofil MESH ###########
+###########     Schnittprofil     ###########
+#############################################
+#############################################
+horizontalprofile_meshpoint_depth = SELECT DISTINCT \
+         mp.KPOSITION KEY, \
+        'Layer ' || ml.KPOSITION || ': ' || -ml.UPPERZLOCATION || ' - '|| -ml.LOWERZLOCATION VALUE \
+    from MEDIAN.MESHLAYER ml, \
+         MEDIAN.MESHPOINT mp \
+    where ml.KPOSITION = mp.KPOSITION and \
+          ml.MESHID = mp.MESHID and \
+          mp.FEATUREID in \
+    ( select FEATUREID \
+      from MEDIAN.MESHPOINT mp, \
+           MEDIAN.MESH m \
+      where m.OBJECTID = ? AND \
+            mp.MESHID = m.MESHID )\
+    order by mp.KPOSITION
+            
+horizontalprofile_meshpoint_cross_ij=SELECT MEDIAN.MESHFACE.JPOSITION, \
+           MEDIAN.MESHFACE.IPOSITION \
+    FROM MEDIAN.MESHFACE, \
+         MEDIAN.MESH M \
+    WHERE MEDIAN.MESHFACE.KPOSITION = 1 AND \
+          M.MESHID = MEDIAN.MESHFACE.MESHID AND \
+          M.OBJECTID = ? AND \
+          INTERSECTS(SHAPE, "?")
+horizontalprofile_mesh_cross_chart_data =  SELECT ST_ASTEXT(SHAPE), \
+           msv.DATAVALUE YORDINATE, \
+           msv.PARAMETERID GROUP1, \
+           MEDIAN.MESHPOINT.KPOSITION GROUP2, \
+           msv.TIMEVALUE GROUP3, \
+           MEDIAN.MESHPOINT.JPOSITION, \
+           MEDIAN.MESHPOINT.IPOSITION, \
+           2 DATAID \
+    from MEDIAN.MESHLAYER ml, \
+         MEDIAN.MESHPOINT, \
+         MEDIAN.MESH m, \
+         MEDIAN.MESHSCALARVALUE msv \
+    where msv.FEATUREID = MEDIAN.MESHPOINT.FEATUREID AND \
+          ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \
+          ml.MESHID = MEDIAN.MESHPOINT.MESHID and \
+          m.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+          m.PARTIDMIN <= msv.PARTID AND \
+          m.PARTIDMAX >= msv.PARTID AND \
+          msv.PARAMETERID in (?) AND \
+          msv.TIMEVALUE in (?) AND \
+          m.OBJECTID = ? AND \
+          ml.KPOSITION in (?) AND \
+          MEDIAN.MESHPOINT.FEATUREID in \
+              ( \
+               SELECT distinct FEATUREID \
+               FROM MEDIAN.MESHPOINT \
+               WHERE ? \
+               ) \
+    order by msv.TIMEVALUE, \
+            MEDIAN.MESHPOINT.KPOSITION, \
+            msv.PARAMETERID, \
+            MEDIAN.MESHPOINT.JPOSITION, \
+            MEDIAN.MESHPOINT.IPOSITION
+#############################################
+#############################################
+############# Profilschnitt MESH ############
+#############################################
+#############################################
+verticalcrosssection_mesh_year = select  distinct \
+        to_char(msv.TIMEVALUE,'YYYY') KEY, \
+        to_char(msv.TIMEVALUE,'YYYY') VALUE \
+    from MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.MESH m \
+    where m.OBJECTID = ?  AND \
+          msv.PARTID >= m.PARTIDMIN AND \
+          msv.PARTID <= m.PARTIDMAX AND \
+          msv.PARAMETERID = ? \
+    order by to_char(msv.TIMEVALUE,'YYYY')
+verticalcrosssection_mesh_date = select  distinct \
+        msv.TIMEVALUE KEY, \
+        msv.TIMEVALUE VALUE \
+    from MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.MESH m \
+    where m.OBJECTID = ?  AND \
+          msv.PARTID >= m.PARTIDMIN AND \
+          msv.PARTID <= m.PARTIDMAX AND \
+          msv.PARAMETERID = ? AND \
+          to_char(msv.TIMEVALUE,'YYYY') in (?) \
+    order by msv.TIMEVALUE
+verticalcrosssection_mesh_chart_data = SELECT ST_ASTEXT(SHAPE), \
+           ((ml.UPPERZLOCATION  + ml.LOWERZLOCATION) / 2) Z, \
+           msv.DATAVALUE YORDINATE, \
+           msv.PARAMETERID GROUP1, \
+           msv.TIMEVALUE GROUP2, \
+           MEDIAN.MESHPOINT.JPOSITION, \
+           MEDIAN.MESHPOINT.IPOSITION, \
+           MEDIAN.MESHPOINT.KPOSITION \
+    from MEDIAN.MESHLAYER ml, \
+         MEDIAN.MESHPOINT, \
+         MEDIAN.MESH m, \
+         MEDIAN.MESHSCALARVALUE msv \
+    where msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \
+          ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \
+          ml.MESHID = MEDIAN.MESHPOINT.MESHID and \
+          m.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+          m.PARTIDMIN <= msv.PARTID AND \
+          m.PARTIDMAX >= msv.PARTID AND \
+          msv.PARAMETERID = ? AND \
+          msv.TIMEVALUE = ? AND \
+          m.OBJECTID = ? AND \
+          MEDIAN.MESHPOINT.FEATUREID in \
+              ( \
+               SELECT distinct FEATUREID \
+               FROM MEDIAN.MESHPOINT \
+               WHERE ? \
+               ) \
+    order by msv.TIMEVALUE, \
+             msv.PARAMETERID, \
+             MEDIAN.MESHPOINT.JPOSITION, \
+             MEDIAN.MESHPOINT.IPOSITION, \
+             MEDIAN.MESHPOINT.KPOSITION
+             
+verticalcrosssection_mesh_odv_data = SELECT SI.NAME CRUISE, \
+            M.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \
+           '*' TYPE, \
+           ST_ASTEXT(SHAPE), \
+           0 BOTDEPTH, \
+           (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \
+           MSV.TIMEVALUE, \
+           MSV.DATAVALUE, \
+           MSV.PARAMETERID PARAMETER, \
+           MEDIAN.MESHPOINT.JPOSITION, \
+           MEDIAN.MESHPOINT.IPOSITION, \
+           MEDIAN.MESHPOINT.KPOSITION, \
+           2 DATAID \
+    from MEDIAN.MESHLAYER ml, \
+         MEDIAN.MESHPOINT, \
+         MEDIAN.MESH m, \
+         MEDIAN.SOURCEINFO SI, \
+         MEDIAN.MESHSCALARVALUE msv \
+    where msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \
+          ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \
+          ml.MESHID = MEDIAN.MESHPOINT.MESHID and \
+          m.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+          m.PARTIDMIN <= msv.PARTID AND \
+          m.PARTIDMAX >= msv.PARTID AND \
+          M.SOURCEID = SI.SOURCEID AND \
+          msv.PARAMETERID = ? AND \
+          msv.TIMEVALUE = ? AND \
+          m.OBJECTID = ? AND \
+          MEDIAN.MESHPOINT.FEATUREID in \
+            ( select FEATUREID \
+              from MEDIAN.MESHPOINT mp, \
+                   MEDIAN.MESH m \
+              where m.OBJECTID = ? AND \
+                    mp.MESHID = m.MESHID  AND \
+                    ? = (select ? from MEDIAN.MESHPOINT where FEATUREID = ?)) \
+    order by msv.TIMEVALUE, \
+             msv.PARAMETERID, \
+             MEDIAN.MESHPOINT.JPOSITION, \
+             MEDIAN.MESHPOINT.IPOSITION, \
+             MEDIAN.MESHPOINT.KPOSITION
+             
+#############################################
+#############################################
+########## Horizontalschnitt MESH ###########
+#############################################
+#############################################
+horizontalcrosssection_meshpoint_depth = SELECT DISTINCT MP.KPOSITION KEY, \
+        'Layer ' || ML.KPOSITION || ': ' || -ML.UPPERZLOCATION || ' - '|| -ML.LOWERZLOCATION VALUE \
+    from MEDIAN.MESHLAYER ML, \
+         MEDIAN.MESHPOINT MP, \
+         MEDIAN.MESH M \
+    WHERE ML.KPOSITION = MP.KPOSITION AND \
+          ML.MESHID = MP.MESHID AND \
+          M.OBJECTID = ? AND \
+          MP.MESHID = M.MESHID \
+    ORDER BY MP.KPOSITION
+    
+horizontalcrosssection_mesh_year = select  distinct \
+        to_char(msv.TIMEVALUE,'YYYY') KEY, \
+        to_char(msv.TIMEVALUE,'YYYY') VALUE \
+    from MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.MESH m \
+    where m.OBJECTID = ?  AND \
+          msv.PARTID >= m.PARTIDMIN AND \
+          msv.PARTID <= m.PARTIDMAX AND \
+          msv.PARAMETERID = ? \
+    order by to_char(msv.TIMEVALUE,'YYYY')
+horizontalcrosssection_mesh_date = select  distinct \
+        msv.TIMEVALUE KEY, \
+        msv.TIMEVALUE VALUE \
+    from MEDIAN.MESHSCALARVALUE msv, \
+         MEDIAN.MESH m \
+    where m.OBJECTID = ?  AND \
+          msv.PARTID >= m.PARTIDMIN AND \
+          msv.PARTID <= m.PARTIDMAX AND \
+          msv.PARAMETERID = ? AND \
+          to_char(msv.TIMEVALUE,'YYYY') in (?) \
+    order by msv.TIMEVALUE
+    
+horizontalcrosssection_mesh_data = SELECT ST_ASTEXT(SHAPE), \
+           MSV.DATAVALUE YORDINATE, \
+           MEDIAN.MESHPOINT.JPOSITION, \
+           MEDIAN.MESHPOINT.IPOSITION, \
+           MEDIAN.MESHPOINT.KPOSITION, \
+           MSV.PARAMETERID, \
+           MSV.TIMEVALUE, \
+           2 DATAID \
+    from MEDIAN.MESHLAYER ML, \
+         MEDIAN.MESHPOINT, \
+         MEDIAN.MESH M, \
+         MEDIAN.MESHSCALARVALUE MSV \
+    where MSV.FEATUREID = MEDIAN.MESHPOINT.FEATUREID AND \
+          ML.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \
+          ML.MESHID = MEDIAN.MESHPOINT.MESHID and \
+          M.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+          M.PARTIDMIN <= MSV.PARTID AND \
+          M.PARTIDMAX >= MSV.PARTID AND \
+          MSV.PARAMETERID = ? AND \
+          MSV.TIMEVALUE = ? AND \
+          M.OBJECTID = ? AND \
+          MEDIAN.MESHPOINT.KPOSITION = ? \
+    order by MEDIAN.MESHPOINT.JPOSITION, \
+             MEDIAN.MESHPOINT.IPOSITION
+horizontalcrosssection_mesh_odv_data = SELECT SI.NAME CRUISE, \
+            M.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \
+           '*' TYPE, \
+           ST_ASTEXT(SHAPE), \
+           0 BOTDEPTH, \
+           (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \
+           MSV.TIMEVALUE, \
+           MSV.DATAVALUE, \
+           MSV.PARAMETERID PARAMETER, \
+           MEDIAN.MESHPOINT.JPOSITION, \
+           MEDIAN.MESHPOINT.IPOSITION, \
+           MEDIAN.MESHPOINT.KPOSITION \
+    from MEDIAN.MESHLAYER ML, \
+         MEDIAN.MESHPOINT, \
+         MEDIAN.MESH M, \
+         MEDIAN.SOURCEINFO SI, \
+         MEDIAN.MESHSCALARVALUE MSV \
+    where MSV.FEATUREID = MEDIAN.MESHPOINT.FEATUREID AND \
+          ML.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \
+          ML.MESHID = MEDIAN.MESHPOINT.MESHID and \
+          M.MESHID = MEDIAN.MESHPOINT.MESHID AND \
+          M.PARTIDMIN <= MSV.PARTID AND \
+          M.PARTIDMAX >= MSV.PARTID AND \
+          M.SOURCEID = SI.SOURCEID AND \
+          MSV.PARAMETERID = ? AND \
+          MSV.TIMEVALUE = ? AND \
+          M.OBJECTID = ? AND \
+          MEDIAN.MESHPOINT.KPOSITION = ? \
+    order by MEDIAN.MESHPOINT.JPOSITION, \
+             MEDIAN.MESHPOINT.IPOSITION
+             
+area_filter = SELECT DISTINCT \
+       FEATUREID KEY ,\
+       DESCRIPTION VALUE \
+    FROM MEDIAN.FEATUREAREA \
+    WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \
+          FEATUREID > 0 \
+    ORDER BY FEATUREID
+    
+subarea_filter = SELECT \
+       FEATURECODE KEY, \
+       NAME VALUE \
+    FROM MEDIAN.FEATUREAREA \
+    WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \
+          FEATUREID = ? \
+    ORDER BY NAME
+    
+rasterQuery = SELECT ST_ASTEXT(RASTER) \
+    FROM MEDIAN.TOPO_WORLD_2MIN \
+    WHERE INTERSECTS(RASTER, "?")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/schema/externalinterface_schema.sql	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,71 @@
+/* 
+ * Lookup-Tabelle für das FIS anhand eines Gebietes.
+ * Diese Tabelle ist in der ArcSDE als Layer zu integrieren.
+ * Die Inhalte der Spalte id_fis müssen mit den vergebenen IDs
+ * in der Konfiguration des Artefaktservers übereinstimmen.
+ *
+ * Abbildung als Layer in der ArcSDE
+ * Das hier bereitgestellte SQL ist lediglich als Anhalt zu betrachten.
+ */
+create table fis_has_region (
+    id_fis varchar2(30 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/
+    description varchar2(90 char),
+    geometry ??? not null
+);
+
+ALTER TABLE fis_has_region ADD PRIMARY KEY (id_fis);
+
+/*
+ * Lookup-Tabelle für das FIS anhand eines Mapservices.
+ * Die Inhalte der Spalte id_fis müssen mit den vergebenen IDs
+ * in der Konfiguration des Artefaktservers übereinstimmen.
+ * Die Inhalte der Spalte id_mapservice müssen mit den vergebenen
+ * IDs der Services im Mapviewer übereinstimmen.
+ */
+create table fis_has_mapservice(
+    id_fis varchar2(30 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/
+    id_mapservice varchar2(100 char) not null /* TODO maximale Länge bestimmen und ggf. anpassen.*/
+);
+
+ALTER TABLE fis_has_mapservice ADD PRIMARY KEY (id_fis,id_mapservice);
+
+/**
+ * Lookuptabelle zwischen einer LayerID und dem dazugehörigen 
+ * Mapservice und den im Layer dargestellten Parameter.
+ * Fremdschlüsselbeziehung zu der Tabelle fis_has_mapservice.
+ * Primärschlüssel: id_mapservice, id_layer, id_parameter
+ * id_parameter referenziert zusätzlich die Tabelle MEDIAN.PARAMETER.
+ * 
+ * Auf eine explizite Abbildung von GroupLayern kann verzichtet werden,
+ * da sie lediglich einen "ordnenden" Charakter haben.
+ * vgl. S 52 Pflichtenheft.
+ * 
+ * Ãœber id_group wird abgebildet ob ein Layer zu einer Gruppe von
+ * Layern gehört.
+ */
+create table layer_has_parameter(
+    id_mapservice varchar2(100 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/
+    id_layer varchar2(30 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/
+    id_group varchar2(30 char ), /* TODO maximale Länge bestimmen und ggf. anpassen.*/
+    id_parameter NUMBER(10) not null /* Referenz zur Tabelle MEDIAN.PARAMETER */
+);
+
+ALTER TABLE layer_has_parameter ADD 
+      PRIMARY KEY (id_mapservice,id_layer,id_parameter);
+
+/**
+ * Lookuptabelle ob ein Mapservice genau einen Parameter darstellt.
+ * Wenn in dieser Tabelle nichts vorhanden ist muss unter zurhilfenahme
+ * der Layer-ID in der Tabelle layer_has_parameter gesucht werden.
+ * Die Inhalte der Spalte id_mapservice müssen mit den vergebenen
+ * IDs der Services im Mapviewer übereinstimmen.
+ * id_parameter referenziert zusätzlich die Tabelle MEDIAN.PARAMETER.
+ */
+create table mapservice_has_parameter(
+    id_mapservice varchar2(100 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/
+    id_parameter NUMBER(10) not null /* Referenz zur Tabelle MEDIAN.PARAMETER */
+);
+
+
+ALTER TABLE mapservice_has_parameter ADD 
+      PRIMARY KEY (id_mapservice,id_parameter);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/doc/schema/externalinterface_testdata.sql	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+INSERT INTO fis_has_mapservice (id_fis,id_mapservice) VALUES ('modeldata','BSH_IMS_Prediction_Model_Salinity');
+INSERT INTO fis_has_mapservice (id_fis,id_mapservice) VALUES ('marnet','BSH_IMS_Marine_Environment_Monitoring_Network');
+
+INSERT INTO mapservice_has_parameter(id_mapservice,id_parameter) VALUES ('BSH_IMS_Prediction_Model_Salinity',2);
+
+INSERT INTO layer_has_parameter(id_mapservice,id_layer,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 'Sealevel', null, ?);
+INSERT INTO layer_has_parameter(id_mapservice,id_layer,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 'Temperature', null, 1);
+INSERT INTO layer_has_parameter(id_mapservice,id_layer,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 'Salinity', null, 2);
+INSERT INTO layer_has_parameter(id_mapservice,id_layer,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 'OxygenSaturation', null, 31);
+INSERT INTO layer_has_parameter(id_mapservice,id_layer,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 'Current', null, ?);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/pom.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,149 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>de.intevation.bsh.artifacts</groupId>
+  <artifactId>gnv-artifacts</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>gnv-artifacts</name>
+  <url>http://maven.apache.org</url>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-eclipse-plugin</artifactId>
+        <version>2.5.1</version>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.0.2</version>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>de.intevation.bsh.artifact-database</groupId>
+      <artifactId>artifact-database</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>de.intevation.bsh.geo-backend</groupId>
+      <artifactId>geo-backend</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.esri.sde</groupId>
+      <artifactId>jsde_sdk</artifactId>
+      <version>9.2.5</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.esri.sde</groupId>
+      <artifactId>jpe_sdk</artifactId>
+      <version>9.2.5</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.ibm</groupId>
+      <artifactId>icu4j</artifactId>
+      <version>3.2</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>[1.2,)</version>
+    </dependency>
+    <dependency>
+      <groupId>jfree</groupId>
+      <artifactId>jfreechart</artifactId>
+      <version>1.0.13</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.xmlgraphics</groupId>
+      <artifactId>batik-dom</artifactId>
+      <version>1.7</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.xmlgraphics</groupId>
+      <artifactId>batik-svggen</artifactId>
+      <version>1.7</version>
+    </dependency>
+    <dependency>
+      <groupId>com.lowagie</groupId>
+      <artifactId>itext</artifactId>
+      <version>2.1.7</version>
+    </dependency>
+    <dependency>
+      <groupId>net.sf.opencsv</groupId>
+      <artifactId>opencsv</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-math</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>net.sf.ehcache</groupId>
+      <artifactId>ehcache</artifactId>
+      <version>1.6.2</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-validator</groupId>
+      <artifactId>commons-validator</artifactId>
+      <version>1.3.1</version>
+    </dependency>
+    <dependency>
+      <groupId>oro</groupId>
+      <artifactId>oro</artifactId>
+      <version>2.0.8</version>
+    </dependency>
+    <dependency>
+      <groupId>org.geotools</groupId>
+      <artifactId>gt-shapefile</artifactId>
+      <version>2.5.8</version>
+    </dependency>
+    <dependency>
+      <groupId>org.geotools</groupId>
+      <artifactId>gt-epsg-wkt</artifactId>
+      <version>2.5.8</version>
+    </dependency>
+    <dependency>
+      <groupId>com.vividsolutions</groupId>
+      <artifactId>jts</artifactId>
+      <version>1.9</version>
+    </dependency>
+    <dependency>
+      <groupId>trove</groupId>
+      <artifactId>trove</artifactId>
+      <version>2.1.1</version>
+    </dependency>
+  </dependencies>
+  <repositories>
+    <repository>
+      <id>gt2.repo</id>
+      <name>GeoTools2 Repository including JTS</name>
+      <url>http://download.osgeo.org/webdav/geotools</url>
+    </repository>
+    <repository>
+      <id>repository.jboss.org</id>
+      <name>JBoss Repository</name>
+      <url>http://repository.jboss.com/maven2</url>
+    </repository>
+  </repositories>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/APP.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,21 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import de.intevation.artifactdatabase.App;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class APP {
+
+    /**
+     * @param args
+     */
+    public static void main(String[] args) {
+        App.main(args);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,859 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import de.intevation.artifactdatabase.Config;
+import de.intevation.artifactdatabase.ProxyArtifact;
+import de.intevation.artifactdatabase.XMLUtils;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactDatabase;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.ArtifactNamespaceContext;
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+
+import de.intevation.gnv.artifacts.cache.CacheFactory;
+
+import de.intevation.gnv.artifacts.context.GNVArtifactContext;
+
+import de.intevation.gnv.artifacts.fis.product.Product;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import de.intevation.gnv.state.DefaultInputData;
+import de.intevation.gnv.state.InputData;
+import de.intevation.gnv.state.InputValue;
+import de.intevation.gnv.state.OutputMode;
+import de.intevation.gnv.state.OutputState;
+import de.intevation.gnv.state.State;
+import de.intevation.gnv.state.StateBase;
+import de.intevation.gnv.state.StateFactory;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import de.intevation.gnv.transition.Transition;
+import de.intevation.gnv.transition.TransitionFactory;
+
+import de.intevation.gnv.utils.ArtifactXMLUtilities;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.xpath.XPathConstants;
+
+import net.sf.ehcache.Cache;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Ingo Weinzierl      (ingo.weinzierl@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public abstract class GNVArtifactBase extends GNVDefaultArtifact {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(GNVArtifactBase.class);
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = -8907096744400741458L;
+
+    /**
+     * The Identifier for the Replacement of the Artifactname
+     */
+    public static final String XPATH_IDENTIFIER_REPLACE = "IDENTIFIER";
+
+    /**
+     * The XPATH to the XML-Fragment that should be used for the Configuration
+     */
+    public static final String XPATH_ARTIFACT_CONFIGURATION = "/artifact-database/artifacts/artifact[@name='"
+                                                              + XPATH_IDENTIFIER_REPLACE
+                                                              + "']";
+
+    public static final String XPATH_STATIC_NODE = "/art:result/art:ui/art:static";
+
+    public static final String XPATH_INPUT_DATA = "/art:action/art:data/art:input";
+
+    public static final String XPATH_INCLUDE_UI = "/art:action/art:include-ui";
+
+    public static final String XPATH_TARGET_NAME = "/art:action/art:target/@name";
+
+    public static final String XPATH_OUTPUT_NAME = "/art:action/art:out/@name"; 
+
+    public static final String XPATH_OUTPUT_PARAMS = "/art:action/art:out/art:params/art:input"; 
+
+    public static final String INITIAL_STATE = "product";
+
+    /**
+     * The current State
+     */
+    protected State current = null;
+
+    /**
+     * The States that can be used
+     */
+    protected Map<String, State> states = null;
+    
+    /**
+     * The Transitions which can switch between the different States.
+     */
+    protected Collection<Transition> transitions = null;
+
+
+    /**
+     * The current product
+     */
+    protected Product product;
+
+    /**
+     * The Name of the Artifact
+     */
+    protected String name = null;
+
+    /**
+     * Constructor
+     */
+    public GNVArtifactBase() {
+        super();
+    }
+
+
+    @Override
+    public Document advance(Document target, CallContext context) {
+        log.debug("GNVArtifactBase.advance()");
+
+        Document result      = XMLUtils.newDocument();
+        String   targetState = XMLUtils.xpathString(
+            target, XPATH_TARGET_NAME, ArtifactNamespaceContext.INSTANCE
+        );
+
+        // no current state...
+        if (current == null) {
+            log.debug("No current state. Advance not possible.");
+
+            result = createReport(
+                result,
+                "exceptionreport",
+                "exception",
+                "No State activated."
+            );
+
+            return result;
+        }
+
+        State next = null;
+
+        try {
+
+            // step forward
+            if (isStateCurrentlyReachable(targetState)) {
+                next = states.get(targetState);
+
+                // 2. Transfer Results
+                next.putInputData(current.getInputData(), identifier);
+                next.setParent(current);
+
+                if (current != null) {
+                    current.endOfLife(context.globalContext());
+                }
+
+                // 3. Switch to next State
+                current = next;
+
+                // 4. Initialize next Step
+                current.initialize(identifier, context);
+
+                result = createReport(
+                    result, "result", "success", "Advance success"
+                );
+            }
+
+            // step backward
+            else if((next = getPreviousState(current, targetState)) != null) {
+
+                // reset input data
+                resetFutureStates(current, targetState);
+
+                // remove data from future states from cache
+                resetDescribeData(current, identifier, targetState);
+
+                if (current != null) {
+                    current.endOfLife(context.globalContext());
+                }
+
+                current = next;
+
+                result = createReport(
+                    result, "result", "success", "Advance success"
+                );
+            }
+
+            // goto initial step
+            else if(targetState.equals(INITIAL_STATE)) {
+
+                String fis                    = product.getArtifactFactory();
+                ArtifactDatabase db           = context.getDatabase();
+                GNVProductArtifactFactory fac = (GNVProductArtifactFactory)
+                    db.getInternalArtifactFactory(fis);
+
+                Artifact select = fac.createArtifact(identifier, context);
+                context.putContextValue(ProxyArtifact.REPLACE_PROXY, select);
+
+                resetDescribeData(current, identifier, INITIAL_STATE);
+
+                result = createReport(
+                    result, "result", "success", "Advance success"
+                );
+            }
+
+            // advance not possible
+            else {
+                log.warn("advance not possible for target: " + targetState);
+                result = createReport(
+                    result,
+                    "exceptionreport",
+                    "exception",
+                    "Statetransition not supported"
+                );
+            }
+        }
+        catch (StateException se) {
+            log.error(se, se);
+            result = createReport(
+                result,
+                "exceptionreport",
+                "exception",
+                se.getLocalizedMessage()
+            );
+        }
+
+        return result;
+    }
+
+
+    protected Document createReport(
+        Document document,
+        String   nodeName,
+        String   state,
+        String   msg
+    ) {
+        XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+            document,
+            ArtifactNamespaceContext.NAMESPACE_URI,
+            ArtifactNamespaceContext.NAMESPACE_PREFIX
+        );
+
+        Element reportNode = creator.create(nodeName);
+        Element stateNode  = creator.create(state);
+
+        stateNode.setTextContent(msg);
+        reportNode.appendChild(stateNode);
+        document.appendChild(reportNode);
+
+        return document;
+
+    }
+
+
+    protected State getPreviousState(State current, String name) {
+        if (current == null) {
+            return null;
+        }
+
+        if (current.getID().equals(name)) {
+            return current;
+        }
+        else {
+            return getPreviousState(current.getParent(), name);
+        }
+    }
+
+    public void resetDescribeData(State state, String uuid, String target) {
+        CacheFactory factory = CacheFactory.getInstance();
+        
+        if (factory.isInitialized()) {
+            Cache  cache = factory.getCache();
+            String key   = uuid + StateBase.DESCRIBEDATAKEY;
+
+            net.sf.ehcache.Element value = cache.get(key);
+            if (value == null)
+                return;
+
+            List data = (List) value.getObjectValue();
+            while(!target.equals(state.getID())) {
+                data.remove(data.size()-1);
+                state = state.getParent();
+
+                if (state == null)
+                    break;
+            }
+
+            cache.put(new net.sf.ehcache.Element(key, data));
+        }
+    }
+
+
+    protected void resetFutureStates(State current, String name) {
+        if (current == null) {
+            return;
+        }
+
+        if (current.getID().equals(name)) {
+            return;
+        }
+        else {
+            current.reset(identifier);
+            resetFutureStates(current.getParent(), name);
+        }
+    }
+
+
+    private boolean isStateCurrentlyReachable(String stateid){
+        Iterator<Transition> it = this.transitions.iterator();
+        String from = this.current.getID();
+        while (it.hasNext()){
+            Transition transition = it.next();
+            if (transition.getFrom().equals(from)){
+                if (transition.getTo().equals(stateid) && transition.isValid(this.current)){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    
+    public Document initialize (CallContext context) {
+        Document result = XMLUtils.newDocument();
+        try {
+            this.current.initialize(super.identifier, context);
+            result = new ArtifactXMLUtilities()
+            .createSuccessReport("Initialize success",
+                    XMLUtils.newDocument());
+        } catch (StateException e) {
+            log.error(e,e);
+            result = new ArtifactXMLUtilities().createExceptionReport(e
+                    .getLocalizedMessage(), XMLUtils.newDocument());
+        }
+        return result;
+    }
+
+    protected String readStateName(Document document) {
+        String returnValue = XMLUtils.xpathString(
+            document, XPATH_TARGET_NAME, ArtifactNamespaceContext.INSTANCE);
+        return returnValue;
+    }
+
+    protected Node getConfigurationFragment(Document document) {
+        log.debug("GNVArtifactBase.getConfigurationFragment");
+        String xpathQuery = XPATH_ARTIFACT_CONFIGURATION.replaceAll(
+                XPATH_IDENTIFIER_REPLACE, this.name);
+        
+        Element configurationNode = (Element)Config.getNodeXPath(document, xpathQuery);
+        
+        String link = configurationNode.getAttribute("xlink:href");
+        if (link != null ){
+            String absolutFileName = Config.replaceConfigDir(link);
+            configurationNode = (Element)new ArtifactXMLUtilities().readConfiguration(absolutFileName);
+        }
+        
+        return configurationNode;
+    }
+
+    /**
+     * @see de.intevation.artifactdatabase.DefaultArtifact#feed(org.w3c.dom.Document,
+     *      de.intevation.artifacts.CallContext)
+     */
+    @Override
+    public Document feed(Document target, CallContext context) {
+        log.debug("GNVArtifactBase.feed");
+        Document result = XMLUtils.newDocument();
+        try {
+            if (this.current != null) {
+                Collection<InputData> inputData = this.parseInputData(
+                    target,
+                    XPATH_INPUT_DATA);
+
+                if (!inputData.isEmpty()){
+                    this.current.putInputData(inputData, super.identifier);
+                    result = new ArtifactXMLUtilities().createSuccessReport(
+                            "Feed success", XMLUtils.newDocument());
+                }else{
+                    String msg = "No Inputdata given. Please select at least one Entry.";
+                    log.warn(msg);
+                    result = new ArtifactXMLUtilities().createExceptionReport(msg,
+                            XMLUtils.newDocument());
+                }
+            } else {
+                String msg = "No State instantiated";
+                log.warn(msg);
+                result = new ArtifactXMLUtilities().createExceptionReport(msg,
+                        XMLUtils.newDocument());
+            }
+        } catch (StateException e) {
+            log.error(e, e);
+            result = new ArtifactXMLUtilities().createExceptionReport(e
+                    .getLocalizedMessage(), XMLUtils.newDocument());
+        }
+        return result;
+    }
+
+
+    /**
+     * @see de.intevation.artifactdatabase.DefaultArtifact#describe(org.w3c.dom.Document, de.intevation.artifacts.CallContext)
+     */
+    @Override
+    public Document describe(Document data, CallContext context) {
+        log.debug("GNVArtifactBase.describe");
+
+        Document document = createDescibeOutput(
+            context,
+            identifier,
+            getIncludeUIFromDocument(data)
+        );
+
+        // insert node for rendering product field
+        Element staticNode = (Element) XMLUtils.xpath(
+            document,
+            XPATH_STATIC_NODE,
+            XPathConstants.NODE,
+            ArtifactNamespaceContext.INSTANCE
+        );
+
+        XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+            document,
+            XMLUtils.XFORM_URL,
+            XMLUtils.XFORM_PREFIX
+        );
+
+        XMLUtils.ElementCreator artCreator = new XMLUtils.ElementCreator(
+            document,
+            ArtifactNamespaceContext.NAMESPACE_URI,
+            ArtifactNamespaceContext.NAMESPACE_PREFIX
+        );
+
+        return document;
+    }
+
+    /**
+     * @see de.intevation.artifactdatabase.DefaultArtifact#setup(java.lang.String,
+     *      java.lang.Object)
+     */
+    @Override
+    public void setup(String identifier, ArtifactFactory factory, Object context) {
+        log.debug("GNVArtifactBase.setup");
+        super.setup(identifier, factory, context);
+
+        Object localContext = context;
+        if (context instanceof CallContext) {
+            localContext = ((CallContext) context).globalContext();
+
+        }
+
+        if (localContext instanceof GNVArtifactContext) {
+            GNVArtifactContext gnvContext = (GNVArtifactContext) localContext;
+            Document doc = gnvContext.getConfig();
+            Node artifactNode = this.getConfigurationFragment(doc);
+                        
+            NodeList stateList = Config.getNodeSetXPath(artifactNode,
+                    "states/state");
+            this.states = new HashMap<String, State>(stateList
+                    .getLength());
+            for (int i = 0; i < stateList.getLength(); i++) {
+                State tmpState = StateFactory.getInstance()
+                        .createState(stateList.item(i));
+                if (tmpState != null) {
+                    log.debug("Initiate new state: " + tmpState.getID());
+                    this.states.put(tmpState.getID(), tmpState);
+                    if (this.current == null) {
+                        this.current = tmpState;
+                    }
+                }
+            }
+            
+            NodeList transitionList = Config.getNodeSetXPath(artifactNode,
+            "states/transition");
+            this.transitions = new ArrayList<Transition>(transitionList.getLength());
+            for (int i = 0; i < transitionList.getLength(); i++) {
+                Transition tmpTransition = TransitionFactory.getInstance()
+                        .createTransition(transitionList.item(i));
+                if (tmpTransition != null) {
+                    this.transitions.add(tmpTransition);
+                }
+            }
+
+        }
+    }
+
+
+    protected Document createDescibeOutput(
+        CallContext context,
+        String      uuid,
+        boolean     incudeUI
+    ) {
+        log.debug("GNVArtifactBase.createDescibeOutput");
+        Document document = XMLUtils.newDocument();
+
+        XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+            document,
+            ArtifactNamespaceContext.NAMESPACE_URI,
+            ArtifactNamespaceContext.NAMESPACE_PREFIX
+        );
+        Element rootNode = this.createRootNode(creator, document);
+        this.createHeader(creator, rootNode, document, "describe");
+        this.createOutputs(creator, rootNode, document);
+        this.createCurrentState(creator, rootNode, document);
+        this.createReachableStates(creator, rootNode, document);
+        this.createModel(creator, rootNode, document);
+        if (incudeUI){
+            this.createUserInterface(creator, rootNode, document, context, uuid);
+        }
+
+        return document;
+    }
+    
+    protected boolean getIncludeUIFromDocument(Document document){
+        String value = XMLUtils.xpathString(
+            document, XPATH_INCLUDE_UI, ArtifactNamespaceContext.INSTANCE);
+
+        boolean includeUI = false;
+        if (value != null){
+            includeUI = Boolean.parseBoolean(value);
+        }
+        return includeUI;
+    }
+
+    protected Element createRootNode(
+        XMLUtils.ElementCreator creator,
+        Document                document
+    ) {
+        Element rootNode = creator.create("result");
+        document.appendChild(rootNode);
+        return rootNode;
+    }
+
+    protected void createHeader(
+        XMLUtils.ElementCreator creator,
+        Element                 parent,
+        Document                document,
+        String                  documentType
+    ) {
+        Element typeNode = creator.create("type");
+        creator.addAttr(typeNode, "name", documentType);
+        parent.appendChild(typeNode);
+
+        Element uuidNode = creator.create("uuid");
+        creator.addAttr(uuidNode, "value", super.identifier);
+        parent.appendChild(uuidNode);
+
+        Element hashNode = creator.create("hash");
+        creator.addAttr(hashNode, "value", this.hash());
+        parent.appendChild(hashNode);
+    }
+
+    protected Element createSelectBox(
+        XMLUtils.ElementCreator artCreator,
+        XMLUtils.ElementCreator creator,
+        Document                document,
+        CallContext             context
+    ) {
+        RessourceFactory resource = RessourceFactory.getInstance();
+        CallMeta callMeta         = (CallMeta) context.getMeta();
+        String productName        = product.getName();
+
+        Element selectNode = creator.create("select1");
+        creator.addAttr(selectNode, "ref", "product");
+        artCreator.addAttr(selectNode, "state", INITIAL_STATE, true);
+
+
+        Element labelNode = creator.create("label");
+        labelNode.setTextContent(
+            resource.getRessource(callMeta.getLanguages(), "product", "product")
+        );
+
+        Element choicesNode = creator.create("choices");
+
+        Element itemNode = creator.create("item");
+        creator.addAttr(itemNode, "selected", "true");
+
+        Element choiceLabel = creator.create("label");
+        choiceLabel.setTextContent(resource.getRessource(
+            callMeta.getLanguages(),
+            productName,
+            productName
+        ));
+
+        Element choiceValue = creator.create("value");
+        choiceValue.setTextContent(productName);
+
+        itemNode.appendChild(choiceLabel);
+        itemNode.appendChild(choiceValue);
+        choicesNode.appendChild(itemNode);
+
+        selectNode.appendChild(labelNode);
+        selectNode.appendChild(choicesNode);
+
+        return selectNode;
+    }
+
+
+    protected void createReachableStates(
+        XMLUtils.ElementCreator creator,
+        Element                 parent,
+        Document                document
+    ) {
+        Element stateNode = creator.create("reachable-states");
+        if (this.current != null) {
+
+            // add future states
+            Iterator<Transition> transitions = this.transitions.iterator();
+            while (transitions.hasNext()) {
+                Transition tmpTransition = transitions.next();
+                if (tmpTransition.getFrom().equals(current.getID()) && 
+                    tmpTransition.isValid(this.current)){
+                    Element currentNode = creator.create("state");
+                    creator.addAttr(currentNode, "name", tmpTransition.getTo());
+                    creator.addAttr(
+                        currentNode,
+                        "description",
+                        this.states.get(tmpTransition.getTo()).getDescription());
+                    stateNode.appendChild(currentNode);
+                }
+            }
+
+
+            // add old states
+            appendOldReachableStates(creator, stateNode, current);
+        }
+        parent.appendChild(stateNode);
+    }
+
+
+    protected void appendOldReachableStates(
+        XMLUtils.ElementCreator creator,
+        Element                 parent,
+        State                   state
+    ) {
+        if (state == null)
+            return;
+
+        while (state != null) {
+            Element currentNode = creator.create("state");
+            creator.addAttr(currentNode, "name", state.getID());
+            creator.addAttr(currentNode, "description", state.getDescription());
+            parent.appendChild(currentNode);
+
+            state = state.getParent();
+        }
+    }
+
+
+    protected void createCurrentState(
+        XMLUtils.ElementCreator creator,
+        Element                 parent,
+        Document                document
+    ) {
+        Element stateNode = creator.create("state");
+        creator.addAttr(stateNode, "name", this.current.getID());
+        creator.addAttr(stateNode, "description", this.current.getDescription());
+        parent.appendChild(stateNode);
+    }
+
+    protected void createModel(
+        XMLUtils.ElementCreator creator,
+        Element                 parent,
+        Document                document
+    ) {
+        Element modelNode = creator.create("model");
+        if (this.current != null) {
+            Collection<InputValue> inputValues = this.current
+                    .getRequiredInputValues();
+            if (inputValues != null) {
+                Iterator<InputValue> it = inputValues.iterator();
+                while (it.hasNext()) {
+                    InputValue inputValue = it.next();
+                    Element inputNode = creator.create("input");
+                    creator.addAttr(inputNode, "name", inputValue.getName());
+                    creator.addAttr(inputNode, "type", inputValue.getType());
+                    modelNode.appendChild(inputNode);
+                }
+            }
+        }
+        parent.appendChild(modelNode);
+    }
+
+    protected void createUserInterface(
+        XMLUtils.ElementCreator creator,
+        Element                 parent,
+        Document                document,
+        CallContext             context,
+        String                  uuid
+    ) {
+        XMLUtils.ElementCreator xCreator = new XMLUtils.ElementCreator(
+            document,
+            XMLUtils.XFORM_URL,
+            XMLUtils.XFORM_PREFIX
+        );
+
+        Element uiNode     = creator.create("ui");
+        Element staticNode = creator.create("static");
+        Element dynamic    = creator.create("dynamic");
+
+        uiNode.appendChild(staticNode);
+        uiNode.appendChild(dynamic);
+
+        parent.appendChild(uiNode);
+
+        // append fis to dynamic part
+        appendFis(document, staticNode, context, product.getArtifactFactory());
+
+        if (this.current != null) {
+            Element staticUI = createSelectBox(
+                creator, xCreator, document, context
+            );
+            staticNode.appendChild(staticUI);
+
+            this.current.describe(
+                document, uiNode, context, uuid
+            );
+        }
+    }
+
+
+    protected void createOutputs(
+        XMLUtils.ElementCreator creator,
+        Element                 parent,
+        Document                document
+    ) {
+        log.debug("GNVArtifactBase.createOutputs");
+        Element outputsNode = creator.create("outputs");
+        if (this.current instanceof OutputState) {
+            Collection<OutputMode> outputModes = ((OutputState) this.current)
+                    .getOutputModes();
+            if (outputModes != null) {
+                Iterator<OutputMode> it = outputModes.iterator();
+                while (it.hasNext()) {
+                    OutputMode outputMode = it.next();
+                    log.debug("Write Outputnode for " + outputMode.toString());
+                    Element outputModeNode = creator.create("output");
+                    creator.addAttr(
+                        outputModeNode, "name", outputMode.getName());
+                    creator.addAttr(
+                        outputModeNode, "description", outputMode.getDescription());
+                    creator.addAttr(
+                        outputModeNode, "mime-type", outputMode.getMimeType());
+                    outputsNode.appendChild(outputModeNode);
+
+                    Collection<InputValue> inputParameters = outputMode
+                            .getInputParameters();
+                    if (inputParameters != null) {
+                        Element inputParametersNode = creator.create("parameter");
+                        outputModeNode.appendChild(inputParametersNode);
+                        Iterator<InputValue> it2 = inputParameters.iterator();
+                        while (it2.hasNext()) {
+                            InputValue inputValue = it2.next();
+                            Element inputParameterNode =
+                                creator.create("parameter");
+                            creator.addAttr(
+                                inputParameterNode, "name", inputValue.getName());
+                            creator.addAttr(
+                                inputParameterNode, "type", inputValue.getType());
+                            creator.addAttr(
+                                inputParameterNode, "value", inputValue.getDefaultValue());
+                            inputParametersNode.appendChild(inputParameterNode);
+                        }
+                    }
+                }
+            } else {
+                log.warn("No Outputmodes given.");
+            }
+        }
+        parent.appendChild(outputsNode);
+    }
+
+    protected Collection<InputData> parseInputData(Document document,
+                                                   String xPath) {
+        HashMap<String, InputData> returnValue = null;
+
+        NodeList inputElemets = (NodeList) XMLUtils.xpath(document, xPath,
+                XPathConstants.NODESET, ArtifactNamespaceContext.INSTANCE);
+        if (inputElemets != null) {
+            returnValue = new HashMap<String, InputData>();
+
+            for (int i = 0; i < inputElemets.getLength(); i++) {
+                Element inputDataNode = (Element)inputElemets.item(i);
+                String name = inputDataNode.getAttribute("name");
+                String value = inputDataNode.getAttribute("value");
+
+                if (returnValue.containsKey(name)) {
+                    InputData inputData = returnValue.get(name);
+                    inputData.concartValue(value);
+                    log.debug(inputData.toString());
+                    returnValue.put(name, inputData);
+                } else {
+                    InputData inputData = new DefaultInputData(name, value);
+
+                    returnValue.put(name, inputData);
+                }
+            }
+        }
+        return returnValue.values();
+    }
+
+    /**
+     * @see de.intevation.artifactdatabase.DefaultArtifact#out(org.w3c.dom.Document,
+     *      java.io.OutputStream, de.intevation.artifacts.CallContext)
+     */
+    @Override
+    public void out(Document format, OutputStream outputStream,
+                    CallContext context) throws IOException {
+        log.debug("TGNVArtifactBase.out");
+        try {
+
+            if (current != null && current instanceof OutputState) {
+                ((OutputState) current)
+                        .out(format, this.parseInputData(
+                                format, XPATH_OUTPUT_PARAMS),
+                                outputStream, super.identifier, context);
+            }
+        } catch (StateException e) {
+            log.error(e, e);
+            throw new IOException(e.getMessage());
+        }
+    }
+
+    protected static String readOutputType(Document document) {
+        String value = XMLUtils.xpathString(
+            document, XPATH_OUTPUT_NAME, ArtifactNamespaceContext.INSTANCE);
+        return value;
+    }
+
+
+    public void setProduct(Product product) {
+        this.product = product;        
+    }
+
+    public void endOfLife(Object globalContext) {
+        super.endOfLife(globalContext);
+
+        if (current != null) {
+            current.endOfLife(globalContext);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVArtifactFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,28 @@
+package de.intevation.gnv.artifacts;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifactdatabase.DefaultArtifactFactory;
+
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class GNVArtifactFactory extends DefaultArtifactFactory {
+
+    public static final String XPATH_PRODUCT_FACTORY   = "artifact-factory";
+
+    private static Logger logger = Logger.getLogger(GNVArtifactFactory.class);
+
+    public GNVArtifactFactory() {
+    }
+
+    @Override
+    public void setup(Document document, Node factoryNode) {
+        super.setup(document, factoryNode);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVDefaultArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,83 @@
+package de.intevation.gnv.artifacts;
+
+import de.intevation.artifactdatabase.DefaultArtifact;
+import de.intevation.artifactdatabase.XMLUtils;
+
+import de.intevation.artifacts.ArtifactNamespaceContext;
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class GNVDefaultArtifact extends DefaultArtifact {
+
+    private static Logger logger = Logger.getLogger(GNVDefaultArtifact.class);
+
+
+    public GNVDefaultArtifact() {
+        super();
+    }
+
+
+    protected void appendFis(
+        Document    document,
+        Element     staticNode,
+        CallContext context,
+        String      fisName
+    ) {
+        RessourceFactory resource = RessourceFactory.getInstance();
+        CallMeta callMeta         = (CallMeta) context.getMeta();
+
+        XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+            document,
+            XMLUtils.XFORM_URL,
+            XMLUtils.XFORM_PREFIX
+        );
+
+        XMLUtils.ElementCreator artCreator = new XMLUtils.ElementCreator(
+            document,
+            ArtifactNamespaceContext.NAMESPACE_URI,
+            ArtifactNamespaceContext.NAMESPACE_PREFIX
+        );
+
+        Element selectNode = creator.create("select1");
+        artCreator.addAttr(selectNode, "fis", "true", true);
+
+        Element labelNode = creator.create("label");
+        labelNode.setTextContent(
+            resource.getRessource(callMeta.getLanguages(), "fis", "fis")
+        );
+
+        Element choicesNode = creator.create("choices");
+
+        Element itemNode = creator.create("item");
+        creator.addAttr(itemNode, "selected", "true");
+
+        Element choiceLabel = creator.create("label");
+        choiceLabel.setTextContent(resource.getRessource(
+            callMeta.getLanguages(),
+            fisName,
+            fisName
+        ));
+
+        Element choiceValue = creator.create("value");
+        choiceValue.setTextContent(fisName);
+
+        itemNode.appendChild(choiceLabel);
+        itemNode.appendChild(choiceValue);
+        choicesNode.appendChild(itemNode);
+
+        selectNode.appendChild(labelNode);
+        selectNode.appendChild(choicesNode);
+
+        staticNode.appendChild(selectNode);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVProductArtifactFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,175 @@
+package de.intevation.gnv.artifacts;
+
+import de.intevation.artifactdatabase.DefaultArtifactFactory;
+import de.intevation.artifactdatabase.ProxyArtifact;
+import de.intevation.artifactdatabase.XMLUtils;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+
+import de.intevation.gnv.artifacts.fis.SelectProductArtifact;
+
+import de.intevation.gnv.artifacts.fis.product.DefaultProduct;
+
+import de.intevation.gnv.state.DefaultInputData;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.xpath.XPathConstants;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class GNVProductArtifactFactory extends DefaultArtifactFactory {
+
+    public static final String XPATH_REPLACE_NAME = "IDENTIFIER";
+
+    public static final String XPATH_PRODUCT_ARTIFACT =
+        "artifact-database/artifacts/artifact[@name='"+XPATH_REPLACE_NAME+"']";
+
+    public static final String XPATH_PRODUCT = "products/product";
+
+    public static final String XPATH_PRODUCT_NAME = "@name";
+
+    public static final String XPATH_PRODUCT_FACTORY = "artifact-factory";
+
+    public static final String XPATH_PRODUCT_PARAMETER = "parameters/parameter";
+
+    private Logger logger = Logger.getLogger(GNVProductArtifactFactory.class);
+
+    private Map productFactories;
+    private Map products;
+
+
+    public GNVProductArtifactFactory() {
+    }
+
+    @Override
+    public Artifact createArtifact(String identifier, Object context) {
+
+        // create a SelectProductArtifact for initial product selection
+        Artifact artifact = super.createArtifact(identifier, context);
+
+        if (artifact instanceof ProxyArtifact) {
+
+            SelectProductArtifact select = new SelectProductArtifact();
+            select.setProducts(products);
+            select.setup(identifier, this, context);
+
+            ((ProxyArtifact) artifact).setProxied(select);
+        }
+
+        return artifact;
+    }
+
+    @Override
+    public void setup(Document document, Node factoryNode) {
+        super.setup(document, factoryNode);
+
+        String xpath  = XPATH_PRODUCT_ARTIFACT.replace(XPATH_REPLACE_NAME, name);
+        Node artifact = (Node) XMLUtils.xpath(
+            document, xpath, XPathConstants.NODE);
+
+        NodeList productNodes = (NodeList) XMLUtils.xpath(
+            artifact, XPATH_PRODUCT, XPathConstants.NODESET);
+
+        if (productNodes == null) {
+            logger.warn("No products found for fis: " + name);
+            return;
+        }
+
+        int productLength = productNodes.getLength();
+
+        if (productLength != 0) {
+            productFactories = new HashMap(productLength);
+            products         = new HashMap(productLength);
+
+            parseProductFactories(document, productNodes);
+        }
+    }
+
+
+    public ArtifactFactory getArtifactFactoryByName(String name) {
+        return (ArtifactFactory) productFactories.get(name);
+    }
+
+
+    protected void parseProductFactories(Document document, NodeList products) {
+        int items = products.getLength();
+
+        for(int i = 0; i < items; i++) {
+
+            try {
+                Node product = products.item(i);
+
+                String name = (String) XMLUtils.xpath(
+                    product, XPATH_PRODUCT_NAME, XPathConstants.STRING);
+
+                Node factoryNode = (Node) XMLUtils.xpath(
+                    product, XPATH_PRODUCT_FACTORY, XPathConstants.NODE);
+
+                String factoryClass = factoryNode.getTextContent();
+
+                if (factoryClass == null || factoryClass.equals("")) {
+                    logger.warn("No artifact factory class found for " + name);
+                    continue;
+                }
+
+                Class cls               = Class.forName(factoryClass);
+                ArtifactFactory factory = (ArtifactFactory) cls.newInstance();
+                factory.setup(document, factoryNode);
+
+                productFactories.put(name, factory);
+                initializeProducts(product);
+            }
+            catch (ClassNotFoundException cnfe) {
+                logger.warn(cnfe, cnfe);
+            }
+            catch (InstantiationException ie) {
+                logger.warn(ie, ie);
+            }
+            catch (IllegalAccessException iae) {
+                logger.warn(iae, iae);
+            }
+        }
+    }
+
+
+    protected void initializeProducts(Node productNode) {
+        String productName = (String) XMLUtils.xpath(
+            productNode, "@name", XPathConstants.STRING);
+
+        NodeList parameterNodes = (NodeList) XMLUtils.xpath(
+            productNode, XPATH_PRODUCT_PARAMETER, XPathConstants.NODESET
+        );
+
+        if (parameterNodes != null) {
+            int items = parameterNodes.getLength();
+            Collection inputParameter = new ArrayList(items);
+
+            for (int j = 0; j < items; j++) {
+                Node parameterNode = (Node) parameterNodes.item(j);
+                String name        = (String) XMLUtils.xpath(
+                    parameterNode, "@name", XPathConstants.STRING);
+                String value       = (String) XMLUtils.xpath(
+                    parameterNode, "@value", XPathConstants.STRING);
+
+                inputParameter.add(new DefaultInputData(name, value));
+            }
+
+            products.put(
+                productName,
+                new DefaultProduct(productName, inputParameter, this.name)
+            );
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/cache/CacheFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,86 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts.cache;
+
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.CacheManager;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class CacheFactory {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(CacheFactory.class);
+
+    private final static String CACHENAME = "artifactdata";
+
+    /**
+     * The singleton Instance of this Factory.
+     */
+    private static CacheFactory instance = null;
+
+    /**
+     * 
+     */
+    private CacheManager cacheManager = null;
+
+    /**
+     * Basic-Constructor of this Class
+     */
+    private CacheFactory() {
+        super();
+    }
+
+    /**
+     * This Method provides an singleton Instance of this Class.
+     * 
+     * @return an singleton Instance of this Class
+     */
+    public static CacheFactory getInstance() {
+        if (instance == null) {
+            instance = new CacheFactory();
+        }
+        return instance;
+    }
+
+    /**
+     * Getting the ConnectionPool
+     * 
+     * @return the ConnectionPool
+     */
+    public Cache getCache() {
+        return this.cacheManager.getCache(CACHENAME);
+    }
+
+    /**
+     * Initializes the ConnectionPool. Should only be called once on system
+     * startup
+     * 
+     * @param properties
+     *            the Properties for the Individual Configuration of the
+     *            ConnectionPool
+     */
+    public void initializeCache(String configurationFileName) {
+        if (cacheManager == null) {
+            cacheManager = new CacheManager(configurationFileName);
+            cacheManager.addCache(CACHENAME);
+        }
+    }
+
+    /**
+     * Checks if the ConnectionPool has already been initialized.
+     * 
+     * @return true if the ConnectionPool is initialized.
+     */
+    public boolean isInitialized() {
+        return this.cacheManager != null;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,93 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts.context;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Paint;
+
+import java.io.File;
+
+import de.intevation.artifactdatabase.DefaultArtifactContext;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class GNVArtifactContext 
+extends      DefaultArtifactContext
+{
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(GNVArtifactContext.class);
+
+    public static final String CHART_TEMPLATE_KEY =
+        "gnv.chart.template";
+
+    public static final String HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES_KEY =
+        "gnv.horizontal.cross.section.profile.samples";
+    
+    public static final String HORIZONTAL_CROSS_SECTION_SAMPLES_KEY =
+        "gnv.horizontal.cross.section.samples";
+
+    public static final String
+        HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH_KEY =
+        "gnv.horizontal.cross.section.result.shapefile";
+
+    public static final File
+        DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SHAPEFILE_PATH = 
+        new File(System.getProperty("java.io.tmpdir"));
+
+    public static final Integer 
+        DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES = Integer.valueOf(250);
+    
+    public static final Integer 
+        DEFAULT_HORIZONTAL_CROSS_SECTION_SAMPLES = Integer.valueOf(1024);
+
+    public static final String HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY =
+        "gnv.horizontal.cross.section.ground.interpolation";
+
+    public static final String DEFAULT_HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION =
+        "bilinear";
+
+    public static final String PALETTES_KEY =
+        "gnv.color.palettes";
+
+    public static final String VERTICAL_CROSS_SECTION_SAMPLES_KEY =
+        "gnv.vertical.cross.section.samples";
+
+    public static final Dimension DEFAULT_VERTICAL_CROSS_SECTION_SAMPLES =
+        new Dimension(1024, 768);
+
+    public static final String VERTICAL_CROSS_SECTION_FILTER_FACTORIES_KEY =
+        "gnv.vertical.cross.section.filter.factories";
+
+    public static final String VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY =
+        "gnv.vertical.cross.section.ground.interpolation";
+
+    public static final String DEFAULT_VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION =
+        "bilinear";
+
+    public static final String VERTICAL_CROSS_SECTION_GROUND_FILL_KEY =
+        "gnv.vertical.cross.section.ground.fill";
+
+    public static final Paint DEFAULT_VERTICAL_CROSS_SECTION_GROUND_FILL =
+        new Color(0x7c8683);
+
+    public GNVArtifactContext() {
+        super();
+        log.debug("GNVArtifactContext.Constructor");
+    }
+
+    public GNVArtifactContext(Document config) {
+        super(config);
+        log.debug("GNVArtifactContext.Constructor(config)");
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,584 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts.context;
+
+import java.awt.Color;
+import java.awt.Paint;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.File;
+
+import java.util.Properties;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Collections;
+
+import java.awt.Dimension;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import de.intevation.gnv.geobackend.base.connectionpool.ConnectionPoolFactory;
+
+import de.intevation.gnv.geobackend.base.query.container.QueryContainerFactory;
+import de.intevation.gnv.geobackend.base.query.container.exception.QueryContainerException;
+
+import de.intevation.gnv.chart.XMLChartTheme;
+
+import de.intevation.gnv.artifacts.cache.CacheFactory;
+
+import de.intevation.gnv.raster.Palette;
+import de.intevation.gnv.raster.Filter;
+import de.intevation.gnv.raster.PaletteManager;
+
+import de.intevation.artifacts.ArtifactContextFactory;
+
+import de.intevation.artifactdatabase.Config;
+import de.intevation.artifactdatabase.XMLUtils;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Ingo Weinzierl      (iweinzierl@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class GNVArtifactContextFactory implements ArtifactContextFactory {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(GNVArtifactContext.class);
+
+    public static final String XPATH_GEOBACKEND_CONFIGURATION = 
+        "artifact-database/geo-backend/backend-configuration";
+
+    public static final String XPATH_GEOBACKEND_QUERYCONFIGURATION = 
+        "artifact-database/geo-backend/query-configuration";
+
+    private final static String CACHECONFIGNODEPATH = 
+        "/artifact-database/ehcache/configuration";
+
+    private final static String CHARTCONFIGNODEPATH = 
+        "/artifact-database/gnv/charttemplate/configuration";
+
+    public final static String PALETTES_PATH =
+        "/artifact-database/gnv/palettes";
+
+    public final static String PALETTE_ITEMS =
+        "palette";
+
+    public final static String HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES =
+        "/artifact-database/gnv/horizontal-cross-section-profile/samples/@number";
+
+    public final static String HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION =
+        "/artifact-database/gnv/horizontal-cross-section/ground/@interpolation";
+
+    public final static String HORIZONTAL_CROSS_SECTION_SAMPLES =
+        "/artifact-database/gnv/horizontal-cross-section/samples/@number";
+    
+    public final static String HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH =
+        "/artifact-database/gnv/horizontal-cross-section/result-shapefile-directory/@path";
+    
+    public final static String VERTICAL_CROSS_SECTION_SAMPLES =
+        "/artifact-database/gnv/vertical-cross-section/samples";
+
+    public final static String VERTICAL_CROSS_SECTION_FILTERS =
+        "/artifact-database/gnv/vertical-cross-section/filters/filter";
+
+    public final static String VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION =
+        "/artifact-database/gnv/vertical-cross-section/ground/@interpolation";
+
+    public final static String VERTICAL_CROSS_SECTION_GROUND_FILL_COLOR =
+        "/artifact-database/gnv/vertical-cross-section/ground/@fill-color";
+
+    /**
+     * Constructor
+     */
+    public GNVArtifactContextFactory() {
+        super();
+        log.debug("GNVArtifactContextFactory.Constructor");
+    }
+
+    /**
+     * @see de.intevation.artifacts.ArtifactContextFactory#createArtifactContext(org.w3c.dom.Document)
+     */
+    public Object createArtifactContext(Document config) {
+        GNVArtifactContext returnValue = null;
+        try {
+            log.debug("GNVArtifactContextFactory.createArtifactContext");
+            log.info("Initialisation of the Geo-BackendConnectionPool");
+            String backendConfigurationFile = Config.getStringXPath(config,
+                    XPATH_GEOBACKEND_CONFIGURATION);
+            backendConfigurationFile = Config.replaceConfigDir(
+                backendConfigurationFile);
+            
+            Properties properties = getProperties(backendConfigurationFile);
+            ConnectionPoolFactory cpf = ConnectionPoolFactory.getInstance();
+            cpf.initializeConnectionPool(properties);
+
+            log.info("Initialisation of the QueryContainer");
+            String queryConfigurationFile = Config.getStringXPath(config,
+                    XPATH_GEOBACKEND_QUERYCONFIGURATION);
+            queryConfigurationFile = Config.replaceConfigDir(
+                queryConfigurationFile);
+            
+            Properties queryProperties = getProperties(queryConfigurationFile);
+            QueryContainerFactory qcf = QueryContainerFactory.getInstance();
+            qcf.initializeQueryContainer(queryProperties);
+
+            log.info("Initialisation of the Cache");
+            String cacheConfigurationFile = Config.getStringXPath(config,
+                    CACHECONFIGNODEPATH);
+            cacheConfigurationFile = Config.replaceConfigDir(
+                cacheConfigurationFile);
+
+            CacheFactory cf = CacheFactory.getInstance();
+            cf.initializeCache(cacheConfigurationFile);
+
+            returnValue = new GNVArtifactContext(config);
+
+            configurePalettes(config, returnValue);
+
+            configureChartTemplate(config, returnValue);
+
+            configureHorizontalCrossSectionProfile(config, returnValue);
+
+            configureHorizontalCrossSection(config,returnValue);
+
+            configureVerticalCrossSection(config, returnValue);
+
+        } catch (FileNotFoundException e) {
+            log.error(e, e);
+        } catch (IOException e) {
+            log.error(e, e);
+        } catch (QueryContainerException e) {
+            log.error(e, e);
+        }
+        return returnValue;
+    }
+
+    protected void configureVerticalCrossSection(
+        Document           config,
+        GNVArtifactContext context
+    ) {
+        log.info("configuration of vertical cross section");
+        configureVerticalCrossSectionSamples(config, context);
+        configureVerticalCrossSectionFilters(config, context);
+        configureVerticalCrossSectionGroundInterpolation(config, context);
+        configureVerticalCrossSectionGroundFillColor(config, context);
+    }
+
+    protected void configureVerticalCrossSectionGroundFillColor(
+        Document           config,
+        GNVArtifactContext context
+    ) {
+        log.info("configuration of vertical cross section ground fill color");
+
+        String fillColor = Config.getStringXPath(
+            config,
+            VERTICAL_CROSS_SECTION_GROUND_FILL_COLOR);
+
+        Paint fill =
+            GNVArtifactContext.DEFAULT_VERTICAL_CROSS_SECTION_GROUND_FILL;
+
+        if (fillColor != null
+        && (fillColor = fillColor.trim()).length() != 0) {
+            try {
+                Color color = Color.decode(fillColor);
+                log.info("ground fill color: #" +
+                    Integer.toHexString(color.getRGB()));
+                fill = color;
+            }
+            catch (NumberFormatException nfe) {
+                log.error("'" + fillColor + "' is not a valid color");
+            }
+        }
+
+        context.put(
+            GNVArtifactContext
+                .VERTICAL_CROSS_SECTION_GROUND_FILL_KEY,
+            fill);
+    }
+
+    protected void configureVerticalCrossSectionGroundInterpolation(
+        Document           config,
+        GNVArtifactContext context
+    ) {
+        log.info("configuration of vertical cross section ground interpolation");
+        String interpolation = Config.getStringXPath(
+            config,
+            VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION);
+
+        if (interpolation == null 
+        || (interpolation = interpolation.trim()).length() == 0) {
+            interpolation = GNVArtifactContext
+                .DEFAULT_VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION;
+        }
+
+        log.info("ground interpolation: " + interpolation);
+
+        context.put(
+            GNVArtifactContext
+                .VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY,
+            interpolation);
+    }
+
+    protected void configureVerticalCrossSectionFilters(
+        Document           config,
+        GNVArtifactContext context
+    ) {
+        log.info("configuration of vertical cross section filters");
+
+        NodeList filters = Config.getNodeSetXPath(
+            VERTICAL_CROSS_SECTION_FILTERS);
+
+        ArrayList<Filter.Factory> filterFactories =
+            new ArrayList<Filter.Factory>();
+
+        if (filters == null) {
+            log.warn("no filters found");
+        }
+        else {
+            for (int i = 0, N = filters.getLength(); i < N; ++i) {
+                Element filterElement = (Element)filters.item(i);
+                String factoryName = filterElement.getAttribute("factory");
+                if ((factoryName = factoryName.trim()).length() > 0) {
+                    try {
+                        Class clazz = Class.forName(factoryName);
+                        Filter.Factory filterFactory =
+                            (Filter.Factory)clazz.newInstance();
+                        filterFactories.add(filterFactory);
+                    }
+                    catch (ClassNotFoundException cnfe) {
+                        log.error("filter class not found", cnfe);
+                    }
+                    catch (InstantiationException ie) {
+                        log.error("cannot instantiate filter factory", ie);
+                    }
+                    catch (IllegalAccessException iae) {
+                        log.error("cannot access filter factory", iae);
+                    }
+                    catch (ClassCastException cce) {
+                        log.error("not a filter factory class", cce);
+                    }
+                }
+                else {
+                    log.error("No factory name given");
+                }
+            }
+        }
+
+        log.info("number of filters: " + filterFactories.size());
+
+        context.put(
+            GNVArtifactContext.VERTICAL_CROSS_SECTION_FILTER_FACTORIES_KEY,
+            Collections.unmodifiableList(filterFactories));
+    }
+
+    protected void configureVerticalCrossSectionSamples(
+        Document           config,
+        GNVArtifactContext context
+    ) {
+        log.info("configuration of vertical cross section samples");
+
+        Element samples = (Element)Config.getNodeXPath(
+            VERTICAL_CROSS_SECTION_SAMPLES);
+
+        Dimension sampleSize = new Dimension(
+            GNVArtifactContext.DEFAULT_VERTICAL_CROSS_SECTION_SAMPLES);
+
+        if (samples == null) {
+            log.warn("no samples found");
+        }
+        else {
+            String widthString = samples.getAttribute("width");
+            if ((widthString = widthString.trim()).length() > 0) {
+                try {
+                    sampleSize.width = Math.max(1, Integer.parseInt(widthString));
+                }
+                catch (NumberFormatException nfe) {
+                    log.error("invalid value for width: '" + widthString + "'");
+                }
+            }
+            String heightString = samples.getAttribute("height");
+            if ((heightString = heightString.trim()).length() > 0) {
+                try {
+                    sampleSize.height = Math.max(1, Integer.parseInt(heightString));
+                }
+                catch (NumberFormatException nfe) {
+                    log.error("invalid value for height: '" + heightString + "'");
+                }
+            }
+        }
+        log.info("samples (width x height): " + 
+            sampleSize.width + " x " + sampleSize.height);
+
+        context.put(
+            GNVArtifactContext.VERTICAL_CROSS_SECTION_SAMPLES_KEY,
+            sampleSize);
+
+    }
+
+    protected void configureHorizontalCrossSectionProfile(
+        Document           config,
+        GNVArtifactContext context
+    )
+    {
+        log.info("configuration of horizontal cross section profile");
+
+        String numSamples = Config.getStringXPath(
+            config,
+            HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES);
+
+        Integer samples =
+            GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES;
+
+        if (numSamples == null) {
+            log.warn("No number of samples found.");
+        }
+        else {
+            try {
+                samples = Integer.valueOf(numSamples);
+            }
+            catch (NumberFormatException nfe) {
+                log.warn("Invalid integer for number of samples");
+            }
+        }
+
+        log.info("# horizontal cross section profile samples: " + samples);
+
+        context.put(
+            GNVArtifactContext.HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES_KEY,
+            samples);
+    }
+    
+    protected void configureHorizontalCrossSection(
+        Document           config,
+        GNVArtifactContext context
+    ) {
+        log.info("configuration of horizontal cross section");
+
+        configureHorizontalCrossSectionSamples(config, context);
+        configureHorizontalCrossSectionResultShapeFilePath(config, context);
+        configureHorizontalCrossSectionGroundInterpolation(config, context);
+    }
+
+    protected void configureHorizontalCrossSectionGroundInterpolation(
+        Document           config,
+        GNVArtifactContext context
+    )
+    {
+        log.info(
+            "configuration of horizontal cross section ground interpolation");
+
+        String interpolation = Config.getStringXPath(
+            config,
+            HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION);
+
+        if (interpolation == null 
+        || (interpolation = interpolation.trim()).length() == 0) {
+            interpolation = GNVArtifactContext
+                .DEFAULT_HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION;
+        }
+
+        log.info("ground interpolation: " + interpolation);
+
+        context.put(
+            GNVArtifactContext
+                .HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY,
+            interpolation);
+    }
+
+    protected void configureHorizontalCrossSectionResultShapeFilePath(
+        Document           config,
+        GNVArtifactContext context
+    )
+    {
+        log.info(
+            "configuration of horizontal cross section result shape file path");
+
+        File dir = 
+            GNVArtifactContext.
+            DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SHAPEFILE_PATH;
+
+        String path = Config.getStringXPath(
+            config,
+            HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH);
+
+        if (path != null && (path = path.trim()).length() > 0) {
+            dir = new File(Config.replaceConfigDir(path));
+        }
+        else {
+            log.warn("No 'result-shapefile-directory' given");
+        }
+
+        log.info("writing shape files to '" 
+            + dir.getAbsolutePath() + "'");
+
+        context.put(
+            GNVArtifactContext
+                .HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH_KEY,
+            dir);
+    }
+
+    protected void configureHorizontalCrossSectionSamples(
+        Document           config,
+        GNVArtifactContext context
+    )
+    {
+        log.info("configuration of horizontal cross section samples");
+        String numSamples = Config.getStringXPath(
+            config,
+            HORIZONTAL_CROSS_SECTION_SAMPLES);
+
+        Integer samples =
+            GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_SAMPLES;
+
+        if (numSamples == null) {
+            log.warn("No number of samples found.");
+        }
+        else {
+            try {
+                samples = Integer.valueOf(numSamples);
+            }
+            catch (NumberFormatException nfe) {
+                log.warn("Invalid integer for number of samples");
+            }
+        }
+
+        log.info("# horizontal cross section profile samples: " + samples);
+
+        context.put(
+            GNVArtifactContext.HORIZONTAL_CROSS_SECTION_SAMPLES_KEY,
+            samples);
+    }
+
+
+    protected void configureChartTemplate(
+        Document           config,
+        GNVArtifactContext context
+    ) {
+        log.info("Initialisation of chart template");
+        String chartConfigFile = Config.getStringXPath(
+            config, CHARTCONFIGNODEPATH
+        );
+
+        XMLChartTheme theme = new XMLChartTheme("XMLChartTheme");
+
+        if (chartConfigFile == null) {
+            log.warn("no configuration file for chart template found");
+        }
+        else {
+            chartConfigFile = Config.replaceConfigDir(chartConfigFile);
+            log.debug("Parse xml configuration of " + chartConfigFile);
+
+            Document tmpl = XMLUtils.parseDocument(new File(chartConfigFile));
+            if (tmpl != null) {
+                theme.applyXMLConfiguration(tmpl);
+            }
+            else {
+                log.error(
+                    "Cannot load chart template from '" +
+                    chartConfigFile + "'");
+            }
+        }
+
+        context.put(GNVArtifactContext.CHART_TEMPLATE_KEY, theme);
+    }
+
+    protected void configurePalettes(
+        Document           config,
+        GNVArtifactContext context
+    ) {
+        log.info("configure palettes");
+
+        HashMap<Integer, PaletteManager> palettes = new HashMap();
+
+        Element node = (Element)Config.getNodeXPath(config, PALETTES_PATH);
+
+        if (node == null) {
+            log.error("No palettes found");
+        }
+        else {
+            NodeList pals = node.getElementsByTagName(PALETTE_ITEMS);
+            for (int i = 0, N = pals==null?0:pals.getLength(); i < N; ++i) {
+                Element pal = (Element)pals.item(i);
+                String name         = pal.getAttribute("name");
+                String description  = pal.getAttribute("description");
+                String filename     = pal.getAttribute("file");
+                String parameterIds = pal.getAttribute("parameter-ids");
+
+                if (name == null || (name = name.trim()).length() == 0) {
+                    log.error("Palette has no 'name' attribute.");
+                }
+                else if (filename == null
+                || (filename = filename.trim()).length() == 0) {
+                    log.error("Palette '" + name + "' has no 'file' attribute.");
+                }
+                else if (parameterIds == null 
+                || (parameterIds = parameterIds.trim()).length() == 0) {
+                    log.error("no parameter ids given for '" + name + "'");
+                }
+                else {
+                    ArrayList<Integer> ids = new ArrayList<Integer>();
+                    for (String idString: parameterIds.split("[\t ,]+")) {
+                        try {
+                            ids.add(Integer.valueOf(idString));
+                        }
+                        catch (NumberFormatException nfe) {
+                            log.error(
+                                "parameter id '" + idString + "' is integer");
+                        }
+                    }
+                    filename = Config.replaceConfigDir(filename);
+                    Document document = XMLUtils.parseDocument(
+                        new File(filename));
+                    if (document == null) {
+                        log.error("Cannot load palette file '" +
+                            filename + "'");
+                    }
+                    else {
+                        PaletteManager manager = new PaletteManager(
+                            name,
+                            description,
+                            new Palette(document));
+                        for (Integer id: ids) {
+                            palettes.put(id, manager);
+                        }
+                    }
+                }
+            } // for all palettes
+        }
+
+        context.put(GNVArtifactContext.PALETTES_KEY, palettes);
+    }
+
+    /**
+     * @param filePath
+     * @return
+     * @throws FileNotFoundException
+     * @throws IOException
+     */
+    private Properties getProperties(String filePath)
+    throws FileNotFoundException, IOException
+    {
+        InputStream inputStream = null;
+        try {
+            inputStream = new FileInputStream(filePath);
+            Properties properties = new Properties();
+            properties.load(inputStream);
+            return properties;
+        }
+        finally {
+            if (inputStream != null) {
+                try { inputStream.close(); }
+                catch (IOException ioe) {}
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,380 @@
+package de.intevation.gnv.artifacts.fis;
+
+import de.intevation.artifactdatabase.ProxyArtifact;
+import de.intevation.artifactdatabase.XMLUtils;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.ArtifactNamespaceContext;
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+
+import de.intevation.gnv.artifacts.GNVArtifactBase;
+import de.intevation.gnv.artifacts.GNVDefaultArtifact;
+import de.intevation.gnv.artifacts.GNVProductArtifactFactory;
+
+import de.intevation.gnv.artifacts.fis.product.Product;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import de.intevation.gnv.state.InputData;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class SelectProductArtifact extends GNVDefaultArtifact {
+
+    public static final String XPATH_UUID = "art:action/art:uuid/@value";
+
+    public static final String XPATH_HASH = "art:action/art:hash/@value";
+
+    public static final String XPATH_INPUT_DATA_VALUE =
+        "art:action/art:data/art:input[@name='product']/@value";
+
+    public static final String XFORM_URL    = "http://www.w3.org/2002/xforms";
+    public static final String XFORM_PREFIX = "xform";
+
+    private static Logger log = Logger.getLogger(SelectProductArtifact.class);
+
+    private Map      products;
+    private Product  current;
+    private Artifact artifact;
+    private String   name;
+
+    public SelectProductArtifact() {
+        super();
+    }
+
+
+    @Override
+    public void setup(
+        String          identifier,
+        ArtifactFactory factory,
+        Object          context
+    ) {
+        log.debug("setup()");
+        super.setup(identifier, factory, context);
+        this.name = factory.getName();
+    }
+
+
+    public void setProducts(Map products) {
+        this.products = products;
+    }
+
+
+    @Override
+    public Document feed(Document target, CallContext context) {
+        log.debug("SelectProductArtifact.feed()");
+
+        if (artifact == null) {
+            Document document    = XMLUtils.newDocument();
+            String   productName = XMLUtils.xpathString(
+                target,
+                XPATH_INPUT_DATA_VALUE,
+                ArtifactNamespaceContext.INSTANCE
+            );
+
+            current = (Product) products.get(productName);
+
+            String reportNode = null;
+            String resultNode = null;
+            String msg        = null;
+
+            if (current != null) {
+                reportNode = "result";
+                resultNode = "success";
+                msg        = "Feed was successfully. New Artifact created.";
+            }
+            else {
+                reportNode = "exceptionreport";
+                resultNode = "exception";
+                msg        = "Product does not exist.";
+            }
+
+            XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+                document,
+                ArtifactNamespaceContext.NAMESPACE_URI,
+                ArtifactNamespaceContext.NAMESPACE_PREFIX
+            );
+
+            Element report  = creator.create(reportNode);
+            Element success = creator.create(resultNode);
+            success.setTextContent(msg);
+            report.appendChild(success);
+            document.appendChild(report);
+
+            return document;
+        }
+        else {
+            return artifact.feed(target, context);
+        }
+    }
+
+
+    @Override
+    public Document advance(Document target, CallContext context) {
+        log.debug("SelectProductArtifact.advance()");
+
+        if (artifact != null) {
+            Document result = artifact.advance(target, context);
+            context.putContextValue(ProxyArtifact.REPLACE_PROXY, artifact);
+            return result;
+        }
+
+        Document result = XMLUtils.newDocument();
+        if (current == null) {
+            // artifact needs to be feeded first
+            String msg = "Artifact is not configured properly. Call 'feed' fist.";
+            log.error(msg);
+
+            XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+                result,
+                ArtifactNamespaceContext.NAMESPACE_URI,
+                ArtifactNamespaceContext.NAMESPACE_PREFIX
+            );
+
+            Element report = creator.create("exceptionreport");
+            Element exception = creator.create("exception");
+            exception.setTextContent(msg);
+            report.appendChild(exception);
+            result.appendChild(report);
+
+            return result;
+        }
+
+        String uuid = XMLUtils.xpathString(
+            target, XPATH_UUID, ArtifactNamespaceContext.INSTANCE
+        );
+
+        String hash = XMLUtils.xpathString(
+            target, XPATH_HASH, ArtifactNamespaceContext.INSTANCE
+        );
+
+        // fetch ArtifactFactory from context and create a new Artifact
+        ArtifactFactory factory = context.getDatabase()
+            .getInternalArtifactFactory(this.name);
+        factory                 = ((GNVProductArtifactFactory)factory)
+            .getArtifactFactoryByName(current.getName());
+        artifact                = factory.createArtifact(uuid, context);
+
+        Document feedDocument = feedDocument(uuid, hash);
+        artifact.feed(feedDocument(uuid, hash), context);
+
+        result = ((GNVArtifactBase) artifact).initialize(context);
+        if (artifact instanceof GNVArtifactBase) {
+            ((GNVArtifactBase) artifact).setProduct(current);
+        }
+        context.putContextValue(ProxyArtifact.REPLACE_PROXY, artifact);
+        return result;
+    }
+
+
+    @Override
+    public Document describe(Document data, CallContext context) {
+        log.debug("SelectProductArtifact.describe()");
+
+        // create root node
+        Document document               = XMLUtils.newDocument();
+        XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+            document,
+            ArtifactNamespaceContext.NAMESPACE_URI,
+            ArtifactNamespaceContext.NAMESPACE_PREFIX
+        );
+
+        Element rootNode = creator.create("result");
+        Element typeNode = creator.create("type");
+        creator.addAttr(typeNode, "name", "describe");
+        rootNode.appendChild(typeNode);
+
+        Element uuidNode = creator.create("uuid");
+        creator.addAttr(uuidNode, "value", super.identifier);
+        rootNode.appendChild(uuidNode);
+
+        Element hashNode = creator.create("hash");
+        creator.addAttr(hashNode, "value", hash());
+        rootNode.appendChild(hashNode);
+
+        // create output node
+        Element out = creator.create("outputs");
+        rootNode.appendChild(out);
+
+        // create current state
+        Element state = creator.create("state");
+        creator.addAttr(state, "name", "choose-product");
+        creator.addAttr(state, "description", "Auswahl des Produktes.");
+        rootNode.appendChild(state);
+
+        // create reachable states
+        Element rStates = creator.create("reachable-states");
+        appendProducts(document, rStates, context);
+        rootNode.appendChild(rStates);
+
+        // create model
+        Element model = creator.create("model");
+        Element input = creator.create("input");
+        creator.addAttr(input, "name", "product");
+        creator.addAttr(input, "type", "String");
+        model.appendChild(input);
+        rootNode.appendChild(model);
+
+        // create ui
+        Element ui         = creator.create("ui");
+        Element staticNode = creator.create("static");
+        Element dynamic    = creator.create("dynamic");
+
+        appendFis(document, staticNode, context, this.name);
+        appendSelectProducts(document, dynamic, context.getMeta());
+        ui.appendChild(staticNode);
+        ui.appendChild(dynamic);
+        rootNode.appendChild(ui);
+
+        document.appendChild(rootNode);
+
+        return document;
+    }
+
+
+    @Override
+    public void out(Document document, OutputStream out, CallContext context)
+    throws IOException
+    {
+        log.debug("SelectProductArtifact.out()");
+        if (artifact != null) {
+            artifact.out(document, out, context);
+        }
+    }
+
+
+    protected void appendProducts(
+        Document document,
+        Node     parent,
+        Object   context
+    ) {
+        Iterator iter = products.values().iterator();
+
+        XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+            document,
+            ArtifactNamespaceContext.NAMESPACE_URI,
+            ArtifactNamespaceContext.NAMESPACE_PREFIX
+        );
+
+        while(iter.hasNext()) {
+            Product prod = (Product) iter.next();
+            String  name = prod.getName();
+
+            Element current = creator.create("state");
+            creator.addAttr(current, "name", name);
+            creator.addAttr(current, "description", name);
+            parent.appendChild(current);
+        }
+    }
+
+
+    protected void appendSelectProducts(
+        Document document,
+        Node     node,
+        CallMeta callMeta
+    ) {
+        RessourceFactory ressource = RessourceFactory.getInstance();
+
+        XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+            document,
+            XFORM_URL,
+            XFORM_PREFIX
+        );
+
+        String  selectboxName = "product";
+        Element selectNode    = creator.create("select1");
+        creator.addAttr(selectNode, "ref", selectboxName);
+
+        Element lableNode = creator.create("label");
+        lableNode.setTextContent(ressource.getRessource(callMeta.getLanguages(),
+                selectboxName,
+                selectboxName
+            )
+        );
+
+        Element choiceNode = creator.create("choices");
+        selectNode.appendChild(lableNode);
+        selectNode.appendChild(choiceNode);
+
+        Iterator it = products.values().iterator();
+        while (it.hasNext()) {
+            Product p               = (Product) it.next();
+            Element itemNode        = creator.create("item");
+            Element choiceLableNode = creator.create("label");
+            choiceLableNode.setTextContent(ressource.getRessource(
+                callMeta.getLanguages(),
+                p.getName(),
+                p.getName()
+            ));
+            itemNode.appendChild(choiceLableNode);
+
+            Element choiceValueNode = creator.create("value");
+            choiceValueNode.setTextContent(p.getName());
+            itemNode.appendChild(choiceValueNode);
+            choiceNode.appendChild(itemNode);
+        }
+
+        node.appendChild(selectNode);
+    }
+
+
+    protected Document feedDocument(String uuid, String hash) {
+        Document document = XMLUtils.newDocument();
+
+        XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+            document,
+            ArtifactNamespaceContext.NAMESPACE_URI,
+            ArtifactNamespaceContext.NAMESPACE_PREFIX
+        );
+        Element  rootNode = creator.create("action");
+
+        Element typeNode = creator.create("type");
+        creator.addAttr(typeNode, "name", "feed");
+        rootNode.appendChild(typeNode);
+
+        Element uuidNode = creator.create("uuid");
+        creator.addAttr(uuidNode, "value", uuid);
+        rootNode.appendChild(uuidNode);
+
+        Element hashNode = creator.create("hash");
+        creator.addAttr(hashNode, "value", hash);
+        rootNode.appendChild(hashNode);
+
+        Element dataNode = creator.create("data");
+        rootNode.appendChild(dataNode);
+
+        Collection<InputData> parameter = this.current.getParameter();
+        if (parameter != null) {
+            Iterator<InputData> parameterIt = parameter.iterator();
+
+            while (parameterIt.hasNext()) {
+                InputData inputData = parameterIt.next();
+
+                Element inputNode = creator.create("input");
+                creator.addAttr(inputNode, "name", inputData.getName());
+                creator.addAttr(inputNode, "value", inputData.getValue());
+                dataNode.appendChild(inputNode);
+            }
+        }
+        document.appendChild(rootNode);
+        return document;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,66 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts.fis.product;
+
+import de.intevation.gnv.state.InputData;
+
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultProduct implements Product {
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 6473812725442092770L;
+
+    private String name = null;
+
+    private Collection<InputData> parameter = null;
+
+    private String artifactFactory = null;
+
+    /**
+     * Constructor
+     * 
+     * @param name
+     * @param parameter
+     * @param artifactFactory
+     */
+    public DefaultProduct(
+        String                name,
+        Collection<InputData> parameter,
+        String                artifactFactory
+    ) {
+        super();
+        this.name            = name;
+        this.parameter       = parameter;
+        this.artifactFactory = artifactFactory;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.fis.product.Product#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.fis.product.Product#getParameter()
+     */
+    public Collection<InputData> getParameter() {
+        return this.parameter;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.fis.product.Product#getArtifactFactory()
+     */
+    public String getArtifactFactory() {
+        return this.artifactFactory;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,23 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts.fis.product;
+
+import de.intevation.gnv.state.InputData;
+
+import java.io.Serializable;
+
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface Product extends Serializable {
+
+    public String getName();
+
+    public Collection<InputData> getParameter();
+
+    public String getArtifactFactory();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,171 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts.ressource;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.List;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.PreferredLocale;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class RessourceFactory {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(RessourceFactory.class);
+
+    /**
+     * The singleton Instance of this Factory.
+     */
+    private static RessourceFactory instance = null;
+
+    private static String RESSOURCE_BASE_ID = "artifact.ressource.dir";
+
+    private static String ressourceName    = "artifactMessages";
+    private static String DEFAULT_DIR      = "lang";
+    private static String LANG_CONFIG_FILE = "lang.conf";
+
+    private String ressourceDir = null;
+
+    private Locale[] locales = null;
+
+    /**
+     * Basic-Constructor of this Class
+     */
+    private RessourceFactory() {
+        super();
+        ressourceDir = System.getProperty(RESSOURCE_BASE_ID, DEFAULT_DIR);
+    }
+
+    /**
+     * This Method provides an singleton Instance of this Class.
+     * 
+     * @return an singleton Instance of this Class
+     */
+    public static synchronized RessourceFactory getInstance() {
+        if (instance == null) {
+            instance = new RessourceFactory();
+        }
+        return instance;
+    }
+
+
+    /**
+     * This method reads locales, configured in LANG_CONFIG_FILE, from
+     * filesystem and returns them as array.
+     *
+     * @return Array of locales supported by the the server.
+     */
+    public Locale[] getLocales() {
+
+        if (locales != null)
+            return locales;
+
+        log.debug("Supported locales have not been read - read now.");
+        try {
+            String config  = "/" + ressourceDir + "/" + LANG_CONFIG_FILE;
+            InputStream in = RessourceFactory.class.getResourceAsStream(config);
+
+            BufferedReader reader = new BufferedReader(
+                new InputStreamReader(in)
+            );
+
+            String line     = null;
+            String country  = null;
+            String language = null;
+            int idx         =   -1;
+
+            List tmpLocales = new ArrayList();
+
+            while((line = reader.readLine()) != null) {
+                // validate if defined locale has a valid length
+                if (line.length() != 2 && line.length() != 5) {
+                    log.warn("Illegal locale definition found.");
+                    continue;
+                }
+
+                idx = line.indexOf("_");
+                if (idx > 0) {
+                    // found locale containing language and country code
+                    language = line.substring(0, idx);
+                    country  = line.substring(idx+1);
+                    tmpLocales.add(new Locale(language, country));
+                }
+                else {
+                    // found locale containing languagey code only
+                    tmpLocales.add(new Locale(line));
+                }
+            }
+
+            locales = (Locale[]) tmpLocales.toArray(
+                new Locale[tmpLocales.size()]
+            );
+
+            return locales;
+        }
+        catch (FileNotFoundException fnfe) {
+            log.warn("File not found: " + LANG_CONFIG_FILE, fnfe);
+        }
+        catch (IOException ioe) {
+            log.warn(ioe.getLocalizedMessage(), ioe);
+        }
+
+        return null;
+    }
+
+
+    /**
+     * Deliveres the translated Value for an Key to an given Language
+     * 
+     * @param locale
+     *            The choosen locale
+     * @param key
+     *            the key
+     * @param defaultValue
+     *            the Value that should be returned.
+     * @return the translated Value
+     */
+    public String getRessource(PreferredLocale[] preferredLocales, String key,
+                               String defaultValue) {
+        if (key == null || preferredLocales.length == 0) {
+            return defaultValue;
+        }
+
+        return getRessource(preferredLocales[0].getLocale(), key, defaultValue);
+    }
+
+
+    public String getRessource(Locale locale, String key, String defaultVal) {
+        if (key == null || locale == null)
+            return defaultVal;
+
+        try {
+            ResourceBundle rb = ResourceBundle.getBundle(
+                ressourceDir + "/" + ressourceName,
+                locale
+            );
+
+            return rb.getString(key);
+        }
+        catch (MissingResourceException mre) {
+            log.warn("No resource bundle: " + locale.toString(), mre);
+            return defaultVal;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/AbstractChart.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,31 @@
+package de.intevation.gnv.chart;
+
+import java.util.Collection;
+import java.util.Locale;
+
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.ChartTheme;
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public abstract class AbstractChart
+implements            Chart
+{
+    protected JFreeChart  chart;
+    protected boolean     linesVisible;
+    protected boolean     shapesVisible;
+
+    protected Locale      locale;
+
+    protected ChartLabels labels;
+    protected ChartTheme  theme;
+    protected Collection  parameters;
+    protected Collection  measurements;
+    protected Collection  resultSet;
+    protected Collection  dates;
+    protected Collection  timeGaps;
+
+    public abstract JFreeChart generateChart();
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=latin1 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,275 @@
+package de.intevation.gnv.chart;
+
+import java.awt.Color;
+import java.awt.geom.Ellipse2D;
+import java.text.NumberFormat;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.axis.Axis;
+import org.jfree.chart.axis.NumberAxis;
+import org.jfree.chart.axis.NumberTickUnit;
+import org.jfree.chart.axis.AxisLocation;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.chart.plot.XYPlot;
+import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
+import org.jfree.chart.title.TextTitle;
+import org.jfree.data.xy.XYDataset;
+import org.jfree.data.Range;
+import org.jfree.data.general.Series;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public abstract class AbstractXYLineChart
+extends               AbstractChart
+{
+    public static final double LOWER_MARGIN = 0.05D;
+    public static final double UPPER_MARGIN = 0.05D;
+
+    private static Logger log      = Logger.getLogger(AbstractXYLineChart.class);
+
+    protected static Color[] COLOR = {
+        Color.black, Color.red, Color.green, Color.blue, Color.yellow,
+        Color.gray, Color.orange, Color.pink, Color.cyan
+    };
+
+    protected static int nextColor = 0;
+
+    protected PlotOrientation PLOT_ORIENTATION = PlotOrientation.VERTICAL;
+
+    /** Map to store datasets for each parameter */
+    protected Map datasets;
+
+    /** Map to store max ranges of each parameter (axis.setAutoRange(true)
+     * doesn't seem to work */
+    protected Map ranges;
+
+    protected abstract void initData();
+    protected abstract void addValue(Result row, Series series);
+    protected abstract void addSeries(Series series, String label, int idx);
+    protected abstract void localizeDomainAxis(Axis axis, Locale locale);
+    protected abstract String createSeriesName(
+        String breakPoint1,
+        String breakPoint2,
+        String breakPoint3
+    );
+
+
+    public JFreeChart generateChart() {
+        log.debug("generate XYLineChart");
+        nextColor = 0;
+
+        if (chart != null)
+            return chart;
+
+        initChart();
+
+        chart.addSubtitle(new TextTitle(labels.getSubtitle()));
+
+        theme.apply(chart);
+        initData();
+
+        adjustPlot((XYPlot)chart.getPlot());
+
+        return chart;
+    }
+
+
+    protected void initChart() {
+        chart = ChartFactory.createXYLineChart(
+            labels.getTitle(),
+            labels.getDomainAxisLabel(),
+            null,
+            null,
+            PLOT_ORIENTATION,
+            true,
+            false,
+            false
+        );
+    }
+
+
+    protected void prepareAxis(String seriesKey, int idx) {
+        log.debug("prepare axis of xychart");
+
+        XYPlot plot      = chart.getXYPlot();
+        Axis xAxis       = plot.getDomainAxis();
+        NumberAxis yAxis = new NumberAxis(seriesKey);
+
+        localizeDomainAxis(xAxis, locale);
+        localizeRangeAxis(yAxis, locale);
+
+        // litte workarround to adjust the max range of axes.
+        // NumberAxis.setAutoRange(true) doesn't seem to work properly.
+        Range yRange     = (Range) ranges.get(seriesKey);
+        yAxis.setRange(Range.expand(yRange, LOWER_MARGIN, UPPER_MARGIN));
+        log.debug("Max Range of dataset is: " + yRange.toString());
+
+        if (seriesKey.contains("richtung")) {
+            yAxis.setTickUnit(new NumberTickUnit(30.0));
+            yAxis.setUpperBound(360.0);
+            yAxis.setLowerBound(0.0);
+        }
+        else {
+            yAxis.setFixedDimension(10.0);
+            yAxis.setAutoRangeIncludesZero(false);
+        }
+
+        plot.setRangeAxis(idx, yAxis);
+        yAxis.configure();
+
+        if (idx % 2 != 0)
+            plot.setRangeAxisLocation(idx, AxisLocation.BOTTOM_OR_RIGHT);
+        else
+            plot.setRangeAxisLocation(idx, AxisLocation.BOTTOM_OR_LEFT);
+
+        plot.mapDatasetToRangeAxis(idx, idx);
+    }
+
+
+    protected void adjustRenderer(
+        int     idx,
+        int     seriesCount,
+        boolean renderLines,
+        boolean renderShapes
+    ) {
+        log.debug("Adjust render of series");
+        XYLineAndShapeRenderer renderer = null;
+        XYPlot                 plot     = chart.getXYPlot();
+
+        try {
+            renderer = (XYLineAndShapeRenderer)((XYLineAndShapeRenderer)
+                (plot.getRenderer())).clone();
+        }
+        catch (CloneNotSupportedException cnse) {
+            log.warn("Error while cloning renderer.", cnse);
+            renderer = new XYLineAndShapeRenderer(renderLines, renderShapes);
+            renderer.setBaseShape(new Ellipse2D.Double(-2,-2,4,4));
+        }
+
+        for (int i = 0; i < seriesCount; i++) {
+            renderer.setSeriesShape(i, renderer.getSeriesShape(0));
+            renderer.setSeriesPaint(i, COLOR[nextColor%COLOR.length]);
+            renderer.setSeriesShapesVisible(i, renderShapes);
+            renderer.setSeriesLinesVisible(i, renderLines);
+            nextColor++;
+        }
+        plot.setRenderer(idx, renderer);
+    }
+
+
+    protected void adjustPlot(XYPlot plot) {
+        if (plot.getRangeAxisCount() > 1)
+            plot.setRangeGridlinesVisible(false);
+    }
+
+
+    protected void localizeRangeAxis(Axis axis, Locale locale) {
+        if (locale == null)
+            return;
+
+        log.debug(
+            "Set language of axis [" + axis.getLabel() + "] " +
+            "to " + locale.toString()
+        );
+
+        NumberFormat format = NumberFormat.getInstance(locale);
+        ((NumberAxis) axis).setNumberFormatOverride(format);
+    }
+
+
+    public Range getMaxRangeOfDataset(XYDataset dataset) {
+        int    seriesCount = dataset.getSeriesCount();
+        double upper       = Double.NEGATIVE_INFINITY;
+        double lower       = Double.POSITIVE_INFINITY;
+
+        for (int i = 0; i < seriesCount; i++) {
+            int itemCount = dataset.getItemCount(i);
+
+            for (int j = 0; j < itemCount; j++) {
+                Number num = dataset.getY(i, j);
+
+                if (num != null) {
+                    double y = num.doubleValue();
+                    lower    = y < lower ? y : lower;
+                    upper    = y > upper ? y : upper;
+                }
+            }
+        }
+
+        return new Range(lower, upper);
+    }
+
+
+    public Range getMaxRangeOfDatasetWithMargin(
+        XYDataset dataset,
+        double    percent
+    ) {
+        Range range   = getMaxRangeOfDataset(dataset);
+        double length = range.getLength();
+        double upper  = range.getUpperBound() + length /100 * percent;
+        double lower  = range.getLowerBound() - length /100 * percent;
+
+        return new Range(lower, upper);
+    }
+
+
+    protected String findParameter(String label) {
+        Iterator iter = parameters.iterator();
+
+        while (iter.hasNext()) {
+            KeyValueDescibeData data = (KeyValueDescibeData) iter.next();
+            String              key  = data.getValue();
+
+            if (label.indexOf(key) > -1)
+                return key;
+        }
+
+        return label;
+    }
+
+
+    protected String findValueTitle(Collection values, String id) {
+        log.debug("find description of dataset");
+
+        if (values != null){
+            Iterator it = values.iterator();
+            while (it.hasNext()) {
+                KeyValueDescibeData data = (KeyValueDescibeData) it.next();
+
+                if (id.equals(data.getKey()))
+                    return data.getValue();
+            }
+        }
+        return "";
+    }
+
+
+    protected void storeMaxRange(double value, String parameter) {
+        Range  range     = null;
+
+        range = ranges.containsKey(parameter)
+            ? (Range) ranges.get(parameter)
+            : new Range(value, value);
+
+        double lower = range.getLowerBound();
+        double upper = range.getUpperBound();
+
+        lower = value < lower ? value : lower;
+        upper = value > upper ? value : upper;
+
+        ranges.put(parameter, new Range(lower, upper));
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/Chart.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,15 @@
+package de.intevation.gnv.chart;
+
+import org.jfree.chart.JFreeChart;
+
+import java.io.Serializable;
+
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public interface Chart
+extends          Serializable
+{
+    public JFreeChart generateChart();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartLabels.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,113 @@
+/* Copyright (C) 2007 con terra GmbH (http://www.conterra.de)
+ * All rights reserved
+ *
+ * $Id: ChartLabels.java,v 1.1 2007/12/10 13:57:13 drewnak Exp $
+ *
+ * created by:      drewnak
+ * created at :     10.12.2007
+ * created at :     11:48:39
+ *
+ * modified by:     $Author: drewnak $
+ * modified at:     $Date: 2007/12/10 13:57:13 $
+ */
+package de.intevation.gnv.chart;
+
+/**
+ * @author drewnak
+ * @author Tim Englich <tim.englich@intevation.de> Changes and codecleanup
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class ChartLabels {
+    /**
+     * 
+     */
+    private String title;
+
+    /**
+     *
+     */
+    private String subtitle;
+
+    /**
+     * 
+     */
+    private String domainAxisLabel;
+
+    /**
+     *
+     */
+    private String rangeAxisLabel;
+
+    /**
+     *
+     */
+    private String parameterName;
+
+
+    /**
+     * Constructor
+     * 
+     * @param title
+     * @param domainAxisLabel
+     */
+    public ChartLabels(String title, String subtitle, String domainAxisLabel) {
+        this(title, subtitle, domainAxisLabel, null);
+    }
+
+    public ChartLabels(
+        String title,
+        String subtitle,
+        String domainAxisLabel,
+        String rangeAxisLabel
+    ) {
+        this(title, subtitle, domainAxisLabel, rangeAxisLabel, null);
+    }
+
+
+    public ChartLabels(
+        String title,
+        String subtitle,
+        String domainAxisLabel,
+        String rangeAxisLabel,
+        String parameterName
+    ) {
+        this.title           = title;
+        this.subtitle        = subtitle;
+        this.domainAxisLabel = domainAxisLabel;
+        this.rangeAxisLabel  = rangeAxisLabel;
+        this.parameterName   = parameterName;
+    }
+
+    /**
+     * @return the title
+     */
+    public String getTitle() {
+        return this.title;
+    }
+
+
+    /**
+     * @return the subtitle
+     */
+    public String getSubtitle() {
+        return subtitle;
+    }
+
+    /**
+     * @return the timeAxisLabel
+     */
+    public String getDomainAxisLabel() {
+        return this.domainAxisLabel;
+    }
+
+
+    public String getRangeAxisLabel() {
+        return this.rangeAxisLabel;
+    }
+
+
+    public String getParameterName() {
+        return this.parameterName;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartStyle.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,170 @@
+/* Copyright (C) 2007 con terra GmbH (http://www.conterra.de)
+ * All rights reserved
+ *
+ * $Id: ChartStyle.java,v 1.2 2007/12/21 12:31:15 blume Exp $
+ *
+ * created by:      drewnak
+ * created at :     10.12.2007
+ * created at :     13:07:44
+ *
+ * modified by:     $Author: blume $
+ * modified at:     $Date: 2007/12/21 12:31:15 $
+ */
+package de.intevation.gnv.chart;
+
+import java.awt.Color;
+import java.awt.Dimension;
+
+/**
+ * @author drewnak
+ */
+public class ChartStyle {
+
+    private Color mCanvasColor;
+    private Color mPlotBackgroundColor;
+    private Color mDomainGridlineColor;
+    private Color mRangeGridlineColor;
+    private boolean mDomainCrosshairVisible;
+    private boolean mRangeCrosshairVisible;
+    private Insets mAxisOffset;
+    private boolean mOverrideDefaultChartWidth = false;
+    private Dimension mChartSize;
+
+    private boolean mUseUpperDataLevel = false;
+    private boolean mUseLowerDataLevel = false;
+    private int mUpperLevel;
+    private int mLowerLevel;
+
+    /**
+     * @param pCanvasColor
+     * @param pPlotBackgroundColor
+     * @param pDomainGridlineColor
+     * @param pRangeGridlineColor
+     * @param pDomainCrosshairVisible
+     * @param pRangeCrosshairVisible
+     * @param pAxisOffset
+     */
+    public ChartStyle(Color pCanvasColor, Color pPlotBackgroundColor,
+                      Color pDomainGridlineColor, Color pRangeGridlineColor,
+                      boolean pDomainCrosshairVisible,
+                      boolean pRangeCrosshairVisible, Insets pAxisOffset,
+                      Dimension pChartSize) {
+        super();
+        mCanvasColor = pCanvasColor;
+        mPlotBackgroundColor = pPlotBackgroundColor;
+        mDomainGridlineColor = pDomainGridlineColor;
+        mRangeGridlineColor = pRangeGridlineColor;
+        mDomainCrosshairVisible = pDomainCrosshairVisible;
+        mRangeCrosshairVisible = pRangeCrosshairVisible;
+        mAxisOffset = pAxisOffset;
+        mChartSize = pChartSize;
+    }
+
+    public Color getCanvasColor() {
+        return mCanvasColor;
+    }
+
+    public void setCanvasColor(Color pCanvasColor) {
+        mCanvasColor = pCanvasColor;
+    }
+
+    public Color getDomainGridlineColor() {
+        return mDomainGridlineColor;
+    }
+
+    public void setDomainGridlineColor(Color pDomainGridlineColor) {
+        mDomainGridlineColor = pDomainGridlineColor;
+    }
+
+    public Color getRangeGridlineColor() {
+        return mRangeGridlineColor;
+    }
+
+    public void setRangeGridlineColor(Color pRangeGridlineColor) {
+        mRangeGridlineColor = pRangeGridlineColor;
+    }
+
+    public boolean isDomainCrosshairVisible() {
+        return mDomainCrosshairVisible;
+    }
+
+    public void setDomainCrosshairVisible(boolean pDomainCrosshairVisible) {
+        mDomainCrosshairVisible = pDomainCrosshairVisible;
+    }
+
+    public boolean isRangeCrosshairVisible() {
+        return mRangeCrosshairVisible;
+    }
+
+    public void setRangeCrosshairVisible(boolean pRangeCrosshairVisible) {
+        mRangeCrosshairVisible = pRangeCrosshairVisible;
+    }
+
+    public Insets getAxisOffset() {
+        return mAxisOffset;
+    }
+
+    public void setAxisOffset(Insets pAxisOffset) {
+        mAxisOffset = pAxisOffset;
+    }
+
+    public Color getPlotBackgroundColor() {
+        return mPlotBackgroundColor;
+    }
+
+    public void setPlotBackgroundColor(Color pPlotBackgroundColor) {
+        mPlotBackgroundColor = pPlotBackgroundColor;
+    }
+
+    public Dimension getChartSize() {
+        return mChartSize;
+    }
+
+    public void setChartSize(Dimension pChartSize) {
+        mChartSize = pChartSize;
+    }
+
+    public boolean isOverrideDefaultChartWidth() {
+        return mOverrideDefaultChartWidth;
+    }
+
+    public void setOverrideDefaultChartWidth(boolean pOverrideDefaultChartWidth) {
+        mOverrideDefaultChartWidth = pOverrideDefaultChartWidth;
+    }
+
+    public void setNewChartWidth(int pNewChartWidth) {
+        mChartSize.setSize(pNewChartWidth, mChartSize.getHeight());
+    }
+
+    public boolean isUseUpperDataLevel() {
+        return mUseUpperDataLevel;
+    }
+
+    public void setUseUpperDataLevel(boolean pUseUpperDataLevel) {
+        mUseUpperDataLevel = pUseUpperDataLevel;
+    }
+
+    public boolean isUseLowerDataLevel() {
+        return mUseLowerDataLevel;
+    }
+
+    public void setUseLowerDataLevel(boolean pUseLowerDataLevel) {
+        mUseLowerDataLevel = pUseLowerDataLevel;
+    }
+
+    public int getUpperLevel() {
+        return mUpperLevel;
+    }
+
+    public void setUpperLevel(int pUpperLevel) {
+        mUpperLevel = pUpperLevel;
+    }
+
+    public int getLowerLevel() {
+        return mLowerLevel;
+    }
+
+    public void setLowerLevel(int pLowerLevel) {
+        mLowerLevel = pLowerLevel;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/HorizontalCrossProfileChart.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,59 @@
+package de.intevation.gnv.chart;
+
+import java.util.Collection;
+import java.util.Locale;
+
+import de.intevation.gnv.chart.ChartLabels;
+import de.intevation.gnv.geobackend.base.Result;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.ChartTheme;
+import org.jfree.data.general.Series;
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class HorizontalCrossProfileChart
+extends      HorizontalProfileChart
+{
+    private static Logger log = Logger.getLogger(HorizontalCrossProfileChart.class);
+
+    public HorizontalCrossProfileChart(
+        ChartLabels labels,
+        ChartTheme  theme,
+        Collection  parameters,
+        Collection  measurements,
+        Collection  dates,
+        Collection  result,
+        Collection  timeGaps,
+        Locale      locale,
+        boolean     linesVisible,
+        boolean     shapesVisible
+    ) {
+        super(
+            labels,
+            theme,
+            parameters,
+            measurements,
+            dates,
+            result,
+            timeGaps,
+            locale,
+            linesVisible,
+            shapesVisible
+        );
+    }
+
+
+    @Override
+    protected void gapDetection(
+        Result[] results,
+        Series   series,
+        int      startPos,
+        int      endPos
+    ) {
+        // nothing to do here, gap detection is done in interpolation
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,283 @@
+package de.intevation.gnv.chart;
+
+import java.util.Collection;
+import java.util.Locale;
+
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.io.WKTReader;
+import com.vividsolutions.jts.io.ParseException;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.ChartTheme;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.general.Series;
+import org.jfree.data.xy.XYSeries;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.utils.DistanceCalculator;
+
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class HorizontalProfileChart
+extends      VerticalProfileChart
+{
+    private static Logger log = Logger.getLogger(HorizontalProfileChart.class);
+
+    private static WKTReader wktReader = new WKTReader();
+    private        Point     lastPoint;
+    private        double    distance;
+
+
+    public HorizontalProfileChart(
+        ChartLabels labels,
+        ChartTheme  theme,
+        Collection  parameters,
+        Collection  measurements,
+        Collection  dates,
+        Collection  result,
+        Collection  timeGaps,
+        Locale      locale,
+        boolean     linesVisible,
+        boolean     shapesVisible
+    ) {
+        super(
+            labels,
+            theme,
+            parameters,
+            measurements,
+            dates,
+            result,
+            timeGaps,
+            locale,
+            linesVisible,
+            shapesVisible
+        );
+        this.PLOT_ORIENTATION = PlotOrientation.VERTICAL;
+        this.distance         = 0;
+    }
+
+
+    protected void gapDetection(
+        Result[] results,
+        Series   series,
+        int      startPos,
+        int      endPos
+    ) {
+        log.debug("Start gap detection.");
+        try {
+            Point startValue = getPoint(results[startPos]);
+            Point endValue   = getPoint(results[endPos-1]);
+            if (results[0].getInteger("DATAID") == 2)
+                addGapsOnGrid(results, series, startPos, endPos);
+            else
+                addGaps(
+                    results,
+                    series,
+                    startValue,
+                    endValue,
+                    startPos,
+                    endPos
+                );
+        }
+        catch (ParseException pe) {
+            log.warn(
+                "Error while parsing points for gap detection. " +
+                "No gaps for current series will be detected."
+            );
+        }
+
+        log.debug("Gap detection finished.");
+    }
+
+
+    protected void addValue(Result row, Series series) {
+        try {
+            Point point = (Point) wktReader.read(row.getString("SHAPE"));
+            if (lastPoint != null)
+                distance = distance + DistanceCalculator.calculateDistance(
+                    lastPoint, point
+                );
+            lastPoint = point;
+
+            ((XYSeries) series).add(
+                distance,
+                row.getDouble("YORDINATE")
+            );
+        }
+        catch(ParseException pe) {
+            log.warn("No data found while parsing.");
+        }
+    }
+
+
+    protected void addSeries(Series series, String label, int idx) {
+        super.addSeries(series, label, idx);
+
+        // reset values used by current series for next series
+        lastPoint = null;
+        distance  = 0;
+    }
+
+
+    protected String createSeriesName(
+        String breakPoint1,
+        String breakPoint2,
+        String breakPoint3
+    ) {
+        log.debug("create seriesname of horizontalprofile chart");
+        return super.createSeriesName(
+            breakPoint1,
+            breakPoint2,
+            breakPoint3) +
+            " " +
+            findValueTitle(dates, breakPoint3);
+    }
+
+
+    protected void addGapsOnGrid(
+        Result[] results,
+        Series   series,
+        int      startPos,
+        int      endPos
+    ) {
+        String axis = getDependendAxisName(
+            results[startPos],
+            results[startPos+1]
+        );
+
+        double range        = 0;
+        double distance     = 0;
+        int    last         = 0;
+        int    current      = 0;
+        Point  lastPoint    = null;
+        Point  currentPoint = null;
+
+        for (int i = startPos+1; i < endPos; i++) {
+            try {
+                last         = results[i-1].getInteger(axis);
+                lastPoint    = getPoint(results[i-1]);
+                current      = results[i].getInteger(axis);
+                currentPoint = getPoint(results[i]);
+                distance     = DistanceCalculator.calculateDistance(
+                    lastPoint,
+                    currentPoint
+                );
+
+                boolean detected = gridDetection(last, current);
+
+                if (detected) {
+                    log.debug(
+                        "Gap detected on grid between " + range +
+                        " and " + (range+distance)
+                    );
+
+                    ((XYSeries) series).add(range+0.0001, null);
+                }
+
+                range += distance;
+            }
+            catch (ParseException pe) {
+                log.warn("Error while parsing point for gap detection.", pe);
+            }
+        }
+    }
+
+
+    protected void addGaps(
+        Result[] results,
+        Series   series,
+        Point    startValue,
+        Point    endValue,
+        int      startPos,
+        int      endPos
+    ) {
+        double range = 0;
+        Point  last  = null;
+        Point  now   = null;
+
+        for (int i = startPos+1; i < endPos; i++) {
+            boolean detected = false;
+
+            try {
+                last   = (Point) getPoint(results[i-1]);
+                now    = (Point) getPoint(results[i]);
+
+                // gap detection for more than GAP_MAX_VALUES values
+                if (results.length > GAP_MAX_VALUES)
+                    detected = simpleDetection(startValue, endValue, last, now);
+                // gap detection for less than GAP_MAX_VALUES values
+                else
+                    detected = specialDetection(
+                        startValue,
+                        endValue,
+                        last,
+                        now,
+                        results.length
+                    );
+
+                // gap detected, insert null value to break line
+                if (detected) {
+                    log.info("Gap after " + range);
+                    double x = range + 0.0001;
+
+                    ((XYSeries)series).add(x, null);
+                }
+
+                range += DistanceCalculator.calculateDistance(last,now);
+            }
+            catch (ParseException pe) {
+                log.warn("Error while parsing point.");
+            }
+
+        }
+    }
+
+
+    protected boolean simpleDetection(
+        Point start,
+        Point end,
+        Point last,
+        Point current
+    ) {
+        double delta      = DistanceCalculator.calculateDistance(start, end);
+        double deltaSmall = DistanceCalculator.calculateDistance(last,current);
+
+        return (deltaSmall > (delta / 100 * PERCENTAGE));
+    }
+
+
+    protected boolean specialDetection(
+        Point start,
+        Point end,
+        Point last,
+        Point current,
+        int   count
+    ) {
+        double delta      = Math.abs(
+            DistanceCalculator.calculateDistance(end, start)
+        );
+        double smallDelta = Math.abs(
+            DistanceCalculator.calculateDistance(current, last)
+        );
+
+        return (smallDelta > (3.0 / (count - 1) * delta));
+    }
+
+    @Override
+    protected String getDependendAxisName(Result first, Result second) {
+        if (first.getInteger("IPOSITION") == second.getInteger("IPOSITION"))
+            return "JPOSITION";
+
+        return "IPOSITION";
+    }
+
+    private Point getPoint(Result result)
+    throws ParseException
+    {
+        return (Point) wktReader.read(result.getString("SHAPE"));
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/Insets.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,34 @@
+/* Copyright (C) 2007 con terra GmbH (http://www.conterra.de)
+ * All rights reserved
+ *
+ * $Id: Insets.java,v 1.1 2007/12/10 13:57:13 drewnak Exp $
+ *
+ * created by:      drewnak
+ * created at :     10.12.2007
+ * created at :     13:31:12
+ *
+ * modified by:     $Author: drewnak $
+ * modified at:     $Date: 2007/12/10 13:57:13 $
+ */
+package de.intevation.gnv.chart;
+
+public class Insets {
+    public double mUpper;
+    public double mLower;
+    public double mLeft;
+    public double mRight;
+
+    /**
+     * @param pUpper
+     * @param pLower
+     * @param pLeft
+     * @param pRight
+     */
+    public Insets(double pUpper, double pLeft, double pLower, double pRight) {
+        super();
+        mUpper = pUpper;
+        mLower = pLower;
+        mLeft = pLeft;
+        mRight = pRight;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,495 @@
+package de.intevation.gnv.chart;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import de.intevation.gnv.geobackend.base.Result;
+
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+
+import de.intevation.gnv.timeseries.gap.TimeGap;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.ChartTheme;
+
+import org.jfree.chart.axis.Axis;
+import org.jfree.chart.axis.DateAxis;
+import org.jfree.chart.axis.DateTickUnit;
+import org.jfree.chart.axis.DateTickUnitType;
+import org.jfree.chart.axis.TickUnits;
+import org.jfree.chart.axis.TickUnitSource;
+import org.jfree.chart.axis.ValueAxis;
+
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.chart.plot.XYPlot;
+
+import org.jfree.data.general.Series;
+
+import org.jfree.data.time.Minute;
+import org.jfree.data.time.TimeSeries;
+import org.jfree.data.time.TimeSeriesCollection;
+
+/**
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public class TimeSeriesChart
+extends      AbstractXYLineChart
+{
+
+    private static final String DATE_FORMAT = "chart.timeseries.date.format";
+
+    public static final String DEFAULT_DATE_FORMAT = "dd-MMM-yyyy";
+
+    private static final long   NO_TIME_GAP = Long.MAX_VALUE - 1000;
+
+    private static Logger log = Logger.getLogger(TimeSeriesChart.class);
+
+
+    public TimeSeriesChart(
+        ChartLabels labels,
+        ChartTheme  theme,
+        Collection  parameters,
+        Collection  measurements,
+        Collection  dates,
+        Collection  result,
+        Collection  timeGaps,
+        Locale      locale,
+        boolean     linesVisible,
+        boolean     shapesVisible
+    ) {
+        this.labels           = labels;
+        this.theme            = theme;
+        this.parameters       = parameters;
+        this.measurements     = measurements;
+        this.dates            = dates;
+        this.resultSet        = result;
+        this.timeGaps         = timeGaps;
+        this.locale           = locale;
+        this.PLOT_ORIENTATION = PlotOrientation.VERTICAL;
+        this.linesVisible     = linesVisible;
+        this.shapesVisible    = shapesVisible;
+        this.datasets         = new HashMap();
+        this.ranges           = new HashMap();
+    }
+
+
+    protected void initChart() {
+        chart = ChartFactory.createTimeSeriesChart(
+            labels.getTitle(),
+            labels.getDomainAxisLabel(),
+            null,
+            null,
+            true,
+            false,
+            false
+        );
+
+        XYPlot plot = (XYPlot) chart.getPlot();
+        plot.setDomainAxis(0, new DateAxis(
+            labels.getDomainAxisLabel(), TimeZone.getDefault(), locale));
+    }
+
+
+    protected void initData() {
+        log.debug("init data for timeseries chart");
+
+        String  breakPoint1       = null;
+        String  breakPoint2       = null;
+        String  breakPoint3       = null;
+
+        Iterator   iter       = resultSet.iterator();
+        Result     row        = null;
+        String     seriesName = null;
+        String     parameter  = null;
+        TimeSeries series     = null;
+
+        int  idx       = 0;
+        int  startPos  = 0;
+        int  endPos    = 0;
+        Date startDate = null;
+        Date endDate   = null;
+
+        Result[] results =
+            (Result[]) resultSet.toArray(new Result[resultSet.size()]);
+
+        while (iter.hasNext()) {
+            row = (Result) iter.next();
+
+            // add current data to plot and prepare for next one
+            if (!row.getString("GROUP1").equals(breakPoint1) ||
+                !row.getString("GROUP2").equals(breakPoint2) ||
+                !row.getString("GROUP3").equals(breakPoint3)
+            ) {
+                log.debug("prepare data/plot for next dataset");
+
+                if(series != null) {
+                    // add gaps before adding series to chart
+                    startDate = results[startPos].getDate("XORDINATE");
+                    endDate   = results[endPos-1].getDate("XORDINATE");
+                    addGaps(results,series,startDate,endDate,startPos,endPos);
+                    addSeries(series, parameter, idx);
+
+                    startPos  = endPos + 1;
+                }
+
+                // prepare variables for next plot
+                breakPoint1 = row.getString("GROUP1");
+                breakPoint2 = row.getString("GROUP2");
+                breakPoint3 = row.getString("GROUP3");
+
+                seriesName = createSeriesName(
+                    breakPoint1,
+                    breakPoint2,
+                    breakPoint3
+                );
+                parameter = findParameter(seriesName);
+
+                log.debug("next dataset is '" + seriesName + "'");
+                series = new TimeSeries(seriesName, Minute.class);
+            }
+
+            addValue(row, series);
+            storeMaxRange(row.getDouble("YORDINATE"), parameter);
+            endPos++;
+        }
+
+        if (startPos < results.length && endPos-1 < results.length) {
+            // add the last dataset if existing to plot and prepare its axis
+            startDate = results[startPos].getDate("XORDINATE");
+            endDate = results[endPos-1].getDate("XORDINATE");
+            addGaps(results, series, startDate, endDate, startPos, endPos);
+            addSeries(series, parameter, idx);
+        }
+
+        addDatasets();
+    }
+
+
+    protected void addValue(Result row, Series series) {
+        ((TimeSeries) series).addOrUpdate(
+            new Minute(row.getDate("XORDINATE")),
+            row.getDouble("YORDINATE")
+        );
+    }
+
+
+    protected void addSeries(Series series, String parameter, int idx) {
+        log.debug("add series (" + parameter + ")to timeseries chart");
+
+        if (series == null) {
+            log.warn("no data to add");
+            return;
+        }
+
+        TimeSeriesCollection tsc = null;
+
+        if (datasets.containsKey(parameter))
+            tsc = (TimeSeriesCollection) datasets.get(parameter);
+        else
+            tsc = new TimeSeriesCollection();
+
+        tsc.addSeries((TimeSeries) series);
+        datasets.put(parameter, tsc);
+    }
+
+
+    protected void addDatasets() {
+        Iterator   iter = parameters.iterator();
+        XYPlot     plot = chart.getXYPlot();
+        int        idx  = 0;
+
+        TimeSeriesCollection tsc  = null;
+        KeyValueDescibeData  data = null;
+        String               key  = null;
+        while (iter.hasNext()) {
+            data = (KeyValueDescibeData) iter.next();
+            key  = data.getValue();
+
+            if (datasets.containsKey(key)) {
+                tsc  = (TimeSeriesCollection)datasets.get(key);
+                plot.setDataset(idx, tsc );
+                log.debug("Added " + key + " parameter to plot.");
+                prepareAxis(key, idx);
+                adjustRenderer(
+                    idx++,
+                    tsc.getSeriesCount(),
+                    linesVisible,
+                    shapesVisible
+                );
+            }
+        }
+    }
+
+
+    protected void localizeDomainAxis(Axis axis, Locale locale) {
+        ((ValueAxis)axis).setStandardTickUnits(createStandardDateTickUnits(
+            TimeZone.getDefault(),
+            locale));
+    }
+
+
+    public static TickUnitSource createStandardDateTickUnits(
+        TimeZone zone,
+        Locale locale)
+    {
+        /* 
+         * This method have been copied from JFreeChart's DateAxis class.
+         * DateFormat objects are hard coded in DateAxis and cannot be adjusted.
+         */
+        if (zone == null) {
+            throw new IllegalArgumentException("Null 'zone' argument.");
+        }
+        if (locale == null) {
+            throw new IllegalArgumentException("Null 'locale' argument.");
+        }
+        TickUnits units = new TickUnits();
+
+        // date formatters
+        DateFormat f1 = new SimpleDateFormat("HH:mm:ss.SSS", locale);
+        DateFormat f2 = new SimpleDateFormat("HH:mm:ss", locale);
+        DateFormat f3 = new SimpleDateFormat("HH:mm", locale);
+        DateFormat f4 = new SimpleDateFormat("d-MMM, HH:mm", locale);
+        DateFormat f5 = new SimpleDateFormat("d-MMM yyyy", locale);
+        DateFormat f6 = new SimpleDateFormat("MMM-yyyy", locale);
+        DateFormat f7 = new SimpleDateFormat("yyyy", locale);
+
+        f1.setTimeZone(zone);
+        f2.setTimeZone(zone);
+        f3.setTimeZone(zone);
+        f4.setTimeZone(zone);
+        f5.setTimeZone(zone);
+        f6.setTimeZone(zone);
+        f7.setTimeZone(zone);
+
+        // milliseconds
+        units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 1, f1));
+        units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 5,
+                DateTickUnitType.MILLISECOND, 1, f1));
+        units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 10,
+                DateTickUnitType.MILLISECOND, 1, f1));
+        units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 25,
+                DateTickUnitType.MILLISECOND, 5, f1));
+        units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 50,
+                DateTickUnitType.MILLISECOND, 10, f1));
+        units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 100,
+                DateTickUnitType.MILLISECOND, 10, f1));
+        units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 250,
+                DateTickUnitType.MILLISECOND, 10, f1));
+        units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 500,
+                DateTickUnitType.MILLISECOND, 50, f1));
+
+        // seconds
+        units.add(new DateTickUnit(DateTickUnitType.SECOND, 1,
+                DateTickUnitType.MILLISECOND, 50, f2));
+        units.add(new DateTickUnit(DateTickUnitType.SECOND, 5,
+                DateTickUnitType.SECOND, 1, f2));
+        units.add(new DateTickUnit(DateTickUnitType.SECOND, 10,
+                DateTickUnitType.SECOND, 1, f2));
+        units.add(new DateTickUnit(DateTickUnitType.SECOND, 30,
+                DateTickUnitType.SECOND, 5, f2));
+
+        // minutes
+        units.add(new DateTickUnit(DateTickUnitType.MINUTE, 1,
+                DateTickUnitType.SECOND, 5, f3));
+        units.add(new DateTickUnit(DateTickUnitType.MINUTE, 2,
+                DateTickUnitType.SECOND, 10, f3));
+        units.add(new DateTickUnit(DateTickUnitType.MINUTE, 5,
+                DateTickUnitType.MINUTE, 1, f3));
+        units.add(new DateTickUnit(DateTickUnitType.MINUTE, 10,
+                DateTickUnitType.MINUTE, 1, f3));
+        units.add(new DateTickUnit(DateTickUnitType.MINUTE, 15,
+                DateTickUnitType.MINUTE, 5, f3));
+        units.add(new DateTickUnit(DateTickUnitType.MINUTE, 20,
+                DateTickUnitType.MINUTE, 5, f3));
+        units.add(new DateTickUnit(DateTickUnitType.MINUTE, 30,
+                DateTickUnitType.MINUTE, 5, f3));
+
+        // hours
+        units.add(new DateTickUnit(DateTickUnitType.HOUR, 1,
+                DateTickUnitType.MINUTE, 5, f3));
+        units.add(new DateTickUnit(DateTickUnitType.HOUR, 2,
+                DateTickUnitType.MINUTE, 10, f3));
+        units.add(new DateTickUnit(DateTickUnitType.HOUR, 4,
+                DateTickUnitType.MINUTE, 30, f3));
+        units.add(new DateTickUnit(DateTickUnitType.HOUR, 6,
+                DateTickUnitType.HOUR, 1, f3));
+        units.add(new DateTickUnit(DateTickUnitType.HOUR, 12,
+                DateTickUnitType.HOUR, 1, f4));
+
+        // days
+        units.add(new DateTickUnit(DateTickUnitType.DAY, 1,
+                DateTickUnitType.HOUR, 1, f5));
+        units.add(new DateTickUnit(DateTickUnitType.DAY, 2,
+                DateTickUnitType.HOUR, 1, f5));
+        units.add(new DateTickUnit(DateTickUnitType.DAY, 7,
+                DateTickUnitType.DAY, 1, f5));
+        units.add(new DateTickUnit(DateTickUnitType.DAY, 15,
+                DateTickUnitType.DAY, 1, f5));
+
+        // months
+        units.add(new DateTickUnit(DateTickUnitType.MONTH, 1,
+                DateTickUnitType.DAY, 1, f6));
+        units.add(new DateTickUnit(DateTickUnitType.MONTH, 2,
+                DateTickUnitType.DAY, 1, f6));
+        units.add(new DateTickUnit(DateTickUnitType.MONTH, 3,
+                DateTickUnitType.MONTH, 1, f6));
+        units.add(new DateTickUnit(DateTickUnitType.MONTH, 4,
+                DateTickUnitType.MONTH, 1, f6));
+        units.add(new DateTickUnit(DateTickUnitType.MONTH, 6,
+                DateTickUnitType.MONTH, 1, f6));
+
+        // years
+        units.add(new DateTickUnit(DateTickUnitType.YEAR, 1,
+                DateTickUnitType.MONTH, 1, f7));
+        units.add(new DateTickUnit(DateTickUnitType.YEAR, 2,
+                DateTickUnitType.MONTH, 3, f7));
+        units.add(new DateTickUnit(DateTickUnitType.YEAR, 5,
+                DateTickUnitType.YEAR, 1, f7));
+        units.add(new DateTickUnit(DateTickUnitType.YEAR, 10,
+                DateTickUnitType.YEAR, 1, f7));
+        units.add(new DateTickUnit(DateTickUnitType.YEAR, 25,
+                DateTickUnitType.YEAR, 5, f7));
+        units.add(new DateTickUnit(DateTickUnitType.YEAR, 50,
+                DateTickUnitType.YEAR, 10, f7));
+        units.add(new DateTickUnit(DateTickUnitType.YEAR, 100,
+                DateTickUnitType.YEAR, 20, f7));
+
+        return units;
+    }
+
+
+    protected String getMessage(Locale locale, String key, String def) {
+        return RessourceFactory.getInstance().getRessource(locale, key, def);
+    }
+
+
+    protected String createSeriesName(
+        String breakPoint1,
+        String breakPoint2,
+        String breakPoint3
+    ) {
+        log.debug("create seriesname of timeseries chart");
+        return findValueTitle(parameters, breakPoint1) +
+            " " +
+            findValueTitle(measurements, breakPoint2) +
+            "m";
+    }
+
+
+    protected void addGaps(
+        Result[] results,
+        Series   series,
+        Date     startDate,
+        Date     endDate,
+        int      startPos,
+        int      endPos
+    ) {
+        int  gapID   = results[startPos].getInteger("GAPID");
+        long maxDiff = calculateGapSize(
+            startDate, endDate, startPos, endPos, gapID
+        );
+
+        Date last = startDate;
+        for (int i = startPos+1; i < endPos; i++) {
+            Result res = results[i];
+            Date   now = res.getDate("XORDINATE");
+
+            if ((now.getTime() - last.getTime()) > maxDiff) {
+                // add gap, add 1 minute to last date and add null value
+                log.info(
+                    "Gap between " +
+                    last.toString() + " and " + now.toString()
+                );
+                last.setTime(last.getTime() + 60000);
+                ((TimeSeries) series).addOrUpdate(new Minute(last), null);
+            }
+
+            last = now;
+        }
+    }
+
+
+    protected long calculateGapSize(
+        Date start,
+        Date end,
+        int  startPos,
+        int  endPos,
+        int  gapID
+    ){
+        long maxGap   = (end.getTime() - start.getTime()) / 20;
+        long interval = getTimeGapValue(start, end, startPos, endPos, gapID);
+
+        if (maxGap < interval)
+            maxGap = interval + 10;
+
+        return maxGap;
+    }
+
+
+    protected long getTimeGapValue(
+        Date dStart,
+        Date dEnd,
+        int  pStart,
+        int  pEnd,
+        int  gapID
+    ){
+        long gap = 0;
+
+        if (gapID < 0 || gapID >= 99) {
+
+            if (gapID == -1) {
+                // no gaps in meshes
+                gap = NO_TIME_GAP;
+            }
+            else if (pEnd-pStart < 60) {
+                gap = (3/(pEnd-pStart)) * (dEnd.getTime() - dStart.getTime());
+            }
+        }
+        else{
+            Iterator it = timeGaps.iterator();
+
+            while (it.hasNext()) {
+                TimeGap tempTimeGap = (TimeGap) it.next();
+
+                if (tempTimeGap.getKey() == gapID){
+                    String unit     = tempTimeGap.getUnit();
+                    int    gapValue = tempTimeGap.getValue();
+
+                    if (unit.equals(TimeGap.TIME_UNIT_MINUTE)) {
+                        gap = gapValue * TimeGap.MINUTE_IN_MILLIS;
+                    }
+                    else if (unit.equals(TimeGap.TIME_UNIT_HOUR)) {
+                        gap = gapValue * TimeGap.HOUR_IN_MILLIS;
+                    }
+                    else if (unit.equals(TimeGap.TIME_UNIT_DAY)) {
+                        gap = gapValue * TimeGap.DAY_IN_MILLIS;
+                    }
+                    else if (unit.equals(TimeGap.TIME_UNIT_WEEK)) {
+                        gap = gapValue * TimeGap.WEEK_IN_MILLIS;
+                    }
+                    else if (unit.equals(TimeGap.TIME_UNIT_MONTH)) {
+                        gap = gapValue * (TimeGap.DAY_IN_MILLIS *30);
+                    }
+                    else if (unit.equals(TimeGap.TIME_UNIT_YEAR)) {
+                        gap = gapValue * (TimeGap.DAY_IN_MILLIS *365);
+                    }
+                    break;
+                }
+            }
+        }
+
+        return gap;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,223 @@
+package de.intevation.gnv.chart;
+
+import de.intevation.gnv.jfreechart.PolygonDataset;
+import de.intevation.gnv.jfreechart.PolygonPlot;
+import de.intevation.gnv.jfreechart.PolygonRenderer;
+import de.intevation.gnv.jfreechart.PolygonSeries;
+
+import de.intevation.gnv.math.AttributedXYColumns;
+
+import de.intevation.gnv.raster.Palette;
+
+import java.awt.Color;
+import java.awt.Paint;
+
+import java.text.NumberFormat;
+
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+
+import org.jfree.chart.JFreeChart;
+
+import org.jfree.chart.axis.NumberAxis;
+import org.jfree.chart.axis.SymbolAxis;
+import org.jfree.chart.axis.ValueAxis;
+
+import org.jfree.chart.plot.PlotOrientation;
+
+import org.jfree.chart.renderer.LookupPaintScale;
+
+import org.jfree.chart.title.PaintScaleLegend;
+import org.jfree.chart.title.TextTitle;
+
+import org.jfree.ui.RectangleEdge;
+import org.jfree.ui.RectangleInsets;
+
+/**
+ * @author Ingo Weinzierl      (ingo.weinzierl@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class VerticalCrossSectionChart
+implements   Chart
+{
+    public static final class PalettePaintLookup
+    implements PolygonRenderer.PaintLookup
+    {
+        private Palette             palette;
+        private Map<Integer, Paint> special;
+
+        public PalettePaintLookup(Palette palette) {
+            this(palette, null);
+        }
+
+        public PalettePaintLookup(
+            Palette             palette, 
+            Map<Integer, Paint> special
+        ) {
+            this.palette = palette;
+            this.special = special;
+        }
+
+        public Paint getPaint(int index) {
+            if (special != null) {
+                Paint paint = special.get(index);
+                if (paint != null) {
+                    return paint;
+                }
+            }
+            return index < 0
+                ? Color.black
+                : palette.getColor(index);
+        }
+    } // class PalettePaintLookup
+
+    public static class LocalizedLabelGenerator
+    extends             PolygonRenderer.DefaultLabelGenerator
+    {
+        protected NumberFormat format;
+
+        public LocalizedLabelGenerator() {
+        }
+
+        public LocalizedLabelGenerator(NumberFormat format) {
+            this.format = format;
+        }
+
+        protected String toString(Object label) {
+            return label instanceof Number
+                ? format.format(((Number)label).doubleValue())
+                : super.toString(label);
+        }
+    } // class LocalizedLabelGenerator
+
+    protected JFreeChart chart;
+
+    protected AttributedXYColumns columns;
+    protected Map<Integer, Paint> special;
+    protected Palette             palette;
+    protected Locale              locale;
+    protected ChartLabels         labels;
+
+    public VerticalCrossSectionChart() {
+    }
+
+    public VerticalCrossSectionChart(
+        AttributedXYColumns columns,
+        Palette             palette,
+        Locale              locale,
+        ChartLabels         labels
+    ) {
+        this(columns, palette, null, locale, labels);
+    }
+
+    public VerticalCrossSectionChart(
+        AttributedXYColumns columns,
+        Palette             palette,
+        Map<Integer, Paint> special,
+        Locale              locale,
+        ChartLabels         labels
+    ) {
+        this.columns = columns;
+        this.palette = palette;
+        this.special = special;
+        this.locale  = locale;
+        this.labels  = labels;
+    }
+
+    protected JFreeChart createChart() {
+
+        boolean legendB  = false;
+        boolean tooltips = false;
+        boolean urls     = false;
+
+        PlotOrientation po  = PlotOrientation.HORIZONTAL;
+        PolygonDataset data = columns.getPolygonDataset();
+
+        HashSet<Integer> usedColors = new HashSet<Integer>();
+
+        for (int i = data.getSeriesCount()-1; i >= 0; --i) {
+            PolygonSeries ps = data.getSeries(i);
+            Integer fill = (Integer)ps.getAttribute("fill");
+            if (fill != null
+            && (special != null && !special.containsKey(fill))) {
+                usedColors.add(fill);
+            }
+        }
+
+        NumberFormat format = NumberFormat.getInstance(locale);
+        format.setMinimumFractionDigits(0);
+        format.setMaximumFractionDigits(2);
+
+        PolygonRenderer renderer = new PolygonRenderer(
+            new PalettePaintLookup(palette, special),
+            new LocalizedLabelGenerator(format));
+
+        ValueAxis domainAxis = new NumberAxis(this.labels.getDomainAxisLabel());
+        ValueAxis rangeAxis  = new NumberAxis(this.labels.getRangeAxisLabel());
+
+        PolygonPlot plot = new PolygonPlot(
+            data,
+            renderer,
+            domainAxis,
+            rangeAxis,
+            null);
+
+        plot.setOutlinePaint(Color.WHITE);
+
+        String [] labels = new String[usedColors.size()];
+
+        int colors = palette.getSize();
+        LookupPaintScale lookupPaint =
+            new LookupPaintScale(-0.5d, labels.length-0.5d, Color.white);
+
+        Color color = null;
+
+        for (int i = 0, j = labels.length-1; i < colors && j >= 0; i++) {
+            if (usedColors.contains(i)) {
+                Palette.Entry entry = palette.getEntryByIndex(i);
+                color     = entry.getColor();
+                labels[j] = entry.getDescription();
+                lookupPaint.add(j-0.5d, color);
+                --j;
+            }
+        }
+
+        JFreeChart chart = new JFreeChart(
+            this.labels.getTitle(),
+            JFreeChart.DEFAULT_TITLE_FONT,
+            plot,
+            legendB);
+
+        chart.removeLegend();
+        chart.addSubtitle(new TextTitle(this.labels.getSubtitle()));
+
+        SymbolAxis scale = new SymbolAxis(this.labels.getParameterName(), labels);
+        scale.setRange(-1.5d, labels.length+0.5d);
+        scale.setGridBandsVisible(false);
+        scale.setPlot(plot);
+
+        PaintScaleLegend legend = new PaintScaleLegend(
+            lookupPaint, scale);
+        legend.setMargin(new RectangleInsets(3d, 10d, 3d, 10d));
+        legend.setPosition(RectangleEdge.LEFT);
+        legend.setAxisOffset(5d);
+
+        chart.addSubtitle(legend);
+
+        return chart;
+    }
+
+    public JFreeChart generateChart() {
+        if (chart == null) {
+            chart = createChart();
+        }
+
+        return chart;
+    }
+
+    public void setBackgroundPaint(Paint paint) {
+        chart.setBackgroundPaint(paint);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,341 @@
+package de.intevation.gnv.chart;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.ChartTheme;
+import org.jfree.chart.axis.Axis;
+import org.jfree.chart.plot.XYPlot;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.xy.XYSeries;
+import org.jfree.data.general.Series;
+import org.jfree.data.xy.XYSeriesCollection;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class VerticalProfileChart
+extends      AbstractXYLineChart
+{
+    public static final String DEFAULT_AXIS = "KPOSITION";
+
+    private static Logger log = Logger.getLogger(VerticalProfileChart.class);
+
+    protected final double PERCENTAGE     = 5.0;
+    protected final double GAP_MAX_LEVEL  = Math.sqrt(2.0);
+    protected final int    GAP_MAX_VALUES = 60;
+
+
+    public VerticalProfileChart(
+        ChartLabels labels,
+        ChartTheme  theme,
+        Collection  parameters,
+        Collection  measurements,
+        Collection  dates,
+        Collection  result,
+        Collection  timeGaps,
+        Locale      locale,
+        boolean     linesVisible,
+        boolean     shapesVisible
+    ) {
+        this.labels           = labels;
+        this.theme            = theme;
+        this.parameters       = parameters;
+        this.measurements     = measurements;
+        this.dates            = dates;
+        this.resultSet        = result;
+        this.timeGaps         = timeGaps;
+        this.locale           = locale;
+        this.PLOT_ORIENTATION = PlotOrientation.HORIZONTAL;
+        this.linesVisible     = linesVisible;
+        this.shapesVisible    = shapesVisible;
+        this.datasets         = new HashMap();
+        this.ranges           = new HashMap();
+    }
+
+
+    protected void initData() {
+        log.debug("init data for VerticalProfileChart");
+
+        String  breakPoint1       = null;
+        String  breakPoint2       = null;
+        String  breakPoint3       = null;
+
+        Iterator iter       = resultSet.iterator();
+        Result   row        = null;
+        String   seriesName = null;
+        String   parameter  = null;
+        XYSeries series     = null;
+
+        int idx           = 0;
+        int startPos      = 0;
+        int endPos        = 0;
+        double startValue = 0;
+        double endValue   = 0;
+
+        Result[] results =
+            (Result[]) resultSet.toArray(new Result[resultSet.size()]);
+
+        while (iter.hasNext()) {
+            row = (Result) iter.next();
+
+            // add current data to plot and prepare for next one
+            if (!row.getString("GROUP1").equals(breakPoint1) ||
+                !row.getString("GROUP2").equals(breakPoint2) ||
+                !row.getString("GROUP3").equals(breakPoint3)
+            ) {
+                log.debug("prepare data/plot for next dataset");
+
+                if(series != null) {
+                    gapDetection(results, series, startPos, endPos);
+                    addSeries(series, parameter, idx);
+
+                    startPos = endPos +1;
+                }
+
+                // prepare variables for next plot
+                breakPoint1 = row.getString("GROUP1");
+                breakPoint2 = row.getString("GROUP2");
+                breakPoint3 = row.getString("GROUP3");
+
+                seriesName  = createSeriesName(
+                    breakPoint1,
+                    breakPoint2,
+                    breakPoint3
+                );
+                parameter = findParameter(seriesName);
+
+                log.debug("next dataset is '" + seriesName + "'");
+                series = new XYSeries(seriesName);
+            }
+
+            addValue(row, series);
+            Double value = row.getDouble("YORDINATE");
+            if (value != null)
+                storeMaxRange(value, parameter);
+            endPos++;
+        }
+
+        if (results.length == 0)
+            return;
+
+        gapDetection(results, series, startPos, endPos);
+        addSeries(series, parameter, idx);
+
+        addDatasets();
+    }
+
+
+    protected void gapDetection(
+        Result[] results,
+        Series   series,
+        int      startPos,
+        int      endPos
+    ) {
+        double startValue = results[startPos].getDouble("XORDINATE");
+        double endValue   = results[endPos-1].getDouble("XORDINATE");
+        if (results[0].getInteger("DATAID") == 2)
+            addGapsOnGrid(results, series, startPos, endPos);
+        else
+            addGaps(results, series, startValue, endValue, startPos, endPos);
+    }
+
+
+    protected void addValue(Result row, Series series) {
+        ((XYSeries) series).add(
+            row.getDouble("XORDINATE"),
+            row.getDouble("YORDINATE")
+        );
+    }
+
+
+    protected void addSeries(Series series, String parameter, int idx) {
+        log.debug("add series (" + parameter + ")to chart");
+
+        if (series == null) {
+            log.warn("no data to add");
+            return;
+        }
+
+        XYSeriesCollection xysc = null;
+
+        if (datasets.containsKey(parameter))
+            xysc = (XYSeriesCollection) datasets.get(parameter);
+        else
+            xysc = new XYSeriesCollection();
+
+        xysc.addSeries((XYSeries) series);
+        datasets.put(parameter, xysc);
+    }
+
+
+    protected void addDatasets() {
+        Iterator   iter = parameters.iterator();
+        XYPlot     plot = chart.getXYPlot();
+        int        idx  = 0;
+
+        XYSeriesCollection   xysc = null;
+        KeyValueDescibeData  data = null;
+        String               key  = null;
+        while (iter.hasNext()) {
+            data = (KeyValueDescibeData) iter.next();
+            key  = data.getValue();
+
+            if (datasets.containsKey(key)) {
+                xysc  = (XYSeriesCollection)datasets.get(key);
+                plot.setDataset(idx, xysc );
+                log.debug("Added " + key + " parameter to plot.");
+                prepareAxis(key, idx);
+                adjustRenderer(
+                    idx++,
+                    xysc.getSeriesCount(),
+                    linesVisible,
+                    shapesVisible
+                );
+            }
+        }
+    }
+
+
+    protected void localizeDomainAxis(Axis axis, Locale locale) {
+        // call localizeRangeAxis from superclass which formats NumberAxis
+        super.localizeRangeAxis(axis, locale);
+    }
+
+
+    protected String createSeriesName(
+        String breakPoint1,
+        String breakPoint2,
+        String breakPoint3
+    ) {
+        log.debug("create seriesname of verticalprofile chart");
+        return findValueTitle(parameters, breakPoint1) +
+            " " +
+            findValueTitle(measurements, breakPoint2) +
+            "m";
+    }
+
+
+    protected void addGapsOnGrid(
+        Result[] results,
+        Series   series,
+        int      startPos,
+        int      endPos
+    ) {
+        String axis = null;
+        
+        if (results.length > (startPos+1)) {
+            axis = getDependendAxisName(
+                results[startPos],
+                results[startPos+1]
+            );
+        }
+        else {
+            axis = DEFAULT_AXIS;
+        }
+
+        double range        = 0;
+        int    last         = 0;
+        int    current      = 0;
+
+        for (int i = startPos+1; i < endPos; i++) {
+            last    = results[i-1].getInteger(axis);
+            current = results[i].getInteger(axis);
+
+            boolean detected = gridDetection(last, current);
+
+            if (detected) {
+                double xOld = results[i-1].getDouble("XORDINATE");
+                double xNow = results[i].getDouble("XORDINATE");
+                log.debug("Gap detected on grid between "+ xOld +" and "+ xNow);
+                ((XYSeries) series).add(xOld+0.0001, null);
+            }
+        }
+    }
+
+
+    protected void addGaps(
+        Result[] results,
+        Series   series,
+        double   startValue,
+        double   endValue,
+        int      startPos,
+        int      endPos
+    ) {
+
+        double last    = 0;
+        double current = 0;
+        int    num     = results.length;
+
+        for (int i = startPos+1; i < endPos; i++) {
+            boolean detected = false;
+
+            last    = results[i-1].getDouble("YORDINATE");
+            current = results[i].getDouble("YORDINATE");
+
+            // gap detection for more than GAP_MAX_VALUES values
+            if (num > GAP_MAX_VALUES)
+                detected = simpleDetection(startValue, endValue, last, current);
+            // gap detection for less than GAP_MAX_VALUES values
+            else
+                detected = specialDetection(
+                    startValue,
+                    endValue,
+                    last,
+                    current,
+                    num
+                );
+
+            if (detected) {
+                log.info("Gap between " + last + " and " + current);
+                ((XYSeries) series).add((last+current)/2, null);
+            }
+        }
+    }
+
+
+    protected boolean simpleDetection(
+        double start,
+        double end,
+        double last,
+        double current
+    ) {
+        double delta      = Math.abs(end - start);
+        double smallDelta = Math.abs(current - last);
+
+        return (smallDelta > delta / 100 * PERCENTAGE);
+    }
+
+
+    protected boolean specialDetection(
+        double start,
+        double end,
+        double last,
+        double current,
+        int    count
+    ) {
+        double delta      = Math.abs(end - start);
+        double smallDelta = Math.abs(current - last);
+
+        return (smallDelta > (3.0 / (count - 1) * delta));
+    }
+
+    
+    protected boolean gridDetection(double last, double current) {
+        return (Math.abs(current - last) > GAP_MAX_LEVEL);
+    }
+
+
+    protected String getDependendAxisName(Result first, Result second) {
+        return "KPOSITION";
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/XMLChartTheme.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,295 @@
+package de.intevation.gnv.chart;
+
+import java.awt.Font;
+import java.awt.Color;
+import java.awt.geom.Ellipse2D;
+import java.lang.NumberFormatException;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.StandardChartTheme;
+import org.jfree.chart.plot.XYPlot;
+import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
+import org.jfree.ui.RectangleInsets;
+import org.jfree.util.UnitType;
+
+
+import org.w3c.dom.Document;
+
+import de.intevation.artifactdatabase.Config;
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class XMLChartTheme
+extends      StandardChartTheme
+{
+    private static final Color DEFAULT_COLOR = Color.BLACK;
+
+    private Logger log = Logger.getLogger(XMLChartTheme.class);
+
+    protected boolean domainCrosshairVisible;
+    protected boolean rangeCrosshairVisible;
+    protected boolean renderLines;
+    protected boolean renderShapes;
+
+    protected int pointWidth;
+    protected int pointHeight;
+
+
+    public XMLChartTheme(String name) {
+        super(name);
+    }
+
+
+    public void setDomainCrosshairVisible(boolean visible) {
+        this.domainCrosshairVisible = visible;
+    }
+
+
+    public boolean getDomainCrosshairVisible() {
+        return domainCrosshairVisible;
+    }
+
+
+    public boolean getRangeCrosshairVisible() {
+        return rangeCrosshairVisible;
+    }
+
+
+    public void setRangeCrosshairVisible(boolean visible) {
+        this.rangeCrosshairVisible = visible;
+    }
+
+
+    public void applyXMLConfiguration(Document document) {
+        log.debug("create XMLChartTheme");
+
+        init(document);
+    }
+
+
+    private void init(Document document) {
+        log.debug("init XMLChartTheme parameters");
+
+        initChartParameters(document);
+        initTitleParameters(document);
+        initSubtitleParameters(document);
+        initPlotParameters(document);
+        initAxisParameters(document);
+        initLegendParameters(document);
+        initRenderer(document);
+    }
+
+
+    private void initTitleParameters(Document document) {
+        log.debug("init title parameters.");
+
+        int     size  = getInt(document, "theme/title/font/size/@value");
+        String  type  = getString(document, "theme/title/font/type/@value");
+        boolean bold  = getBool(document, "theme/title/font/bold/@value");
+
+        setExtraLargeFont(createFont(type, size, bold));
+
+        String color = getString(document, "theme/title/font/color/@value");
+        Color  c     = decodeColor(color);
+        if (c != null)
+            setTitlePaint(c);
+    }
+
+
+    private void initSubtitleParameters(Document document) {
+        log.debug("init title parameters.");
+
+        int     size  = getInt(document, "theme/subtitle/font/size/@value");
+        String  type  = getString(document, "theme/subtitle/font/type/@value");
+        boolean bold  = getBool(document, "theme/subtitle/font/bold/@value");
+
+        setLargeFont(createFont(type, size, bold));
+
+        String col  = getString(document, "theme/subtitle/font/color/@value");
+        setSubtitlePaint(Color.decode(col));
+    }
+
+
+    private void initChartParameters(Document document) {
+        log.debug("init chart parameters.");
+
+        String bg = getString(document, "theme/chart/background/color/@value");
+        Color  c  = decodeColor(bg);
+        if (c != null)
+            setChartBackgroundPaint(c);
+    }
+
+
+    private void initPlotParameters(Document document) {
+        log.debug("init plot parameters.");
+
+        String tmp = null;
+        tmp        = getString(document, "theme/plot/background/color/@value");
+        Color  c   = decodeColor(tmp);
+        if (c != null)
+            setPlotBackgroundPaint(c);
+
+        tmp = getString(document, "theme/plot/outline/color/@value");
+        c   = decodeColor(tmp);
+        if (c != null)
+            setPlotOutlinePaint(c);
+
+        tmp = getString(document, "theme/plot/domaingridline/color/@value");
+        c   = decodeColor(tmp);
+        if (c != null)
+            setDomainGridlinePaint(c);
+
+        tmp = getString(document, "theme/plot/rangegridline/color/@value");
+        c   = decodeColor(tmp);
+        if (c != null)
+            setRangeGridlinePaint(c);
+
+        boolean rangeCrosshairVisible = getBool(
+            document, "theme/plot/rangecrosshair/visible/@value");
+        setRangeCrosshairVisible(rangeCrosshairVisible);
+
+        boolean domainCrosshairVisible = getBool(
+            document, "theme/plot/domaincrosshair/visible/@value");
+        setDomainCrosshairVisible(domainCrosshairVisible);
+
+        int top    = getInt(document, "theme/plot/offset/top/@value");
+        int bottom = getInt(document, "theme/plot/offset/bottom/@value");
+        int left   = getInt(document, "theme/plot/offset/left/@value");
+        int right  = getInt(document, "theme/plot/offset/right/@value");
+        setAxisOffset(new RectangleInsets(
+            UnitType.RELATIVE,
+            top, left, bottom, right)
+        );
+    }
+
+
+    private void initAxisParameters(Document document) {
+        log.debug("init axis parameters.");
+
+        String tmp = null;
+        tmp        = getString(document, "theme/axis/label/color/@value");
+        Color c    = decodeColor(tmp);
+        if (c != null)
+            setAxisLabelPaint(c);
+
+        tmp = getString(document, "theme/axis/ticklabel/color/@value");
+        c   = decodeColor(tmp);
+        if (c != null)
+            setTickLabelPaint(c);
+    }
+
+
+    private void initLegendParameters(Document document) {
+        log.debug("init legend parameters.");
+
+        String tmp = null;
+        tmp        = getString(document, "theme/legend/font/color/@value");
+        Color c    = decodeColor(tmp);
+        if (c != null)
+            setLegendItemPaint(c);
+
+        tmp = getString(document, "theme/legend/background/color/@value");
+        c   = decodeColor(tmp);
+        if (c != null)
+            setLegendBackgroundPaint(c);
+    }
+
+
+    private void initRenderer(Document document) {
+        log.debug("init renderer parameters.");
+
+        pointWidth  = getInt(document, "theme/plot/itemrenderer/width/@value");
+        log.debug("Read point width of " + pointWidth);
+        pointHeight = getInt(document, "theme/plot/itemrenderer/height/@value");
+        log.debug("Read point height of " + pointHeight);
+        renderLines = getBool(
+            document, "theme/plot/itemrenderer/renderLines/@value"
+        );
+        renderShapes = getBool(
+            document, "theme/plot/itemrenderer/renderPoints/@value"
+        );
+    }
+
+
+    private static String getString(Document document, String xpath) {
+        return Config.getStringXPath(document, xpath);
+    }
+
+
+    private static int getInt(Document document, String xpath) {
+        String tmp = getString(document, xpath);
+
+        if (tmp != null)
+            return Integer.parseInt(tmp);
+        else
+            return 0;
+    }
+
+
+    private static boolean getBool(Document document, String xpath) {
+        String tmp = getString(document, xpath);
+
+        if (tmp != null)
+            return Boolean.parseBoolean(tmp);
+        else
+            return false;
+    }
+
+
+    protected Color decodeColor(String color) {
+        try {
+            if (color == null)
+                return null;
+
+            return Color.decode(color);
+        }
+        catch (NumberFormatException nfe) {
+            log.warn("Error while parsing color: " + color, nfe);
+        }
+
+        return null;
+    }
+
+
+    protected Font createFont(String type, int size, boolean bold) {
+        Font font = null;
+        if (bold)
+            font = new Font(type, Font.BOLD, size);
+        else
+            font = new Font(type, Font.PLAIN, size);
+
+        return font;
+    }
+
+
+    protected void applyToXYPlot(XYPlot plot) {
+        log.debug("apply theme parameter to XYPlot");
+
+        super.applyToXYPlot(plot);
+        plot.setDomainCrosshairVisible(this.domainCrosshairVisible);
+        plot.setRangeCrosshairVisible(this.rangeCrosshairVisible);
+
+        applyToXYLineAndShapeRenderer(plot);
+    }
+
+
+    protected void applyToXYLineAndShapeRenderer(XYPlot plot) {
+        if (plot == null)
+            return;
+
+        XYLineAndShapeRenderer renderer =
+            (XYLineAndShapeRenderer) plot.getRenderer();
+
+        Ellipse2D.Double point = new Ellipse2D.Double(
+            -(pointWidth/2), -(pointHeight/2), pointWidth, pointHeight
+        );
+
+        renderer.setSeriesShape(0, point);
+        renderer.setSeriesShapesVisible(0, renderShapes);
+        renderer.setSeriesLinesVisible(0, renderLines);
+
+        plot.setRenderer(renderer);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/exception/TechnicalChartException.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,51 @@
+/**
+ *
+ */
+package de.intevation.gnv.chart.exception;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class TechnicalChartException extends Exception {
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = -5325863742368006109L;
+
+    /**
+     * Constructor
+     */
+    public TechnicalChartException() {
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param message
+     */
+    public TechnicalChartException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param cause
+     */
+    public TechnicalChartException(Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param message
+     * @param cause
+     */
+    public TechnicalChartException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/ChartExportHelper.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,153 @@
+package de.intevation.gnv.exports;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.PageSize;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfTemplate;
+import com.lowagie.text.pdf.PdfWriter;
+
+import java.awt.Transparency;
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.Rectangle2D.Double;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import javax.imageio.ImageIO;
+
+import org.apache.batik.svggen.SVGGraphics2D;
+import org.apache.batik.svggen.SVGGraphics2DIOException;
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.JFreeChart;
+
+import de.intevation.artifactdatabase.XMLUtils;
+
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class ChartExportHelper {
+
+    private static final String  DEFAULT_PAGE_SIZE = "A4";
+    private static final String  DEFAULT_ENCODING  = "UTF-8";
+
+    private static Logger log = Logger.getLogger(ChartExportHelper.class);
+
+    public static void exportImage(
+        OutputStream out,
+        JFreeChart chart,
+        String format,
+        int width,
+        int height
+    )
+    throws IOException
+    {
+        log.info("export chart as png");
+
+        ImageIO.write(
+            chart.createBufferedImage(
+                width, height, Transparency.BITMASK, null
+            ),
+            format,
+            out
+        );
+    }
+
+
+    public static void exportSVG(
+        OutputStream out,
+        JFreeChart   chart,
+        String       encoding,
+        int          width,
+        int          height
+    ) {
+        log.info("export chart as svg");
+
+        if (encoding == null)
+            encoding = DEFAULT_ENCODING;
+
+        org.w3c.dom.Document document = XMLUtils.newDocument();
+        SVGGraphics2D        graphics = new SVGGraphics2D(document);
+
+        chart.draw(graphics, new Rectangle2D.Double(0.0D, 0.0D,width,height));
+
+        try {
+            graphics.stream(new OutputStreamWriter(out, encoding));
+        }
+        catch (SVGGraphics2DIOException svge) {
+            log.error("Error while writing svg export to output stream.", svge);
+        }
+        catch (UnsupportedEncodingException uee) {
+            log.error("Unsupported encoding: " + encoding, uee);
+        }
+    }
+
+
+    public static void exportPDF(
+        OutputStream out,
+        JFreeChart   chart,
+        String       pageFormat,
+        boolean      landscape,
+        float        marginLeft,
+        float        marginRight,
+        float        marginTop,
+        float        marginBottom
+    ) {
+        log.info("export chart as pdf.");
+
+        if (pageFormat == null)
+            pageFormat = DEFAULT_PAGE_SIZE;
+
+        Rectangle page = PageSize.getRectangle(pageFormat);
+        int pageWidth  = (int) (page.getRight(marginRight) - page.getLeft(marginLeft));
+        int pageHeight = (int) (page.getTop(marginTop) - page.getBottom(marginBottom));
+
+        Document document = null;
+        if (landscape) {
+            document = new Document(page.rotate());
+            log.debug("Create landscape pdf.");
+        }
+        else
+            document = new Document(page);
+
+        try {
+            PdfWriter writer = PdfWriter.getInstance(document, out);
+
+            document.addSubject(chart.getTitle().getText());
+            document.addCreationDate();
+            document.open();
+
+            PdfContentByte content  = writer.getDirectContent();
+
+            int width  = 0;
+            int height = 0;
+            if (landscape) {
+                width  = pageHeight;
+                height = pageWidth;
+            }
+            else {
+                width  = pageWidth;
+                height = pageHeight;
+            }
+
+            PdfTemplate template = content.createTemplate(width, height);
+            Graphics2D  graphics = template.createGraphics(width, height);
+            Rectangle2D area = new Rectangle2D.Double(0.0D, 0.0D,width,height);
+
+            chart.draw(graphics, area);
+            graphics.dispose();
+            content.addTemplate(template, marginLeft, marginBottom);
+        }
+        catch (DocumentException de) {
+            log.error("Error while exporting chart to pdf.", de);
+        }
+        finally {
+            document.close();
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/DefaultDataCollector.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,48 @@
+package de.intevation.gnv.exports;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.geobackend.base.ResultDescriptor;
+import de.intevation.gnv.state.exception.StateException;
+
+
+/**
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public class DefaultDataCollector
+implements Export.DataCollector
+{
+    private   Logger log = Logger.getLogger(DefaultDataCollector.class);
+
+    protected ResultDescriptor rd;
+    protected String []        names;
+
+
+    public DefaultDataCollector(String[] names) {
+        this.names = names;
+    }
+
+    public void init(Result res) {
+        rd = res.getResultDescriptor();
+    }
+
+    public String[] getData(Result result)
+    throws StateException {
+
+        if (rd == null)
+            init(result);
+
+        List entries = new ArrayList();
+
+        int[] indices = rd.getColumnIndices(names);
+        for (int i = 0; i < names.length; ++i) {
+            entries.add(result.getString(indices[i]));
+        }
+
+        return (String[]) entries.toArray((new String[entries.size()]));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/DefaultExport.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,83 @@
+package de.intevation.gnv.exports;
+
+import org.apache.log4j.Logger;
+
+import au.com.bytecode.opencsv.CSVWriter;
+
+import java.util.Iterator;
+import java.util.Collection;
+
+import java.io.UnsupportedEncodingException;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.OutputStream;
+
+import de.intevation.gnv.geobackend.base.Result;
+
+import de.intevation.gnv.state.exception.StateException;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public class DefaultExport
+implements   Export
+{
+    private static Logger log = Logger.getLogger(DefaultExport.class);
+
+    private Export.DataCollector collector;
+
+    public DefaultExport(Export.DataCollector collector) {
+        this.collector = collector;
+    }
+
+    protected void writeData(
+        Profile    profile, 
+        Collection result,
+        CSVWriter  writer
+    )
+    throws StateException {
+        log.debug("create content for export.");
+        Iterator<Result> it = result.iterator();
+
+        String[] header = profile.getHeader();
+        if (header != null)
+            writer.writeNext(header);
+
+        while (it.hasNext()) {
+            Result res = it.next();
+
+            writer.writeNext(collector.getData(res));
+        }
+    }
+
+    public void create(
+        Profile      profile,
+        OutputStream outputStream, 
+        Collection   result
+    )
+    throws
+        IOException,
+        UnsupportedEncodingException,
+        StateException 
+    {
+        if (result == null) {
+            String msg = "No data given for generation of " +
+                profile.getType() + " file.";
+            log.error(msg);
+            throw new StateException(msg);
+        }
+
+        CSVWriter writer = new CSVWriter(
+            new OutputStreamWriter(
+                outputStream,
+                profile.getEncoding()), 
+            profile.getSeparator(),
+            profile.getQuoteCharacter(),
+            profile.getEscapeCharacter()); 
+
+        writeData(profile, result, writer);
+
+        writer.close();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/DefaultProfile.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,66 @@
+package de.intevation.gnv.exports;
+
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public class DefaultProfile
+implements   Export.Profile
+{
+    protected Export.DataCollector collector;
+    protected String []            header;
+    protected String []            names;
+    protected char                 separator;
+    protected char                 escapeCharacter;
+    protected char                 quoteCharacter;
+    protected String               type;
+    protected String               encoding;
+
+    public DefaultProfile() {
+    }
+
+    public DefaultProfile(
+        String []            header,
+        char                 separator,
+        char                 escapeCharacter,
+        char                 quoteCharacter,
+        String               type,
+        String               encoding
+    ) {
+        this.header          = header;
+        this.separator       = separator;
+        this.escapeCharacter = escapeCharacter;
+        this.quoteCharacter  = quoteCharacter;
+        this.type            = type;
+        this.encoding        = encoding;
+    }
+
+    public String toString(int index, String value) {
+        return value;
+    }
+
+    public char getSeparator() {
+        return separator;
+    }
+
+    public char getEscapeCharacter() {
+        return escapeCharacter;
+    }
+
+    public char getQuoteCharacter() {
+        return quoteCharacter;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getEncoding() {
+        return encoding;
+    }
+
+    public String[] getHeader() {
+        return header;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/Export.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,40 @@
+package de.intevation.gnv.exports;
+
+import java.util.Collection;
+
+import java.io.OutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.exception.StateException;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public interface Export {
+
+    public interface Profile {
+        String toString(int column, String value);
+        char      getSeparator();
+        char      getEscapeCharacter();
+        char      getQuoteCharacter();
+        String    getType();
+        String    getEncoding();
+        String [] getHeader();
+    }
+
+    public interface DataCollector {
+        String[] getData(Result result)
+        throws StateException;
+    }
+
+    public void create(
+        Profile      profile,
+        OutputStream outputStream, 
+        Collection   result
+    )
+    throws IOException, UnsupportedEncodingException, StateException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/ShapeDataCollector.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,57 @@
+package de.intevation.gnv.exports;
+
+import org.apache.log4j.Logger;
+
+import com.vividsolutions.jts.io.WKTReader;
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.geom.Point;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.exception.StateException;
+
+
+/**
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public class ShapeDataCollector
+extends DefaultDataCollector
+{
+    private Logger log = Logger.getLogger(ShapeDataCollector.class);
+
+    protected WKTReader wktReader = new WKTReader();
+
+    public ShapeDataCollector(String[] names) {
+        super(names);
+    }
+
+    public String[] getData(Result result) 
+    throws StateException {
+
+        if (rd == null)
+            init(result);
+
+        try {
+            String [] entries = new String[names.length+1];
+            int j             = 0;
+            for (int i = 0; i < names.length; i++) {
+                
+                if (names[i].equals("SHAPE")) {
+                    Point p  = (Point)wktReader.read(result.getString("SHAPE"));
+
+                    entries[j++] = ""+p.getX();
+                    entries[j++] = ""+p.getY();
+                }
+                else {
+                    entries[j++] = result.getString(names[i]);
+                }
+            }
+
+            return entries;
+        }
+        catch (ParseException pe) {
+            log.error(pe, pe);
+            throw new StateException(
+                "Error occured while parsing a Point from WKT.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/SimpleOdvDataCollector.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,74 @@
+package de.intevation.gnv.exports;
+
+import java.util.Date;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+import org.apache.log4j.Logger;
+
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.geom.Point;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.exception.StateException;
+
+/**
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public class SimpleOdvDataCollector
+extends ShapeDataCollector
+{
+    private static Logger log = Logger.getLogger(SimpleOdvDataCollector.class);
+
+    public static final String SRC_FORMAT  = "yyyy.MM.dd HH:mm:ss";
+    public static final String DEST_FORMAT = "yyyy-MM-dd HH:mm";
+
+    public static DateFormat srcFormat  = new SimpleDateFormat(SRC_FORMAT);
+    public static DateFormat destFormat = new SimpleDateFormat(DEST_FORMAT);
+
+    public SimpleOdvDataCollector(String[] names) {
+        super(names);
+    }
+
+    public String[] getData(Result result)
+    throws StateException
+    {
+        if (rd == null)
+            init(result);
+
+        try {
+            String [] entries = new String[names.length+1];
+            int j             = 0;
+            for (int i = 0; i < names.length; i++) {
+                
+                if (names[i].equals("SHAPE")) {
+                    Point p  = (Point)wktReader.read(result.getString("SHAPE"));
+
+                    entries[j++] = ""+p.getX();
+                    entries[j++] = ""+p.getY();
+                }
+                // Change the datetime format from yyyy.MM.dd HH:mm:ss to 
+                // yyyy-MM-dd HH:mm
+                else if (names[i].equals("TIMEVALUE")) {
+                    Date source  = srcFormat.parse(result.getString(names[i]));
+                    entries[j++] = destFormat.format(source);
+                }
+                else {
+                    entries[j++] = result.getString(names[i]);
+                }
+            }
+
+            return entries;
+        }
+        catch (ParseException pe) {
+            log.error(pe, pe);
+            throw new StateException(
+                "Error occured while parsing source data.");
+        }
+        catch (java.text.ParseException pe) {
+            log.error(pe, pe);
+            throw new StateException(
+                "Error occured while parsing source data.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/CompactXYItems.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,128 @@
+package de.intevation.gnv.jfreechart;
+
+import java.io.Serializable;
+
+/**
+ * @author Sascha Teichmann <sascha.teichmann@intevation.de>
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class CompactXYItems
+implements   Serializable
+{
+    protected double [] data;
+
+    public CompactXYItems(double [] data) {
+        this.data = data;
+    }
+
+    public double getX(int index) {
+        return data[index << 1];
+    }
+
+    public double getY(int index) {
+        return data[(index << 1)+1];
+    }
+
+    public void get(int index, double [] xy) {
+        xy[0] = data[index = (index << 1) + 1];
+        xy[1] = data[index + 1];
+    }
+
+    public double [] getData() {
+        return data;
+    }
+
+    public void setData(double [] data) {
+        this.data = data;
+    }
+
+    public int size() {
+        return data.length >> 1;
+    }
+
+    public double [] calculateBoundingBox(double [] bbox)  {
+        for (int i = 0; i < data.length;) {
+            double x = data[i++];
+            double y = data[i++];
+            if (x < bbox[0]) bbox[0] = x;
+            if (y < bbox[1]) bbox[1] = y;
+            if (x > bbox[2]) bbox[2] = x;
+            if (y > bbox[3]) bbox[3] = y;
+        }
+        return bbox;
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < data.length;) {
+            if (i > 0) sb.append("; ");
+            sb.append('(');
+            sb.append(data[i++]);
+            sb.append(", ");
+            sb.append(data[i++]);
+            sb.append(')');
+        }
+        return sb.toString();
+    }
+
+
+    public double getMinX() {
+        double lower = Double.POSITIVE_INFINITY;
+
+        for (int i = 0; i < data.length; i += 2) {
+            double x = data[i];
+
+            if (!Double.isNaN(x)) {
+                lower = Math.min(lower, x);
+            }
+        }
+
+        return lower;
+    }
+
+
+    public double getMaxX() {
+        double upper = Double.NEGATIVE_INFINITY;
+
+        for (int i = 0; i < data.length; i += 2) {
+            double x = data[i];
+
+            if (!Double.isNaN(x)) {
+                upper = Math.max(upper, x);
+            }
+        }
+
+        return upper;
+    }
+
+
+    public double getMinY() {
+        double lower = Double.POSITIVE_INFINITY;
+
+        for (int i = 1; i < data.length; i += 2) {
+            double y = data[i];
+
+            if (!Double.isNaN(y)) {
+                lower = Math.min(lower, y);
+            }
+        }
+
+        return lower;
+    }
+
+
+    public double getMaxY() {
+        double upper = Double.NEGATIVE_INFINITY;
+
+        for (int i = 1; i < data.length; i += 2) {
+            double y = data[i];
+
+            if (!Double.isNaN(y)) {
+                upper = Math.max(upper, y);
+            }
+        }
+
+        return upper;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/LevelOrderIndices.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,58 @@
+package de.intevation.gnv.jfreechart;
+
+import java.util.LinkedList;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class LevelOrderIndices
+{
+    public interface Visitor {
+        Object visit(int index);
+    }
+
+    protected int from;
+    protected int to;
+
+    public LevelOrderIndices() {
+    }
+
+    public LevelOrderIndices(int to) {
+        this(0, to);
+    }
+
+    public LevelOrderIndices(int from, int to) {
+        this.from = Math.min(from, to);
+        this.to   = Math.max(from, to);
+    }
+
+    public Object visit(Visitor visitor) {
+        LinkedList<int[]> queue = new LinkedList<int[]>();
+
+        queue.add(new int [] { from, to });
+
+        while (!queue.isEmpty()) {
+            int [] pair = queue.remove();
+
+            int mid = (pair[0] + pair[1]) >> 1;
+
+            Object result = visitor.visit(mid);
+
+            if (result != null) {
+                return result;
+            }
+
+            if (mid-1 >= pair[0]) {
+                queue.add(new int [] { pair[0], mid-1 });
+            }
+
+            if (mid+1 <= pair[1]) {
+                pair[0] = mid+1;
+                queue.add(pair);
+            }
+        }
+
+        return null;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonDataset.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,110 @@
+package de.intevation.gnv.jfreechart;
+
+import java.util.List;
+import java.util.Collection;
+import java.util.ArrayList;
+
+import org.jfree.data.Range;
+import org.jfree.data.general.AbstractSeriesDataset;
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class PolygonDataset
+extends      AbstractSeriesDataset
+{
+    /** PolygonSeries included in this Dataset */
+    private List data;
+
+
+    public PolygonDataset() {
+        data = new ArrayList();
+    }
+
+    public PolygonDataset(Collection series) {
+        data = new ArrayList(series);
+    }
+
+    public PolygonDataset(PolygonSeries series) {
+        this();
+
+        if (series != null) {
+            data.add(series);
+        }
+    }
+
+
+    public void addSeries(PolygonSeries series) {
+        if (series == null)
+            throw new IllegalArgumentException("Null 'series' argument.");
+
+        data.add(series);
+    }
+
+    public void addAllSeries(Collection<PolygonSeries> series) {
+        data.addAll(series);
+    }
+
+    public Range getDomainBounds() {
+        double lower       = Double.POSITIVE_INFINITY;
+        double upper       = Double.NEGATIVE_INFINITY;
+        int    seriesCount = getSeriesCount();
+
+        for (int s = 0; s < seriesCount; s++) {
+            PolygonSeries series = getSeries(s);
+
+            Range domainRange = series.getDomainBounds();
+            double minX = domainRange.getLowerBound();
+            if (!Double.isNaN(minX)) {
+                lower = Math.min(lower, minX);
+            }
+
+            double maxX = domainRange.getUpperBound();
+            if (!Double.isNaN(maxX)) {
+                upper = Math.max(upper, maxX);
+            }
+        }
+
+        return new Range(lower, upper);
+    }
+
+
+    public Range getRangeBounds() {
+        double lower       = Double.POSITIVE_INFINITY;
+        double upper       = Double.NEGATIVE_INFINITY;
+        int    seriesCount = getSeriesCount();
+
+        for (int i = 0; i < seriesCount; i++) {
+            PolygonSeries series = getSeries(i);
+
+            Range range = series.getRangeBounds();
+            double minX = range.getLowerBound();
+            if (!Double.isNaN(minX)) {
+                lower = Math.min(lower, minX);
+            }
+
+            double maxX = range.getUpperBound();
+            if (!Double.isNaN(maxX)) {
+                upper = Math.max(upper, maxX);
+            }
+        }
+
+        return new Range(lower, upper);
+    }
+
+
+    public int getSeriesCount() {
+        return data.size();
+    }
+
+
+    public Comparable getSeriesKey(int series) {
+        return ((PolygonSeries)data.get(series)).getKey();
+    }
+
+
+    public PolygonSeries getSeries(int idx) {
+        return (PolygonSeries)data.get(idx);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,440 @@
+package de.intevation.gnv.jfreechart;
+
+import java.awt.AlphaComposite;
+import java.awt.Composite;
+import java.awt.Graphics2D;
+import java.awt.Shape;
+
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jfree.chart.axis.Axis;
+import org.jfree.chart.axis.AxisCollection;
+import org.jfree.chart.axis.AxisLocation;
+import org.jfree.chart.axis.AxisSpace;
+import org.jfree.chart.axis.AxisState;
+import org.jfree.chart.axis.ValueAxis;
+
+import org.jfree.chart.plot.Plot;
+import org.jfree.chart.plot.PlotRenderingInfo;
+import org.jfree.chart.plot.PlotState;
+import org.jfree.chart.plot.PlotOrientation;
+
+import org.jfree.data.Range;
+
+import org.jfree.ui.RectangleEdge;
+import org.jfree.ui.RectangleInsets;
+
+import org.jfree.util.ObjectList;
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+// TODO implement cloneable
+public class PolygonPlot
+extends      Plot
+{
+    public static final String PLOT_TYPE = "PolygonPlot";
+
+    public static final PlotOrientation DEFAULT_PLOT_ORIENTATION =
+        PlotOrientation.VERTICAL;
+
+    private PolygonDataset  dataset;
+    private transient PolygonRenderer renderer;
+
+    private PlotOrientation orientation;
+
+    private RectangleInsets axisOffset;
+
+    private ObjectList      domainAxisLocation;
+    private ObjectList      rangeAxisLocation;
+    private ObjectList      domainAxes;
+    private ObjectList      rangeAxes;
+
+
+    public PolygonPlot(PolygonDataset dataset, PolygonRenderer renderer) {
+        this(dataset, renderer, null, null, PlotOrientation.HORIZONTAL);
+    }
+
+
+    public PolygonPlot(
+        PolygonDataset  dataset,
+        PolygonRenderer renderer,
+        PlotOrientation orientation
+    ) {
+        this(dataset, renderer, null, null, orientation);
+    }
+
+
+    public PolygonPlot(
+        PolygonDataset  dataset,
+        PolygonRenderer renderer,
+        ValueAxis       domainAxis,
+        ValueAxis       rangeAxis,
+        PlotOrientation orientation
+    ) {
+        super();
+
+        this.dataset            = dataset;
+        this.renderer           = renderer;
+        this.domainAxes         = new ObjectList();
+        this.rangeAxes          = new ObjectList();
+        this.domainAxisLocation = new ObjectList();
+        this.rangeAxisLocation  = new ObjectList();
+        this.axisOffset         = RectangleInsets.ZERO_INSETS;
+
+        if (orientation != null)
+            this.orientation = orientation;
+        else
+            this.orientation = DEFAULT_PLOT_ORIENTATION;
+
+        if (domainAxis != null) {
+            this.domainAxes.set(0, domainAxis);
+            domainAxis.setPlot(this);
+        }
+        domainAxisLocation.set(0, AxisLocation.BOTTOM_OR_LEFT);
+
+        if (rangeAxis != null) {
+            this.rangeAxes.set(0, rangeAxis);
+            rangeAxis.setPlot(this);
+        }
+        rangeAxisLocation.set(0, AxisLocation.BOTTOM_OR_LEFT);
+
+        configureDomainAxis();
+        configureRangeAxis();
+    }
+
+
+    public void configureDomainAxis() {
+        // we just have 1 dataset
+        Range domainAxisRange = getDataset().getDomainBounds();
+
+        for (int i = 0; i < domainAxes.size(); i++) {
+            ValueAxis axis = (ValueAxis) domainAxes.get(i);
+
+            if (axis != null) {
+                axis.configure();
+                axis.setRange(domainAxisRange);
+            }
+        }
+    }
+
+    public ValueAxis getDomainAxis() {
+        return getDomainAxis(0);
+    }
+
+    public ValueAxis getDomainAxis(int index) {
+        return index < domainAxes.size()
+            ? (ValueAxis)domainAxes.get(index)
+            : null;
+    }
+
+    public ValueAxis getRangeAxis() {
+        return getRangeAxis(0);
+    }
+
+    public ValueAxis getRangeAxis(int index) {
+        return index < rangeAxes.size()
+            ? (ValueAxis)rangeAxes.get(index)
+            : null;
+    }
+
+    public  void configureRangeAxis() {
+        // we just have 1 dataset
+        Range rangeAxisRange = getDataset().getRangeBounds();
+
+        for (int i = 0; i < rangeAxes.size(); i++) {
+            ValueAxis axis = (ValueAxis) rangeAxes.get(i);
+
+            if (axis != null) {
+                axis.configure();
+                axis.setRange(rangeAxisRange);
+            }
+        }
+    }
+
+
+    public PolygonDataset getDataset(){
+        return this.dataset;
+    }
+
+
+    public String getPlotType() {
+        return PLOT_TYPE;
+    }
+
+
+    public  void setDataset(PolygonDataset dataset) {
+        this.dataset = dataset;
+    }
+
+
+    public void draw(
+        Graphics2D        g2,
+        Rectangle2D       area,
+        Point2D           anchor,
+        PlotState         parentState,
+        PlotRenderingInfo info
+    ) {
+        Graphics2D  savedG2       = g2;
+        Rectangle2D savedDataArea = area;
+
+        if (info != null) {
+            info.setPlotArea(area);
+            info.setDataArea(area);
+        }
+
+        AxisSpace space      = calculateAxisSpace(g2, area);
+        Rectangle2D dataArea = space.shrink(area, null);
+
+        // draw background and outline
+        drawBackground(g2, area);
+        drawOutline(g2, area);
+
+        Shape savedClip = g2.getClip();
+        g2.clip(area);
+
+        Composite originalComposite = g2.getComposite();
+        g2.setComposite(AlphaComposite.getInstance(
+            AlphaComposite.SRC_OVER,
+            getForegroundAlpha()
+        ));
+            
+        // draw axis
+        drawAxes(g2, area, dataArea, info);
+
+        if (!isEmptyOrNull(dataset)) {
+            // draw data
+            drawPolygons(savedG2, dataArea, info);
+            drawLabels(savedG2, dataArea, info);
+        }
+
+        g2.setClip(savedClip);
+        g2.setComposite(originalComposite);
+    }
+
+
+    private void drawAxes(
+        Graphics2D        g2,
+        Rectangle2D       plotArea,
+        Rectangle2D       dataArea,
+        PlotRenderingInfo plotState
+    ) {
+        AxisCollection axisCollection = new AxisCollection();
+
+        for (int i = 0; i < domainAxes.size(); i++) {
+            ValueAxis axis = (ValueAxis) domainAxes.get(i);
+            if (axis != null)
+                axisCollection.add(axis, getDomainAxisEdge(i));
+        }
+
+        for (int i = 0; i < rangeAxes.size(); i++) {
+            ValueAxis axis = (ValueAxis) rangeAxes.get(i);
+            if (axis != null)
+                axisCollection.add(axis, getRangeAxisEdge(i));
+        }
+
+        Map axisStateMap = new HashMap();
+
+        // draw the top axes
+        double cursor = dataArea.getMinY() - this.axisOffset.calculateTopOutset(
+                dataArea.getHeight());
+        Iterator iterator = axisCollection.getAxesAtTop().iterator();
+        while (iterator.hasNext()) {
+            ValueAxis axis = (ValueAxis) iterator.next();
+            AxisState info = axis.draw(g2, cursor, plotArea, dataArea,
+                    RectangleEdge.TOP, plotState);
+            cursor = info.getCursor();
+            axisStateMap.put(axis, info);
+        }
+
+        // draw the bottom axes
+        cursor = dataArea.getMaxY()
+                 + this.axisOffset.calculateBottomOutset(dataArea.getHeight());
+        iterator = axisCollection.getAxesAtBottom().iterator();
+        while (iterator.hasNext()) {
+            ValueAxis axis = (ValueAxis) iterator.next();
+            AxisState info = axis.draw(g2, cursor, plotArea, dataArea,
+                    RectangleEdge.BOTTOM, plotState);
+            cursor = info.getCursor();
+            axisStateMap.put(axis, info);
+        }
+
+        // draw the left axes
+        cursor = dataArea.getMinX()
+                 - this.axisOffset.calculateLeftOutset(dataArea.getWidth());
+        iterator = axisCollection.getAxesAtLeft().iterator();
+        while (iterator.hasNext()) {
+            ValueAxis axis = (ValueAxis) iterator.next();
+            AxisState info = axis.draw(g2, cursor, plotArea, dataArea,
+                    RectangleEdge.LEFT, plotState);
+            cursor = info.getCursor();
+            axisStateMap.put(axis, info);
+        }
+
+        // draw the right axes
+        cursor = dataArea.getMaxX()
+                 + this.axisOffset.calculateRightOutset(dataArea.getWidth());
+        iterator = axisCollection.getAxesAtRight().iterator();
+        while (iterator.hasNext()) {
+            ValueAxis axis = (ValueAxis) iterator.next();
+            AxisState info = axis.draw(g2, cursor, plotArea, dataArea,
+                    RectangleEdge.RIGHT, plotState);
+            cursor = info.getCursor();
+            axisStateMap.put(axis, info);
+        }
+    }
+
+
+    private void drawLabels(
+        Graphics2D        g2,
+        Rectangle2D       area,
+        PlotRenderingInfo info
+    ) {
+        renderer.drawLabels(g2, this, area, dataset);
+    }
+
+    private void drawPolygons(
+        Graphics2D        g2,
+        Rectangle2D       area,
+        PlotRenderingInfo info
+    ) {
+        renderer.drawPolygons(g2, this, area, dataset);
+    }
+
+
+    private AxisSpace calculateAxisSpace(Graphics2D  g2, Rectangle2D plotArea) {
+        AxisSpace space         = new AxisSpace();
+        space                   = calculateRangeAxisSpace(g2, plotArea, space);
+        Rectangle2D tmpPlotArea = space.shrink(plotArea, null);
+        space                   = calculateDomainAxisSpace(g2, plotArea, space);
+
+        return space;
+    }
+
+
+    private AxisSpace calculateDomainAxisSpace(
+        Graphics2D  g2,
+        Rectangle2D plotArea,
+        AxisSpace   space
+    ) {
+        if (space == null)
+            space = new AxisSpace();
+
+        for (int i = 0; i < domainAxes.size(); i++) {
+            Axis axis = (Axis) domainAxes.get(i);
+
+            if (axis != null) {
+                RectangleEdge edge = getDomainAxisEdge(i);
+                space = axis.reserveSpace(g2, this, plotArea, edge, space);
+            }
+        }
+
+        return space;
+    }
+
+
+    private AxisSpace calculateRangeAxisSpace(
+        Graphics2D  g2,
+        Rectangle2D plotArea,
+        AxisSpace   space
+    ) {
+        if (space == null)
+            space = new AxisSpace();
+
+        for (int i = 0; i < rangeAxes.size(); i++) {
+            Axis axis = (Axis) rangeAxes.get(i);
+
+            if (axis != null) {
+                RectangleEdge edge = getRangeAxisEdge(i);
+                space = axis.reserveSpace(g2, this, plotArea, edge, space);
+            }
+        }
+
+        return space;
+    }
+
+    public RectangleEdge getDomainAxisEdge() {
+        return Plot.resolveDomainAxisLocation(
+            getDomainAxisLocation(), orientation
+        );
+    }
+
+
+    public RectangleEdge getDomainAxisEdge(int idx) {
+        AxisLocation  location = getDomainAxisLocation(idx);
+        RectangleEdge result   = Plot.resolveDomainAxisLocation(
+            location, orientation
+        );
+
+        if (result == null)
+            result = RectangleEdge.opposite(getDomainAxisEdge());
+
+        return result;
+    }
+
+
+    public RectangleEdge getRangeAxisEdge() {
+        return Plot.resolveRangeAxisLocation(
+            getRangeAxisLocation(), orientation
+        );
+    }
+
+
+    public RectangleEdge getRangeAxisEdge(int idx) {
+        AxisLocation  location = getRangeAxisLocation(idx);
+        RectangleEdge result   = Plot.resolveRangeAxisLocation(
+            location,
+            orientation
+        );
+
+        if (result == null)
+            result = RectangleEdge.opposite(getRangeAxisEdge());
+
+        return result;
+    }
+
+
+    public AxisLocation getDomainAxisLocation() {
+        return (AxisLocation) domainAxisLocation.get(0);
+    }
+
+
+    public AxisLocation getDomainAxisLocation(int idx) {
+        if (idx < domainAxisLocation.size())
+            return (AxisLocation) domainAxisLocation.get(idx);
+
+        return null;
+    }
+
+
+    public AxisLocation getRangeAxisLocation() {
+        return (AxisLocation) rangeAxisLocation.get(0);
+    }
+
+
+    public AxisLocation getRangeAxisLocation(int idx) {
+        if (idx < rangeAxisLocation.size())
+            return (AxisLocation) rangeAxisLocation.get(idx);
+
+        return null;
+    }
+
+
+    private boolean isEmptyOrNull(PolygonDataset dataset) {
+        if (dataset != null) {
+            int seriesCount = dataset.getSeriesCount();
+            for (int s = 0; s < seriesCount; s++) {
+                PolygonSeries series = dataset.getSeries(s);
+                if (series.getItemCount() > 0) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,242 @@
+package de.intevation.gnv.jfreechart;
+
+import java.util.ArrayList;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.awt.Shape;
+import java.awt.BasicStroke;
+import java.awt.FontMetrics;
+import java.awt.Font;
+
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.Rectangle2D.Double;
+
+import org.jfree.data.Range;
+
+import org.jfree.chart.axis.ValueAxis;
+
+import org.jfree.ui.RectangleEdge;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.text.TextUtilities;
+
+
+/**
+ * @author Ingo Weinzierl      (ingo.weinzierl@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class PolygonRenderer
+{
+	private static Logger log = Logger.getLogger(
+		PolygonRenderer.class);
+
+    public interface PaintLookup {
+
+        Paint getPaint(int index);
+
+    } // interface PaintLookup
+
+    public static class DefaultLabelGenerator
+    implements          PolygonSeriesLabelGenerator
+    {
+        public DefaultLabelGenerator() {
+        }
+
+        public String generateLabel(PolygonSeries series) {
+            Object label = series.getAttribute("label");
+            return label != null
+                ? toString(label)
+                : null;
+        }
+
+        protected String toString(Object label) {
+            return label.toString();
+        }
+    } // class DefaultLabelGenerator
+
+    public static final PolygonSeriesLabelGenerator 
+        DEFAULT_LABEL_GENERATOR_INSTANCE = new DefaultLabelGenerator();
+
+    protected PaintLookup                 lookup;
+    protected PolygonSeriesLabelGenerator labelGenerator;
+
+    public PolygonRenderer(PaintLookup lookup) {
+        this(lookup, null);
+    }
+
+    public PolygonRenderer(
+        PaintLookup                 lookup, 
+        PolygonSeriesLabelGenerator labelGenerator
+    ) {
+        this.lookup         = lookup;
+        this.labelGenerator = labelGenerator;
+    }
+
+    public void drawPolygons(
+        Graphics2D     graphics,
+        PolygonPlot    plot,
+        Rectangle2D    area,
+        PolygonDataset dataset
+    ) {
+        int seriesCount = dataset.getSeriesCount();
+        for (int i = 0; i < seriesCount; i++) {
+            PolygonSeries series   = dataset.getSeries(i);
+            Integer       colorIdx = (Integer)series.getAttribute("fill");
+
+            if (colorIdx != null) {
+                Paint paint = lookup.getPaint(colorIdx.intValue());
+                graphics.setPaint(paint != null ? paint : Color.black);
+                graphics.fill(constructShape(plot, area, series, true));
+            }
+            else {
+                Number lineWidth = (Number)series.getAttribute("line.width");
+                BasicStroke stroke = new BasicStroke(
+                    lineWidth != null ? lineWidth.floatValue() : 1f);
+                graphics.setStroke(stroke);
+                graphics.setPaint(Color.black);
+                graphics.draw(constructShape(plot, area, series, false));
+            }
+        }
+    }
+
+    public void drawLabels(
+        final Graphics2D  graphics,
+        final PolygonPlot plot,
+        final Rectangle2D area,
+        PolygonDataset    dataset
+    ) {
+        if (labelGenerator == null) {
+            return;
+        }
+
+        final ArrayList<Rectangle2D> bboxes = new ArrayList<Rectangle2D>();
+
+        Font font = graphics.getFont();
+        font = font.deriveFont(Font.PLAIN, Math.max(8, font.getSize()-3));
+        graphics.setFont(font);
+        FontMetrics metrics = graphics.getFontMetrics(font);
+
+        for (int i = dataset.getSeriesCount()-1; i >= 0; --i) {
+            PolygonSeries series = dataset.getSeries(i);
+
+            String label = labelGenerator.generateLabel(series);
+            if (label == null) {
+                continue;
+            }
+
+            final Rectangle2D box = TextUtilities.getTextBounds(
+                label, graphics, metrics);
+
+            for (int j = series.getItemCount()-1; j >= 0; --j) {
+                final CompactXYItems ring = series.getItem(j);
+                LevelOrderIndices loi = new LevelOrderIndices(ring.size()-1);
+                Rectangle2D r = (Rectangle2D)loi.visit(
+                    new LevelOrderIndices.Visitor() 
+                {
+                    ValueAxis          da = plot.getDomainAxis();
+                    ValueAxis          ra = plot.getRangeAxis();
+                    RectangleEdge      de = plot.getDomainAxisEdge();
+                    RectangleEdge      re = plot.getRangeAxisEdge();
+                    Rectangle2D.Double r  = new Rectangle2D.Double(
+                        0d, 0d, box.getWidth(), box.getHeight());
+
+                    public Object visit(int index) {
+                        r.x = da.valueToJava2D(ring.getX(index), area, de) 
+                            - 0.5*box.getWidth();
+                        r.y = ra.valueToJava2D(ring.getY(index), area, re)
+                            + 0.5*box.getHeight();
+
+                        for (Rectangle2D b: bboxes) {
+                            if (b.intersects(r)) {
+                                return null;
+                            }
+                        }
+                        return r;
+                    }
+                });
+
+                if (r != null) {
+                    bboxes.add(r);
+                    graphics.drawString(
+                        label, (float)r.getX(), (float)r.getY());
+                }
+            } // for all items in series
+        } // for all series
+    }
+
+    protected Shape constructShape(
+        PolygonPlot   plot,
+        Rectangle2D   area,
+        PolygonSeries series, 
+        boolean       close
+    ) {
+        ValueAxis     da = plot.getDomainAxis();
+        ValueAxis     ra = plot.getRangeAxis();
+        RectangleEdge de = plot.getDomainAxisEdge();
+        RectangleEdge re = plot.getRangeAxisEdge();
+
+        CompactXYItems [] rings = series.getRings();
+        GeneralPath       path  = new GeneralPath();
+
+        for (int i = 0; i < rings.length; ++i) {
+
+            CompactXYItems ring = rings[i];
+
+            double [] data = ring.getData();
+
+            if (data.length >= 2) {
+                path.moveTo(
+                    (float)da.valueToJava2D(data[0], area, de),
+                    (float)ra.valueToJava2D(data[1], area, re));
+            }
+            for (int j = 2; j < data.length;) {
+                path.lineTo(
+                    (float)da.valueToJava2D(data[j++], area, de),
+                    (float)ra.valueToJava2D(data[j++], area, re));
+            }
+            if (close) {
+                path.closePath();
+            }
+        }
+        return path;
+    }
+
+    public Rectangle2D getBoundingBox(PolygonDataset dataset) {
+        Rectangle2D bbox = null;
+
+        for (int i = 0, N = dataset.getSeriesCount(); i < N; i++) {
+            Range domain = dataset.getSeries(i).getDomainBounds();
+            Range range  = dataset.getSeries(i).getRangeBounds();
+
+            double x = domain.getLowerBound();
+            double y = range.getLowerBound();
+            double w = Math.abs(domain.getUpperBound() - x);
+            double h = Math.abs(range.getUpperBound() - y);
+
+            if (bbox == null) {
+                bbox = new Rectangle2D.Double(x, y, w, h);
+            }
+            else {
+                bbox.add(new Rectangle2D.Double(x, y, w, h));
+            }
+        }
+
+        return bbox;
+    }
+
+    public Rectangle2D getBounds(PolygonSeries series) {
+
+        Range domain = series.getDomainBounds();
+        Range range  = series.getRangeBounds();
+
+        return new Rectangle2D.Double(
+            domain.getLowerBound(), range.getLowerBound(),
+            domain.getUpperBound(), range.getUpperBound()
+        );
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonSeries.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,172 @@
+package de.intevation.gnv.jfreechart;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import org.jfree.data.Range;
+import org.jfree.data.general.Series;
+
+/**
+ * @author Sascha Teichmann <sascha.teichmann@intevation.de>
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class PolygonSeries
+extends      Series
+{
+    protected CompactXYItems []  rings;
+    protected Map                attributes;
+
+    private static long uniqueKey;
+
+    protected synchronized static Long createUniqueKey() {
+        return new Long(uniqueKey++);
+    }
+
+    public PolygonSeries() {
+        this(createUniqueKey(), null);
+    }
+
+    public PolygonSeries(Comparable key, CompactXYItems [] rings) {
+        this(key, null, rings, new HashMap());
+    }
+
+    public PolygonSeries(
+        Comparable       key,
+        String           description,
+        CompactXYItems[] rings
+    ) {
+        this(key, description, rings, new HashMap());
+    }
+
+    public PolygonSeries(
+        Comparable        key,
+        String            description,
+        CompactXYItems [] rings,
+        Map               attributes
+    ) {
+        super(key, description);
+        this.rings      = rings;
+        this.attributes = attributes;
+    }
+
+
+    public void setRings(CompactXYItems [] rings) {
+        this.rings = rings;
+    }
+
+    public CompactXYItems [] getRings() {
+        return rings;
+    }
+
+    public void addRing(CompactXYItems newRing) {
+        if (rings == null) {
+            rings = new CompactXYItems [] { newRing };
+        }
+        else {
+            CompactXYItems [] nRings = new CompactXYItems[rings.length + 1];
+            System.arraycopy(rings, 0, nRings, 0, rings.length);
+            nRings[rings.length] = newRing;
+            rings = nRings;
+        }
+    }
+
+    public void addRings(CompactXYItems [] newRings) {
+        if (newRings == null || newRings.length == 0) {
+            return;
+        }
+        if (rings == null || rings.length == 0) {
+            rings = newRings;
+        }
+        else {
+            CompactXYItems [] both =
+                new CompactXYItems[rings.length + newRings.length];
+            System.arraycopy(rings, 0, both, 0, rings.length);
+            System.arraycopy(newRings, 0, both, rings.length, newRings.length);
+            rings = both;
+        }
+    }
+
+    public Object getAttribute(Object key) {
+        return attributes.get(key);
+    }
+
+
+    public Object setAttribute(Object key, Object value) {
+        return attributes.put(key, value);
+    }
+
+
+    public int getItemCount() {
+        return rings != null ? rings.length : 0;
+    }
+
+
+    public CompactXYItems getItem(int idx) {
+        return rings[idx];
+    }
+
+
+    public Object removeAttribute(Object key) {
+        return attributes.remove(key);
+    }
+
+
+    public boolean hasAttribute(Object key) {
+        return attributes.containsKey(key);
+    }
+
+
+    public Range getDomainBounds() {
+        double upper = Double.NEGATIVE_INFINITY;
+        double lower = Double.POSITIVE_INFINITY;
+        int    count = getItemCount();
+
+        for (int i = 0; i < count; i++) {
+            CompactXYItems  items = getItem(i);
+            double          minX  = items.getMinX();
+            double          maxX  = items.getMaxX();
+
+            if (!Double.isNaN(minX)) {
+                lower = Math.min(lower, minX);
+            }
+
+            if (!Double.isNaN(maxX)) {
+                upper = Math.max(upper, maxX);
+            }
+        }
+
+        if (lower > upper) {
+            return null;
+        }
+
+        return new Range(lower, upper);
+    }
+
+
+    public Range getRangeBounds() {
+        double upper = Double.NEGATIVE_INFINITY;
+        double lower = Double.POSITIVE_INFINITY;
+        int    count = getItemCount();
+
+        for (int i = 0; i < count; i++) {
+            CompactXYItems  items = getItem(i);
+            double          minY  = items.getMinY();
+            double          maxY  = items.getMaxY();
+
+            if (!Double.isNaN(minY)) {
+                lower = Math.min(lower, minY);
+            }
+
+            if (!Double.isNaN(maxY)) {
+                upper = Math.max(upper, maxY);
+            }
+        }
+
+        if (lower > upper) {
+            return null;
+        }
+
+        return new Range(lower, upper);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonSeriesLabelGenerator.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+package de.intevation.gnv.jfreechart;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public interface PolygonSeriesLabelGenerator
+{
+    String generateLabel(PolygonSeries series);
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/AreaInterpolation.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,160 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+
+import com.vividsolutions.jts.index.strtree.STRtree;
+
+import java.awt.Dimension;
+
+import java.io.Serializable;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+/**
+ *  @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class AreaInterpolation
+implements   Serializable
+{
+    private static Logger log = Logger.getLogger(AreaInterpolation.class);
+
+    protected double [] raster;
+
+    protected int width;
+    protected int height;
+
+    public AreaInterpolation() {
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public int getHeight() {
+        return height;
+    }
+
+    public double [] getRaster() {
+        return raster;
+    }
+
+    public static final double EPS = 1e-6d;
+
+
+    public boolean interpolate(
+        List<? extends Point2d> points,
+        Envelope                boundingBox,
+        Dimension               samples,
+        XYDepth                 depth
+    ) {
+        boolean debug = log.isDebugEnabled();
+
+        if (points == null || points.isEmpty()) {
+            log.warn("no points to interpolate");
+            return false;
+        }
+
+        List<GridCell> cells = GridCell.pointsToGridCells(
+            points,
+            Interpolation2D.relevantArea(
+                boundingBox,
+                points));
+
+        if (cells.isEmpty()) {
+            log.warn("no cells to interpolate");
+            return false;
+        }
+
+        int W = samples.width;
+        int H = samples.height;
+
+        double cellWidth  = boundingBox.getWidth()  / W;
+        double cellHeight = boundingBox.getHeight() / H;
+
+        STRtree spatialIndex = new STRtree();
+
+        for (GridCell cell: cells) {
+            spatialIndex.insert(cell.getEnvelope(), cell);
+        }
+
+        if (debug) {
+            log.debug("width:  "        + boundingBox.getWidth());
+            log.debug("height:  "       + boundingBox.getHeight());
+            log.debug("sample width:  " + W);
+            log.debug("sample height: " + H);
+            log.debug("cell width:  "   + cellWidth);
+            log.debug("cell height: "   + cellHeight);
+        }
+
+        Envelope   queryBuffer     = new Envelope();
+        Coordinate center          = new Coordinate();
+        GridCell.CellFinder finder = new GridCell.CellFinder();
+
+        double [] raster = new double[W*H];
+        Arrays.fill(raster, Double.NaN);
+
+        double minX = boundingBox.getMinX();
+        double minY = boundingBox.getMinY();
+
+        long startTime = System.currentTimeMillis();
+
+        int pos = 0;
+        for (int j = 0; j < H; ++j) {
+
+            double y = j*cellHeight + 0.5d*cellHeight + minY;
+            double x = 0.5d*cellWidth + minX;
+
+            for (int end = pos + W; pos < end; ++pos, x += cellWidth) {
+
+                queryBuffer.init(x - EPS, x + EPS, y - EPS, y + EPS);
+                center.x = x; center.y = y;
+                finder.prepare(center);
+                spatialIndex.query(queryBuffer, finder);
+
+                GridCell found = finder.found;
+
+                if (found == null || depth.depth(center) > 0d) {
+                    continue;
+                }
+
+                double z1 = Interpolation2D.interpolate(
+                    found.p1.x, found.p1.z,
+                    found.p2.x, found.p2.z,
+                    center.x);
+                double z2 = Interpolation2D.interpolate(
+                    found.p3.x, found.p3.z,
+                    found.p4.x, found.p4.z,
+                    center.x);
+                double y1 = Interpolation2D.interpolate(
+                    found.p1.x, found.p1.y,
+                    found.p2.x, found.p2.y,
+                    center.x);
+                double y2 = Interpolation2D.interpolate(
+                    found.p3.x, found.p3.y,
+                    found.p4.x, found.p4.y,
+                    center.x);
+                raster[pos] = Interpolation2D.interpolate(
+                    y1, z1,
+                    y2, z2,
+                    center.y);
+            }
+        }
+
+        long stopTime = System.currentTimeMillis();
+
+        if (debug) {
+            log.debug("interpolation took: " + (stopTime - startTime)/1000f + " secs");
+        }
+
+        this.raster = raster;
+        this.width  = W;
+        this.height = H;
+
+        return true;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/AttributedPoint2ds.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,80 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.MultiLineString;
+import com.vividsolutions.jts.geom.MultiPolygon;
+
+import de.intevation.gnv.utils.Pair;
+
+import java.io.Serializable;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *  @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class AttributedPoint2ds
+implements   Serializable
+{
+    protected List<? extends Point2d>             points;
+    protected Map                                 attributes;
+    protected AreaInterpolation                   interpolation;
+    protected List<Pair<Object, MultiLineString>> lineStrings;
+    protected Map<Integer, MultiPolygon>          polygons;
+
+    public AttributedPoint2ds() {
+    }
+
+    public AttributedPoint2ds(List<? extends Point2d> points) {
+        this.points = points;
+    }
+
+    public Object getAttribute(Object key) {
+        return attributes != null
+            ? attributes.get(key)
+            : null;
+    }
+
+    public void setAttribute(Object key, Object value) {
+        if (attributes == null) {
+            attributes = new HashMap();
+        }
+        attributes.put(key, value);
+    }
+
+    public List<? extends Point2d> getPoints() {
+        return points;
+    }
+
+    public void setPoints(List<? extends Point2d> points) {
+        this.points = points;
+    }
+
+    public void setInterpolation(AreaInterpolation interpolation) {
+        this.interpolation = interpolation;
+    }
+
+    public AreaInterpolation getInterpolation() {
+        return interpolation;
+    }
+
+    public void setPolygons(Map<Integer, MultiPolygon> polygons) {
+        this.polygons = polygons;
+    }
+
+    public Map<Integer, MultiPolygon> getPolygons() {
+        return polygons;
+    }
+
+    public void setLineStrings(
+        List<Pair<Object, MultiLineString>> lineStrings
+    ) {
+        this.lineStrings = lineStrings;
+    }
+
+    public List<Pair<Object, MultiLineString>> getLineStrings() {
+        return lineStrings;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/AttributedXYColumns.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,72 @@
+package de.intevation.gnv.math;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
+
+import java.io.Serializable;
+
+import de.intevation.gnv.jfreechart.PolygonDataset; 
+
+/**
+ *  @author Ingo Weinzierl      (ingo.weinzierl@intevation.de)
+ *  @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class AttributedXYColumns
+implements   Serializable
+{
+    protected List<? extends XYColumn> columns;
+    protected Map                      attributes;
+    protected Interpolation3D          interpolation;
+    protected PolygonDataset           dataset;
+
+    public AttributedXYColumns() {
+    }
+
+    public AttributedXYColumns(List<? extends XYColumn> columns) {
+        this(columns, null);
+    }
+
+    public AttributedXYColumns(List<? extends XYColumn> columns, Map attributes) {
+        this.columns    = columns;
+        this.attributes = attributes;
+    }
+
+    public Object getAttribute(Object key) {
+        return attributes != null
+            ? attributes.get(key)
+            : null;
+    }
+
+    public void setAttribute(Object key, Object value) {
+        if (attributes == null) {
+            attributes = new HashMap();
+        }
+        attributes.put(key, value);
+    }
+
+    public List<? extends XYColumn> getXYColumns() {
+        return columns;
+    }
+
+    public void setXYColumns(List<? extends XYColumn> columns) {
+        this.columns = columns;
+    }
+
+    public void setInterpolation(Interpolation3D interpolation) {
+        this.interpolation = interpolation;
+    }
+
+    public Interpolation3D getInterpolation() {
+        return interpolation;
+    }
+
+    public void setPolygonDataset(PolygonDataset dataset) {
+        this.dataset = dataset;
+    }
+
+    public PolygonDataset getPolygonDataset() {
+        return dataset;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/ConstantFunction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,24 @@
+package de.intevation.gnv.math;
+
+import org.apache.commons.math.analysis.UnivariateRealFunction;
+
+/**
+ * @author Sascha L. Teichmann <sascha.teichmann@intevation.de>
+ */
+public class ConstantFunction
+implements   UnivariateRealFunction
+{
+    protected double value;
+    
+    public ConstantFunction() {
+    }
+
+    public ConstantFunction(double value) {
+        this.value = value;
+    }
+
+    public double value(double x) {
+        return value;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/ConstantXYDepth.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,24 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class ConstantXYDepth
+implements   XYDepth
+{
+    protected double depth;
+
+    public ConstantXYDepth() {
+    }
+
+    public ConstantXYDepth(double depth) {
+        this.depth = depth;
+    }
+
+    public double depth(Coordinate coordinate) {
+        return depth;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/GridCell.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,159 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.LinearRing;
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.geom.Polygon;
+
+import com.vividsolutions.jts.index.ItemVisitor;
+
+import java.io.Serializable;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+/**
+ *  @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class GridCell
+implements   Serializable
+{
+    private static Logger log = Logger.getLogger(GridCell.class);
+
+    public static final class CellFinder
+    implements                ItemVisitor
+    {
+        public    GridCell found;
+
+        protected Point    point;
+
+        public CellFinder() {
+        }
+
+        public void prepare(Coordinate center) {
+            found = null;
+            point = GEOMETRY_FACTORY.createPoint(center);
+        }
+
+        public void visitItem(Object item) {
+            if (found == null) {
+                GridCell cell = (GridCell)item;
+                if (cell.contains(point)) {
+                    found = cell;
+                }
+            }
+        }
+    } // class CellFinder
+
+    public Point2d p1;
+    public Point2d p2;
+    public Point2d p3;
+    public Point2d p4;
+
+    protected Polygon polygon;
+
+    public static final GeometryFactory GEOMETRY_FACTORY
+        = new GeometryFactory();
+
+    public GridCell() {
+    }
+
+    public GridCell(Point2d p1, Point2d p2, Point2d p3, Point2d p4) {
+        this.p1 = p1;
+        this.p2 = p2;
+        this.p3 = p3;
+        this.p4 = p4;
+        createPolygon();
+    }
+
+    protected void createPolygon() {
+        LinearRing shell = GEOMETRY_FACTORY
+            .createLinearRing(new Coordinate [] { p1, p2, p3, p4, p1 });
+        polygon = GEOMETRY_FACTORY.createPolygon(shell, null);
+    }
+
+    public Envelope getEnvelope() {
+        return polygon.getEnvelopeInternal();
+    }
+
+    public boolean contains(Geometry coord) {
+        return polygon.contains(coord);
+    }
+
+    public static List<GridCell> pointsToGridCells(
+        List<? extends Point2d> points
+    ) {
+        return pointsToGridCells(points, null);
+    }
+
+    public static List<GridCell> pointsToGridCells(
+        List<? extends Point2d> points,
+        Envelope                relevantArea
+    ) {
+        int minI = Integer.MAX_VALUE;
+        int maxI = Integer.MIN_VALUE;
+        int minJ = Integer.MAX_VALUE;
+        int maxJ = Integer.MIN_VALUE;
+
+        HashMap<Integer, HashMap<Integer, Point2d>> rows =
+            new HashMap<Integer, HashMap<Integer, Point2d>>();
+
+        int culled = 0;
+
+        for (Point2d p: points) {
+
+            if (relevantArea != null && !relevantArea.contains(p.x, p.y)) {
+                ++culled;
+                continue;
+            }
+
+            if (p.i < minI) minI = p.i;
+            if (p.i > maxI) maxI = p.i;
+            if (p.j < minJ) minJ = p.j;
+            if (p.j > maxJ) maxJ = p.j;
+
+            HashMap<Integer, Point2d> row = rows.get(p.i);
+
+            if (row == null) {
+                rows.put(p.i, row = new HashMap<Integer, Point2d>());
+            }
+
+            row.put(p.j, p);
+        }
+
+        ArrayList<GridCell> cells = new ArrayList<GridCell>(points.size());
+
+        for (int i = minI + 1; i <= maxI; ++i) {
+            HashMap<Integer, Point2d> row1 = rows.get(i-1);
+            HashMap<Integer, Point2d> row2 = rows.get(i);
+            if (row1 != null && row2 != null) {
+                for (int j = minJ + 1; j < maxJ; ++j) {
+                    Point2d p1 = row1.get(j-1);
+                    Point2d p2 = row1.get(j);
+                    Point2d p3 = row2.get(j);
+                    Point2d p4 = row2.get(j-1);
+
+                    if (p1 != null && p2 != null &&  p3 != null && p4 != null) {
+                        cells.add(new GridCell(p1, p2, p3, p4));
+                    }
+                } // for all columns in row
+            }
+        } // for all rows
+
+        if (log.isDebugEnabled()) {
+            log.debug("culled points: " + culled);
+            log.debug("min/max i: " + minI + " / " + maxI);
+            log.debug("min/max j: " + minJ + " / " + maxJ);
+            log.debug("cells found: " + cells.size());
+        }
+
+        return cells;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/HeightValue.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,46 @@
+package de.intevation.gnv.math;
+
+import java.io.Serializable;
+
+import java.util.Comparator;
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ * @author Sascha L. Teichmann <sascha.teichmann@intevation.de>
+ */
+public class HeightValue
+implements   Serializable
+{
+    public static final Comparator INV_Z_COMPARATOR = new Comparator() {
+        public int compare(Object a, Object b) {
+            HeightValue ha = (HeightValue)a;
+            HeightValue hb = (HeightValue)b;
+            if (ha.z > hb.z) return -1;
+            if (ha.z < hb.z) return +1;
+            return 0;
+        }
+    };
+
+    public double z;
+    public double v;
+    public int    k;
+
+    public HeightValue(double z, double v, int k) {
+        this.z = z;
+        this.v = v;
+        this.k = k;
+    }
+
+    public double getZ() {
+        return z;
+    }
+
+    public double getV() {
+        return v;
+    }
+
+    public double getK() {
+        return k;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/IJKey.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,39 @@
+package de.intevation.gnv.math;
+
+import java.io.Serializable;
+
+/**
+ * @author Sascha L. Teichmann <sascha.teichmann@intevation.de>
+ */
+public class IJKey
+implements   Serializable
+{
+    public int i;
+    public int j;
+
+    public IJKey() {
+    }
+
+    public IJKey(int i, int j) {
+        this.i = i;
+        this.j = j;
+    }
+
+    public void sort() {
+        if (i > j) {
+            int t = i;
+            i = j;
+            j = t;
+        }
+    }
+
+    public int hashCode() {
+        return (i << 16) | j;
+    }
+
+    public boolean equals(Object obj) {
+        IJKey other = (IJKey)obj;
+        return i == other.i && j == other.j;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation2D.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,241 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+
+import com.vividsolutions.jts.index.strtree.STRtree;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+/**
+ *  @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public final class Interpolation2D
+{
+    private static Logger log = Logger.getLogger(Interpolation2D.class);
+
+    public static final int CULL_POINT_THRESHOLD = Integer.getInteger(
+        "gnv.interpolation2d.cull.point.threshold", 1000);
+
+    public static final double EPS = 1e-6d;
+
+    public interface Consumer {
+        void interpolated(Coordinate point, boolean success);
+    } // interface Consumer
+
+    private Interpolation2D() {
+    }
+
+    public static final Envelope relevantArea(
+        List<? extends Coordinate> path,
+        List<? extends Coordinate> points
+    ) {
+        return relevantArea(path, points, CULL_POINT_THRESHOLD);
+    }
+
+    public static final Envelope relevantArea(
+        Envelope                   pathBBox,
+        List<? extends Coordinate> points
+    ) {
+        return relevantArea(pathBBox, points, CULL_POINT_THRESHOLD);
+    }
+
+    public static final Envelope relevantArea(
+        Envelope                   pathBBox,
+        List<? extends Coordinate> points,
+        int                        threshold
+    ) {
+        return points.size() < threshold
+            ? null
+            : relevantArea(
+                pathBBox,
+                pointsBoundingBox(points));
+    }
+
+    public static final Envelope relevantArea(
+        List<? extends Coordinate> path,
+        List<? extends Coordinate> points,
+        int                        threshold
+    ) {
+        return points.size() < threshold || path.isEmpty()
+            ? null
+            : relevantArea(
+                pointsBoundingBox(path),
+                pointsBoundingBox(points));
+    }
+
+    public static final Envelope relevantArea(
+        Envelope pathBBox,
+        Envelope pointsBBox
+    ) {
+        double pathArea   = pathBBox.getWidth()*pathBBox.getHeight();
+        double pointsArea = pointsBBox.getWidth()*pointsBBox.getHeight();
+
+        if (pathArea > 0.8d*pointsArea) { return null; }
+
+        double nArea = 1.44d * pathArea;
+        if (nArea < 0.1d*pointsArea) nArea = 0.1d*pointsArea;
+        double w = pathBBox.getWidth();
+        double h = pathBBox.getHeight();
+        double [] d = solveQuadratic(1d, w+h, pathArea - nArea);
+
+        if (d == null) { return null; }
+
+        double extra = pos(d);
+
+        pathBBox.expandBy(extra);
+
+        return pathBBox;
+    }
+
+    public static final double [] solveQuadratic(
+        double a, double b, double c
+    ) {
+        double d = b*b - 4d*a*c;
+        if (d < 0d) { return null; }
+
+        d = Math.sqrt(d);
+        a = 1d/(2d*a);
+        b = -b;
+
+        return new double [] { a*(b + d), a*(b - d) };
+    }
+
+    public static final double pos(double [] x) {
+        return x[0] >= 0 ? x[0] : x[1];
+    }
+
+
+    public static Envelope pointsBoundingBox(
+        List<? extends Coordinate> path
+    ) {
+        int N = path.size();
+        Envelope area = new Envelope(path.get(N-1));
+
+        for (int i = N-2; i >= 0; --i) {
+            area.expandToInclude(path.get(i));
+        }
+
+        return area;
+    }
+
+    public static void interpolate(
+        List<? extends Coordinate> path,
+        List<? extends Point2d>    points,
+        double                     from,
+        double                     to,
+        int                        steps,
+        Metrics                    metrics,
+        Consumer                   consumer
+    ) {
+        boolean debug = log.isDebugEnabled();
+
+        int N = path.size();
+        int M = points.size();
+
+        if (debug) {
+            log.debug("Size of path: " + N);
+            log.debug("Size of points: " + M);
+        }
+
+        if (M < 1 || N < 2) { // nothing to do
+            return;
+        }
+
+        List<GridCell> cells = GridCell.pointsToGridCells(
+            points, relevantArea(path, points));
+
+        if (cells.isEmpty()) {
+            log.warn("no cells found");
+            return;
+        }
+
+        // put into spatial index to speed up finding neighbors.
+        STRtree spatialIndex = new STRtree();
+
+        for (GridCell cell: cells) {
+            spatialIndex.insert(cell.getEnvelope(), cell);
+        }
+
+        LinearToMap linearToMap = new LinearToMap(
+            path, from, to, metrics);
+
+        double dP = (to - from)/steps;
+
+        Coordinate          center      = new Coordinate();
+        Envelope            queryBuffer = new Envelope();
+        GridCell.CellFinder finder      = new GridCell.CellFinder();
+
+        int missedInterpolations = 0;
+        int interpolations       = 0;
+
+        for (double p = from; p <= to; p += dP) {
+            if (!linearToMap.locate(p, center)) {
+                continue;
+            }
+            queryBuffer.init(
+                center.x - EPS, center.x + EPS, 
+                center.y - EPS, center.y + EPS);
+
+            finder.prepare(center);
+            spatialIndex.query(queryBuffer, finder);
+
+            GridCell found = finder.found;
+
+            if (found == null) {
+                consumer.interpolated(center, false);
+                ++missedInterpolations;
+                continue;
+            }
+
+            Point2d n0 = found.p1;
+            Point2d n1 = found.p2;
+            Point2d n2 = found.p3;
+            Point2d n3 = found.p4;
+
+            double z1 = interpolate(
+                n0.x, n0.z,
+                n1.x, n1.z,
+                center.x);
+            double z2 = interpolate(
+                n2.x, n2.z,
+                n3.x, n3.z,
+                center.x);
+            double y1 = interpolate(
+                n0.x, n0.y,
+                n1.x, n1.y,
+                center.x);
+            double y2 = interpolate(
+                n2.x, n2.y,
+                n3.x, n3.y,
+                center.x);
+            center.z = interpolate(
+                y1, z1,
+                y2, z2,
+                center.y);
+            consumer.interpolated(center, true);
+            ++interpolations;
+        }
+
+        if (debug) {
+            log.debug("interpolations: " + 
+                interpolations + " / " + missedInterpolations);
+        }
+    }
+
+    public static final double interpolate(
+        double x1, double y1,
+        double x2, double y2,
+        double x
+    ) {
+        if (x2 == x1) {
+            return (y1 + y2)*0.5d;
+        }
+        double m = (y2-y1)/(x2-x1);
+        double b = y1 - m*x1;
+        return m*x + b;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation3D.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,241 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+
+import com.vividsolutions.jts.index.strtree.STRtree;
+
+import java.awt.Dimension;
+
+import java.io.Serializable;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class Interpolation3D
+implements   Serializable
+{
+    private static Logger log = Logger.getLogger(Interpolation3D.class);
+
+    public static final int DEFAULT_WIDTH  = 1024;
+    public static final int DEFAULT_HEIGHT =  768;
+
+    public static final double EPS = 1e-6d;
+
+    protected int width;
+    protected int height;
+
+    protected double cellWidth;
+    protected double cellHeight;
+
+    protected double [] raster;
+    protected double [] depths;
+
+    public Interpolation3D() {
+        this(DEFAULT_WIDTH, DEFAULT_HEIGHT);
+    }
+
+    public Interpolation3D(Dimension size) {
+        this(size.width, size.height);
+    }
+
+    public Interpolation3D(int width, int height) {
+        this.width  = width;
+        this.height = height;
+    }
+
+    public int getHeight() {
+        return height;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public double getCellWidth() {
+        return cellWidth;
+    }
+
+    public double getCellHeight() {
+        return cellHeight;
+    }
+
+    public double [] getRaster() {
+        return raster;
+    }
+
+    public double [] getDepths() {
+        return depths;
+    }
+
+    public double getMaxDepth() {
+        double maxDepth = Double.MAX_VALUE;
+        for (int i = depths!=null?depths.length-1:0; i >= 0; --i) {
+            double d = depths[i];
+            if (!Double.isNaN(d) && d < maxDepth) {
+                maxDepth = d;
+            }
+        }
+        return maxDepth;
+    }
+
+    public boolean interpolate(
+        List<? extends Coordinate> path,
+        List<? extends XYColumn>   points,
+        double                     from,
+        double                     to,
+        Metrics                    metrics,
+        XYDepth                    xyDepth
+    ) {
+        boolean debug = log.isDebugEnabled();
+
+        int N = path.size();
+        int M = points.size();
+
+        if (debug) {
+            log.debug("Size of path: " + N);
+            log.debug("Size of points: " + M);
+        }
+
+        if (M < 1 || N < 2) { // nothing to do
+            return false;
+        }
+
+        List<GridCell> cells = GridCell.pointsToGridCells(
+            points, Interpolation2D.relevantArea(path, points));
+
+        if (cells.isEmpty()) {
+            log.warn("no cells found");
+            return false;
+        }
+
+        // put into spatial index to speed up finding neighbors.
+        STRtree spatialIndex = new STRtree();
+
+        for (GridCell cell: cells) {
+            spatialIndex.insert(cell.getEnvelope(), cell);
+        }
+
+        LinearToMap linearToMap = new LinearToMap(
+            path, from, to, metrics);
+
+        double [] depths = new double[width];
+        Arrays.fill(depths, Double.NaN);
+
+        double cellWidth = (to - from)/width;
+
+        double maxDepth = Double.MAX_VALUE;
+
+        int i = 0;
+        Coordinate center = new Coordinate();
+        for (double p = cellWidth*0.5; i < depths.length; ++i, p += cellWidth) {
+            if (linearToMap.locate(p, center)) {
+                double depth = xyDepth.depth(center);
+                depths[i] = depth;
+                if (depth < maxDepth) {
+                    maxDepth = depth;
+                }
+            }
+        }
+
+        if (maxDepth == Double.MAX_VALUE) {
+            log.warn("no depth found -> no interpolation");
+            return false;
+        }
+
+        double cellHeight = Math.abs(maxDepth)/height;
+
+        if (debug) {
+            log.debug("max depth found: " + maxDepth);
+            log.debug("cell size: " + cellWidth + " x " + cellHeight);
+        }
+
+        double [] raster = new double[width*height];
+        Arrays.fill(raster, Double.NaN);
+
+        Envelope            queryBuffer  = new Envelope();
+        GridCell.CellFinder finder       = new GridCell.CellFinder();
+
+        i = 0;
+        for (double p = cellWidth*0.5; i < depths.length; ++i, p += cellWidth) {
+            double depth = depths[i];
+            if (Double.isNaN(depth) || depth >= 0d) {
+                continue;
+            }
+            linearToMap.locate(p, center);
+
+            queryBuffer.init(
+                center.x - EPS, center.x + EPS, 
+                center.y - EPS, center.y + EPS);
+
+            finder.prepare(center);
+            spatialIndex.query(queryBuffer, finder);
+
+            GridCell found = finder.found;
+
+            if (found == null) {
+                continue;
+            }
+
+            XYColumn n0 = (XYColumn)found.p1;
+            XYColumn n1 = (XYColumn)found.p2;
+            XYColumn n2 = (XYColumn)found.p3;
+            XYColumn n3 = (XYColumn)found.p4;
+
+            if (n0.prepare(xyDepth)
+            &&  n1.prepare(xyDepth)
+            &&  n2.prepare(xyDepth)
+            &&  n3.prepare(xyDepth)
+            ) {
+                double y1 = Interpolation2D.interpolate(
+                    n0.x, n0.y,
+                    n1.x, n1.y,
+                    center.x);
+                double y2 = Interpolation2D.interpolate(
+                    n2.x, n2.y,
+                    n3.x, n3.y,
+                    center.x);
+                double z = -cellHeight*0.5;
+                for (int j = i;
+                    j < raster.length && z >= depth;
+                    z -= cellHeight, j += width) {
+
+                    double v0 = n0.value(z);
+                    double v1 = n1.value(z);
+                    double v2 = n2.value(z);
+                    double v3 = n3.value(z);
+
+                    double z1 = Interpolation2D.interpolate(
+                        n0.x, v0,
+                        n1.x, v1,
+                        center.x);
+                    double z2 = Interpolation2D.interpolate(
+                        n2.x, v2,
+                        n3.x, v3,
+                        center.x);
+                    double value = Interpolation2D.interpolate(
+                        y1, z1,
+                        y2, z2,
+                        center.y);
+                    raster[j] = value;
+                }
+                // XXX: Adjusted depth to create no gap 
+                // between last value and ground.
+                depths[i] = z+0.5d*cellHeight; 
+            } // down the x/y column
+        } // all along the track
+
+        this.depths     = depths;
+        this.raster     = raster;
+        this.cellWidth  = cellWidth;
+        this.cellHeight = cellHeight;
+
+        return true;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolator.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,12 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+/**
+ *  @author Sascha L. Teichmann
+ */
+public interface Interpolator
+{
+    void interpolate(double t, Coordinate v);
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/L1Comparator.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,37 @@
+package de.intevation.gnv.math;
+
+import java.util.Comparator;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+/**
+ *  @author Sascha L. Teichmann
+ */
+public  class L1Comparator
+implements    Comparator
+{
+    private Coordinate ref;
+
+    public L1Comparator() {
+    }
+
+    public L1Comparator(Coordinate ref) {
+        this.ref = ref;
+    }
+
+    public void setReference(Coordinate ref) {
+        this.ref = ref;
+    }
+
+    public int compare(Object a, Object b) {
+        Coordinate pa = (Coordinate)a;
+        Coordinate pb = (Coordinate)b;
+        double da = Point2d.L1(ref, pa);
+        double db = Point2d.L1(ref, pb);
+        if (da < db) return -1;
+        if (da > db) return +1;
+        return 0;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/LinearFunction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,57 @@
+package de.intevation.gnv.math;
+
+import org.apache.commons.math.optimization.fitting.ParametricRealFunction;
+
+import org.apache.commons.math.FunctionEvaluationException;
+
+import org.apache.commons.math.analysis.UnivariateRealFunction;
+
+/**
+ *  @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class LinearFunction
+implements   ParametricRealFunction
+{
+    public static final LinearFunction INSTANCE = new LinearFunction();
+
+    public static class Univariate 
+    implements          UnivariateRealFunction
+    {
+        protected double m;
+        protected double b;
+
+        public Univariate() {
+        }
+
+        public Univariate(double x1, double y1, double x2, double y2) {
+            if (y1 == y2) {
+                m = 0d;
+                b = (x1 + x2)*0.5d;
+            }
+            else {
+                m = (x1 - x2)/(y1 - y2);
+                b = y1 - m*x1;
+            }
+        }
+
+        public double value(double x) {
+            return m*x + b;
+        }
+    } // class Univariate
+
+    public LinearFunction() {
+    }
+
+    public double value(double x, double [] parameters)
+    throws FunctionEvaluationException 
+    {
+        return x*parameters[0] + parameters[1];
+    }
+
+    public double [] gradient(double x, double [] parameters) 
+    throws FunctionEvaluationException 
+    {
+        return new double [] { x, 1f };
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/LinearMetrics.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,59 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+/**
+ *  @author Sascha L. Teichmann
+ */
+public final class LinearMetrics
+implements         Metrics
+{
+    public static final Metrics INSTANCE =
+        new LinearMetrics();
+
+    public static final class LinearInterpolator
+    implements                Interpolator
+    {
+        private double mx;
+        private double bx;
+        private double my;
+        private double by;
+
+        public LinearInterpolator(Coordinate p1, Coordinate p2) {
+
+            /*
+             I) p1.x = 0*m + bx
+            II) p2.x = 1*m + bx
+
+            bx = p1.x
+
+            p2.x = m + p1.x
+
+            mx = p2.x - p1.x
+            */
+
+            bx = p1.x;
+            mx = p2.x - bx;
+
+            by = p1.y;
+            my = p2.y - by;
+        }
+
+        public void interpolate(double t, Coordinate v) {
+            v.x = t*mx + bx;
+            v.y = t*my + by;
+        }
+    } // class LinearInterpolator
+
+    private LinearMetrics() {
+    }
+
+    public double distance(Coordinate p1, Coordinate p2) {
+        return p1.distance(p2);
+    }
+
+    public Interpolator getInterpolator(Coordinate p1, Coordinate p2) {
+        return new LinearInterpolator(p1, p2);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/LinearToMap.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,184 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+import java.util.List;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ *  @author Sascha L. Teichmann
+ */
+public class LinearToMap
+{
+    public static final class Range {
+        private Range next;
+
+        private double from;
+        private double to;
+        private double b;
+
+        private Coordinate p1;
+        private Coordinate p2;
+
+        private Interpolator interpolator;
+
+        public Range() {
+        }
+
+        public Range(
+            double       from, 
+            double       to,
+            Interpolator interpolator,
+            Coordinate   p1,
+            Coordinate   p2
+        ) {
+            this.from         = from;
+            this.to           = to;
+            this.interpolator = interpolator;
+            this.p1           = p1;
+            this.p2           = p2;
+
+            b = from == to
+                ? 0d
+                : 1.0d/(to - from);
+        }
+
+        public void eval(double x, Coordinate v) {
+            interpolator.interpolate((x - from)*b, v);
+        }
+
+        public boolean inside(double x) {
+            return x >= from && x <= to;
+        }
+
+        public Coordinate startPoint() {
+            return p1;
+        }
+
+        public Coordinate endPoint() {
+            return p2;
+        }
+    } // class Range
+
+    protected Range head;
+    protected Range last;
+
+    public LinearToMap() {
+    }
+
+    public LinearToMap(
+        List<? extends Coordinate> path, 
+        double                     from, 
+        double                     to,
+        Metrics                    metrics
+    ) {
+        double diagramLength = Math.abs(to - from);
+
+        double worldLength = length(path, metrics);
+
+        double rangeStart = from;
+
+        Range last = null;
+
+        for (int i = 1, N = path.size(); i < N; ++i) {
+            Coordinate p1 = path.get(i-1);
+            Coordinate p2 = path.get(i);
+            double segmentLength = metrics.distance(p1, p2);
+
+            double relativeLength = segmentLength / worldLength;
+
+            double rangeLength = diagramLength * relativeLength;
+
+            double rangeEnd = rangeStart + rangeLength;
+
+            Range range = new Range(
+                rangeStart, rangeEnd,
+                metrics.getInterpolator(p1, p2),
+                p1, p2);
+
+            if (last == null) {
+                last = head = range;
+            }
+            else {
+                last.next = range;
+                last = range;
+            }
+            rangeStart = rangeEnd;
+        }
+    }
+
+    protected Range locateRange(double diagramX) {
+
+        if (last != null && last.inside(diagramX)) {
+            return last;
+        }
+
+        Range current = head;
+        while (current != null) {
+            if (current.inside(diagramX)) {
+                return last = current;
+            }
+            current = current.next;
+        }
+
+        return null;
+    }
+
+    public boolean locate(double diagramX, Coordinate v) {
+        Range range = locateRange(diagramX);
+        if (range == null) {
+            return false;
+        }
+        range.eval(diagramX, v);
+        return true;
+    }
+
+    public static double length(
+        List<? extends Coordinate> path, 
+        Metrics                    metrics
+    ) {
+        double sum = 0d;
+        for (int i = path.size()-1; i >= 1; --i) {
+            Coordinate p1 = path.get(i);
+            Coordinate p2 = path.get(i-1);
+            sum += metrics.distance(p1, p2);
+        }
+        return sum;
+    }
+
+    public int numRanges() {
+        int count = 0;
+        Range current = head;
+        while (current != null) {
+            ++count;
+            current = current.next;
+        }
+        return count;
+    }
+
+    public Iterator ranges() {
+        return new Iterator() {
+
+            Range current = head;
+
+            public boolean hasNext() {
+                return current != null;
+            }
+
+            public Object next() {
+                if (!hasNext()) {
+                    throw new NoSuchElementException();
+                }
+                Range x = current;
+                current = current.next;
+                return x;
+            }
+
+            public void remove() {
+                throw new UnsupportedOperationException();
+            }
+        };
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Metrics.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,14 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+/**
+ *  @author Sascha L. Teichmann
+ */
+public interface Metrics
+{
+    double distance(Coordinate p1, Coordinate p2);
+
+    Interpolator getInterpolator(Coordinate p1, Coordinate p2);
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Point2d.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,101 @@
+package de.intevation.gnv.math;
+
+import java.util.Comparator;
+
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jts.geom.Coordinate;
+
+/**
+ *  @author Sascha L. Teichmann
+ */
+public class Point2d
+extends      Coordinate
+{
+    public static final double EPSILON = 1e-3d;
+
+    public static final Comparator X_COMPARATOR = new Comparator() {
+        public int compare(Object a, Object b) {
+            double xa = ((Coordinate)a).x;
+            double xb = ((Coordinate)b).x;
+            if (xa < xb) return -1;
+            if (xa > xb) return +1;
+            return 0;
+        }
+    };
+
+    public static final Comparator Y_COMPARATOR = new Comparator() {
+        public int compare(Object a, Object b) {
+            double ya = ((Coordinate)a).y;
+            double yb = ((Coordinate)b).y;
+            if (ya < yb) return -1;
+            if (ya > yb) return +1;
+            return 0;
+        }
+    };
+
+    public static class InverseL1Comparator
+    implements          Comparator
+    {
+        private Point2d ref;
+
+        public InverseL1Comparator(Point2d ref) {
+            this.ref = ref;
+        }
+
+        public int compare(Object a, Object b) {
+            Point2d pa = (Point2d)a;
+            Point2d pb = (Point2d)b;
+            double da = ref.L1(pa);
+            double db = ref.L1(pb);
+            if (da < db) return -1;
+            if (da > db) return +1;
+            return 0;
+        }
+    } // class InverseL1Comparator
+
+    public int i;
+    public int j;
+
+    public Point2d() {
+    }
+
+    public Point2d(double x, double y, int i, int j) {
+        super(x, y);
+        this.i = i;
+        this.j = j;
+    }
+
+    public Point2d(double x, double y, double z, int i, int j) {
+        super(x, y, z);
+        this.i = i;
+        this.j = j;
+    }
+
+
+    public double L1(Point2d other) {
+        return L1(this, other);
+    }
+
+    public static double L1(Coordinate a, Coordinate b) {
+        return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
+    }
+
+    public Envelope envelope() {
+        return envelope(EPSILON);
+    }
+
+    public Envelope envelope(double epsilon) {
+        return new Envelope(
+            x-epsilon, x+epsilon,
+            y-epsilon, y+epsilon);
+    }
+
+    public boolean hasIGap(Point2d other) {
+        return Math.abs(i - other.i) > 1;
+    }
+
+    public boolean hasJGap(Point2d other) {
+        return Math.abs(j - other.j) > 1;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/QueriedXYDepth.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,94 @@
+/**
+ *
+ */
+package de.intevation.gnv.math;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import java.lang.ref.SoftReference;
+
+import org.apache.log4j.Logger;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.geobackend.base.query.QueryExecutor;
+import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
+import de.intevation.gnv.geobackend.base.query.exception.QueryException;
+import de.intevation.gnv.geobackend.sde.datasources.RasterObject;
+
+import de.intevation.gnv.utils.WKTUtils;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class QueriedXYDepth implements XYDepth {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(QueriedXYDepth.class);
+    
+    private static final String queryID = "rasterQuery";
+    
+    private QueryExecutor queryExecutor;
+    
+    private ArrayList<SoftReference<RasterObject>> rasterData;
+
+    private RasterObject last;
+
+    private int interpolation;
+    
+    public QueriedXYDepth() {
+        this(RasterObject.BILINEAR);
+    }
+
+    public QueriedXYDepth(int interpolation) {
+        this.interpolation = interpolation;
+        rasterData    = new ArrayList<SoftReference<RasterObject>>();
+        queryExecutor = QueryExecutorFactory.getInstance().getQueryExecutor();
+    }
+
+    /**
+     * @see de.intevation.gnv.math.XYDepth#depth(com.vividsolutions.jts.geom.Coordinate)
+     */
+    public double depth(Coordinate coordinate) {
+        double resultValue = Double.NaN;
+        
+        RasterObject ro = getRasterObject(coordinate);
+        
+        if (ro == null) {
+            try {
+                String[] filterValues = new String[] { WKTUtils.toWKT(coordinate) };
+                Collection<Result> result = queryExecutor.executeQuery(this.queryID,filterValues);
+                for (Result row: result) {
+                    if ((ro = (RasterObject)row.getObject(0)) != null) {
+                        rasterData.add(new SoftReference<RasterObject>(last = ro));
+                    }
+                    break;
+                }
+            } catch (QueryException e) {
+                log.error(e, e);
+            }
+        }
+        return ro != null
+            ? ro.getValue(coordinate, interpolation)
+            : Double.NaN; 
+    }
+    
+    private RasterObject getRasterObject(Coordinate coordinate) {
+        if (last != null && last.contains(coordinate)) {
+            return last;
+        }
+        for (int i = rasterData.size()-1; i >= 0; --i) {
+            SoftReference<RasterObject> ref = rasterData.get(i);
+            RasterObject ro = ref.get();
+            if (ro != null && ro.contains(coordinate)) {
+                return last = ro;
+            }
+        }
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/XYColumn.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,127 @@
+package de.intevation.gnv.math;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+
+import org.apache.commons.math.analysis.interpolation.SplineInterpolator;
+import org.apache.commons.math.analysis.interpolation.UnivariateRealInterpolator;
+
+import org.apache.commons.math.analysis.UnivariateRealFunction;
+
+import org.apache.commons.math.MathException;
+import org.apache.commons.math.FunctionEvaluationException;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ * @author Sascha L. Teichmann <sascha.teichmann@intevation.de>
+ */
+public class XYColumn
+extends      Point2d
+implements   UnivariateRealFunction
+{
+    private static Logger log = Logger.getLogger(XYColumn.class);
+
+    protected List<HeightValue> values;
+
+    protected transient UnivariateRealFunction curve;
+
+    public XYColumn() {
+        values = new ArrayList<HeightValue>();
+    }
+
+    public XYColumn(double x, double y, int i, int j) {
+        super(x, y, i, j);
+        values = new ArrayList<HeightValue>();
+    }
+
+    public void add(HeightValue value) {
+        values.add(value);
+    }
+
+    public List<HeightValue> getValues() {
+        return values;
+    }
+
+    public double value(double depth) {
+        try {
+            if (curve != null) {
+                HeightValue h = values.get(0);
+                // extrapolate beyond boundaries by repeating
+                if (depth > h.z) return h.v;
+                h = values.get(values.size()-1);
+                if (depth < h.z) return h.v;
+                return curve.value(depth);
+            }
+        }
+        catch (FunctionEvaluationException fee) {
+            log.error("evaluation failed", fee);
+        }
+
+        return Double.NaN;
+    }
+
+    public boolean prepare(XYDepth xyDepth) {
+        if (curve == null) {
+            int N = values.size();
+            if (N == 0) {
+                log.error("no points for interpolation");
+                return false;
+            }
+
+            if (N == 1) {
+                // only one value -> constant function
+                curve = new ConstantFunction(values.get(0).v);
+            }
+            else { // more than on value
+                double depth = xyDepth.depth(this);
+                Collections.sort(values, HeightValue.INV_Z_COMPARATOR);
+
+                // if there is no value at 0 repeat first value
+                HeightValue first = values.get(0);
+                if (first.z < 0d) {
+                    values.add(0, new HeightValue(0d, first.v, first.k-1));
+                    ++N;
+                }
+
+                // if there is no value at depth repeat last value
+                HeightValue last = values.get(N-1);
+                if (last.z > depth) {
+                    values.add(new HeightValue(depth, last.v, last.k+1));
+                    ++N;
+                }
+                if (N < 3) { // interpolate linear
+                    first = values.get(0);
+                    last  = values.get(N-1);
+                    curve = new LinearFunction.Univariate(
+                        first.z, first.v,
+                        last.z,  last.v);
+                }
+                else { // higher degree interpolation
+                    double [] z = new double[N];
+                    double [] v = new double[N];
+                    for (int i = 0; i < N; ++i) {
+                        HeightValue h = values.get(N-1-i);
+                        z[i] = h.z;
+                        v[i] = h.v;
+                    }
+                    try {
+                        curve = getInterpolator().interpolate(z, v);
+                    }
+                    catch (MathException me) {
+                        log.error("interpolation failed", me);
+                        return false;
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+    protected UnivariateRealInterpolator getInterpolator() {
+        return new SplineInterpolator();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/XYDepth.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,12 @@
+package de.intevation.gnv.math;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+/**
+ *  @author Sascha L. Teichmann
+ */
+public interface XYDepth
+{
+    double depth(Coordinate coordinate);
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,46 @@
+/**
+ *
+ */
+package de.intevation.gnv.profile.horizontal;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.gnv.artifacts.GNVArtifactBase;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class HorizontalProfileArtifact extends GNVArtifactBase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(HorizontalProfileArtifact.class);
+    /**
+     *
+     */
+    private static final long serialVersionUID = -721831166719594662L;
+
+    /**
+     * Constructor
+     */
+    public HorizontalProfileArtifact() {
+        super();
+        log.debug("HorizontalProfileArtifact.Constructor");
+        this.name = "horizontalProfile";
+    }
+
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String,
+     *      de.intevation.artifacts.ArtifactFactory, java.lang.Object)
+     */
+    @Override
+    public void setup(String identifier, ArtifactFactory factory, Object context) {
+        log.debug("HorizontalProfileArtifact.setup");
+        super.setup(identifier, factory, context);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileInstantaneousPointArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,33 @@
+/**
+ *
+ */
+package de.intevation.gnv.profile.horizontal;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class HorizontalProfileInstantaneousPointArtifact extends
+                                                        HorizontalProfileArtifact {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(HorizontalProfileInstantaneousPointArtifact.class);
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = -6700816287500004553L;
+
+    /**
+     * Constructor
+     */
+    public HorizontalProfileInstantaneousPointArtifact() {
+        super();
+        log.debug("HorizontalProfileInstantaneousPointArtifact.Constructor");
+        super.name = super.name + "InstantaneousPoint";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,32 @@
+/**
+ *
+ */
+package de.intevation.gnv.profile.horizontal;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class HorizontalProfileMeshArtifact extends HorizontalProfileArtifact {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(HorizontalProfileMeshArtifact.class);
+
+    /**
+     * The UID of this class
+     */
+    private static final long serialVersionUID = -8291547966693867205L;
+
+    /**
+     * Constructor
+     */
+    public HorizontalProfileMeshArtifact() {
+        super();
+        log.debug("VerticalProfileMeshArtifact.Constructor");
+        super.name = super.name + "Mesh";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshCrossArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,34 @@
+/**
+ *
+ */
+package de.intevation.gnv.profile.horizontal;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class HorizontalProfileMeshCrossArtifact extends
+                                               HorizontalProfileMeshArtifact {
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 3955589051619129854L;
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(HorizontalProfileMeshCrossArtifact.class);
+    
+    /**
+     * Constructor
+     */
+    public HorizontalProfileMeshCrossArtifact() {
+        super();
+        log.debug("HorizontalProfileMeshCrossArtifact.Constructor");
+        super.name = super.name + "Cross";
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontalcrosssection/HorizontalCrossSectionMeshArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,46 @@
+/**
+ *
+ */
+package de.intevation.gnv.profile.horizontalcrosssection;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.gnv.artifacts.GNVArtifactBase;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class HorizontalCrossSectionMeshArtifact extends GNVArtifactBase {
+    /**
+     *
+     */
+    private static final long serialVersionUID = -2687278172203755640L;
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(HorizontalCrossSectionMeshArtifact.class);
+
+
+    /**
+     * Constructor
+     */
+    public HorizontalCrossSectionMeshArtifact() {
+        super();
+        log.debug("HorizontalCrossSectionMeshArtifact.Constructor");
+        this.name = "horizontalCrossSectionMesh";
+    }
+    
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String,
+     *      de.intevation.artifacts.ArtifactFactory, java.lang.Object)
+     */
+    @Override
+    public void setup(String identifier, ArtifactFactory factory, Object context) {
+        log.debug("HorizontalCrossSectionMeshArtifact.setup");
+        super.setup(identifier, factory, context);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,45 @@
+/**
+ *
+ */
+package de.intevation.gnv.profile.vertical;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.gnv.artifacts.GNVArtifactBase;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class VerticalProfileArtifact extends GNVArtifactBase {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(VerticalProfileArtifact.class);
+
+    /**
+     * The UID of this class
+     */
+    private static final long serialVersionUID = -8291547966693867205L;
+
+    /**
+     * Constructor
+     */
+    public VerticalProfileArtifact() {
+        super();
+        log.debug("VerticalProfileArtifact.Constructor");
+        this.name = "verticalProfile";
+    }
+
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String,
+     *      de.intevation.artifacts.ArtifactFactory, java.lang.Object)
+     */
+    @Override
+    public void setup(String identifier, ArtifactFactory factory, Object context) {
+        log.debug("VerticalProfileArtifact.setup");
+        super.setup(identifier, factory, context);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileInstantaneousPointArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,33 @@
+/**
+ *
+ */
+package de.intevation.gnv.profile.vertical;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class VerticalProfileInstantaneousPointArtifact extends
+                                                      VerticalProfileArtifact {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(VerticalProfileInstantaneousPointArtifact.class);
+
+    /**
+     * The UID of this class
+     */
+    private static final long serialVersionUID = -8291547966693867205L;
+
+    /**
+     * Constructor
+     */
+    public VerticalProfileInstantaneousPointArtifact() {
+        super();
+        log.debug("VerticalProfileInstantaneousPointArtifact.Constructor");
+        super.name = super.name + "InstantaneousPoint";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileMeshArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,32 @@
+/**
+ *
+ */
+package de.intevation.gnv.profile.vertical;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class VerticalProfileMeshArtifact extends VerticalProfileArtifact {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(VerticalProfileMeshArtifact.class);
+
+    /**
+     * The UID of this class
+     */
+    private static final long serialVersionUID = -8291547966693867205L;
+
+    /**
+     * Constructor
+     */
+    public VerticalProfileMeshArtifact() {
+        super();
+        log.debug("VerticalProfileMeshArtifact.Constructor");
+        super.name = super.name + "Mesh";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,46 @@
+/**
+ *
+ */
+package de.intevation.gnv.profile.verticalcrosssection;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.gnv.artifacts.GNVArtifactBase;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class VerticalCrossSectionMeshArtifact extends GNVArtifactBase {
+    /**
+     *
+     */
+    private static final long serialVersionUID = -2687278172203755640L;
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(VerticalCrossSectionMeshArtifact.class);
+
+
+    /**
+     * Constructor
+     */
+    public VerticalCrossSectionMeshArtifact() {
+        super();
+        log.debug("VerticalCrossSectionMeshArtifact.Constructor");
+        this.name = "verticalCrossSectionMesh";
+    }
+    
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String,
+     *      de.intevation.artifacts.ArtifactFactory, java.lang.Object)
+     */
+    @Override
+    public void setup(String identifier, ArtifactFactory factory, Object context) {
+        log.debug("VerticalCrossSectionMeshArtifact.setup");
+        super.setup(identifier, factory, context);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/AbstractProducer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,26 @@
+package de.intevation.gnv.raster;
+
+import de.intevation.gnv.raster.Vectorizer.RingsHandler;
+
+public abstract class AbstractProducer
+implements            RingsHandler
+{
+    protected double minX;
+    protected double minY;
+    protected double maxX;
+    protected double maxY;
+
+    public AbstractProducer() {
+    }
+
+    public AbstractProducer(
+        double minX, double minY,
+        double maxX, double maxY
+    ) {
+        this.minX = minX;
+        this.minY = minY;
+        this.maxX = maxX;
+        this.maxY = maxY;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/DemuxRingsHandler.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,40 @@
+package de.intevation.gnv.raster;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import de.intevation.gnv.raster.Vectorizer.RingsHandler;
+import de.intevation.gnv.raster.Vectorizer.Edge;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class DemuxRingsHandler
+implements   RingsHandler
+{
+    protected ArrayList<RingsHandler> handlers;
+
+    public DemuxRingsHandler() {
+        handlers = new ArrayList<RingsHandler>();
+    }
+
+    public void addHandler(RingsHandler handler) {
+        handlers.add(handler);
+    }
+
+    public void handleRings(
+        List<Edge> rings, 
+        int        value, 
+        int        width,
+        int        height
+    ) {
+        for (RingsHandler handler: handlers) {
+            handler.handleRings(rings, value, width, height);
+        }
+    }
+
+    public void clear() {
+        handlers.clear();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/ExternalIndexConverter.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,44 @@
+package de.intevation.gnv.raster;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class ExternalIndexConverter
+implements   JTSMultiPolygonProducer.ValueConverter
+{
+    private static Logger log = Logger.getLogger(
+        ExternalIndexConverter.class);
+
+    protected Palette palette;
+
+    public ExternalIndexConverter() {
+    }
+
+    public ExternalIndexConverter(Palette palette) {
+        this.palette = palette;
+    }
+
+    public Integer convert(Integer value) {
+        if (value == null) {
+            return value;
+        }
+
+        int v = value.intValue();
+
+        if (v == -1) {
+            return value;
+        }
+
+        Palette.Entry entry = palette.getEntryByIndex(v);
+
+        if (entry == null) {
+            log.warn("cannot find palette entry for index: " + v);
+            return value;
+        }
+
+        return Integer.valueOf(entry.getExternalIndex());
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Filter.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,20 @@
+package de.intevation.gnv.raster;
+
+import org.w3c.dom.Element;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public interface Filter
+{
+    public interface Factory {
+
+        void init(Element element);
+
+        Filter create();
+
+    } // interface Factory
+
+    Raster filter(Raster raster);
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,34 @@
+package de.intevation.gnv.raster;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class IsoAttributeGenerator
+implements   IsoProducer.AttributeGenerator
+{
+    protected Palette palette;
+
+    public IsoAttributeGenerator() {
+    }
+
+    public IsoAttributeGenerator(Palette palette) {
+        this.palette = palette;
+    }
+
+    public Object generateAttribute(int neighbor1, int neighbor2) {
+        Palette.Entry e1 = palette.getEntryByIndex(neighbor1);
+        Palette.Entry e2 = palette.getEntryByIndex(neighbor2);
+
+        if (e1 == null || e2 == null) {
+            return null;
+        }
+
+        double e1t = e1.getFrom();
+        double e2f = e2.getTo();
+
+        return Double.valueOf(e2f >= e1t
+            ? 0.5d*(e1t+e2f)
+            : 0.5d*(e2.getTo()+e1.getFrom()));
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,117 @@
+package de.intevation.gnv.raster;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.log4j.Logger;
+
+import gnu.trove.TIntObjectHashMap;
+import gnu.trove.TDoubleArrayList;
+
+import de.intevation.gnv.raster.Vectorizer.Edge;
+
+import de.intevation.gnv.math.IJKey;
+
+import de.intevation.gnv.jfreechart.PolygonSeries;
+import de.intevation.gnv.jfreechart.CompactXYItems;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class IsoPolygonSeriesProducer
+extends      IsoProducer
+{
+    private static Logger log = Logger.getLogger(
+        IsoPolygonSeriesProducer.class);
+
+	public static final Float LINE_WIDTH = Float.valueOf(0.1f);
+
+    public IsoPolygonSeriesProducer(
+        double minX, double minY,
+        double maxX, double maxY
+    ) {
+        super(minX, minY, maxX, maxY);
+    }
+
+    public Collection<PolygonSeries> getSeries() {
+        return getSeries(null);
+    }
+
+    public Collection<PolygonSeries> getSeries(
+        AttributeGenerator attributeGenerator
+    ) {
+        ArrayList<PolygonSeries> series = new ArrayList<PolygonSeries>();
+
+        double b1 = minX;
+        double m1 = width != 1
+            ? (maxX - minX)/(width-1)
+            : 0d;
+
+         double b2 = minY;
+         double m2 = height != 1
+            ? (maxY - minY)/(height-1)
+            : 0d;
+
+        TDoubleArrayList vertices = new TDoubleArrayList();
+
+        for (IJKey key: joinPairs()) {
+            PolygonSeries ps = new PolygonSeries();
+
+            // process complete
+            ArrayList<Edge> completeList = complete.get(key);
+            if (completeList != null) {
+                for (Edge head: completeList) {
+                    Edge current = head;
+                    do {
+                        vertices.add(m1*(current.a % width) + b1);
+                        vertices.add(m2*(current.a / width) + b2);
+                    }
+                    while ((current = current.next) != head);
+                    // add head again to close shape
+                    vertices.add(m1*(head.a % width) + b1);
+                    vertices.add(m2*(head.a / width) + b2);
+                    ps.addRing(new CompactXYItems(vertices.toNativeArray()));
+                    vertices.reset();
+                }
+            }
+
+            // process open
+            TIntObjectHashMap map = commonOpen.get(key);
+
+            if (map != null) {
+                for (Edge head: headList(map)) {
+
+                    head = Vectorizer.simplify(head, width);
+                    Edge current = head, last = head;
+                    do {
+                        vertices.add(m1*(current.a % width) + b1);
+                        vertices.add(m2*(current.a / width) + b2);
+                        last = current;
+                    }
+                    while ((current = current.next) != null);
+                    // add b from tail
+                    vertices.add(m1*(last.b % width) + b1);
+                    vertices.add(m2*(last.b / width) + b2);
+                    ps.addRing(new CompactXYItems(vertices.toNativeArray()));
+                    vertices.reset();
+                } // for all in common open
+            } // if map defined for key
+
+			if (ps.getItemCount() > 0) {
+				series.add(ps);
+				if (attributeGenerator != null) {
+                    Object attribute = attributeGenerator
+                        .generateAttribute(key.i, key.j);
+
+                    if (attribute != null) {
+                        ps.setAttribute("label", attribute);
+					}
+				}
+				ps.setAttribute("line.width", LINE_WIDTH);
+			}
+        } // for all pairs
+
+        return series;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoProducer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,143 @@
+package de.intevation.gnv.raster;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import gnu.trove.TIntObjectHashMap;
+import gnu.trove.TIntHashSet;
+import gnu.trove.TObjectProcedure;
+
+import de.intevation.gnv.math.IJKey;
+
+import de.intevation.gnv.raster.Vectorizer.Edge;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class IsoProducer
+extends      AbstractProducer
+{
+    public interface AttributeGenerator {
+
+        Object generateAttribute(int neighbor1, int neighbor2);
+
+    } // interface AttributeGenerator
+
+    protected HashMap<Edge, Integer>            open;
+    protected HashMap<IJKey, TIntObjectHashMap> commonOpen;
+    protected HashMap<IJKey, ArrayList<Edge>>   complete;
+
+    protected int    width;
+    protected int    height;
+
+    public IsoProducer(
+        double minX, double minY,
+        double maxX, double maxY
+    ) {
+        super(minX, minY, maxX, maxY);
+
+        open       = new HashMap<Edge, Integer>();
+        commonOpen = new HashMap<IJKey, TIntObjectHashMap>();
+        complete   = new HashMap<IJKey, ArrayList<Edge>>();
+    }
+
+    public void handleRings(
+        List<Edge> rings, 
+        int        value, 
+        int        width,
+        int        height
+    ) {
+        if (value == -1) {
+            return;
+        }
+        this.width  = width;
+        this.height = height;
+
+        Integer v = Integer.valueOf(value);
+
+        for (Edge head: rings) {
+            Edge current = head;
+            do {
+                Integer neighbor = open.remove(current);
+
+                if (neighbor != null) {
+                    IJKey pair = new IJKey(value, neighbor.intValue());
+                    pair.sort();
+
+                    TIntObjectHashMap co = commonOpen.get(pair);
+
+                    if (co == null) {
+                        commonOpen.put(pair, co = new TIntObjectHashMap());
+                    }
+
+                    Edge edge = new Edge(current);
+
+                    Edge otherA = (Edge)co.remove(edge.a);
+                    if (otherA != null) {
+                        otherA.chain(edge, edge.a);
+                    }
+
+                    Edge otherB = (Edge)co.remove(edge.b);
+                    if (otherB != null) {
+                        otherB.chain(edge, edge.b);
+                    }
+
+                    if (edge.isComplete()) {
+                        ArrayList list = complete.get(pair);
+                        if (list == null) {
+                            complete.put(pair, list = new ArrayList());
+                        }
+                        list.add(Vectorizer.simplify(edge, width));
+                    }
+                    else {
+                        if (otherA == null) {
+                            co.put(edge.a, edge);
+                        }
+                        if (otherB == null) {
+                            co.put(edge.b, edge);
+                        }
+                    }
+                }
+                else {
+                    Edge edge = new Edge(current.b, current.a);
+                    open.put(edge, v);
+                }
+
+                current = current.next;
+            }
+            while (current != head);
+        } // for all rings
+
+    } // handleRings
+
+    protected HashSet<IJKey> joinPairs() {
+        HashSet<IJKey> pairs = new HashSet<IJKey>();
+        pairs.addAll(complete  .keySet());
+        pairs.addAll(commonOpen.keySet());
+        return pairs;
+    }
+
+    protected static ArrayList<Edge> headList(TIntObjectHashMap map) {
+        final ArrayList<Edge> headList = new ArrayList<Edge>();
+        map.forEachValue(new TObjectProcedure() {
+            TIntHashSet headSet = new TIntHashSet();
+            public boolean execute(Object value) {
+                Edge head = ((Edge)value).head();
+                if (headSet.add(head.a)) {
+                    headList.add(head);
+                }
+                return true;
+            }
+        });
+        return headList;
+    }
+
+    public void clear() {
+        open.clear();
+        complete.clear();
+        commonOpen.clear();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,196 @@
+package de.intevation.gnv.raster;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.LineString;
+import com.vividsolutions.jts.geom.MultiLineString;
+import com.vividsolutions.jts.geom.Polygon;
+import com.vividsolutions.jts.geom.TopologyException;
+
+import de.intevation.gnv.math.IJKey;
+
+import de.intevation.gnv.raster.Vectorizer.Edge;
+
+import de.intevation.gnv.utils.Pair;
+
+import gnu.trove.TIntObjectHashMap;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class JTSMultiLineStringProducer
+extends      IsoProducer
+{
+    private static Logger log = Logger.getLogger(
+        JTSMultiLineStringProducer.class);
+
+    protected GeometryFactory geometryFactory;
+
+    protected Polygon clip;
+
+    public JTSMultiLineStringProducer(
+        Polygon clip,
+        double minX, double minY,
+        double maxX, double maxY
+    ) {
+        this(
+            clip,
+            // XXX: Geotools crashes if only using a 2d packed data format!
+            JTSMultiPolygonProducer.createDefaultGeometryFactory(3),
+            minX, minY,
+            maxX, maxY);
+    }
+
+    public JTSMultiLineStringProducer(
+        Polygon clip,
+        GeometryFactory geometryFactory,
+        double minX, double minY,
+        double maxX, double maxY
+    ) {
+        super(minX, minY, maxX, maxY);
+        this.clip = clip;
+        this.geometryFactory = geometryFactory;
+    }
+
+    protected void clipLineString(
+        LineString            lineString,
+        ArrayList<LineString> lineStrings
+    ) {
+        if (clip == null) {
+            lineStrings.add(lineString);
+            return;
+        }
+
+        if (!lineString.intersects(clip)) {
+            return;
+        }
+
+        try {
+            Geometry result = lineString.intersection(clip);
+
+            if (result instanceof LineString) {
+                lineStrings.add((LineString)result);
+            }
+            else if (result instanceof MultiLineString) {
+                MultiLineString mls = (MultiLineString)result;
+                for (int i = 0, N = mls.getNumGeometries(); i < N; ++i) {
+                    Geometry g = mls.getGeometryN(i);
+                    if (g instanceof LineString) {
+                        lineStrings.add((LineString)g);
+                    }
+                    else {
+                        log.warn("cannot handle geometry " + g.getClass());
+                    }
+                }
+            }
+            else {
+                log.warn("cannot handle " + result.getClass());
+            }
+        }
+        catch (TopologyException te) {
+            log.error(te.getLocalizedMessage(), te);
+            lineStrings.add(lineString);
+        }
+    }
+
+    public List<Pair<Object, MultiLineString>> getMultiLineStrings(
+        AttributeGenerator attributeGenerator
+    ) {
+        ArrayList<Pair<Object, MultiLineString>> multiLineStrings =
+            new ArrayList<Pair<Object, MultiLineString>>();
+
+        double b1 = minX;
+        double m1 = width != 1
+            ? (maxX - minX)/(width-1)
+            : 0d;
+
+         double b2 = minY;
+         double m2 = height != 1
+            ? (maxY - minY)/(height-1)
+            : 0d;
+
+        ArrayList<Coordinate> coordinates = new ArrayList<Coordinate>();
+
+        for (IJKey key: joinPairs()) {
+            ArrayList<LineString> lineStrings = new ArrayList<LineString>();
+
+            // process complete
+            ArrayList<Edge> completeList = complete.get(key);
+            if (completeList != null) {
+                for (Edge head: completeList) {
+                    Edge current = head;
+                    do {
+                        coordinates.add(new Coordinate(
+                            m1*(current.a % width) + b1,
+                            m2*(current.a / width) + b2));
+                    }
+                    while ((current = current.next) != head);
+                    // add head again to close shape
+                    coordinates.add(new Coordinate(
+                        m1*(head.a % width) + b1,
+                        m2*(head.a / width) + b2));
+
+                    clipLineString(
+                        geometryFactory.createLineString(
+                            coordinates.toArray(
+                                new Coordinate[coordinates.size()])),
+                        lineStrings);
+
+                    coordinates.clear();
+                }
+            }
+
+            // process open
+            TIntObjectHashMap map = commonOpen.get(key);
+
+            if (map != null) {
+                for (Edge head: headList(map)) {
+
+                    head = Vectorizer.simplify(head, width);
+                    Edge current = head, last = head;
+                    do {
+                        coordinates.add(new Coordinate(
+                            m1*(current.a % width) + b1,
+                            m2*(current.a / width) + b2));
+                        last = current;
+                    }
+                    while ((current = current.next) != null);
+                    // add b from tail
+                    coordinates.add(new Coordinate(
+                        m1*(last.b % width) + b1,
+                        m2*(last.b / width) + b2));
+
+                    clipLineString(
+                        geometryFactory.createLineString(
+                            coordinates.toArray(
+                                new Coordinate[coordinates.size()])),
+                        lineStrings);
+
+                    coordinates.clear();
+                } // for all in common open
+            } // if map defined for key
+
+			if (!lineStrings.isEmpty()) {
+                MultiLineString multiLineString =
+                    geometryFactory.createMultiLineString(
+                        lineStrings.toArray(
+                            new LineString[lineStrings.size()]));
+                lineStrings.clear();
+                Object attribute = attributeGenerator != null
+                    ? attributeGenerator.generateAttribute(key.i, key.j)
+                    : key;
+                multiLineStrings.add(new Pair<Object, MultiLineString>(
+                    attribute,
+                    multiLineString));
+			}
+        } // for all pairs
+
+        return multiLineStrings;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,225 @@
+package de.intevation.gnv.raster;
+
+import com.vividsolutions.jts.algorithm.CGAlgorithms;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.LinearRing;
+import com.vividsolutions.jts.geom.MultiPolygon;
+import com.vividsolutions.jts.geom.Polygon;
+import com.vividsolutions.jts.geom.PrecisionModel;
+import com.vividsolutions.jts.geom.TopologyException;
+
+import com.vividsolutions.jts.geom.impl.PackedCoordinateSequenceFactory;
+
+import de.intevation.gnv.raster.Vectorizer.Edge;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class JTSMultiPolygonProducer
+extends      AbstractProducer
+{
+    private static Logger log = Logger.getLogger(
+        JTSMultiPolygonProducer.class);
+
+    public static final int SRID_WGS84 = 4326;
+
+    public interface ValueConverter {
+
+        Integer convert(Integer value);
+
+    } // interface ValueConverter
+
+    protected GeometryFactory geometryFactory;
+
+    protected Polygon clip;
+
+    protected HashMap<Integer, ArrayList<Polygon>> valueToPolygons;
+
+    public JTSMultiPolygonProducer() {
+    }
+
+    public JTSMultiPolygonProducer(
+        Polygon clip,
+        double minX, double minY,
+        double maxX, double maxY
+    ) {
+        this(
+            clip,
+            createDefaultGeometryFactory(),
+            minX, minY,
+            maxX, maxY);
+    }
+
+    public JTSMultiPolygonProducer(
+        Polygon clip,
+        GeometryFactory geometryFactory,
+        double minX, double minY,
+        double maxX, double maxY
+    ) {
+        super(minX, minY, maxX, maxY);
+        this.clip = clip;
+        this.geometryFactory = geometryFactory;
+        valueToPolygons = new HashMap<Integer, ArrayList<Polygon>>();
+    }
+
+    public static GeometryFactory createDefaultGeometryFactory() {
+        return createDefaultGeometryFactory(3);
+    }
+
+    public static GeometryFactory createDefaultGeometryFactory(int dim) {
+        return new GeometryFactory(
+            new PrecisionModel(
+                PrecisionModel.FLOATING),
+            SRID_WGS84,
+            new PackedCoordinateSequenceFactory(
+                PackedCoordinateSequenceFactory.DOUBLE,
+                dim));
+    }
+
+    public void handleRings(
+        List<Edge> rings, 
+        int        value, 
+        int        width,
+        int        height
+    ) {
+        if (value == -1) {
+            return;
+        }
+
+        double b1 = minX;
+        double m1 = width != 1
+           ? (maxX - minX)/(width-1)
+           : 0d;
+
+        double b2 = minY;
+        double m2 = height != 1
+           ? (maxY - minY)/(height-1)
+           : 0d;
+
+        ArrayList<Coordinate> vertices = new ArrayList<Coordinate>();
+
+        LinearRing shell = null;
+        ArrayList<LinearRing> holes = new ArrayList<LinearRing>();
+
+        for (Edge head: rings) {
+            Edge current = head;
+            do {
+                vertices.add(new Coordinate(
+                    m1*(current.a % width) + b1,
+                    m2*(current.a / width) + b2));
+            }
+            while ((current = current.prev) != head);
+            vertices.add(new Coordinate(
+                m1*(head.a % width) + b1,
+                m2*(head.a / width) + b2));
+
+            Coordinate [] coordinates =
+                vertices.toArray(new Coordinate[vertices.size()]);
+
+            vertices.clear();
+
+            LinearRing ring = geometryFactory.createLinearRing(
+                coordinates);
+
+            if (CGAlgorithms.isCCW(coordinates)) {
+                shell = ring;
+            }
+            else {
+                holes.add(ring);
+            }
+        }
+
+        if (shell == null) {
+            log.error("polygon has no shell");
+            return;
+        }
+
+        Polygon polygon = geometryFactory.createPolygon(
+            shell,
+            holes.toArray(new LinearRing[holes.size()]));
+
+        if (clip == null || clip.intersects(polygon)) {
+            Integer v = Integer.valueOf(value);
+
+            ArrayList<Polygon> polygons = valueToPolygons.get(v);
+
+            if (polygons == null) {
+                valueToPolygons.put(v, polygons = new ArrayList<Polygon>());
+            }
+
+            polygons.add(polygon);
+        }
+    }
+
+    public Map<Integer, MultiPolygon> getMultiPolygons() {
+        return getMultiPolygons(null);
+    }
+
+    protected MultiPolygon flattenCollection(Geometry result) {
+
+        if (result instanceof MultiPolygon) {
+            return (MultiPolygon)result;
+        }
+
+        if (result instanceof Polygon) {
+            return geometryFactory.createMultiPolygon(
+                new Polygon[] { (Polygon)result });
+        }
+
+        log.warn("cannot handle " + result.getClass());
+
+        return null;
+    }
+
+    public Map<Integer, MultiPolygon> getMultiPolygons(
+        ValueConverter valueConverter
+    ) {
+        TreeMap<Integer, MultiPolygon> multiPolygons =
+            new TreeMap<Integer, MultiPolygon>();
+
+        for (Map.Entry<Integer, ArrayList<Polygon>> entry:
+            valueToPolygons.entrySet()
+        ) {
+            ArrayList<Polygon> polygons = entry.getValue();
+
+            Integer value = valueConverter != null
+                ? valueConverter.convert(entry.getKey())
+                : entry.getKey();
+
+            MultiPolygon mp = geometryFactory.createMultiPolygon(
+                polygons.toArray(new Polygon[polygons.size()]));
+
+            if (clip != null) {
+                try {
+                    Geometry result = mp.intersection(clip);
+
+                    MultiPolygon mp2 = flattenCollection(result);
+
+                    if (mp2 != null) { mp = mp2; }
+                }
+                catch (TopologyException te) {
+                    log.error(te.getLocalizedMessage(), te);
+                }
+            }
+            multiPolygons.put(value, mp);
+        }
+
+        return multiPolygons;
+    }
+
+    public void clear() {
+        valueToPolygons.clear();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/KernelFilter.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,70 @@
+package de.intevation.gnv.raster;
+
+import org.w3c.dom.Element;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class KernelFilter
+implements   Filter
+{
+    private static Logger log = Logger.getLogger(KernelFilter.class);
+
+    public static class GaussFactory
+    implements          Filter.Factory
+    {
+        public static final double DEFAULT_SIGMA  = 1.0d;
+        public static final int    DEFAULT_RADIUS = 5;
+
+        protected double sigma;
+        protected int    radius;
+
+        public GaussFactory() {
+            sigma  = DEFAULT_SIGMA;
+            radius = DEFAULT_RADIUS;
+        }
+
+        public void init(Element element) {
+            String s = element.getAttribute("sigma");
+            String r = element.getAttribute("radius");
+
+            if ((s = s.trim()).length() > 0) {
+                try {
+                    sigma = Math.abs(Double.parseDouble(s));
+                }
+                catch (NumberFormatException nfe) {
+                    log.warn("gauss sigma '" + s + "' not a valid float value.");
+                }
+            }
+
+            if ((r = r.trim()).length() > 0) {
+                try {
+                    radius = Math.min(3, Math.abs(Integer.parseInt(r)));
+                }
+                catch (NumberFormatException nfe) {
+                    log.warn("gauss radius '" + r + "' not a valid integer value.");
+                }
+            }
+        }
+
+        public Filter create() {
+            return new KernelFilter(Raster.Kernel.createGauss(sigma, radius));
+        }
+    } // class GaussFactory
+
+    protected Raster.Kernel kernel;
+
+    public KernelFilter() {
+    }
+
+    public KernelFilter(Raster.Kernel kernel) {
+        this.kernel = kernel;
+    }
+
+    public Raster filter(Raster raster) {
+        return raster.create(kernel);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Palette.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,289 @@
+package de.intevation.gnv.raster;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import java.util.Arrays;
+
+import java.awt.Color;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.gnv.raster.Raster.ValueToIndex;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class Palette
+implements   ValueToIndex
+{   
+	private static Logger log = Logger.getLogger(Palette.class);
+
+    public static final class Entry 
+    implements                Comparable
+    {
+        private Entry  left;
+        private Entry  right;
+
+        private int    index;
+
+        private int    externalIndex;
+
+        private double from;
+        private double to;
+
+        private String description;
+
+        private Color  color;
+
+        public Entry() {
+        }
+
+        public Entry(Entry other) {
+            index         = other.index;
+            externalIndex = other.externalIndex;
+            from          = other.from;
+            to            = other.to;
+            description   = other.description;
+            color         = other.color;
+        }
+
+        public Entry(
+            int    index, 
+            int    externalIndex,
+            double from, 
+            double to, 
+            Color  color,
+            String description
+        ) {
+            this.index         = index;
+            this.externalIndex = externalIndex;
+            this.from          = from;
+            this.to            = to;
+            this.color         = color;
+            this.description   = description;
+        }
+
+        public int compareTo(Object other) {
+            Entry e = (Entry)other;
+            if (from < e.from) return -1;
+            if (from > e.from) return +1;
+            return 0;
+        }
+
+        public double getFrom() {
+            return from;
+        }
+
+        public double getTo() {
+            return to;
+        }
+
+        public Color getColor() {
+            return color;
+        }
+
+        public int getExternalIndex() {
+            return externalIndex;
+        }
+
+        public Entry locateEntry(double value) {
+            Entry current = this;
+            while (current != null) {
+                boolean b = value >= current.from;
+                if (b && value <= current.to) {
+                    return current;
+                }
+                current = b
+                    ? current.right
+                    : current.left;
+            }
+            return null;
+        }
+
+        public int locate(double value) {
+            Entry entry = locateEntry(value);
+            return entry != null
+                ? entry.index
+                : -1;
+        }
+
+        public Entry findByIndex(int index) {
+            Entry current = this;
+            while (current != null) {
+                if (current.index == index) {
+                    break;
+                }
+                current = index < current.index
+                    ? current.left
+                    : current.right;
+            }
+            return current;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public boolean isInfinity() {
+            return from == -Double.MAX_VALUE
+              ||   to   ==  Double.MAX_VALUE;
+        }
+    } // class Entry
+
+    protected Entry [] entries;
+    protected Entry    lookup;
+    protected Color [] rgbs;
+
+    private Entry buildLookup(Entry [] entries, int lo, int hi) {
+        if (lo > hi) {
+            return null;
+        }
+        int mid = (lo + hi)/2;
+        Entry entry = entries[mid];
+        entry.left  = buildLookup(entries, lo, mid-1);
+        entry.right = buildLookup(entries, mid+1, hi);
+        return entry;
+    }
+
+    public Palette() {
+    }
+
+    public Palette(Document document) {
+
+        NodeList rangeNodes = document.getElementsByTagName("range");
+
+        entries = new Entry[rangeNodes.getLength()];
+        rgbs    = new Color[entries.length];
+
+        for (int i = 0; i < entries.length; ++i) {
+            Element rangeElement = (Element)rangeNodes.item(i);
+            double from     = doubleValue(rangeElement.getAttribute("from"));
+            double to       = doubleValue(rangeElement.getAttribute("to"));
+            int    extIndex = intValue(rangeElement.getAttribute("index"), i);
+            Color  color    = color(rangeElement.getAttribute("rgb"));
+            String desc     = rangeElement.getAttribute("description");
+            if (from > to) { double t = from; from = to; to = t; }
+            entries[i] = new Entry(i, extIndex, from, to, color, desc);
+            rgbs[i] = color;
+        }
+
+        buildLookup();
+    }
+
+    public Palette(Palette original, int N) {
+        if (N < 2)  {
+            throw new IllegalArgumentException("N < 2");
+        }
+
+        Entry [] origEntries = original.entries;
+
+        int newSize = 0;
+        for (int i = 0; i < origEntries.length; ++i) {
+            // cannot split infinity intervals
+            newSize += origEntries[i].isInfinity() ? 1 : N;
+        }
+
+        entries = new Entry[newSize];
+        rgbs    = new Color[newSize];
+
+        for (int i = 0, j = 0; i < origEntries.length; ++i) {
+            Entry origEntry = origEntries[i];
+            if (origEntry.isInfinity()) {
+                // infinity intervals are just copied
+                Entry nEntry = new Entry(origEntry);
+                entries[j] = nEntry;
+                rgbs[j]    = nEntry.color;
+                nEntry.index = j++;
+            }
+            else {
+                // split interval into N parts
+                double from  = origEntry.from;
+                double to    = origEntry.to;
+                double delta = (to - from)/N;
+				for (int k = 0; k < N; ++k) {
+                    Entry nEntry = new Entry(origEntry);
+                    nEntry.from = from;
+                    nEntry.to   = from + delta;
+                    from += delta;
+                    entries[j] = nEntry;
+                    rgbs[j]    = nEntry.color;
+                    nEntry.index = j++;
+                }
+            } // limited interval
+        } // for all original entries
+
+        buildLookup();
+    }
+
+    private static final int intValue(String s, int def) {
+        if (s == null || (s = s.trim()).length() == 0) {
+            return def;
+        }
+        try {
+            return Integer.parseInt(s);
+        }
+        catch (NumberFormatException nfe) {
+            log.error(nfe.getLocalizedMessage(), nfe);
+        }
+        return def;
+    }
+
+    private static final double doubleValue(String s) {
+        if (s == null || (s = s.trim()).length() == 0) {
+            return 0d;
+        }
+        if ((s = s.toLowerCase()).startsWith("-inf")) {
+            return -Double.MAX_VALUE; // XXX: Not using Double.NEGATIVE_INFINITY!
+        }
+
+        if (s.startsWith("inf")) {
+            return Double.MAX_VALUE; // XXX: Not using Double.NEGATIVE_INFINITY!
+        }
+
+        return Double.parseDouble(s);
+    }
+
+    private static final Color color(String s) {
+        if (s == null || (s = s.trim()).length() == 0) {
+            return null;
+        }
+        return Color.decode(s);
+    }
+
+
+    protected void buildLookup() {
+        Arrays.sort(entries);
+        lookup = buildLookup(entries, 0, entries.length-1);
+    }
+
+    public Palette subdivide(int N) {
+        return new Palette(this, N);
+    }
+
+    public int getSize() {
+        return rgbs.length;
+    }
+
+    public Color getColor(int index) {
+        return rgbs[index];
+    }
+
+    public int indexToRGB(int index) {
+        return rgbs[index].getRGB();
+    }
+
+    public int toIndex(double value) {
+        return lookup.locate(value);
+    }
+
+    public Entry getEntry(double value) {
+        return lookup.locateEntry(value);
+    }
+
+    public Entry getEntryByIndex(int index) {
+        return lookup.findByIndex(index);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/PaletteManager.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,71 @@
+package de.intevation.gnv.raster;
+
+import java.util.HashMap;
+
+import java.lang.ref.SoftReference;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class PaletteManager
+{
+    protected Palette base;
+
+    protected String  description;
+    protected String  name;
+
+    protected HashMap<Integer, SoftReference<Palette>> levels;
+
+    public PaletteManager() {
+    }
+
+    public PaletteManager(
+        String  name,
+        String  description,
+        Palette base
+    ) {
+        this.name        = name;
+        this.description = description;
+        this.base        = base;
+        levels = new HashMap<Integer, SoftReference<Palette>>();
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Palette getBase() {
+        return base;
+    }
+
+    public Palette getLevel(int n) {
+        if (n < 2) {
+            return base;
+        }
+
+        Integer N = Integer.valueOf(n);
+
+        Palette palette;
+
+        synchronized (levels) {
+            SoftReference<Palette> ref = levels.get(N);
+
+            if (ref != null && (palette = ref.get()) != null) {
+                return palette;
+            }
+
+            palette = base.subdivide(n);
+
+            ref = new SoftReference(palette);
+
+            levels.put(N, ref);
+        }
+
+        return palette;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,86 @@
+package de.intevation.gnv.raster;
+
+import java.util.List;
+import java.util.HashMap;
+
+import gnu.trove.TDoubleArrayList;
+
+import de.intevation.gnv.raster.Vectorizer.Edge;
+
+import de.intevation.gnv.jfreechart.PolygonSeries;
+import de.intevation.gnv.jfreechart.PolygonDataset;
+import de.intevation.gnv.jfreechart.CompactXYItems;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class PolygonDatasetProducer
+extends      AbstractProducer
+{
+    protected HashMap<Integer, PolygonSeries> polygonSeries;
+
+    protected PolygonDatasetProducer() {
+    }
+
+    public PolygonDatasetProducer(
+        double minX, double minY,
+        double maxX, double maxY
+
+    ) {
+        super(minX, minY, maxX, maxY);
+        polygonSeries = new HashMap<Integer, PolygonSeries>();
+    }
+
+    public void handleRings(
+        List<Edge> rings, 
+        int        value, 
+        int        width,
+        int        height
+    ) {
+        if (value == -1) {
+            return;
+        }
+
+        Integer v = Integer.valueOf(value);
+
+        PolygonSeries ps = polygonSeries.get(v);
+
+        if (ps == null) {
+            polygonSeries.put(v, ps = new PolygonSeries());
+            ps.setAttribute("fill", v);
+        }
+
+        TDoubleArrayList vertices = new TDoubleArrayList();
+
+        /* minX = 0*m1 + b1 <=> b1 = minX
+         * maxX = (width-1)*m1 + b1
+         * m1 = (maxX - minX)/(width-1)
+         */
+
+        double b1 = minX;
+        double m1 = width != 1
+           ? (maxX - minX)/(width-1)
+           : 0d;
+
+        double b2 = minY;
+        double m2 = height != 1
+           ? (maxY - minY)/(height-1)
+           : 0d;
+
+        for (Edge head: rings) {
+            Edge current = head;
+            do {
+                vertices.add(m1*(current.a % width) + b1);
+                vertices.add(m2*(current.a / width) + b2);
+            }
+            while ((current = current.next) != head);
+            ps.addRing(new CompactXYItems(vertices.toNativeArray()));
+            vertices.reset();
+        }
+    }
+
+    public PolygonDataset getPolygonDataset() {
+        return new PolygonDataset(polygonSeries.values());
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Raster.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,237 @@
+package de.intevation.gnv.raster;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class Raster
+{
+    public static class Kernel {
+
+        public static final class Coeff {
+            public int    di;
+            public int    dj;
+            public double c;
+
+            public Coeff() {
+            }
+
+            public Coeff(int di, int dj, double c) {
+                this.di = di;
+                this.dj = dj;
+                this.c  = c;
+            }
+
+            public String toString() {
+                return String.valueOf(c);
+            }
+
+        } // class Coeff
+
+        protected Coeff [] coeffs;
+        protected int      width;
+
+        public Kernel() {
+        }
+
+        public Kernel(Coeff [] coeffs, int width) {
+            this.coeffs = coeffs;
+            this.width  = width;
+        }
+
+        public static double gauss(double x, double y, double sigma) {
+            double s2 = sigma*sigma;
+            return 1.0d/(2.0d*Math.PI*s2)*Math.exp(-(x*x + y*y)/(2.0d*s2));
+        }
+
+        public static Kernel createGauss() {
+            return createGauss(1.0d, 5);
+        }
+
+        public static Kernel createGauss(double sigma, int width) {
+            Coeff [] coeffs = new Coeff[width*width];
+            double sum = 0d;
+            for (int j = 0; j < width; ++j) {
+                int y = -width/2 + j;
+                for (int i = 0; i < width; ++i) {
+                    int x = -width/2 + i;
+                    double c = gauss(x, y, sigma);
+                    coeffs[j*width + i] = new Coeff(x, y, c);
+                    sum += c;
+                }
+            }
+            sum = 1.0/sum;
+            for (int i = 0; i < coeffs.length; ++i) {
+                coeffs[i].c *= sum;
+            }
+            return new Kernel(coeffs, width);
+        }
+
+        public double fold(Access access, int i, int j) {
+
+            double s = 0.0d;
+
+            double unused = 0d;
+
+            for (int k = 0; k < coeffs.length; ++k) {
+                Coeff coeff = coeffs[k];
+                double v = access.get(i + coeff.di, j + coeff.dj);
+                if (Double.isNaN(v)) {
+                    unused += coeff.c;
+                }
+                else {
+                    s += v * coeff.c;
+                }
+            }
+
+            return s*(1.0d - unused);
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+
+            int height = coeffs.length/width;
+
+            for (int j = 0; j < height; ++j) {
+                if (j > 0) {
+                    sb.append(System.getProperty("line.separator"));
+                }
+                for (int i = 0; i < width; ++i) {
+                    if (i > 0) {
+                        sb.append("\t");
+                    }
+                    sb.append(coeffs[j*width + i]);
+                }
+            }
+
+            return sb.toString();
+        }
+    } // class Kernel
+
+    public interface Access {
+
+        double get(int i, int j);
+
+    } // interface Access
+
+    public interface ValueToIndex {
+
+        int toIndex(double value);
+
+    } // interface ValueToIndex;
+
+    public static class IsoClasses
+    implements          ValueToIndex
+    {
+        protected double m;
+        protected double b;
+        protected int    numClasses;
+
+        public IsoClasses(Raster raster, int numClasses) {
+
+            this.numClasses = numClasses;
+
+            double min =  Double.MAX_VALUE;
+            double max = -Double.MAX_VALUE;
+
+            double [] src = raster.raster;
+
+            for (int i = 0; i < src.length; ++i) {
+                double x = src[i];
+                if (!Double.isNaN(x)) {
+                    if (x < min) min = x;
+                    if (x > max) max = x;
+                }
+            }
+
+            /* f(min) = 0, f(max) = numClasses - 1
+
+               I:  0              = m*min + b
+               II: numClasses - 1 = m*max + b
+
+               II - I:
+               numClasses - 1 = m*(max - min)
+
+               m = (numClasses - 1)/(max - min)
+               b = m*min
+            */
+
+            if (max == min) {
+                m = 0;
+                b = 0;
+            }
+            else {
+                m = (numClasses - 1)/(max - min);
+                b = m*min;
+            }
+        }
+
+        public int toIndex(double value) {
+            return Double.isNaN(value)
+                ? -1
+                : Math.min(Math.max(0, (int)Math.round(m*value + b)), numClasses-1);
+        }
+    } // class IsoClasses
+
+    protected double [] raster;
+    protected int       width;
+
+    public Raster() {
+        this(new double[0], 0);
+    }
+
+    public Raster(double [] raster, int width) {
+        this.raster = raster;
+        this.width  = width;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public int getHeight() {
+        return raster.length / width;
+    }
+
+    public double [] getValues() {
+        return raster;
+    }
+
+    public int [] toIndexed(ValueToIndex valueToIndex) {
+        int [] dst = new int[raster.length];
+        for (int i = 0; i < raster.length; ++i) {
+            dst[i] = valueToIndex.toIndex(raster[i]);
+        }
+        return dst;
+    }
+
+    public Raster create(Kernel kernel) {
+        double [] dst = new double[raster.length];
+        Raster r = new Raster(dst, width);
+        r.apply(kernel, continueBorder());
+        return r;
+    }
+
+    public void apply(Kernel kernel, Access access) {
+        int height = getHeight();
+        for (int j = 0; j < height; ++j) {
+            int row = j*width;
+            for (int i = 0; i < width; ++i) {
+                raster[row + i] = kernel.fold(access, i, j);
+            }
+        }
+    }
+
+    public Access continueBorder() {
+        return new Access() {
+            int height = getHeight()-1;
+            public double get(int i, int j) {
+                     if (i < 0)      i = 0;
+                else if (i >= width) i = width-1;
+                     if (j < 0)      j = 0;
+                else if (j > height) j = height;
+                return raster[j*width + i];
+            }
+        };
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/RasterToPPM.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,41 @@
+package de.intevation.gnv.raster;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.awt.Color;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class RasterToPPM
+{
+    private RasterToPPM() {
+    }
+
+    public static void writeToPPM(Raster raster, Palette palette, OutputStream out)
+    throws IOException
+    {
+        int W = raster.getWidth();
+        int H = raster.getHeight();
+        out.write(("P6\n" + W + " " + H + "\n255\n").getBytes("US-ASCII"));
+        double [] values = raster.getValues();
+        int pos = 0;
+        byte [] data = new byte[W*3];
+        int black = Color.BLACK.getRGB();
+        for (int i = 0; i < H; ++i) {
+            for (int j = 0; j < data.length; ++pos) {
+                Palette.Entry entry = palette.getEntry(values[pos]);
+                int rgb = entry == null
+                    ? black
+                    : entry.getColor().getRGB();
+                data[j++] = (byte)((rgb >> 16) & 0xff);
+                data[j++] = (byte)((rgb >>  8) & 0xff);
+                data[j++] = (byte)( rgb        & 0xff);
+            }
+            out.write(data);
+        }
+        out.flush();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Vectorizer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,343 @@
+package de.intevation.gnv.raster;
+
+import java.util.BitSet;
+import java.util.List;
+import java.util.ArrayList;
+
+import gnu.trove.TIntStack;
+import gnu.trove.TIntObjectHashMap;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class Vectorizer
+{
+    private static Logger log = Logger.getLogger(Vectorizer.class);
+
+    public interface RingsHandler {
+
+        void handleRings(
+            List<Edge> rings,
+            int        value, 
+            int        width,
+            int        height);
+
+    } // interface RingsHandler
+
+    public static final class Edge {
+
+        public Edge prev;
+        public Edge next;
+
+        public int a;
+        public int b;
+
+        public Edge() {
+        }
+
+        public Edge(int a, int b) {
+            this.a = a;
+            this.b = b;
+        }
+
+        public Edge(Edge other) {
+            a = other.a;
+            b = other.b;
+        }
+
+        public void chain(Edge other, int found) {
+
+            if (found == a) {
+                other.next = this;
+                prev = other;
+                return;
+            }
+
+            if (found == b) {
+                next = other;
+                other.prev = this;
+                return;
+            }
+
+            throw new IllegalStateException("cannot chain");
+        }
+
+        public boolean isComplete() {
+            Edge current = this;
+            do {
+                if (current.prev == null || current.next == null) {
+                    return false;
+                }
+                current = current.next;
+            }
+            while (current != this);
+            return true;
+        }
+
+        public int length() {
+            int length = 0;
+            Edge current = this;
+            do { ++length; } 
+            while ((current = current.next) != null && current != this);
+            return length;
+        }
+
+		public Edge head() {
+			Edge current = this;
+			while (current.prev != null) {
+				current = current.prev;
+			}
+			return current;
+		}
+
+        public int hashCode() {
+            return (a << 16) | b;
+        }
+
+        public boolean equals(Object other) {
+            Edge e = (Edge)other;
+            return a == e.a && b == e.b;
+        }
+    } // class Edge
+
+    protected static Edge simplify(Edge edge, int width) {
+
+        Edge e1 = edge, start = edge;
+
+        int length = edge.length();
+
+        if (length < 2) {
+            return e1;
+        }
+
+        Edge e2 = edge.next;
+
+        int count = 0;
+
+        do {
+            int e1x = e1.a % width;
+            int e1y = e1.a / width;
+            int e2x = e1.b % width;
+            int e2y = e1.b / width;
+            int e3x = e2.b % width;
+            int e3y = e2.b / width;
+
+            if ((e1x == e2x && e2x == e3x && e1x == e3x)
+                    ||  (e1y == e2y && e2y == e3y && e1y == e3y)) {
+                e1.b = e2.b;
+                Edge removed = e1.next;
+                e1.next = e2.next;
+                if (e1.next != null) {
+                    e1.next.prev = e1;
+                }
+                e2 = e1.next;
+                count = 0;
+                --length;
+                if (removed == start) {
+                    start = e1;
+                }
+            }
+            else {
+                e1 = e1.next;
+                e2 = e2.next;
+                ++count;
+            }
+        }
+        while (length > 1 && e2 != null && count < length + 2);
+
+        return start;
+    }
+
+    protected int []            raster;
+    protected int               width;
+    protected TIntObjectHashMap openEdges;
+    protected List<Edge>        rings;
+    protected boolean           simplify;
+
+    public Vectorizer() {
+        this(true);
+    }
+
+    public Vectorizer(boolean simplify) {
+        openEdges     = new TIntObjectHashMap();
+        rings         = new ArrayList<Edge>();
+        this.simplify = simplify;
+    }
+
+    public Vectorizer(int [] raster, int width) {
+        this(true, raster, width);
+    }
+
+    public Vectorizer(boolean simplify, int [] raster, int width) {
+        this(simplify);
+        this.raster = raster;
+        this.width  = width;
+    }
+
+    public static final int tl(int i, int w) {
+        int x = i % w;
+        int y = i / w;
+        return x + (w + 1)*y;
+    }
+
+    public static final int tr(int i, int w) {
+        return tl(i, w) + 1;
+    }
+
+    public static final int bl(int i, int w) {
+        return tl(i, w) + w + 1;
+    }
+
+    public static final int br(int i, int w) {
+        return bl(i, w) + 1;
+    }
+
+    protected void resetRegion() {
+        openEdges.clear();
+        rings.clear();
+    }
+
+    protected void emit(Edge edge) {
+
+        Edge otherA = (Edge)openEdges.remove(edge.a);
+        if (otherA != null) {
+            otherA.chain(edge, edge.a);
+        }
+
+        Edge otherB = (Edge)openEdges.remove(edge.b);
+        if (otherB != null) {
+            otherB.chain(edge, edge.b);
+        }
+
+        if (edge.isComplete()) {
+            rings.add(simplify ? simplify(edge, width + 1) : edge);
+        }
+        else {
+            if (otherA == null) {
+                openEdges.put(edge.a, edge);
+            }
+            if (otherB == null) {
+                openEdges.put(edge.b, edge);
+            }
+        }
+    }
+
+    public int process(RingsHandler handler) {
+
+        BitSet visited = new BitSet(raster.length);
+
+        TIntStack stack = new TIntStack();
+
+        int regions = 0;
+
+        int height = raster.length / width;
+
+        for (int i = 0; i < raster.length; ++i) {
+            if (visited.get(i)) {
+                continue;
+            }
+
+            ++regions;
+
+            int currentValue = raster[i];
+            visited.set(i);
+
+            int current = i;
+            visited.set(current);
+
+            for (;;) {
+                int tl = tl(current, width);
+                int tr = tr(current, width);
+                int bl = bl(current, width);
+                int br = br(current, width);
+
+                int t = current - width;
+
+                if (t < 0) {
+                    emit(new Edge(tr, tl));
+                }
+                else {
+                    if (raster[t] != currentValue) {
+                        emit(new Edge(tr, tl));
+                    }
+                    else {
+                        if (!visited.get(t)) {
+                            visited.set(t);
+                            stack.push(t);
+                        }
+                    }
+                }
+
+                int b = current + width;
+
+                if (b >= raster.length) {
+                    emit(new Edge(bl, br));
+                }
+                else {
+                    if (raster[b] != currentValue) {
+                        emit(new Edge(bl, br));
+                    }
+                    else {
+                        if (!visited.get(b)) {
+                            visited.set(b);
+                            stack.push(b);
+                        }
+                    }
+                }
+
+                int x = current % width;
+
+                if (x == 0) {
+                    emit(new Edge(tl, bl));
+                }
+                else {
+                    int l = current - 1;
+                    if (raster[l] != currentValue) {
+                        emit(new Edge(tl, bl));
+                    }
+                    else {
+                        if (!visited.get(l)) {
+                            visited.set(l);
+                            stack.push(l);
+                        }
+                    }
+                }
+
+                if (x == width - 1) {
+                    emit(new Edge(br, tr));
+                }
+                else {
+                    int r = current + 1;
+                    if (raster[r] != currentValue) {
+                        emit(new Edge(br, tr));
+                    }
+                    else {
+                        if (!visited.get(r)) {
+                            visited.set(r);
+                            stack.push(r);
+                        }
+                    }
+                }
+
+                if (stack.size() == 0) {
+                    break;
+                }
+
+                current = stack.pop();
+            }
+
+            handler.handleRings(
+                rings, 
+                currentValue, 
+                width + 1,
+                height + 1);
+
+            resetRegion();
+        }
+
+        return regions;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,175 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.vividsolutions.jts.geom.Point;
+
+import de.intevation.artifactdatabase.Config;
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.describedata.DefaultKeyValueDescribeData;
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+import de.intevation.gnv.state.describedata.NamedArrayList;
+import de.intevation.gnv.state.describedata.NamedCollection;
+import de.intevation.gnv.utils.ArtifactXMLUtilities;
+import de.intevation.gnv.utils.InputValidator;
+import de.intevation.gnv.utils.WKTUtils;
+import de.intevation.gnv.utils.exception.ValidationException;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class CoordinateSelectionState extends StateBase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(CoordinateSelectionState.class);
+    
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 6318923553625195063L;
+    
+    /**
+     * XPATH Expressions for the setup.
+     */
+    
+    private final static String MESH_WIDTH_XPATH = "mesh-width";
+    private final static String XLINK_XPATH = "xlink:href";
+    private final static String MESH_LIST_XPATH = "/mesh-widths/mesh";
+    private final static String ID_XPATH = "id";
+    private final static String WIDTH_VALUE_XPATH = "width";
+    
+    /**
+     * Holds all given Widths between two MeshPoints for different Meshes.
+     */
+    private HashMap<String, Double> meshWidths = null;
+
+    /**
+     * Constructor
+     */
+    public CoordinateSelectionState() {
+        super();
+    }
+
+    @Override
+    protected void purifyResult(Collection<Result> result, String uuid) {
+        log.debug("CoordinateSelectionState.purifyResult");
+        List<Object> describeData = this.getDescibeData(uuid);
+        if (describeData == null) {
+            describeData = new ArrayList<Object>();
+        }
+        NamedCollection<KeyValueDescibeData> keyValueDescibeData = this
+                .extractKVP(result, "FEATUREID", "SHAPE");
+        describeData.add(keyValueDescibeData);
+        this.setDescibeData(uuid, describeData);
+    }
+    
+    /**
+     * @see de.intevation.gnv.state.StateBase#prepareInputData4RegionDBQuery(java.lang.String)
+     */
+    @Override
+    protected String prepareInputData4RegionDBQuery(String value) {
+        log.debug("CoordinateSelectionState.prepareInputData4RegionDBQuery");
+        double distance=0.;
+        String returnValue = null;
+        try {
+            Point center = new InputValidator().getPointValue(value);
+            String meshId = super.inputData.get("meshid").getValue();
+            int segments = 97;
+            if (meshWidths != null){
+                Double distanceValue = this.meshWidths.get(meshId);
+                if (distanceValue != null){
+                    log.debug("User "+distanceValue+" as Buffer around given Point");
+                    distance = distanceValue.doubleValue();
+                }else{
+                    log.warn("No distance is configured for Mesh with id"+ meshId);
+                }
+            }else{
+                log.warn("No MeshWidth configured. Check if this is correct.");
+            }
+            returnValue = center.buffer(distance,segments).toText();
+        } catch (NumberFormatException e) {
+            log.error(e,e);
+        } catch (ValidationException e) {
+            log.error(e,e);
+        }
+        return returnValue;
+        
+    }
+    
+    /**
+     * @see de.intevation.gnv.state.StateBase#extractKVP(java.util.Collection, java.lang.String, java.lang.String)
+     */
+    @Override
+    protected NamedCollection<KeyValueDescibeData> extractKVP(
+            Collection<Result> result,
+            String keyid,
+            String valueid) {
+        Iterator<Result> rit = result.iterator();
+        NamedCollection<KeyValueDescibeData> keyValueDescibeData = new NamedArrayList<KeyValueDescibeData>(
+        this.dataName, result.size());
+        keyValueDescibeData.setMultiSelect(this.dataMultiSelect);
+        String prevKey = null;
+        while (rit.hasNext()) {
+            Result resultValue = rit.next();
+            String key = resultValue.getString(keyid);
+            if(prevKey == null || !prevKey.equals(key)){ // TODO: FIXME: We have to do that because the arcsde does not support a distinct Query on Layers
+                String geomString = this.convert2DisplayCoordinate(resultValue.getString(valueid));
+                String value = geomString;
+                if (resultValue.getResultDescriptor().getColumnIndex("VALUE") > 0){
+                    value = resultValue.getString("VALUE") + " - "+value;
+                }
+                
+                
+                keyValueDescibeData.add(new DefaultKeyValueDescribeData(key,value ));
+            }
+            prevKey = key;
+        }
+        return keyValueDescibeData;
+    }
+    
+    protected static String convert2DisplayCoordinate(String wkt){
+        return WKTUtils.toText(wkt);
+    }
+
+    /**
+     * @see de.intevation.gnv.state.StateBase#setup(org.w3c.dom.Node)
+     */
+    @Override
+    public void setup(Node configuration) {
+        super.setup(configuration);
+        Element widthElement = (Element)Config.getNodeXPath(configuration, MESH_WIDTH_XPATH);
+        
+        if (widthElement != null){
+            String fileName = widthElement.getAttribute(XLINK_XPATH);
+            fileName = Config.replaceConfigDir(fileName);
+            Node configurationNode = new ArtifactXMLUtilities().readConfiguration(fileName);
+            NodeList meshNodes = Config.getNodeSetXPath(configurationNode,MESH_LIST_XPATH );
+            if (meshNodes != null){
+                meshWidths = new HashMap<String, Double>(meshNodes.getLength());
+                for (int i = 0; i < meshNodes.getLength(); i++){
+                    Element meshNode = (Element)meshNodes.item(i);
+                    String id = meshNode.getAttribute(ID_XPATH);
+                    Double value = Double.parseDouble(meshNode.getAttribute(WIDTH_VALUE_XPATH));
+                    meshWidths.put(id, value);
+                }
+            }
+        }else{
+            log.warn("No Mesh Width defined.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultInputData.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,56 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultInputData implements InputData {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 4308041648698108066L;
+    private String name = null;
+    private String value = null;
+
+    /**
+     * Constructor
+     */
+    public DefaultInputData(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.InputData#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.InputData#getValue()
+     */
+    public String getValue() {
+        return this.value;
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return this.name + "==> " + this.value;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.InputData#concartValue(java.lang.String)
+     */
+    public void concartValue(String value) {
+        this.value = this.value + " , " + value;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultInputValue.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,78 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultInputValue implements InputValue {
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = -8518824299166180986L;
+    private String name = null;
+    private String type = null;
+    private boolean multiselect = false;
+    private int usedInQueries = 1;
+    private String defaultValue = "N/N";
+
+    public DefaultInputValue(String name, String type, String defaultValue,
+                             boolean multiselect) {
+        this(name, type, multiselect, 1);
+        this.defaultValue = defaultValue;
+
+    }
+
+    /**
+     * Constructor
+     */
+    public DefaultInputValue(String name, String type, boolean multiselect,
+                             int usedInQueries) {
+        this.name = name;
+        this.type = type;
+        this.multiselect = multiselect;
+        this.usedInQueries = usedInQueries;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.InputValue#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.InputValue#getType()
+     */
+    public String getType() {
+        return this.type;
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return "InputValue " + this.name + " ==> " + this.type
+               + "==> multiselect: " + this.multiselect;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.InputValue#isMultiselect()
+     */
+    public boolean isMultiselect() {
+        return this.multiselect;
+    }
+
+    public int usedInQueries() {
+        return this.usedInQueries;
+    }
+
+    public String getDefaultValue() {
+        return this.defaultValue;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultOutputMode.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,76 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultOutputMode implements OutputMode {
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = -6459085460904827056L;
+    private String name = null;
+    private String description = null;
+    private String mimeType = null;
+    private Collection<InputValue> inputParameters = null;
+
+    /**
+     * Constructor
+     * 
+     * @param name
+     * @param description
+     * @param mimeType
+     */
+    public DefaultOutputMode(String name, String description, String mimeType,
+                             Collection<InputValue> inputParameters) {
+        super();
+        this.name = name;
+        this.description = description;
+        this.mimeType = mimeType;
+        this.inputParameters = inputParameters;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.OutputMode#getDescription()
+     */
+    public String getDescription() {
+        return this.description;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.OutputMode#getMimeType()
+     */
+    public String getMimeType() {
+        return this.mimeType;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.OutputMode#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return "Name: " + this.name + " ; Description: " + this.description
+               + " ; Mime-Type: " + this.mimeType;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.OutputMode#getInputParameters()
+     */
+    public Collection<InputValue> getInputParameters() {
+        return this.inputParameters;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,23 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultState extends StateBase {
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 8934030362091576766L;
+
+    /**
+     * Constructor
+     */
+    public DefaultState() {
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/InputData.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,19 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import java.io.Serializable;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface InputData extends Serializable {
+
+    public String getName();
+
+    public String getValue();
+
+    public void concartValue(String value);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/InputValue.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,24 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import java.io.Serializable;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface InputValue extends Serializable {
+
+    public String getName();
+
+    public String getType();
+
+    public String getDefaultValue();
+
+    public boolean isMultiselect();
+
+    public int usedInQueries();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/MinMaxState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,65 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.describedata.DefaultMinMaxDescribeData;
+import de.intevation.gnv.state.describedata.DescribeData;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class MinMaxState extends StateBase {
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = -3525903792105187408L;
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(MinMaxState.class);
+
+    /**
+     * Constructor
+     */
+    public MinMaxState() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.state.StateBase#purifyResult(java.util.Collection,
+     *      java.lang.String)
+     */
+    @Override
+    protected void purifyResult(Collection<Result> result, String uuid) {
+        log.debug("MinMaxState.purifyResult");
+        List<Object> describeData = this.getDescibeData(uuid);
+        if (describeData == null) {
+            describeData = new ArrayList<Object>();
+        }
+        if (result != null && result.size() == 1) {
+            
+            Result value = result.iterator().next();
+            DescribeData values = new DefaultMinMaxDescribeData(
+                dataName, 
+                value.getObject("MIN"), 
+                value.getObject("MAX"),
+                getID());
+            log.debug(values.toString());
+            describeData.add(values);
+        } else {
+            log.warn("Result cannot be handled as MinMax Resultset");
+        }
+        this.setDescibeData(uuid, describeData);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/OutputMode.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,22 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface OutputMode extends Serializable {
+
+    public String getName();
+
+    public String getDescription();
+
+    public String getMimeType();
+
+    public Collection<InputValue> getInputParameters();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/OutputState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,46 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import java.io.OutputStream;
+
+import java.util.Collection;
+
+import org.w3c.dom.Document;
+
+/**
+ * @author Tim Englich (tim.englich@intevation.de)
+ * 
+ */
+public interface OutputState 
+extends          State
+{
+
+    /**
+     * Returns the Rendered Result of an State.
+     * 
+     * @param outputMode
+     *            The Mode that should be produces (Chart, Map, ...)
+     * @return The Bytecode of the Result
+     * @throws StateException
+     */
+    public void out(
+        Document              format,
+        Collection<InputData> inputData,
+        OutputStream          outputStream,
+        String                uuid,
+        CallContext           callContext
+    ) throws StateException;
+
+    /**
+     * Delivers the provided OutputModes of an State
+     * 
+     * @return the provided OutputModes of an State
+     */
+    public Collection<OutputMode> getOutputModes();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/OutputStateBase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,297 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import de.intevation.artifactdatabase.Config;
+
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+
+import de.intevation.gnv.artifacts.cache.CacheFactory;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import de.intevation.gnv.geobackend.base.Result;
+
+import de.intevation.gnv.geobackend.base.query.QueryExecutor;
+import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
+
+import de.intevation.gnv.geobackend.base.query.exception.QueryException;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import java.io.OutputStream;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Locale;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public abstract class OutputStateBase 
+extends               StateBase 
+implements            OutputState
+{
+    public static final String XPATH_OUTPUT_MODE =
+        "/art:action/art:out/@name";
+
+    public static final String XPATH_MIME_TYPE   =
+        "/art:action/art:out/art:mime-type/@value";
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = -1718732895737303823L;
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(OutputStateBase.class);
+
+    /**
+     * The different Outputmodes which are provided by an OutputState
+     */
+    protected Collection<OutputMode> outputModes = null;
+    
+    protected String queryODVID = null;
+
+    /**
+     * Constructor
+     */
+    public OutputStateBase() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.state.OutputState#getOutputModes()
+     */
+    public Collection<OutputMode> getOutputModes() {
+        log.debug("OutputStateBase.getOutputModes");
+        return this.outputModes;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.StateBase#setup(org.w3c.dom.Node)
+     */
+    @Override
+    public void setup(Node configuration) {
+        log.debug("OutputStateBase.setup");
+        super.setup(configuration);
+        
+        this.queryODVID = Config.getStringXPath(configuration,"queryID-odv");
+        
+        NodeList outputModeList = Config.getNodeSetXPath(configuration,
+                "outputsModes/outputsMode");
+        if (outputModeList != null) {
+            log.debug(outputModeList.getLength() + " were found.");
+            this.outputModes = new ArrayList<OutputMode>(outputModeList
+                    .getLength());
+            for (int i = 0; i < outputModeList.getLength(); i++) {
+                Element currentNode = (Element)outputModeList.item(i);
+                String name = currentNode.getAttribute("name");
+                String description =currentNode.getAttribute("description");
+                String mimeType = currentNode.getAttribute("mime-type");
+                NodeList inputValuesList = Config.getNodeSetXPath(currentNode,
+                        "parameters/inputvalue");
+                Collection<InputValue> inputParameters = null;
+                if (inputValuesList != null) {
+                    inputParameters = new ArrayList<InputValue>(inputValuesList
+                            .getLength());
+                    for (int j = 0; j < inputValuesList.getLength(); j++) {
+                        Element currentInputValuesNode = (Element)inputValuesList.item(j);
+                        String inputValueName = currentInputValuesNode.getAttribute("name");
+                        String inputValueType = currentInputValuesNode.getAttribute("type");
+                        String defaultValue =currentInputValuesNode.getAttribute("value");
+                        boolean isMultiselect = false;
+                        InputValue inputValue = new DefaultInputValue(
+                                inputValueName, inputValueType, defaultValue,
+                                isMultiselect);
+                        inputParameters.add(inputValue);
+                    }
+                }
+
+                OutputMode outputMode = new DefaultOutputMode(name,
+                        description, mimeType, inputParameters);
+                log.debug(outputMode.toString());
+                this.outputModes.add(outputMode);
+
+            }
+        }
+    }
+
+    /**
+     * @see de.intevation.gnv.state.StateBase#advance()
+     */
+    @Override
+    public void advance(String uuid, CallContext context)
+    throws StateException
+    {
+    }
+
+    @Override
+    public void initialize(String uuid, CallContext context)
+    throws StateException
+    {
+    }
+
+    public void out(
+        Document              format, 
+        Collection<InputData> inputData,
+        OutputStream          outputStream, 
+        String                uuid, 
+        CallMeta              callMeta
+    )
+    throws StateException 
+    {
+    }
+
+    /**
+     * @see de.intevation.gnv.state.OutputState#out(java.lang.String,
+     *      java.util.Collection, java.io.OutputStream)
+     */
+    public void out(String outputMode, Collection<InputData> inputData,
+                    OutputStream outputStream) throws StateException {
+    }
+
+    /**
+     * @return
+     */
+    protected Object getChartResult(String uuid, CallContext callContext) {
+        log.debug("OutputStateBase.getChartResult");
+        Object result = null;
+        if (CacheFactory.getInstance().isInitialized()) {
+            String key = uuid + super.getID();
+            log.debug("Hash for Queryelements: " + key);
+            net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key);
+            if (value != null) {
+                result = value.getObjectValue();
+            }else{
+                result = this.getData(this.queryID);
+                if (CacheFactory.getInstance().isInitialized()) {
+                    CacheFactory.getInstance().getCache().put(new net.sf.ehcache.Element(key, result));
+                }
+                
+            }
+        }
+        return result;
+    }
+
+    protected Object getChartFromCache(String uuid, CallContext callContext) {
+        log.debug("Fetch chart [" + uuid + "] from cache");
+        CacheFactory cacheFactory = CacheFactory.getInstance();
+        if (cacheFactory.isInitialized()) {
+            String key = "chart_" + uuid + super.getID();
+            net.sf.ehcache.Element object = cacheFactory.getCache().get(key);
+
+            if (object != null) {
+                return object.getObjectValue();
+            }
+        }
+        return null;
+    }
+    
+    protected Collection<Result> getODVResult(String uuid) {
+        log.debug("OutputStateBase.getODVResult");
+        // TODO add Caching? I think it's not nessessary
+        Collection<Result> returnValue = null;
+        if (this.queryODVID != null){
+            returnValue = this.getData(this.queryODVID);
+        }else{
+            log.warn("No Query for ODV Data is defined.");
+        }
+        return returnValue;
+    }
+
+    /**
+     * @param returnValue
+     * @return
+     */
+    private Collection<Result> getData(String queryID) {
+        log.debug("OutputStateBase.getData");
+        Collection<Result> returnValue = null;
+        try {
+            String[] filterValues = this.generateFilterValuesFromInputData();
+            try {
+                QueryExecutor queryExecutor = QueryExecutorFactory
+                                              .getInstance()
+                                              .getQueryExecutor();
+                returnValue  = queryExecutor.executeQuery(queryID,filterValues);
+            } catch (RuntimeException e) {
+                log.error(e, e);
+            }
+        } catch (QueryException e) {
+            log.error(e, e);
+        }
+        return returnValue;
+    }
+    
+    protected void removeChartResult(String uuid) {
+        log.debug("OutputStateBase.getChartResult");
+        if (CacheFactory.getInstance().isInitialized()) {
+            String key = uuid + super.getID();
+            log.debug("Hash for Queryelements: " + key);
+            net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key);
+            if (value != null) {
+                CacheFactory.getInstance().getCache().remove(key);
+            }
+        }
+    }
+
+    protected void removeChart(String uuid) {
+        log.debug("OutputStateBase.removeChart from cache");
+
+        CacheFactory cacheFactory = CacheFactory.getInstance();
+        if (cacheFactory.isInitialized()) {
+            String key = "chart_" + uuid + super.getID();
+            net.sf.ehcache.Element object = cacheFactory.getCache().get(key);
+            if (object != null)
+                cacheFactory.getCache().remove(key);
+        }
+    }
+
+    protected void purifyChart(Object chart, String uuid) {
+        log.debug("Prufify chart [" + uuid + "]");
+        CacheFactory cacheFactory = CacheFactory.getInstance();
+        if (cacheFactory.isInitialized()) {
+            String key = "chart_" + uuid + getID();
+            cacheFactory.getCache().put(new net.sf.ehcache.Element(key, chart));
+        }
+    }
+
+    /**
+     * @see de.intevation.gnv.state.StateBase#putInputData(java.util.Collection, java.lang.String)
+     */
+    @Override
+    public void putInputData(Collection<InputData> inputData, 
+                             String uuid)
+                                         throws StateException {
+        log.debug("OutputStateBase.putInputData");
+        this.removeChartResult(uuid);
+        this.removeChart(uuid);
+        super.putInputData(inputData, uuid);
+    }
+
+    public void out(String outputMode, Collection<InputData> inputData,
+                    OutputStream outputStream, String uuid, CallMeta callMeta)
+                                                                              throws StateException {
+    }
+
+
+    protected String getMessage(Locale locale, String key, String value) {
+        return RessourceFactory.getInstance().getRessource(
+            locale,
+            key,
+            value
+        );
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/SingleInputState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,61 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.describedata.DefaultSingleValueDescribeData;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class SingleInputState extends StateBase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(SingleInputState.class);
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -6169497306324917318L;
+
+    /**
+     * Constructor
+     */
+    public SingleInputState() {
+    }
+
+    /**
+     * @see de.intevation.gnv.state.StateBase#purifyResult(java.util.Collection,
+     *      java.lang.String)
+     */
+    @Override
+    protected void purifyResult(Collection<Result> result, String uuid) {
+        log.debug("SingleInputState.purifyResult");
+        List<Object> describeData = this.getDescibeData(uuid);
+        if (describeData == null) {
+            describeData = new ArrayList<Object>();
+        }
+        String value = null;
+        if (result != null && result.size() == 1) {
+            Result tmpItem = result.iterator().next();
+            value = tmpItem.getObject("MAX").toString();
+        } else {
+            value = "";
+        }
+
+        describeData.add(new DefaultSingleValueDescribeData(
+            this.dataName, value, getID()));
+        this.setDescibeData(uuid, describeData);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/State.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,60 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import java.io.Serializable;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Ingo Weinzierl      (ingo.weinzierl@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public interface State extends Serializable {
+
+    public void setup(Node configuration);
+
+    public String getID();
+
+    public String getDescription();
+
+    public void describe(
+        Document    document,
+        Node        rootNode,
+        CallContext context,
+        String      uuid
+    );
+
+    public void setParent(State state);
+
+    public State getParent();
+
+    public Collection<InputValue> getRequiredInputValues();
+
+    public Map<String, InputData> inputData();
+
+    public void putInputData(Collection<InputData> inputData, String uuid)
+    throws StateException;
+
+    public Collection<InputData> getInputData() throws StateException;
+
+    public void advance(String uuid, CallContext context)
+    throws StateException;
+
+    public void initialize(String uuid, CallContext context)
+    throws StateException;
+
+    public void reset(String uuid);
+
+    public void endOfLife(Object globalContext);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/StateBase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,902 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import de.intevation.artifactdatabase.Config;
+import de.intevation.artifactdatabase.XMLUtils;
+
+import de.intevation.artifacts.ArtifactNamespaceContext;
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+
+import de.intevation.gnv.artifacts.GNVArtifactBase;
+
+import de.intevation.gnv.artifacts.cache.CacheFactory;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import de.intevation.gnv.geobackend.base.Result;
+
+import de.intevation.gnv.geobackend.base.query.QueryExecutor;
+import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
+
+import de.intevation.gnv.geobackend.base.query.exception.QueryException;
+
+import de.intevation.gnv.geobackend.util.DateUtils;
+
+import de.intevation.gnv.state.describedata.DefaultKeyValueDescribeData;
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+import de.intevation.gnv.state.describedata.MinMaxDescribeData;
+import de.intevation.gnv.state.describedata.NamedArrayList;
+import de.intevation.gnv.state.describedata.NamedCollection;
+import de.intevation.gnv.state.describedata.SingleValueDescribeData;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import de.intevation.gnv.utils.InputValidator;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.xpath.XPathConstants;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Ingo Weinzierl      (ingo.weinzierl@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public abstract class StateBase implements State {
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 2411169179001645426L;
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(GNVArtifactBase.class);
+    
+    private final static String MINVALUEFIELDNAME = "minvalue";
+    private final static String MAXVALUEFIELDNAME = "maxvalue";
+    
+    private final static String NODATASELECTIONKEY = "n/n";
+    
+    public final static String DESCRIBEDATAKEY = "_DESCRIBEDATA";
+
+    public final static String XPATH_STATIC_UI  = "art:static";
+    public final static String XPATH_DYNAMIC_UI = "art:dynamic";
+
+    private String id = null;
+
+    private String description = null;
+
+    protected String dataName = null;
+
+    protected boolean dataMultiSelect = false;
+    
+    protected boolean dataNoSelect = false;
+
+    protected String queryID = null;
+
+    protected Collection<String> inputValueNames = null;
+
+    private Map<String, InputValue> inputValues = null;
+
+    private State parent = null;
+
+    protected Map<String, InputData> inputData = null;
+    
+
+    /**
+     * Constructor
+     */
+    public StateBase() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.state.State#getID()
+     */
+    public String getID() {
+        return this.id;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.State#getDescription()
+     */
+    public String getDescription() {
+        return this.description;
+    }
+
+
+
+    /**
+     * @see de.intevation.gnv.state.State#getRequiredInputValues()
+     */
+    public Collection<InputValue> getRequiredInputValues() {
+        return this.inputValues.values();
+    }
+
+
+    public void reset(String uuid) {
+        
+        if (parent != null) {
+            inputData = parent.inputData();
+        }
+    }
+
+
+    /**
+     * @see de.intevation.gnv.state.State#setup(org.w3c.dom.Node)
+     */
+    public void setup(Node configuration) {
+        log.debug("StateBase.setup");
+        this.id = ((Element)configuration).getAttribute("id");
+        this.description = ((Element)configuration).getAttribute("description");
+
+        log.info("State-ID = " + this.id);
+        
+        NodeList inputValuesNodes = Config.getNodeSetXPath(configuration,
+                "inputvalues/inputvalue");
+        this.inputValues = new HashMap<String, InputValue>(inputValuesNodes
+                .getLength());
+        this.inputValueNames = new ArrayList<String>(inputValuesNodes
+                .getLength());
+        for (int i = 0; i < inputValuesNodes.getLength(); i++) {
+            Element inputValueNode = (Element)inputValuesNodes.item(i);
+            String usedinQueryValue = inputValueNode.getAttribute("usedinquery");
+            int usedinQuery = 1;
+            if (usedinQueryValue != null) {
+                try {
+                    usedinQuery = Integer.parseInt(usedinQueryValue);
+                } catch (NumberFormatException e) {
+                    log
+                            .warn("Used in Query Value cannot be transformed into a Number");
+                }
+            }
+            InputValue inputValue = new DefaultInputValue(inputValueNode.getAttribute("name"), 
+                                                          inputValueNode.getAttribute("type"), 
+                                                          Boolean.parseBoolean(inputValueNode.
+                                                          getAttribute("multiselect")), usedinQuery);
+            log.debug(inputValue.toString());
+            this.inputValues.put(inputValue.getName(), inputValue);
+            this.inputValueNames.add(inputValue.getName());
+        }
+
+        this.queryID = Config.getStringXPath(configuration, "queryID");
+        log.info("QueryID ==> " + this.queryID);
+
+        this.dataName = Config.getStringXPath(configuration, "dataname");
+
+        String dataMultiSelectValue = Config.getStringXPath(configuration,
+                                                           "data-multiselect");
+        if (dataMultiSelectValue != null) {
+            this.dataMultiSelect = Boolean.parseBoolean(dataMultiSelectValue);
+        }
+        
+        String dataNoSelectValue =Config.getStringXPath(configuration,
+                                                        "data-noselect");
+        if (dataNoSelectValue != null) {
+            this. dataNoSelect = Boolean.parseBoolean(dataNoSelectValue);
+        }
+        
+    }
+
+    /**
+     * @see de.intevation.gnv.state.State#getParent()
+     */
+    public State getParent() {
+        return this.parent;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.State#setParent(de.intevation.gnv.state.State)
+     */
+    public void setParent(State state) {
+        this.parent = state;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.State#putInputData(java.util.Collection)
+     */
+    public void putInputData(Collection<InputData> inputData, String uuid)
+                                                                          throws StateException {
+        log.debug("StateBase.putInputData");
+        if (inputData != null) {
+            Iterator<InputData> it = inputData.iterator();
+            InputValidator iv = new InputValidator();
+            while (it.hasNext()) {
+                InputData tmpItem = it.next();
+                InputValue inputValue = this.inputValues.get(tmpItem.getName());
+                if (inputValue != null) {
+                    if (this.inputData == null) {
+                        this.inputData = new HashMap<String, InputData>(
+                                inputData.size());
+                    }
+                    
+                    boolean valid = iv.isInputValid(tmpItem.getValue(),
+                            inputValue.getType());
+                    if (valid) {
+                        if (tmpItem.getName().equals(MINVALUEFIELDNAME)){
+                            String minValue = tmpItem.getValue();
+                            String maxValue = this.getInputValue4ID(inputData, MAXVALUEFIELDNAME);
+                            valid = iv.isInputValid(maxValue,inputValue.getType());
+                            if (!valid){
+                                String errMsg = "Wrong input for " + tmpItem.getValue()
+                                                + " is not an " + inputValue.getType()
+                                                + " Value.";
+                                log.warn(errMsg);
+                                throw new StateException(errMsg);
+                            }
+                            
+                            valid = iv.isInputValid(minValue, 
+                                    maxValue,
+                                    inputValue.getType());
+                            if (!valid){
+                                String errMsg = "MaxValue-Input is less than MinValue-Input ";
+                                log.warn(errMsg);
+                                throw new StateException(errMsg);
+                            }
+                        }else if (tmpItem.getName().equals(MAXVALUEFIELDNAME)){
+                            String minValue = this.getInputValue4ID(inputData, MINVALUEFIELDNAME);
+                            String maxValue = tmpItem.getValue();
+                            valid = iv.isInputValid(minValue,inputValue.getType());
+                            if (!valid){
+                                String errMsg = "Wrong input for " + tmpItem.getValue()
+                                                + " is not an " + inputValue.getType()
+                                                + " Value.";
+                                log.warn(errMsg);
+                                throw new StateException(errMsg);
+                            }
+                            
+                            valid = iv.isInputValid(minValue, 
+                                                    maxValue,
+                                                    inputValue.getType());
+                            if (!valid){
+                                String errMsg = "MaxValue-Input is less than MinValue-Input ";
+                                log.warn(errMsg);
+                                throw new StateException(errMsg);
+                            }
+                        }
+                        this.setSelection(tmpItem, uuid);
+                        this.inputData.put(tmpItem.getName(), tmpItem);
+                    } else {
+                        String errMsg = "Wrong input for " + tmpItem.getValue()
+                                        + " is not an " + inputValue.getType()
+                                        + " Value.";
+                        log.warn(errMsg);
+                        throw new StateException(errMsg);
+                    }
+
+                } else {
+                    String errMsg = "No Inputvalue given for Inputdata "
+                                    + tmpItem.getName();
+                    log.warn(errMsg + "Value will be ignored");
+
+                }
+            }
+        } else {
+            log.warn("No Inputdata given");
+        }
+    }
+    
+    private String getInputValue4ID(Collection<InputData> inputData, String inputName){
+        Iterator<InputData> it = inputData.iterator();
+        while (it.hasNext()) {
+            InputData tmpItem = it.next();
+            if (tmpItem.getName().equals(inputName)){
+                return tmpItem.getValue();
+            }
+        }
+        return null;
+    }
+
+    private void setSelection(InputData inputData, String uuid) {
+        log.debug("StateBase.setSelection");
+
+        Object o = this.getDescribeData(inputData.getName(),uuid);
+        if (o != null) {
+            if (o instanceof Collection<?>) {
+                Collection<KeyValueDescibeData> values = (Collection<KeyValueDescibeData>) o;
+
+                String value = inputData.getValue();
+                String[] selectedValues = value.split(",");
+                Set<String> selectedItems = new HashSet<String>(
+                        selectedValues.length);
+                for (int i = 0; i < selectedValues.length; i++) {
+                    selectedItems.add(selectedValues[i].trim());
+                }
+                // Selektion umsetzen
+                Iterator<KeyValueDescibeData> it = values.iterator();
+                while (it.hasNext()) {
+                    KeyValueDescibeData data = it.next();
+                    String key = "" + data.getKey();
+                    boolean selected = selectedItems.contains(key);
+                    data.setSelected(selected);
+                }
+            } else if (o instanceof MinMaxDescribeData) {
+                MinMaxDescribeData data = (MinMaxDescribeData) o;
+                if (inputData.getName().equals(MINVALUEFIELDNAME)) {
+                    data.setMinValue(inputData.getValue());
+                }
+                if (inputData.getName().equals(MAXVALUEFIELDNAME)) {
+                    data.setMaxValue(inputData.getValue());
+                }
+            } else if (o instanceof SingleValueDescribeData) {
+                ((SingleValueDescribeData)o).setValue(inputData.getValue());
+            }
+        }
+    }
+
+    private Object getDescribeData(String name, String uuid) {
+        log.debug("StateBase.getDescribeData");
+        Collection<Object> descibeData = this.getDescibeData(uuid);
+        if (descibeData != null) {
+            Iterator<Object> it = descibeData.iterator();
+            while (it.hasNext()) {
+                Object o = it.next();
+                if (o instanceof NamedCollection<?>) {
+                    if (name.equals(((NamedCollection<?>) o).getName())) {
+                        return o;
+                    }
+                } else if (o instanceof MinMaxDescribeData) {
+                    if (name.equals(((MinMaxDescribeData) o).getMinName())) {
+                        return o;
+                    }
+                    if (name.equals(((MinMaxDescribeData) o).getMaxName())) {
+                        return o;
+                    }
+                }else if (o instanceof SingleValueDescribeData) {
+                    if (name.equals(((SingleValueDescribeData)o).getName())){
+                        return o;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.State#advance(java.lang.String,
+     *      de.intevation.artifacts.CallMeta)
+     */
+    public void advance(String uuid, CallContext context)
+    throws StateException
+    {
+    }
+    
+    public void initialize(String uuid, CallContext context)
+    throws StateException
+    {
+        log.debug("StateBase.initialize");
+        try {
+            String[] filterValues = this
+                    .generateFilterValuesFromInputData();
+            Collection<Result> result = null;
+            try {
+                if (this.queryID != null) {
+                    QueryExecutor queryExecutor = QueryExecutorFactory
+                            .getInstance().getQueryExecutor();
+                    result = queryExecutor.executeQuery(this.queryID,
+                            filterValues);
+                }
+                this.purifyResult(result, uuid);
+            } catch (RuntimeException e) {
+                log.error(e, e);
+            }
+        } catch (QueryException e) {
+            log.error(e, e);
+            throw new StateException(e);
+        }
+    }
+
+    /**
+     * @return
+     */
+    protected String[] generateFilterValuesFromInputData() {
+        List<String> list = new ArrayList<String>();
+        Iterator<String> it = this.inputValueNames.iterator();
+        while (it.hasNext()) {
+            String value = it.next();
+            InputData data = this.inputData.get(value);
+            if (data != null
+                && this.inputValues.containsKey(data.getName())) {
+                int size = this.inputValues.get(data.getName())
+                        .usedInQueries();
+                String type = this.inputValues.get(data.getName())
+                        .getType();
+                String requestValue = data.getValue();
+                if (type.equalsIgnoreCase("string")) {
+                    requestValue = this
+                            .prepareInputData4DBQuery(requestValue);
+                } else if (type.equalsIgnoreCase("date")) {
+                    requestValue = this
+                            .prepareInputData4DateDBQuery(requestValue);
+                } else if (type.equalsIgnoreCase("coordinate")){
+                    requestValue = this
+                    .prepareInputData4RegionDBQuery(requestValue);
+                }
+                for (int j = 0; j < size; j++) {
+                    list.add(requestValue);
+                }
+            }
+        }
+        String[] filterValues = list.toArray(new String[list.size()]);
+        return filterValues;
+    }
+    
+    protected String prepareInputData4RegionDBQuery(String value){
+        return value;
+    }
+
+    private String prepareInputData4DateDBQuery(String value) {
+        log.debug("StateBase.prepareInputData4DateDBQuery");
+        if (value != null) {
+            String[] values = value.split(",");
+            String newValue = "";
+            for (int i = 0; i < values.length; i++) {
+                if (newValue.length() > 0) {
+                    newValue = newValue + " , ";
+                }
+                // TODO JUST HACK FIND A BETTER RESOLUTION
+                newValue = newValue + "to_date('" + values[i].trim()
+                           + "', 'YYYY.MM.DD HH24:MI:SS')";
+            }
+            return newValue;
+        }
+
+        return value;
+    }
+
+    private String prepareInputData4DBQuery(String value) {
+        log.debug("StateBase.prepareInputData4DBQuery");
+        if (value != null) {
+            String[] values = value.split(",");
+            String newValue = "";
+            for (int i = 0; i < values.length; i++) {
+                if (newValue.length() > 0) {
+                    newValue = newValue + " , ";
+                }
+                newValue = newValue + "'" + values[i].trim() + "'";
+            }
+            return newValue;
+        }
+
+        return value;
+
+    }
+
+    /**
+     * @param result
+     */
+    protected void purifyResult(Collection<Result> result, String uuid) {
+        log.debug("StateBase.purifyResult");
+        List<Object> describeData = this.getDescibeData(uuid);
+        if (describeData == null) {
+            describeData = new ArrayList<Object>();
+        }
+        NamedCollection<KeyValueDescibeData> keyValueDescibeData = extractKVP(result, "KEY", "VALUE");
+        describeData.add(keyValueDescibeData); 
+        this.setDescibeData(uuid, describeData);
+    }
+
+    /**
+     * @param result
+     * @return
+     */
+    protected NamedCollection<KeyValueDescibeData> extractKVP(Collection<Result> result,
+                                                              String keyid,
+                                                              String valueid) {
+        Iterator<Result> rit = result.iterator();
+        int dataSize = (this.dataNoSelect ? result.size()+1 : result.size());
+        
+        NamedCollection<KeyValueDescibeData> keyValueDescibeData = new NamedArrayList<KeyValueDescibeData>(
+                this.dataName, dataSize);
+        keyValueDescibeData.setMultiSelect(this.dataMultiSelect);
+        
+        if (this.dataNoSelect){
+            keyValueDescibeData.add(new DefaultKeyValueDescribeData(
+                NODATASELECTIONKEY,
+                "No Selection",
+                getID()
+            ));
+        }
+
+        boolean initialized = false;
+        int     keyPos      = 0;
+        int     valuePos    = 1;
+        String  previousKey = null;
+
+        while (rit.hasNext()) {
+            Result resultValue = rit.next();
+            if (!initialized){
+                keyPos = resultValue.getResultDescriptor().getColumnIndex(keyid);
+                valuePos = resultValue.getResultDescriptor().getColumnIndex(valueid);
+                if (valuePos < 0){
+                    valuePos = 1;
+                }
+                initialized = true;
+            }
+            String tmpKey = resultValue.getString(keyPos);
+            // TODO: FIXME: We have to do that because the arcsde does not support a distinct Query on Layers.
+            if (previousKey == null || !tmpKey.equals(previousKey)){
+                previousKey = tmpKey;
+                keyValueDescibeData.add(new DefaultKeyValueDescribeData(tmpKey, resultValue.getString(valuePos), getID()));
+            }
+        }
+        return keyValueDescibeData;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.State#describe(org.w3c.dom.Document,
+     *      org.w3c.dom.Node, de.intevation.artifacts.CallMeta,
+     *      java.lang.String)
+     */
+    public void describe(
+        Document    document,
+        Node        rootNode,
+        CallContext context,
+        String      uuid
+    ) {
+        log.debug("StateBase.describe");
+        CallMeta callMeta = context.getMeta();
+
+        List<Object> descibeData = this.getDescibeData(uuid);
+        if (descibeData != null) {
+            Iterator<Object> it = descibeData.iterator();
+
+            XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+                document,
+                ArtifactNamespaceContext.NAMESPACE_URI,
+                ArtifactNamespaceContext.NAMESPACE_PREFIX
+            );
+
+            Node staticNode = (Node) XMLUtils.xpath(
+                rootNode,
+                XPATH_STATIC_UI,
+                XPathConstants.NODE,
+                ArtifactNamespaceContext.INSTANCE
+            );
+
+            Node dynamic = (Node) XMLUtils.xpath(
+                rootNode,
+                XPATH_DYNAMIC_UI,
+                XPathConstants.NODE,
+                ArtifactNamespaceContext.INSTANCE
+            );
+
+            XMLUtils.ElementCreator xCreator = new XMLUtils.ElementCreator(
+                document,
+                XMLUtils.XFORM_URL,
+                XMLUtils.XFORM_PREFIX
+            );
+
+            while (it.hasNext()) {
+                Object o = it.next();
+                if ((!it.hasNext() && dataName != null)) {
+                    appendToDynamicNode(
+                        creator, xCreator, document, dynamic, callMeta, o);
+                }
+                else {
+                    appendToStaticNode(
+                        creator, xCreator, document, staticNode, callMeta, o);
+                }
+            }
+        }
+    }
+
+
+    protected void appendToStaticNode(
+        XMLUtils.ElementCreator artCreator,
+        XMLUtils.ElementCreator creator,
+        Document                document,
+        Node                    staticNode,
+        CallMeta                callMeta,
+        Object                  o
+    ) {
+        if (o instanceof Collection<?>) {
+            String name = null;
+            boolean multiselect = false;
+            if (o instanceof NamedCollection<?>) {
+                NamedCollection<?> nc = ((NamedCollection<?>) o);
+                name = nc.getName();
+                multiselect = nc.isMultiSelect();
+            } else {
+                Object[] names = this.inputValueNames.toArray();
+                name = names[names.length - 1].toString();
+            }
+
+            Element selectNode = creator.create(multiselect?"select":"select1");
+            creator.addAttr(selectNode, "ref", name);
+
+            Element lableNode = creator.create("label");
+            lableNode.setTextContent(RessourceFactory.getInstance()
+                    .getRessource(callMeta.getLanguages(), name, name));
+            Element choiceNode = creator.create("choices");
+
+            Collection<KeyValueDescibeData> values = (Collection<KeyValueDescibeData>) o;
+            Iterator<KeyValueDescibeData> resultIt = values.iterator();
+            while (resultIt.hasNext()) {
+                KeyValueDescibeData result = resultIt.next();
+
+                if (result.isSelected()) {
+                    artCreator.addAttr(
+                        selectNode, "state", result.getState(), true
+                    );
+
+                    Element itemNode = creator.create("item");
+
+                    creator.addAttr(itemNode, "selected", "true");
+
+                    Element choiceLableNode = creator.create("label");
+                    choiceLableNode.setTextContent(result.getValue());
+                    itemNode.appendChild(choiceLableNode);
+
+                    Element choiceValueNode = creator.create("value");
+                    choiceValueNode.setTextContent("" + result.getKey());
+                    itemNode.appendChild(choiceValueNode);
+                    choiceNode.appendChild(itemNode);
+                }
+            }
+            selectNode.appendChild(lableNode);
+            selectNode.appendChild(choiceNode);
+
+            staticNode.appendChild(selectNode);
+        }
+        else if (o instanceof MinMaxDescribeData) {
+            appendMinMaxDescribeData(
+                artCreator,
+                creator,
+                document,
+                staticNode,
+                callMeta,
+                o);
+        }
+        else if (o instanceof SingleValueDescribeData) {
+            appendSingleValueDescribeData(
+                artCreator,
+                creator,
+                document,
+                staticNode,
+                callMeta,
+                o);
+        }
+    }
+
+
+    protected void appendToDynamicNode(
+        XMLUtils.ElementCreator artCreator,
+        XMLUtils.ElementCreator creator,
+        Document                document,
+        Node                    dynamicNode,
+        CallMeta                callMeta,
+        Object                  o
+    ) {
+        if (o instanceof Collection<?>) {
+            String name = null;
+            boolean multiselect = false;
+            if (o instanceof NamedCollection<?>) {
+                NamedCollection<?> nc = ((NamedCollection<?>) o);
+                name = nc.getName();
+                multiselect = nc.isMultiSelect();
+            } else {
+                Object[] names = this.inputValueNames.toArray();
+                name = names[names.length - 1].toString();
+            } 
+
+            Element selectNode = creator.create(multiselect?"select":"select1");
+            creator.addAttr(selectNode, "ref", name);
+
+            Element lableNode = creator.create("label");
+            lableNode.setTextContent(RessourceFactory.getInstance()
+                    .getRessource(callMeta.getLanguages(), name, name));
+            Element choiceNode = creator.create("choices");
+
+            Collection<KeyValueDescibeData> values = (Collection<KeyValueDescibeData>) o;
+            Iterator<KeyValueDescibeData> resultIt = values.iterator();
+            while (resultIt.hasNext()) {
+                KeyValueDescibeData result = resultIt.next();
+                Element itemNode = creator.create("item");
+
+                if (result.isSelected()) {
+                    itemNode.setAttribute("selected", "true");
+                }
+
+                Element choiceLableNode = creator.create("label");
+                choiceLableNode.setTextContent(result.getValue());
+                itemNode.appendChild(choiceLableNode);
+
+                Element choicValueNode = creator.create("value");
+                choicValueNode.setTextContent("" + result.getKey());
+                itemNode.appendChild(choicValueNode);
+                choiceNode.appendChild(itemNode);
+            }
+            selectNode.appendChild(lableNode);
+            selectNode.appendChild(choiceNode);
+
+            dynamicNode.appendChild(selectNode);
+        }
+        else if (o instanceof MinMaxDescribeData) {
+            appendMinMaxDescribeData(
+                artCreator,
+                creator,
+                document,
+                dynamicNode,
+                callMeta,
+                o);
+        }
+        else if (o instanceof SingleValueDescribeData) {
+            appendSingleValueDescribeData(
+                artCreator,
+                creator,
+                document,
+                dynamicNode,
+                callMeta,
+                o);
+        }
+    }
+
+
+    protected void appendMinMaxDescribeData(
+        XMLUtils.ElementCreator artCreator,
+        XMLUtils.ElementCreator creator,
+        Document                document,
+        Node                    node,
+        CallMeta                callMeta,
+        Object                  o
+    ) {
+        MinMaxDescribeData minMaxDescibeData = (MinMaxDescribeData) o;
+        Object min = minMaxDescibeData.getMinValue();
+        Object max = minMaxDescibeData.getMaxValue();
+        if (min instanceof GregorianCalendar) {
+            Date d = ((GregorianCalendar) min).getTime();
+            min = DateUtils.getPatternedDateAmer(d);
+        }
+
+        if (max instanceof GregorianCalendar) {
+            Date d = ((GregorianCalendar) max).getTime();
+            max = DateUtils.getPatternedDateAmer(d);
+        }
+
+        Element groupNode = creator.create("group");
+        artCreator.addAttr(groupNode, "state", minMaxDescibeData.getState(), true);
+
+        creator.addAttr(groupNode, "ref", minMaxDescibeData.getName());
+        Element groupNodeLableNode = creator.create("label");
+        groupNodeLableNode.setTextContent(RessourceFactory
+                .getInstance().getRessource(
+                        callMeta.getLanguages(),
+                        minMaxDescibeData.getName(),
+                        minMaxDescibeData.getName()));
+        groupNode.appendChild(groupNodeLableNode);
+
+        Element inputMinNode = creator.create("input");
+        creator.addAttr(inputMinNode, "ref", MINVALUEFIELDNAME);
+        Element inputMinLableNode = creator.create("label");
+        inputMinLableNode.setTextContent(RessourceFactory
+                .getInstance().getRessource(
+                        callMeta.getLanguages(), MINVALUEFIELDNAME,
+                        MINVALUEFIELDNAME));
+        inputMinNode.appendChild(inputMinLableNode);
+
+        Element inputMinValueNode = creator.create("value");
+        inputMinValueNode.setTextContent(min.toString());
+        inputMinNode.appendChild(inputMinValueNode);
+
+        Element inputMaxNode = creator.create("input");
+        creator.addAttr(inputMaxNode, "ref", MAXVALUEFIELDNAME);
+        Element inputMaxLableNode = creator.create("label");
+        inputMaxLableNode.setTextContent(RessourceFactory
+                .getInstance().getRessource(
+                        callMeta.getLanguages(), MAXVALUEFIELDNAME,
+                        MAXVALUEFIELDNAME));
+        inputMaxNode.appendChild(inputMaxLableNode);
+
+        Element inputMaxValueNode = creator.create("value");
+        inputMaxValueNode.setTextContent(max.toString());
+        inputMaxNode.appendChild(inputMaxValueNode);
+
+        groupNode.appendChild(inputMinNode);
+        groupNode.appendChild(inputMaxNode);
+
+        node.appendChild(groupNode);
+    }
+
+
+    protected void appendSingleValueDescribeData(
+        XMLUtils.ElementCreator artCreator,
+        XMLUtils.ElementCreator creator,
+        Document                document,
+        Node                    node,
+        CallMeta                callMeta,
+        Object                  o
+    ) {
+        SingleValueDescribeData svdb = (SingleValueDescribeData) o;
+
+        Element groupNode = creator.create("group");
+        artCreator.addAttr(groupNode, "state", svdb.getState(), true);
+        creator.addAttr(groupNode, "ref",  svdb.getName());
+
+        Element groupNodeLableNode = creator.create("label");
+        groupNodeLableNode.setTextContent(RessourceFactory
+                .getInstance().getRessource(
+                        callMeta.getLanguages(),
+                        svdb.getName(),
+                        svdb.getName()));
+        groupNode.appendChild(groupNodeLableNode);
+
+        Element inputNode = creator.create("input");
+        creator.addAttr(inputNode, "ref", svdb.getName());
+
+        Element inputLableNode = creator.create("label");
+        inputLableNode.setTextContent("");
+        inputNode.appendChild(inputLableNode);
+
+        Element inputValueNode = creator.create("value");
+        inputValueNode.setTextContent(svdb.getValue());
+        inputNode.appendChild(inputValueNode);
+
+        groupNode.appendChild(inputNode);
+
+        node.appendChild(groupNode);
+    }
+
+    /**
+     * @see de.intevation.gnv.state.State#getDescibeData()
+     */
+    protected List<Object> getDescibeData(String uuid) {
+        if (CacheFactory.getInstance().isInitialized()) {
+            String key = uuid + DESCRIBEDATAKEY;
+            log.debug("Hash for Queryelements: " + key);
+            net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key);
+            if (value != null) {
+                return (List<Object>) (value.getObjectValue());
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * @see de.intevation.gnv.state.State#getDescibeData()
+     */
+    protected void setDescibeData(String uuid, List<Object> describeData) {
+        
+        if (CacheFactory.getInstance().isInitialized()) {
+            String key = uuid + DESCRIBEDATAKEY;
+            log.debug("Hash for Queryelements: " + key);
+            CacheFactory.getInstance().getCache().put(new net.sf.ehcache.Element(key, describeData));
+        }
+    }
+
+    public Map<String, InputData> inputData() {
+        return inputData;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.State#getInputData()
+     */
+    public Collection<InputData> getInputData() throws StateException {
+        return this.inputData != null ? this.inputData.values() : null;
+    }
+
+    public void endOfLife(Object globalContext) {
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/StateFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,55 @@
+/**
+ *
+ */
+package de.intevation.gnv.state;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Node;
+
+import de.intevation.gnv.artifacts.GNVArtifactBase;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class StateFactory {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(GNVArtifactBase.class);
+
+    private static StateFactory instance = null;
+
+    /**
+     * Constructor
+     */
+    public StateFactory() {
+        super();
+    }
+
+    public static StateFactory getInstance() {
+        if (instance == null) {
+            instance = new StateFactory();
+        }
+        return instance;
+    }
+
+    public State createState(Node configuration) {
+        log.debug("StateFactory.createState");
+        State state = null;
+        try {
+            String classname = ((org.w3c.dom.Element)configuration).getAttribute("state");
+            state = (State) (Class.forName(classname).newInstance());
+            state.setup(configuration);
+        } catch (InstantiationException e) {
+            log.error(e, e);
+        } catch (IllegalAccessException e) {
+            log.error(e, e);
+        } catch (ClassNotFoundException e) {
+            log.error(e, e);
+        }
+        return state;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DefaultKeyValueDescribeData.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,69 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.describedata;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultKeyValueDescribeData implements KeyValueDescibeData {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -924469415242703108L;
+
+    private String key;
+
+    private String value = null;
+
+    private String state;
+
+    private boolean selected = false;
+
+    public DefaultKeyValueDescribeData(String key, String value) {
+        this(key, value, null);
+    }
+
+    public DefaultKeyValueDescribeData(String key, String value, String state) {
+        super();
+        this.key = key;
+        this.value = value;
+        this.state = state;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.KeyValueDescibeData#getKey()
+     */
+    public String getKey() {
+        return this.key;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.KeyValueDescibeData#getValue()
+     */
+    public String getValue() {
+        return this.value;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.KeyValueDescibeData#isSelected()
+     */
+    public boolean isSelected() {
+        return this.selected;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.KeyValueDescibeData#setSelected(boolean)
+     */
+    public void setSelected(boolean selected) {
+        this.selected = selected;
+    }
+
+
+    public String getState() {
+        return this.state;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DefaultMinMaxDescribeData.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,104 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.describedata;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultMinMaxDescribeData implements MinMaxDescribeData {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -2917176219029052295L;
+
+    private Object minValue = null;
+
+    private Object maxValue = null;
+    
+    private String name = null; 
+
+    private String state = null;
+
+    private final static String minName = "minvalue";
+
+    private final static String maxName = "maxvalue";
+
+    /**
+     * Constructor
+     */
+    public DefaultMinMaxDescribeData(
+        String name,
+        Object minValue,
+        Object maxValue,
+        String state
+    ) {
+        super();
+        this.name = name;
+        this.minValue = minValue;
+        this.maxValue = maxValue;
+        this.state    = state;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#getMaxValue()
+     */
+    public Object getMaxValue() {
+        return this.maxValue;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#getMinValue()
+     */
+    public Object getMinValue() {
+        return this.minValue;
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return "MIN: " + this.minValue.toString() + " ; MAX: "
+               + this.maxValue.toString();
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#getName()
+     */
+    public String getMinName() {
+        return minName;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#getMaxName()
+     */
+    public String getMaxName() {
+        return maxName;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#setMaxValue(java.lang.Object)
+     */
+    public void setMaxValue(Object maxValue) {
+        this.maxValue = maxValue;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#setMinValue(java.lang.Object)
+     */
+    public void setMinValue(Object minValue) {
+        this.minValue = minValue;
+    }
+
+    public String getName() {
+       return this.name;
+    }
+
+    public String getState() {
+        return this.state;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DefaultSingleValueDescribeData.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,65 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.describedata;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultSingleValueDescribeData implements SingleValueDescribeData {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 3580176842483316917L;
+
+    private String name = null;
+
+    private String value = null;
+
+    private String state = null;
+
+    public DefaultSingleValueDescribeData(String name, String value) {
+        this(name, value, null);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param name
+     * @param value
+     */
+    public DefaultSingleValueDescribeData(
+        String name,
+        String value,
+        String state
+    ) {
+        super();
+        this.name = name;
+        this.value = value;
+        this.state = state;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.SingleValueDescribeData#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.SingleValueDescribeData#getValue()
+     */
+    public String getValue() {
+        return this.value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getState() {
+        return this.state;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DescribeData.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,16 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.describedata;
+
+import java.io.Serializable;
+
+/**
+ * Markerinterface
+ * 
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface DescribeData extends Serializable {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/KeyValueDescibeData.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,24 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.describedata;
+
+import java.io.Serializable;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface KeyValueDescibeData extends Serializable {
+
+    public String getKey();
+
+    public String getValue();
+
+    public String getState();
+
+    public boolean isSelected();
+
+    public void setSelected(boolean selected);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/MinMaxDescribeData.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,27 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.describedata;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface MinMaxDescribeData extends DescribeData {
+
+    public Object getMinValue();
+
+    public Object getMaxValue();
+
+    public void setMinValue(Object minValue);
+
+    public void setMaxValue(Object maxValue);
+
+    public String getName();
+    
+    public String getMinName();
+
+    public String getMaxName();
+
+    public String getState();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/NamedArrayList.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,71 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.describedata;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class NamedArrayList<E> extends ArrayList<E> implements
+                                                   NamedCollection<E> {
+    /**
+     *
+     */
+    private static final long serialVersionUID = 8172229594749676354L;
+
+    private String name = null;
+
+    private boolean multiSelect = false;
+
+    /**
+     * Constructor
+     */
+    public NamedArrayList(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param initialCapacity
+     */
+    public NamedArrayList(String name, int initialCapacity) {
+        super(initialCapacity);
+        this.name = name;
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param c
+     */
+    public NamedArrayList(String name, Collection<E> c) {
+        super(c);
+        this.name = name;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.NamedCollection#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.NamedCollection#isMultiSelect()
+     */
+    public boolean isMultiSelect() {
+        return multiSelect;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.describedata.NamedCollection#setMultiSelect(boolean)
+     */
+    public void setMultiSelect(boolean multiSelect) {
+        this.multiSelect = multiSelect;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/NamedCollection.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,19 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.describedata;
+
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface NamedCollection<E> extends Collection<E> {
+
+    public String getName();
+
+    public boolean isMultiSelect();
+
+    public void setMultiSelect(boolean multiSelect);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/SingleValueDescribeData.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,19 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.describedata;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface SingleValueDescribeData extends DescribeData {
+
+    public String getName();
+
+    public String getValue();
+    
+    public void setValue(String value);
+
+    public String getState();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/exception/StateException.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,52 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.exception;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class StateException extends Exception {
+
+    /**
+     * The UID of the Class
+     */
+    private static final long serialVersionUID = -1635921702746050244L;
+
+    /**
+     * Constructor
+     */
+    public StateException() {
+        super();
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param message
+     */
+    public StateException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param cause
+     */
+    public StateException(Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param message
+     * @param cause
+     */
+    public StateException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,411 @@
+package de.intevation.gnv.state.profile.horizontal;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+import de.intevation.artifactdatabase.Config;
+
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.gnv.artifacts.cache.CacheFactory;
+
+import de.intevation.gnv.artifacts.context.GNVArtifactContext;
+
+import de.intevation.gnv.chart.Chart;
+import de.intevation.gnv.chart.ChartLabels;
+import de.intevation.gnv.chart.HorizontalCrossProfileChart;
+
+import de.intevation.gnv.geobackend.base.DefaultResult;
+import de.intevation.gnv.geobackend.base.DefaultResultDescriptor;
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.geobackend.base.ResultDescriptor;
+
+import de.intevation.gnv.geobackend.base.query.QueryExecutor;
+import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
+
+import de.intevation.gnv.geobackend.base.query.exception.QueryException;
+
+import de.intevation.gnv.math.Interpolation2D;
+import de.intevation.gnv.math.LinearMetrics;
+import de.intevation.gnv.math.Point2d;
+
+import de.intevation.gnv.state.InputData;
+
+import de.intevation.gnv.utils.DistanceCalculator;
+import de.intevation.gnv.utils.StringUtils;
+import de.intevation.gnv.utils.WKTUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.ChartTheme;
+
+import org.w3c.dom.Node;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Ingo Weinzierl      (iweinzierl@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class HorizontalProfileMeshCrossOutputState
+extends      HorizontalProfileOutputState 
+{
+
+    public static final boolean USE_INDEX_BUFFER =
+        Boolean.getBoolean("gnv.horizontal.profile.mesh.cross.index.buffer");
+
+    private static final long serialVersionUID = 2205958041745637263L;
+    
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(
+        HorizontalProfileMeshCrossOutputState.class);
+
+    private String ijkQueryID = null;
+   
+    /**
+     * Constructor
+     */
+    public HorizontalProfileMeshCrossOutputState() {
+        super();
+    }
+    
+    /**
+     * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#setup(org.w3c.dom.Node)
+     */
+    @Override
+    public void setup(Node configuration) {
+        super.setup(configuration);
+        this.ijkQueryID = Config.getStringXPath(configuration,"queryID-ijk");
+        
+    }
+
+
+    @Override
+    protected Chart getChart(
+        ChartLabels  chartLables,
+        ChartTheme   theme,
+        Collection   parameters,
+        Collection   measurements,
+        Collection   dates,
+        Object       result,
+        Locale       locale,
+        String       uuid,
+        boolean      linesVisible,
+        boolean      shapesVisible,
+        CallContext  callContext
+    ) {
+        Chart chart = null;
+        if (CACHE_CHART) {
+            log.info("Try to get horizontalprofilemeshcross chart from cache.");
+            chart = (Chart) getChartFromCache(uuid, callContext);
+        }
+
+        if (chart != null)
+            return chart;
+
+        log.info("Chart not in cache yet.");
+        chart = new HorizontalCrossProfileChart(
+            chartLables,
+            theme,
+            parameters,
+            measurements,
+            dates,
+            (Collection)result,
+            null,
+            locale,
+            linesVisible,
+            shapesVisible
+        );
+        chart.generateChart();
+
+        if (CACHE_CHART) {
+            log.info("Put chart into cache.");
+            purifyChart(chart, uuid);
+        }
+
+        return chart;
+    }
+
+	private static int numSamples(CallContext callContext) {
+		GNVArtifactContext context =
+            (GNVArtifactContext)callContext.globalContext();
+		Integer samples = (Integer)context.get(
+			GNVArtifactContext.HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES_KEY);
+		return samples != null
+			? samples.intValue()
+			: GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES;
+	}
+
+    @Override
+    protected Object getChartResult(String uuid, CallContext callContext) {
+        log.debug("HorizontalProfileMeshCrossOutputState.getChartResult");
+        Collection<Result> result = null;
+        if (CacheFactory.getInstance().isInitialized()) {
+            String key = uuid + super.getID();
+            log.debug("Hash for Queryelements: " + key);
+            net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key);
+            if (value != null) {
+                result = (Collection<Result>) (value.getObjectValue());
+            }else{
+
+                InputData meshLine = inputData.get("mesh_linestring");
+                InputData meshId   = inputData.get("meshid");
+
+                if (meshLine == null) {
+                    log.error("mesh_linestring is not defined");
+                    throw new IllegalStateException("missing mesh_linestring");
+                }
+
+                if (meshId == null) {
+                    log.error("meshid is not defined");
+                    throw new IllegalStateException("missing meshid");
+                }
+
+                Coordinate [] coords = WKTUtils.toCoordinates(
+                    meshLine.getValue());
+
+                if (coords == null) {
+                    throw new IllegalStateException("cannot read coordinates");
+                }
+
+                try {
+                    String additionWhere = USE_INDEX_BUFFER
+                        ? WKTUtils.worldCoordinatesToIndex(
+                            coords,
+                            result,
+                            meshId.getValue(),
+                            ijkQueryID)
+                        : WKTUtils.TRUE_EXPRESSION;
+
+                    String[] addedFilterValues = StringUtils.append(
+                        generateFilterValuesFromInputData(),
+                        additionWhere);
+
+                    QueryExecutor queryExecutor = QueryExecutorFactory
+                        .getInstance()
+                        .getQueryExecutor();
+
+                    result = process(
+                        Arrays.asList(coords),
+						numSamples(callContext),
+                        queryExecutor.executeQuery(
+                        queryID,
+                        addedFilterValues));
+                }
+                catch (QueryException e) {
+                    log.error(e,e);
+                }
+
+                if (CacheFactory.getInstance().isInitialized()) {
+                    CacheFactory.getInstance().getCache().put(new net.sf.ehcache.Element(key, result));
+                }
+
+            }
+        }
+        return result;
+    }
+
+
+    @Override
+    protected String createChartSubtitle(Locale locale, String uuid) {
+        log.debug("create chart subtitle for horizontal crossprofile charts.");
+        String subtitle = createTimePeriod(locale, uuid);
+
+        return subtitle;
+    }
+
+
+    public static Collection<Result> process(
+        List<Coordinate>   path,
+		int                numSamples,
+        Collection<Result> input
+    ) {
+		boolean debug = log.isDebugEnabled();
+
+		if (debug) {
+			log.debug("--- number of points before processing: " + input.size());
+			log.debug("    number samples: " + numSamples);
+		}
+
+        ArrayList<Result> output = new ArrayList<Result>();
+
+        Result last = null;
+
+        int [] diffColums = null;
+
+        SectionHandler sectionHandler = null;
+
+        for (Result result: input) {
+
+            if (sectionHandler == null) {
+
+                ResultDescriptor rd = result.getResultDescriptor();
+                diffColums = rd.getColumnIndices(DIFF_COLUMS);
+                int columns = rd.getColumnCount();
+
+                DefaultResultDescriptor resultDescriptor =
+                    new DefaultResultDescriptor();
+
+                for (int j = 0; j < columns; ++j) {
+                    String columnName = rd.getColumnName(j);
+                    if (!StringUtils.contains(COLUMN_BLACKLIST, columnName)) {
+                        resultDescriptor.addColumn(
+                            columnName,
+                            rd.getColumnClassName(j));
+                    }
+                }
+
+                sectionHandler = new SectionHandler(
+                    path,
+					numSamples,
+                    output,
+                    resultDescriptor);
+
+                sectionHandler.setPrototyp(result);
+            }
+
+            if (last != null && WKTUtils.different(last, result, diffColums)) {
+                sectionHandler.finish();
+                sectionHandler.setPrototyp(result);
+            }
+
+            sectionHandler.handle(result);
+
+            last = result;
+        }
+
+        if (sectionHandler != null) {
+            sectionHandler.finish();
+        }
+
+		if (debug) {
+			log.debug("--- number of points after processing: " + output.size());
+		}
+
+        return output;
+    }
+
+
+    private static final String [] DIFF_COLUMS = {
+        "GROUP1",
+        "GROUP2",
+        "GROUP3"
+    };
+
+    private static final String [] COLUMN_BLACKLIST = {
+        "MEDIAN.MESHPOINT.JPOSITION",
+        "MEDIAN.MESHPOINT.IPOSITION"
+    };
+
+    public static final double EPSILON = 1e-5d;
+
+    public static final class SectionHandler
+    implements                Interpolation2D.Consumer
+    {
+        private ArrayList<Point2d> points;
+        private List<Coordinate>   path;
+        private Collection<Result> output;
+        private Result             prototyp;
+        private ResultDescriptor   descriptor;
+        private boolean            lastWasSuccess;
+		private int                numSamples;
+
+        public SectionHandler() {
+        }
+
+        public SectionHandler(
+            List<Coordinate>   path,
+			int                numSamples,
+            Collection<Result> output,
+            ResultDescriptor   descriptor
+        ) {
+            this.path       = path;
+			this.numSamples = numSamples;
+            this.output     = output;
+            this.descriptor = descriptor;
+            points          = new ArrayList<Point2d>();
+            lastWasSuccess  = true;
+        }
+
+        public void finish() {
+            if (!points.isEmpty()) {
+                double distance = WKTUtils.toKM(
+                    DistanceCalculator.calculateDistance(path));
+
+                if (distance > EPSILON) {
+
+                    Interpolation2D.interpolate(
+                        path,
+                        points,
+                        0d,
+                        distance,
+                        numSamples,
+                        LinearMetrics.INSTANCE,
+                        this);
+                }
+
+                points.clear();
+            }
+            lastWasSuccess = true;
+        }
+
+        public void setPrototyp(Result prototyp) {
+            this.prototyp = prototyp;
+        }
+
+        public void handle(Result result) {
+            Coordinate coordinate =
+                WKTUtils.toCoordinate(result.getString("SHAPE"));
+            double value = result.getDouble("YORDINATE");
+            int iPos     = result.getInteger("IPOSITION");
+            int jPos     = result.getInteger("JPOSITION");
+            Point2d p = new Point2d(
+                coordinate.x,
+                coordinate.y,
+                value,
+                iPos, jPos);
+            points.add(p);
+        }
+
+        public void interpolated(Coordinate coordinate, boolean success) {
+
+            if (!success && !lastWasSuccess) {
+                // only insert null if last was valid.
+                // This prevents flooding the result set with nulls
+                // if interpolating over a large gap.
+                return;
+            }
+
+            DefaultResult result = new DefaultResult(descriptor);
+            ResultDescriptor pd = prototyp.getResultDescriptor();
+
+            int pcolums = pd.getColumnCount();
+            for (int i = 0, j = 0; i < pcolums; ++i) {
+                String colname = pd.getColumnName(i);
+                if (StringUtils.contains(COLUMN_BLACKLIST, colname)) {
+                    continue;
+                }
+                if (colname.equals("SHAPE")) {
+                    result.addColumnValue(j, WKTUtils.toWKT(coordinate));
+                }
+                else if (colname.equals("YORDINATE")) {
+                    result.addColumnValue(j, success
+                        ? Double.valueOf(coordinate.z)
+                        : null);
+                }
+                else {
+                    result.addColumnValue(j, prototyp.getObject(i));
+                }
+                ++j;
+            }
+            output.add(result);
+            lastWasSuccess = success;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,347 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.profile.horizontal;
+
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.io.WKTReader;
+
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.gnv.chart.Chart;
+import de.intevation.gnv.chart.ChartLabels;
+import de.intevation.gnv.chart.HorizontalProfileChart;
+
+import de.intevation.gnv.exports.DefaultExport;
+import de.intevation.gnv.exports.DefaultProfile;
+
+import de.intevation.gnv.exports.Export.Profile;
+
+import de.intevation.gnv.exports.ShapeDataCollector;
+
+import de.intevation.gnv.geobackend.base.Result;
+
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import de.intevation.gnv.state.timeseries.TimeSeriesOutputState;
+
+import de.intevation.gnv.statistics.HorizontalProfileStatistics;
+import de.intevation.gnv.statistics.Statistics;
+
+import de.intevation.gnv.utils.WKTUtils;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+
+import java.text.SimpleDateFormat;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Locale;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.ChartTheme;
+
+/**
+ * @author Tim Englich (tim.englich@intevation.de)
+ */
+public class HorizontalProfileOutputState
+extends      TimeSeriesOutputState
+{    
+    public static final String [] HORIZONTAL_PROFILE_COLUMNS = {
+        "SHAPE",
+        "YORDINATE",
+        "GROUP1"
+        // "GROUP2",
+    };
+
+
+    public static final String [] HORIZONTAL_MESH_CSV_COLUMN_LABEL = {
+        "Longitude",
+        "Latitude",
+        "Value",
+        "ParameterID",
+        //"MeshID"
+    };
+
+
+    public static final String [] HORIZONTAL_MEASUREMENT_CSV_COLUMN_LABEL = {
+        "Longitude",
+        "Latitude",
+        "Value",
+        "ParameterID",
+        //"SurveyID"
+    };
+    /**
+     * The UID of this class
+     */
+    private static final long serialVersionUID = 4401516087492028840L;
+
+    private static Logger log = Logger
+    .getLogger(HorizontalProfileOutputState.class);
+
+    public static final String DATE_FORMAT = "yyyy.MM.dd HH:mm:ss";
+
+    public static final String [] CHART_TITLE_META = {
+        "CRUISE",
+        "DEPTH",
+        "SHAPE"
+    };
+
+
+    public static final String [] CHART_TITLE_META_RESSOURCES = {
+        "cruiseid",
+        "depth",
+        "coordinate"
+    };
+
+    public static final String [] TIMESERIES_CSV_PROFILE_NAMES = {
+        "SHAPE",
+        "YORDINATE",
+        "GROUP1",
+        "GROUP2",
+        "GROUP3"
+    };
+
+    public static final Profile TIMESERIES_CSV_PROFILE =
+        new DefaultProfile(
+            null,
+            ',',
+            '"',
+            '"',
+            "CSV",
+            "ISO-8859-1");
+
+    /**
+     * Constructor
+     */
+    public HorizontalProfileOutputState() {
+        super();
+        super.domainLable = "chart.horizontalprofile.title.xaxis";
+    }
+
+
+    @Override
+    protected Chart getChart(
+        ChartLabels  chartLables,
+        ChartTheme   theme,
+        Collection   parameters,
+        Collection   measurements,
+        Collection   dates,
+        Object       result,
+        Locale       locale,
+        String       uuid,
+        boolean      linesVisible,
+        boolean      shapesVisible,
+        CallContext  callContext
+    ) {
+        Chart chart = null;
+
+        if (CACHE_CHART) {
+            log.info("Try to get horizontalprofile chart from cache.");
+            chart = (Chart) getChartFromCache(uuid, callContext);
+        }
+
+        if (chart != null)
+            return chart;
+
+        log.info("Chart not in cache yet.");
+        chart = new HorizontalProfileChart(
+            chartLables,
+            theme,
+            parameters,
+            measurements,
+            dates,
+            (Collection)result,
+            null,
+            locale,
+            linesVisible,
+            shapesVisible
+        );
+        chart.generateChart();
+
+        if (CACHE_CHART) {
+            log.info("Put chart into cache.");
+            purifyChart(chart, uuid);
+        }
+
+        return chart;
+    }
+
+
+    /**
+     * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#getStatisticsGenerator()
+     */
+    @Override
+    protected Statistics getStatisticsGenerator() {
+        return new HorizontalProfileStatistics();
+    }
+
+
+    @Override
+    protected void createCSV(OutputStream out, Collection<Result> results)
+    throws UnsupportedEncodingException, IOException, StateException
+    {
+        log.debug("Create csv export for horizontal profiles.");
+        Iterator iter = results.iterator();
+        Result   res  = iter.hasNext() ? (Result) iter.next() : null;
+
+        if (res == null)
+            return;
+
+        Profile profile = null;
+        int     dataid  = res.getInteger("DATAID").intValue();
+
+        // on meshes
+        if (dataid == 2) {
+            profile =  new DefaultProfile(
+                HORIZONTAL_MESH_CSV_COLUMN_LABEL,
+                ',',
+                '"',
+                '"',
+                "CSV",
+                "ISO-8859-1");
+        }
+
+        // on measurements
+        else {
+            profile =  new DefaultProfile(
+                HORIZONTAL_MEASUREMENT_CSV_COLUMN_LABEL,
+                ',',
+                '"',
+                '"',
+                "CSV",
+                "ISO-8859-1");
+        }
+
+        DefaultExport export = new DefaultExport(
+            new ShapeDataCollector(HORIZONTAL_PROFILE_COLUMNS));
+        export.create(profile, out, results);
+    }
+
+
+    protected String createChartTitle(Locale locale, String uuid) {
+        String fisName = getFisName(locale);
+        log.debug("created title for horizontal profile chart: " + fisName);
+
+        return fisName;
+    }
+
+
+    protected String createChartSubtitle(Locale locale, String uuid) {
+        log.debug("create chart subtitle.");
+        String subtitle = createTimePeriod(locale, uuid);
+
+        // ODV results contain meta information about cruise, station and so on
+        Collection results = getODVResult(uuid);
+        if (results != null) {
+            Iterator iter   = results.iterator();
+            Result   result = iter.hasNext() ? (Result) iter.next() : null;
+
+            subtitle += subtitle.length() != 0 ? "\n" : "";
+            subtitle += createMetaChartSubtitle(locale, result);
+        }
+
+        return subtitle;
+    }
+
+
+    protected String createMetaChartSubtitle(Locale locale, Result result) {
+        log.debug("Fetch meta information and put it into subtitle.");
+        if (result == null)
+            return "";
+
+        StringBuilder meta      = new StringBuilder();
+        WKTReader     wktReader = new WKTReader();
+
+
+        for (int i = 0; i < CHART_TITLE_META.length; i++) {
+            String qry = CHART_TITLE_META[i];
+
+            if (qry.equals("SHAPE")) {
+                String wktPoint = result.getString(qry);
+
+                meta.append(getMessage(locale,"coordinate","coordinate"));
+                meta.append(": ");
+                meta.append(WKTUtils.toText(wktPoint));
+            }
+            else {
+                log.debug(
+                    "Add " + qry + " to meta information of subtitle: "
+                    + result.getString(qry)
+                );
+                meta.append(getMessage(
+                    locale,
+                    CHART_TITLE_META_RESSOURCES[i],
+                    CHART_TITLE_META_RESSOURCES[i]
+                ));
+                meta.append(": ");
+                meta.append(result.getString(qry));
+            }
+
+            if (i != CHART_TITLE_META.length-1)
+                meta.append("\n");
+        }
+
+        log.debug("Meta title for chart: " + meta.toString());
+        return meta.toString();
+    }
+
+
+    protected String createTimePeriod(Locale locale, String uuid) {
+        log.debug("create time period for chart subtitle.");
+        String subTitle = null;
+        Date startDate  = null;
+        Date endDate    = null;
+
+        Collection          dates  = getDates(uuid);
+        if (dates == null) {
+            log.debug("No time period for subtitle.");
+            return "";
+        }
+
+        SimpleDateFormat    format = new SimpleDateFormat(DATE_FORMAT);
+        KeyValueDescibeData data   = null;
+
+        Iterator iter = dates.iterator();
+        while (iter.hasNext()) {
+            try {
+                data = (KeyValueDescibeData)iter.next();
+
+                if (!data.isSelected())
+                    continue;
+
+                Date current = format.parse(data.getValue());
+                long time    = current.getTime();
+
+                if (startDate == null) {
+                    startDate = current;
+                    endDate   = current;
+                }
+                else if (time < startDate.getTime()) {
+                    startDate = current;
+                }
+                else if (time > endDate.getTime()) {
+                    endDate = current;
+                }
+            }
+            catch (java.text.ParseException pe) {
+                log.warn("Error while parsing date: " + data.getValue(), pe);
+            }
+        }
+
+        if (startDate != null && endDate != null)
+            subTitle = format.format(startDate)+" - "+format.format(endDate);
+
+        subTitle = subTitle == null ? "" : subTitle;
+
+        log.debug("created title for horizontal profile chart: " + subTitle);
+
+        return subTitle;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/NorthSouthEastWestState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,75 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.profile.horizontal;
+
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import de.intevation.gnv.geobackend.base.Result;
+
+import de.intevation.gnv.state.StateBase;
+
+import de.intevation.gnv.state.describedata.DefaultKeyValueDescribeData;
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+import de.intevation.gnv.state.describedata.NamedArrayList;
+import de.intevation.gnv.state.describedata.NamedCollection;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class NorthSouthEastWestState extends StateBase {
+
+    
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = -7989531326553305293L;
+
+    /**
+     * Constructor
+     */
+    public NorthSouthEastWestState() {
+    }
+
+    /**
+     * @see de.intevation.gnv.state.StateBase#purifyResult(java.util.Collection, java.lang.String)
+     */
+    @Override
+    protected void purifyResult(Collection<Result> result, String uuid) {
+    }
+    
+    /**
+     * @see de.intevation.gnv.state.StateBase#initialize(java.lang.String, de.intevation.artifacts.CallMeta)
+     */
+    @Override
+    public void initialize(String uuid, CallContext context)
+    throws StateException
+    {
+        CallMeta callMeta               = context.getMeta();
+        Collection<Object> describeData = this.getDescibeData(uuid);
+        if (describeData == null) {
+            describeData = new ArrayList<Object>();
+        }
+        NamedCollection<KeyValueDescibeData> keyValueDescibeData = new NamedArrayList<KeyValueDescibeData>(
+                this.dataName, 2);
+        keyValueDescibeData.setMultiSelect(super.dataMultiSelect);
+        keyValueDescibeData.add(new DefaultKeyValueDescribeData("IPOSITION",
+                RessourceFactory.getInstance().getRessource(
+                        callMeta.getLanguages(), "iposition", "iposition")));
+        keyValueDescibeData.add(new DefaultKeyValueDescribeData("JPOSITION",
+                RessourceFactory.getInstance().getRessource(
+                        callMeta.getLanguages(), "jposition", "jposition")));
+        describeData.add(keyValueDescibeData);
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,672 @@
+package de.intevation.gnv.state.profile.horizontalcrosssection;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jts.geom.MultiLineString;
+import com.vividsolutions.jts.geom.MultiPolygon;
+import com.vividsolutions.jts.geom.Polygon;
+
+import de.intevation.artifactdatabase.Config;
+import de.intevation.artifactdatabase.XMLUtils;
+
+import de.intevation.artifacts.ArtifactNamespaceContext;
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.gnv.artifacts.cache.CacheFactory;
+
+import de.intevation.gnv.artifacts.context.GNVArtifactContext;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.geobackend.base.ResultDescriptor;
+
+import de.intevation.gnv.geobackend.base.query.QueryExecutor;
+import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
+
+import de.intevation.gnv.geobackend.base.query.exception.QueryException;
+
+import de.intevation.gnv.geobackend.sde.datasources.RasterObject;
+
+import de.intevation.gnv.math.AreaInterpolation;
+import de.intevation.gnv.math.AttributedPoint2ds;
+import de.intevation.gnv.math.Point2d;
+import de.intevation.gnv.math.QueriedXYDepth;
+
+import de.intevation.gnv.raster.ExternalIndexConverter;
+import de.intevation.gnv.raster.IsoAttributeGenerator;
+import de.intevation.gnv.raster.JTSMultiLineStringProducer;
+import de.intevation.gnv.raster.JTSMultiPolygonProducer;
+import de.intevation.gnv.raster.Palette;
+import de.intevation.gnv.raster.PaletteManager;
+import de.intevation.gnv.raster.Raster;
+import de.intevation.gnv.raster.Vectorizer;
+
+import de.intevation.gnv.state.InputData;
+import de.intevation.gnv.state.OutputStateBase;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import de.intevation.gnv.utils.FileUtils;
+import de.intevation.gnv.utils.Pair;
+import de.intevation.gnv.utils.ShapeFileWriter;
+import de.intevation.gnv.utils.StringUtils;
+import de.intevation.gnv.utils.WKTUtils;
+
+import java.awt.Dimension;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class HorizontalCrossSectionMeshOutputState 
+extends      OutputStateBase
+{
+    private static Logger log = Logger
+        .getLogger(HorizontalCrossSectionMeshOutputState.class);
+    
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 3233620652465061860L;
+    
+    public static final boolean USE_INDEX_BUFFER =
+        Boolean.getBoolean("gnv.horizontal.cross.section.mesh.index.buffer");
+
+    private String ijkQueryID;
+
+    private Boolean shapeFileLock = new Boolean(true);
+
+    private String shapeFilePath;
+
+    /**
+     * Constructor
+     */
+    public HorizontalCrossSectionMeshOutputState() {
+    }
+
+    public void initialize(String uuid, CallContext callContext)
+    throws StateException { 
+        super.initialize(uuid, callContext);
+        if (log.isDebugEnabled()) {
+            log.debug("initialize output state " + uuid);
+        }
+        // fill the cache
+        getResult(uuid, callContext);
+    }
+
+    public String getShapeFilePath() {
+        synchronized (shapeFileLock) {
+            return shapeFilePath;
+        }
+    }
+
+    public void setShapeFilePath(String shapeFilePath) {
+        synchronized (shapeFileLock) {
+            this.shapeFilePath = shapeFilePath;
+        }
+    }
+
+    public String resetShapeFilePath() {
+        synchronized (shapeFileLock) {
+            String path = shapeFilePath;
+            shapeFilePath = null;
+            return path;
+        }
+    }
+
+    public void endOfLife(Object globalContext) {
+        super.endOfLife(globalContext);
+
+        // do it in background
+        new Thread() {
+            public void run() {
+                // TODO: Do the un-publishing WMS stuff.
+                String path = resetShapeFilePath();
+
+                if (path == null) {
+                    return;
+                }
+
+                File dir = new File(path);
+
+                for (int i = 0; i < 10; ++i) {
+                    if (!dir.exists() || FileUtils.deleteRecursive(dir)) {
+                        return;
+                    }
+                    try {
+                        Thread.sleep(10000L);
+                    }
+                    catch (InterruptedException ie) {
+                    }
+                }
+
+                log.error("failed to remove directory '" + path + "'");
+            } // run
+        }.start();
+    }
+
+    public void out(
+        Document              format, 
+        Collection<InputData> inputData,
+        OutputStream          outputStream,
+        String                uuid,
+        CallContext           callContext
+    )
+    throws StateException 
+    {
+        String outputMode = XMLUtils.xpathString(
+            format, XPATH_OUTPUT_MODE, ArtifactNamespaceContext.INSTANCE);
+
+        if (outputMode == null) {
+            throw new StateException("cannot find outputMode or mime");
+        }
+
+        outputMode = outputMode.toLowerCase();
+
+        if (log.isDebugEnabled()) {
+            log.debug("---- asking for: " + outputMode);
+        }
+
+        if ("zip".equals(outputMode)) {
+            writeZip(uuid, callContext, outputStream);
+        }
+        else if ("wms".equals(outputMode)) {
+            XMLUtils.toStream(
+                getWMS(uuid, callContext),
+                outputStream);
+        }
+        else if ("statistics".equals(outputMode)) {
+            // TODO: REMOVE THIS!
+            try { outputStream.write("<fake/>\n".getBytes()); }
+            catch (IOException ioe) {}
+        }
+        else {
+            throw new StateException("unsupported output mode");
+        }
+    }
+
+    protected void writeZip(
+        String       uuid,
+        CallContext  callContext,
+        OutputStream output
+    ) 
+    throws StateException
+    {
+        try {
+            String p = getShapeFilePath();
+            if (p != null) {
+                File dir = new File(p);
+                if (dir.isDirectory()) {
+                    FileUtils.createZipArchive(dir, output);
+                }
+            }
+            else {
+                AttributedPoint2ds result = getResult(uuid, callContext);
+                if (result != null
+                && (p = writeToShapeFile(uuid, result, callContext)) != null) {
+                    FileUtils.createZipArchive(new File(p), output);
+                }
+            }
+        }
+        catch (IOException ioe) {
+            log.error(ioe.getLocalizedMessage(), ioe);
+        }
+    }
+
+    protected Document getWMS(String uuid, CallContext callContext) 
+    throws StateException
+    {
+        // TODO: Do the real WMS publishing here!
+        Document document = XMLUtils.newDocument();
+
+        Element pathElement = document.createElement("path");
+        document.appendChild(pathElement);
+
+        String path = getShapeFilePath();
+
+        if (path != null && new File(path).isDirectory()) {
+            pathElement.setTextContent(path);
+        }
+        else {
+            AttributedPoint2ds result = getResult(uuid, callContext);
+            if (result != null
+            && (path = writeToShapeFile(uuid, result, callContext)) != null) {
+                pathElement.setTextContent(path);
+            }
+        }
+
+        return document;
+    }
+
+    protected String writeToShapeFile(
+        String             uuid,
+        AttributedPoint2ds result,
+        CallContext        callContext
+    ) {
+        File baseDir = shapefileDirectory(callContext);
+
+        File shapeDir = new File(baseDir, uuid);
+
+        boolean success    = false;
+        boolean createdDir = false;
+
+        try {
+            synchronized (shapeFileLock) {
+                int count = 0;
+                while (shapeDir.exists()) {
+                    shapeDir = new File(baseDir, uuid + "-" + count);
+                    ++count;
+                }
+
+                if (!shapeDir.mkdirs()) {
+                    log.error("cannot create directory '" 
+                        + shapeDir.getAbsolutePath() + "'");
+                    return null;
+                }
+                createdDir = true;
+            }
+
+            Map<Integer, MultiPolygon> polygons = result.getPolygons();
+
+            List<Pair<Object, MultiLineString>> isolines =
+                result.getLineStrings();
+
+            File polygonsFile = new File(shapeDir, "polygons.shp");
+            File isolinesFile = new File(shapeDir, "isolines.shp");
+
+            if (!ShapeFileWriter.writeMultiPolygonsToFile(
+                polygonsFile,
+                (Integer)result.getAttribute("parameter"),
+                (Integer)result.getAttribute("layer"),
+                (Date)   result.getAttribute("date"),
+                polygons)
+            ) {
+                log.error("writing polygons failed");
+                return null;
+            }
+
+            if (!ShapeFileWriter.writeMultiLineStringsToFile(
+                isolinesFile,
+                (Integer)result.getAttribute("parameter"),
+                (Integer)result.getAttribute("layer"),
+                (Date)   result.getAttribute("date"),
+                isolines)
+            ) {
+                log.error("writing isolines failed");
+                return null;
+            }
+
+            shapeFilePath = shapeDir.getAbsolutePath();
+            success = true;
+
+            callContext.afterCall(CallContext.STORE);
+
+            return shapeFilePath;
+        }
+        finally {
+            if (!success && createdDir) {
+                FileUtils.deleteRecursive(shapeDir);
+            }
+        }
+    }
+
+    protected AttributedPoint2ds getResult(String uuid, CallContext callContext)
+    throws StateException
+    {
+        CacheFactory cf  = CacheFactory.getInstance();
+        String       key = uuid + super.getID();
+
+        if (cf.isInitialized()) {
+            net.sf.ehcache.Element value = cf.getCache().get(key);
+            if (value != null) {
+                 return (AttributedPoint2ds)value.getObjectValue();
+            }
+        }
+
+        AttributedPoint2ds result = produceResult(callContext);
+
+        if (result != null && cf.isInitialized()) {
+            cf.getCache().put(new net.sf.ehcache.Element(key, result));
+        }
+
+        return result;
+    }
+    
+    protected AttributedPoint2ds produceResult(CallContext callContext) 
+    throws StateException
+    {
+        InputData meshPolygon = inputData.get("mesh_polygon");
+        InputData meshId      = inputData.get("meshid");
+
+        if (meshPolygon == null) {
+            log.error("mesh_polygon is not defined");
+            throw new StateException("missing mesh_linestring");
+        }
+
+        if (meshId == null) {
+            log.error("meshid is not defined");
+            throw new StateException("missing meshid");
+        }
+
+        Polygon p = WKTUtils.toPolygon(meshPolygon.getValue());
+
+        if (p == null) {
+            log.error("no valid polygon");
+            throw new StateException("no valid polygon");
+        }
+
+        try {
+            Envelope env  = p.getEnvelopeInternal();
+
+            String additionWhere;
+
+            if (USE_INDEX_BUFFER) {
+                Coordinate [] coords = new Coordinate [] {
+                    new Coordinate(env.getMinX(), env.getMinY()),
+                    new Coordinate(env.getMinX(), env.getMaxY()),
+                    new Coordinate(env.getMaxX(), env.getMaxY()),
+                    new Coordinate(env.getMaxX(), env.getMinY()) };
+
+                additionWhere =
+                    WKTUtils.worldEnvelopeCoordinatesToIndex(
+                        coords,
+                        meshId.getValue(),
+                        ijkQueryID);
+            }
+            else {
+                additionWhere = WKTUtils.TRUE_EXPRESSION;
+            }
+
+            String[] addedFilterValues = StringUtils.append(
+                generateFilterValuesFromInputData(),
+                additionWhere);
+
+            QueryExecutor queryExecutor = QueryExecutorFactory
+                .getInstance()
+                .getQueryExecutor();
+
+            return process(
+                env,
+                p,
+                callContext,
+                preProcess(
+                    queryExecutor.executeQuery(
+                        queryID,
+                        addedFilterValues)));
+        }
+        catch (QueryException e) {
+            log.error(e,e);
+        }
+
+        throw new StateException("no result produced");
+    }
+
+    public AttributedPoint2ds preProcess(Collection<Result> results) {
+
+        boolean debug = log.isDebugEnabled();
+
+        if (debug) {
+            log.debug("--- preProcess: " + results.size() + " results");
+        }
+
+        AttributedPoint2ds ap2ds = new AttributedPoint2ds();
+
+        ArrayList<Point2d> points = new ArrayList<Point2d>(results.size());
+
+        int sIdx = -1;
+        int iIdx = -1;
+        int jIdx = -1;
+        int vIdx = -1;
+
+        boolean firstWarn = true;
+
+        for (Result result: results) {
+
+            if (sIdx == -1) {
+                ResultDescriptor rd = result.getResultDescriptor();
+                sIdx     = rd.getColumnIndex("SHAPE");
+                iIdx     = rd.getColumnIndex("IPOSITION");
+                jIdx     = rd.getColumnIndex("JPOSITION");
+                vIdx     = rd.getColumnIndex("YORDINATE");
+                int kIdx = rd.getColumnIndex("KPOSITION");
+                int tIdx = rd.getColumnIndex("TIMEVALUE");
+                int pIdx = rd.getColumnIndex("PARAMETERID");
+
+                if (sIdx == -1 || iIdx == -1
+                ||  jIdx == -1 || kIdx == -1 
+                ||  vIdx == -1 || tIdx == -1
+                ||  pIdx == -1
+                ) {
+                    log.error("missing column in result set");
+                    return null;
+                }
+
+                ap2ds.setAttribute("date",      result.getDate(tIdx));
+                ap2ds.setAttribute("parameter", result.getInteger(pIdx));
+                ap2ds.setAttribute("layer",     result.getInteger(kIdx));
+            }
+            Coordinate coord = WKTUtils.toCoordinate(result.getString(sIdx));
+            if (coord == null) {
+                if (firstWarn) {
+                    firstWarn = false;
+                    log.warn("cannot fetch coordinate from result");
+                }
+                continue;
+            }
+            double v = result.getDouble(vIdx);
+            int    i = result.getInteger(iIdx);
+            int    j = result.getInteger(jIdx);
+
+            Point2d p2d = new Point2d(coord.x, coord.y, v, i, j);
+            points.add(p2d);
+            
+        }
+        ap2ds.setPoints(points);
+
+        return ap2ds;
+    }
+    
+    public AttributedPoint2ds process(
+        Envelope           boundingBox,
+        Polygon            polygon,
+        CallContext        callContext,
+        AttributedPoint2ds input
+    ) {
+        if (input == null) {
+            log.error("no data to interpolate");
+            return null;
+        }
+
+        Integer parameterId =
+            (Integer)input.getAttribute("parameter"); // XXX: hardcoded
+
+        if (parameterId == null) {
+            log.error("missing parameter id");
+            return null;
+        }
+
+        Map<Integer, PaletteManager> paletteManagers =
+            getPalettes(callContext);
+
+        PaletteManager paletteManager = paletteManagers.get(parameterId);
+
+        if (paletteManager == null) {
+            log.error("no palette found for parameter id " + parameterId);
+            return null;
+        }
+
+        boolean debug = log.isDebugEnabled();
+
+        if (debug) {
+            log.debug("interpolation");
+        }
+
+        AreaInterpolation interpolation =
+            new AreaInterpolation();
+
+        int numSamples          = numSamples(callContext);
+        int groundInterpolation = getGroundInterpolation(callContext);
+
+        if (!interpolation.interpolate(
+            input.getPoints(), 
+            boundingBox,
+            new Dimension(numSamples, numSamples),
+            new QueriedXYDepth(groundInterpolation)
+        )) {
+            log.error("interpolation failed");
+            return null;
+        }
+
+        // Do the post processing
+        Raster raster = new Raster(
+            interpolation.getRaster(),
+            numSamples);
+
+        // TODO: Filter operations.
+
+        if (debug) {
+            log.debug("to indexed raster");
+        }
+
+        // scan for regions with base palette
+        Palette basePalette = paletteManager.getBase();
+
+        int [] intRaster = raster.toIndexed(basePalette);
+
+        // produce JFreeChart compatible polygons
+
+        if (debug) {
+            log.debug("vectorize indexed raster");
+        }
+
+        // produce JTS compatible polygons
+
+        JTSMultiPolygonProducer jtsmpp = new JTSMultiPolygonProducer(
+            polygon,
+            boundingBox.getMinX(), boundingBox.getMinY(),
+            boundingBox.getMaxX(), boundingBox.getMaxY());
+            
+        int numRegions = new Vectorizer(intRaster, numSamples)
+            .process(jtsmpp);
+
+        Map<Integer, MultiPolygon> polygons = jtsmpp.getMultiPolygons(
+            new ExternalIndexConverter(basePalette));
+
+        jtsmpp.clear(); jtsmpp = null; // help gc
+
+        int numColors = polygons.size();
+
+        if (debug) {
+            log.debug("number of regions: " + numRegions);
+            log.debug("number of colors:  " + numColors);
+        }
+        // generate iso lines
+
+        int numIso;
+
+             if (numColors <  5) { numIso = 5; }
+        else if (numColors < 10) { numIso = 2; }
+        else                     { numIso = 0; }
+
+        Palette isoPalette;
+
+        if (numIso == 0) { // same palette
+            isoPalette = basePalette;
+            /* intRaster = intRaster; */
+        }
+        else {
+            isoPalette = paletteManager.getLevel(numIso);
+            intRaster  = raster.toIndexed(isoPalette);
+        }
+
+        JTSMultiLineStringProducer jtslsp = new JTSMultiLineStringProducer(
+            polygon,
+            boundingBox.getMinX(), boundingBox.getMinY(),
+            boundingBox.getMaxX(), boundingBox.getMaxY());
+
+        numRegions = new Vectorizer(false, intRaster, numSamples)
+            .process(jtslsp);
+
+        IsoAttributeGenerator iag = new IsoAttributeGenerator(isoPalette);
+
+        List<Pair<Object, MultiLineString>> lineStrings =
+            jtslsp.getMultiLineStrings(iag);
+
+        jtslsp.clear(); jtslsp = null; // help gc
+
+        input.setInterpolation(interpolation);
+
+        input.setPolygons(polygons);
+        input.setLineStrings(lineStrings);
+
+        return input;
+    }
+
+    
+    @Override
+    public void setup(Node configuration) {
+        super.setup(configuration);
+        this.ijkQueryID = Config.getStringXPath(configuration,"queryID-ijk");
+        
+    }
+    
+    private static int numSamples(CallContext callContext) {
+        GNVArtifactContext context =
+            (GNVArtifactContext)callContext.globalContext();
+        Integer samples = (Integer)context.get(
+            GNVArtifactContext.HORIZONTAL_CROSS_SECTION_SAMPLES_KEY);
+        return samples != null
+            ? samples.intValue()
+            : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_SAMPLES;
+    }
+
+    private static File shapefileDirectory(CallContext callContext) {
+        GNVArtifactContext context =
+            (GNVArtifactContext)callContext.globalContext();
+        File dir = (File)context.get(
+            GNVArtifactContext.HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH_KEY);
+        return dir != null
+            ? dir
+            : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SHAPEFILE_PATH;
+    }
+
+    private static int getGroundInterpolation(CallContext callContext) {
+        GNVArtifactContext context = 
+            (GNVArtifactContext)callContext.globalContext();
+
+        String interpolation = (String)context.get(
+            GNVArtifactContext.HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY);
+
+        return RasterObject.getInterpolationType(interpolation);
+    }
+
+    private static Map<Integer, PaletteManager> getPalettes(
+        CallContext callContext
+    ) {
+        GNVArtifactContext context = 
+            (GNVArtifactContext)callContext.globalContext();
+        Map<Integer, PaletteManager> palettes =
+            (Map<Integer, PaletteManager>)context.get(
+                GNVArtifactContext.PALETTES_KEY);
+        return palettes != null
+            ? palettes
+            : new HashMap<Integer, PaletteManager>();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,205 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.profile.vertical;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Locale;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.ChartTheme;
+
+import de.intevation.gnv.chart.Chart;
+import de.intevation.gnv.chart.ChartLabels;
+import de.intevation.gnv.chart.VerticalProfileChart;
+import de.intevation.gnv.exports.DefaultExport;
+import de.intevation.gnv.exports.DefaultDataCollector;
+import de.intevation.gnv.exports.DefaultProfile;
+import de.intevation.gnv.exports.Export.Profile;
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.exception.StateException;
+import de.intevation.gnv.state.timeseries.TimeSeriesOutputState;
+import de.intevation.gnv.statistics.Statistics;
+import de.intevation.gnv.statistics.VerticalProfileStatistics;
+
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class VerticalProfileOutputState extends TimeSeriesOutputState {
+
+    public static final String [] VERTICAL_PROFILE_COLUMNS = {
+        "XORDINATE", // not quite sure if this is depth
+        "YORDINATE",
+        "GROUP1"
+        // "GROUP2",
+        // "GROUP3"
+    };
+
+
+    public static final String [] VERTICAL_MESH_CSV_COLUMN_LABEL = {
+        "CentralDepth",
+        "Value",
+        "ParameterID"
+        // TODO "FeatureID",
+        // TODO "MeshID"
+    };
+
+
+    public static final String [] VERTICAL_TIMESERIES_CSV_COLUMN_LABEL = {
+        "Depth",
+        "Value",
+        "ParameterID"
+        // TODO FeatureID missing
+        // TODO TimeseriesID missing
+    };
+
+
+    public static final String [] VERTICAL_MEASUREMENT_CSV_COLUMN_LABEL = {
+        "Depth",
+        "Value",
+        "ParameterID"
+        // TODO FeatureID missing
+        // TODO SeriesID missing
+    };
+
+
+    /**
+     * The UID of this class
+     */
+    private static final long serialVersionUID = 4401516087492028840L;
+
+    private static Logger log = Logger
+            .getLogger(TimeSeriesOutputState.class);
+
+    /**
+     * Constructor
+     */
+    public VerticalProfileOutputState() {
+        super();
+        super.domainLable = "chart.verticalprofile.title.xaxis";
+    }
+
+
+    @Override
+    protected Chart getChart(
+        ChartLabels chartLables,
+        ChartTheme  theme,
+        Collection  parameters,
+        Collection  measurements,
+        Collection  dates,
+        Object      result,
+        Locale      locale,
+        String      uuid,
+        boolean     linesVisible,
+        boolean     shapesVisible,
+        CallContext callContext
+    ) {
+        Chart chart = null;
+
+        if (CACHE_CHART) {
+            log.info("Try to get verticalprofile chart from cache.");
+            chart = (Chart) getChartFromCache(uuid, callContext);
+        }
+
+        if (chart != null)
+            return chart;
+
+        log.info("Chart not in cache yet.");
+        chart = new VerticalProfileChart(
+            chartLables,
+            theme,
+            parameters,
+            measurements,
+            dates,
+            (Collection)result,
+            null,
+            locale,
+            linesVisible,
+            shapesVisible
+        );
+        chart.generateChart();
+
+        if (CACHE_CHART) {
+            log.info("Put chart into cache.");
+            purifyChart(chart, uuid);
+        }
+
+        return chart;
+    }
+
+
+    @Override
+    protected void createCSV(OutputStream out, Collection<Result> results)
+    throws UnsupportedEncodingException, IOException, StateException
+    {
+        Iterator iter = results.iterator();
+        Result   res  = iter.hasNext() ? (Result) iter.next() : null;
+
+        if (res == null)
+            return;
+
+        Profile profile = null;
+        int     dataid  = res.getInteger("DATAID").intValue();
+
+        // on meshes
+        if (dataid == 2) {
+            profile =  new DefaultProfile(
+                VERTICAL_MESH_CSV_COLUMN_LABEL,
+                ',',
+                '"',
+                '"',
+                "CSV",
+                "ISO-8859-1");
+        }
+
+        // on timeseries
+        else if (dataid == 1) {
+            profile =  new DefaultProfile(
+                VERTICAL_TIMESERIES_CSV_COLUMN_LABEL,
+                ',',
+                '"',
+                '"',
+                "CSV",
+                "ISO-8859-1");
+        }
+
+        // on measurements
+        else {
+            profile =  new DefaultProfile(
+                VERTICAL_MEASUREMENT_CSV_COLUMN_LABEL,
+                ',',
+                '"',
+                '"',
+                "CSV",
+                "ISO-8859-1");
+        }
+
+        DefaultExport export = new DefaultExport(
+            new DefaultDataCollector(VERTICAL_PROFILE_COLUMNS));
+        export.create(profile, out, results);
+    }
+
+
+    protected String createChartSubtitle(Locale locale, String uuid) {
+        return getSelectedFeatureName(uuid);
+    }
+
+
+
+    /**
+     * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#getStatisticsGenerator()
+     */
+    @Override
+    protected Statistics getStatisticsGenerator() {
+        return new VerticalProfileStatistics();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/OutputHelper.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,87 @@
+package de.intevation.gnv.state.profile.verticalcrosssection;
+
+import de.intevation.gnv.jfreechart.CompactXYItems;
+import de.intevation.gnv.jfreechart.PolygonSeries;
+
+import de.intevation.gnv.math.Interpolation3D;
+
+import gnu.trove.TDoubleArrayList;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class OutputHelper
+{
+    private static Logger log = Logger.getLogger(OutputHelper.class);
+
+    public static final double EPS = 1e-5d;
+
+    private OutputHelper() {
+    }
+
+    public static PolygonSeries createSeabedPolygon(
+        Interpolation3D interpolation,
+        Integer         fill
+    ) {
+        double maxDepth   = interpolation.getMaxDepth();
+        double cellWidth  = interpolation.getCellWidth();
+        double cellHeight = interpolation.getCellHeight();
+
+        double [] depths = interpolation.getDepths();
+
+        double x = 0d;
+
+        TDoubleArrayList vertices = new TDoubleArrayList();
+
+        PolygonSeries ps = new PolygonSeries();
+
+        for (int i = 0; i < depths.length; ++i, x += cellWidth) {
+            double depth = depths[i];
+
+            if (vertices.isEmpty()) {
+                if (Double.isNaN(depth) || depth == maxDepth) {
+                    continue;
+                }
+                if (depth > 0d) depth = 0d;
+                vertices.add(x); vertices.add(maxDepth);
+                vertices.add(x); vertices.add(depth);
+                vertices.add(x+cellWidth); vertices.add(depth);
+            }
+            else { // in polygon
+                if (Double.isNaN(depth) || depth == maxDepth) {
+                    vertices.add(x); vertices.add(maxDepth);
+                    ps.addRing(new CompactXYItems(vertices.toNativeArray()));
+                    vertices.reset();
+                }
+                else {
+                    if (depth > 0d) depth = 0d;
+                    int N = vertices.size();
+                    if (N > 2 && Math.abs(depth - vertices.get(N-1)) < EPS) {
+                        vertices.set(N-2, x+cellWidth);
+                    }
+                    else {
+                        vertices.add(vertices.get(N-2)); vertices.add(depth);
+                        vertices.add(x+cellWidth); vertices.add(depth);
+                    }
+                }
+            }
+        } // for all depths
+
+        if (!vertices.isEmpty()) {
+            vertices.add(vertices.get(vertices.size()-2));
+            vertices.add(maxDepth);
+            ps.addRing(new CompactXYItems(vertices.toNativeArray()));
+        }
+
+        if (ps.getItemCount() == 0) {
+            return null;
+        }
+
+        ps.setAttribute("fill", fill);
+
+        return ps;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,621 @@
+package de.intevation.gnv.state.profile.verticalcrosssection;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.gnv.artifacts.cache.CacheFactory;
+
+import de.intevation.gnv.artifacts.context.GNVArtifactContext;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import de.intevation.gnv.chart.Chart;
+import de.intevation.gnv.chart.ChartLabels;
+import de.intevation.gnv.chart.VerticalCrossSectionChart;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.geobackend.base.ResultDescriptor;
+
+import de.intevation.gnv.geobackend.base.query.QueryExecutor;
+import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
+
+import de.intevation.gnv.geobackend.base.query.exception.QueryException;
+
+import de.intevation.gnv.geobackend.sde.datasources.RasterObject;
+
+import de.intevation.gnv.jfreechart.PolygonDataset;
+import de.intevation.gnv.jfreechart.PolygonSeries;
+
+import de.intevation.gnv.math.AttributedXYColumns;
+import de.intevation.gnv.math.HeightValue;
+import de.intevation.gnv.math.IJKey;
+import de.intevation.gnv.math.Interpolation3D;
+import de.intevation.gnv.math.LinearMetrics;
+import de.intevation.gnv.math.QueriedXYDepth;
+import de.intevation.gnv.math.XYColumn;
+
+import de.intevation.gnv.raster.Filter;
+import de.intevation.gnv.raster.IsoAttributeGenerator;
+import de.intevation.gnv.raster.IsoPolygonSeriesProducer;
+import de.intevation.gnv.raster.Palette;
+import de.intevation.gnv.raster.PaletteManager;
+import de.intevation.gnv.raster.PolygonDatasetProducer;
+import de.intevation.gnv.raster.Raster;
+import de.intevation.gnv.raster.Vectorizer;
+
+import de.intevation.gnv.state.InputData;
+
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import de.intevation.gnv.state.timeseries.TimeSeriesOutputState;
+
+import de.intevation.gnv.statistics.Statistics;
+import de.intevation.gnv.statistics.VerticalCrossSectionStatistics;
+
+import de.intevation.gnv.utils.DistanceCalculator;
+import de.intevation.gnv.utils.StringUtils;
+import de.intevation.gnv.utils.WKTUtils;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Paint;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import net.sf.ehcache.Element;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.ChartTheme;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Ingo Weinzierl      (ingo.weinzierl@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class VerticalCrossSectionOutputState extends TimeSeriesOutputState {
+
+    public static final String CHART_TYPE = "verticalcrosssection";
+
+    public static final Integer GROUND_FILL_INDEX = Integer.valueOf(-2);
+
+    public static final boolean USE_INDEX_BUFFER =
+        Boolean.getBoolean("gnv.vertical.cross.section.index.buffer");
+
+    public static final String[] ATTRIBUTE_LIST = {
+        "SHAPE",
+        "Z",
+        "YORDINATE",
+        "IPOSITION",
+        "JPOSITION",
+        "KPOSITION"
+    };
+
+    private static Logger log = Logger.getLogger(
+        VerticalCrossSectionOutputState.class);
+
+    private String ijkQueryID = "horizontalprofile_meshpoint_cross_ij";
+
+    private String rangeLabel;
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 3233620652465061860L;
+
+    /**
+     * Constructor
+     */
+    public VerticalCrossSectionOutputState() {
+        super();
+        super.domainLable = "chart.verticalcrosssection.title.xaxis";
+        this.rangeLabel   = "chart.verticalcrosssection.title.yaxis";
+    }
+
+    @Override
+    public void initialize(String uuid, CallContext callContext)
+    throws StateException {
+        super.initialize(uuid, callContext);
+        
+        getChartResult(uuid, callContext);
+    }
+
+    @Override
+    protected ChartLabels createChartLabels(Locale locale, String uuid) {
+        RessourceFactory factory = RessourceFactory.getInstance();
+        String parameterName     = getSelectedInputDataName(
+            uuid, parameterValuesName);
+
+        if (parameterName == null)
+            parameterName = "parameterid";
+
+        return new ChartLabels(
+            createChartTitle(locale, uuid),
+            createChartSubtitle(locale, uuid),
+            factory.getRessource(locale, domainLable, domainLable),
+            factory.getRessource(locale, rangeLabel, rangeLabel),
+            parameterName
+        );
+    }
+
+
+    @Override
+    protected String createChartSubtitle(Locale locale, String uuid) {
+        String date = getSelectedInputDataName(uuid, dateValueName);
+
+        if (date == null)
+            date = "dateid";
+
+        RessourceFactory factory = RessourceFactory.getInstance();
+        String chartType         = factory.getRessource(
+            locale, CHART_TYPE, CHART_TYPE);
+
+        return chartType + ": " + date;
+    }
+
+
+    @Override
+    protected Object getChartResult(String uuid, CallContext callContext) {
+        log.debug("VerticalCrossSectionOutputState.getChartResult");
+        Collection<Result> result = null;
+        String key = uuid + super.getID();
+
+        Element element = CacheFactory.getInstance().getCache().get(key);
+        if (element != null)
+            return element.getObjectValue();
+
+        log.debug("No results in cache yet.");
+
+        InputData meshLine = inputData.get("mesh_linestring");
+        InputData meshId   = inputData.get("meshid");
+
+        if (meshLine == null) {
+            log.error("mesh_linestring is not defined");
+            throw new IllegalStateException("missing mesh_linestring");
+        }
+
+        if (meshId == null) {
+            log.error("meshid is not defined");
+            throw new IllegalStateException("missing meshid");
+        }
+
+        Coordinate [] coords = WKTUtils.toCoordinates(
+            meshLine.getValue());
+
+        if (coords == null) {
+            throw new IllegalStateException("cannot read coordinates");
+        }
+
+        try {
+            String additionWhere = USE_INDEX_BUFFER
+                ? WKTUtils.worldCoordinatesToIndex(
+                    coords,
+                    result,
+                    meshId.getValue(),
+                    ijkQueryID)
+                : WKTUtils.TRUE_EXPRESSION;
+
+            String[] addedFilterValues = StringUtils.append(
+                generateFilterValuesFromInputData(),
+                additionWhere);
+
+            QueryExecutor exec = QueryExecutorFactory
+                .getInstance()
+                .getQueryExecutor();
+
+            result = exec.executeQuery(queryID, addedFilterValues);
+        }
+        catch (QueryException qe) {
+            log.error(qe, qe);
+        }
+
+        Object obj = process(
+            Arrays.asList(coords),
+            preProcess(result),
+            callContext);
+
+        CacheFactory.getInstance().getCache().put(new Element(key, obj));
+
+        return obj;
+    }
+
+
+    protected String getSelectedInputDataName(String uuid, String id) {
+        Collection values = getCollection(id, uuid);
+
+        if (values != null) {
+            Iterator it = values.iterator();
+
+            while (it.hasNext()) {
+                KeyValueDescibeData data = (KeyValueDescibeData) it.next();
+
+                if (data.isSelected()) {
+                    return data.getValue();
+                }
+            }
+        }
+        return null;
+    }
+
+    private static int getGroundInterpolation(CallContext callContext) {
+        GNVArtifactContext context = 
+            (GNVArtifactContext)callContext.globalContext();
+
+        String interpolation = (String)context.get(
+            GNVArtifactContext.VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY);
+
+        return RasterObject.getInterpolationType(interpolation);
+    }
+
+    private static Dimension getRasterSize(CallContext callContext) {
+        GNVArtifactContext context = 
+            (GNVArtifactContext)callContext.globalContext();
+        Dimension size = (Dimension)context.get(
+            GNVArtifactContext.VERTICAL_CROSS_SECTION_SAMPLES_KEY);
+        return size != null
+            ? size
+            : GNVArtifactContext.DEFAULT_VERTICAL_CROSS_SECTION_SAMPLES;
+    }
+
+    private static List<Filter.Factory> getFilterFactories(
+        CallContext callContext
+    ) {
+        GNVArtifactContext context = 
+            (GNVArtifactContext)callContext.globalContext();
+        List<Filter.Factory> factories = (List<Filter.Factory>)context.get(
+            GNVArtifactContext.VERTICAL_CROSS_SECTION_FILTER_FACTORIES_KEY);
+        return factories != null
+            ? factories
+            : new ArrayList<Filter.Factory>();
+    }
+
+    private static Map<Integer, PaletteManager> getPalettes(
+        CallContext callContext
+    ) {
+        GNVArtifactContext context = 
+            (GNVArtifactContext)callContext.globalContext();
+        Map<Integer, PaletteManager> palettes =
+            (Map<Integer, PaletteManager>)context.get(
+                GNVArtifactContext.PALETTES_KEY);
+        return palettes != null
+            ? palettes
+            : new HashMap<Integer, PaletteManager>();
+    }
+
+    private static Paint getGroundFill(CallContext callContext) {
+        GNVArtifactContext context = 
+            (GNVArtifactContext)callContext.globalContext();
+        Paint fill = (Paint)context.get(
+            GNVArtifactContext.VERTICAL_CROSS_SECTION_GROUND_FILL_KEY);
+        return fill != null
+            ? fill
+            : GNVArtifactContext.DEFAULT_VERTICAL_CROSS_SECTION_GROUND_FILL;
+    }
+
+    public static final double EPSILON = 1e-5d;
+
+    protected Object process(
+        List<Coordinate>    path,
+        AttributedXYColumns columns,
+        CallContext         callContext
+    ) {
+        Integer parameterId =
+            (Integer)columns.getAttribute("GROUP1"); // XXX: hardcoded
+
+        if (parameterId == null) {
+            log.error("missing parameter id");
+            return null;
+        }
+
+        Map<Integer, PaletteManager> paletteManagers =
+            getPalettes(callContext);
+
+        PaletteManager paletteManager = paletteManagers.get(parameterId);
+
+        if (paletteManager == null) {
+            log.error("no palette found for parameter id " + parameterId);
+            return null;
+        }
+
+        boolean debug = log.isDebugEnabled();
+
+        if (debug) {
+            log.debug("using palette '" + paletteManager.getName() + "'");
+        }
+
+        Dimension            rasterSize      = getRasterSize(callContext);
+        List<Filter.Factory> filterFactories = getFilterFactories(callContext);
+        Interpolation3D      interpolation   = new Interpolation3D(rasterSize);
+
+        double distance = DistanceCalculator.calculateDistance(path);
+
+        if (distance < EPSILON) {
+            log.warn("distance too short for interpolation");
+            return null;
+        }
+
+        boolean success = interpolation.interpolate(
+            path,
+            columns.getXYColumns(),
+            0d,
+            distance,
+            LinearMetrics.INSTANCE,
+            new QueriedXYDepth(
+                getGroundInterpolation(callContext)));
+
+        if (!success) {
+            log.warn("interpolation failed");
+            return null;
+        }
+
+        // Do the post processing
+        Raster raster = new Raster(
+            interpolation.getRaster(),
+            rasterSize.width);
+
+        for (Filter.Factory factory: filterFactories) {
+            raster = factory.create().filter(raster);
+        }
+
+        if (debug) {
+            log.debug("to indexed raster");
+        }
+
+        // scan for regions with base palette
+        Palette basePalette = paletteManager.getBase();
+
+        int [] intRaster = raster.toIndexed(basePalette);
+
+        // produce JFreeChart compatible polygons
+
+        if (debug) {
+            log.debug("vectorize indexed raster");
+        }
+
+        double maxDepth = interpolation.getMaxDepth();
+
+        PolygonDatasetProducer pdsp = new PolygonDatasetProducer(
+            0, 0,
+            distance, maxDepth);
+
+        int numRegions = new Vectorizer(intRaster, rasterSize.width)
+            .process(pdsp);
+
+        PolygonDataset pds = pdsp.getPolygonDataset();
+
+        // Count number of colors before generating seabed
+        // because its used to determine the number of iso lines.
+        int numColors = pds.getSeriesCount();
+
+        if (debug) {
+            log.debug("number of regions: " + numRegions);
+            log.debug("number of colors:  " + numColors);
+        }
+
+        // generate seabed polygon
+
+        PolygonSeries seabed = OutputHelper.createSeabedPolygon(
+            interpolation,
+            GROUND_FILL_INDEX);
+
+        if (seabed != null) {
+            pds.addSeries(seabed);
+        }
+
+        // generate iso lines
+
+        int numIso;
+
+             if (numColors <  5) { numIso = 5; }
+        else if (numColors < 10) { numIso = 2; }
+        else                     { numIso = 0; }
+
+        Palette isoPalette;
+
+        if (numIso == 0) { // same palette
+            isoPalette = basePalette;
+            /* intRaster = intRaster; */
+        }
+        else {
+            isoPalette = paletteManager.getLevel(numIso);
+            intRaster  = raster.toIndexed(isoPalette);
+        }
+
+        IsoPolygonSeriesProducer ipsp = new IsoPolygonSeriesProducer(
+            0, 0,
+            distance, maxDepth);
+
+        numRegions = new Vectorizer(false, intRaster, rasterSize.width)
+            .process(ipsp);
+
+        IsoAttributeGenerator iag = new IsoAttributeGenerator(isoPalette);
+        Collection<PolygonSeries> ps = ipsp.getSeries(iag); 
+        ipsp.clear();
+
+        if (debug) {
+            log.debug("num of iso regions: " + numRegions);
+            log.debug("num of iso series:  " + ps.size());
+        }
+
+        pds.addAllSeries(ps);
+
+        columns.setInterpolation(interpolation);
+        columns.setPolygonDataset(pds);
+
+        return columns;
+    }
+
+
+    protected AttributedXYColumns preProcess(Collection results) {
+
+        AttributedXYColumns attColumns = new AttributedXYColumns();
+        Map<IJKey, XYColumn> map       = new HashMap<IJKey, XYColumn>(1013);
+        Iterator   iter                = results.iterator();
+
+        int sIdx = -1;
+        int iIdx = -1;
+        int jIdx = -1;
+        int kIdx = -1;
+        int vIdx = -1;
+        int zIdx = -1;
+
+        while (iter.hasNext()) {
+            Result result = (Result) iter.next();
+
+            if (sIdx == -1) {
+                ResultDescriptor rd = result.getResultDescriptor();
+                int columnCount     = rd.getColumnCount();
+
+                sIdx = rd.getColumnIndex("SHAPE");
+                iIdx = rd.getColumnIndex("IPOSITION");
+                jIdx = rd.getColumnIndex("JPOSITION");
+                kIdx = rd.getColumnIndex("KPOSITION");
+                vIdx = rd.getColumnIndex("YORDINATE");
+                zIdx = rd.getColumnIndex("Z");
+
+                for (int i = 0; i < columnCount; i++) {
+                    String colName = rd.getColumnName(i);
+
+                    if (!StringUtils.contains(ATTRIBUTE_LIST, colName)) {
+                        attColumns.setAttribute(
+                            colName,
+                            result.getObject(colName));
+                    }
+                }
+            }
+
+            double v = result.getDouble(vIdx);
+            double z = result.getDouble(zIdx);
+            int    i = result.getInteger(iIdx);
+            int    j = result.getInteger(jIdx);
+            int    k = result.getInteger(kIdx);
+
+            IJKey key = new IJKey(i, j);
+
+            XYColumn col = (XYColumn)map.get(key);
+
+            if (col == null) {
+                Coordinate coord = WKTUtils.toCoordinate(result.getString(sIdx));
+                if (coord == null) coord = new Coordinate();
+                col = new XYColumn(coord.x, coord.y, i, j);
+                map.put(key, col);
+            }
+
+            col.add(new HeightValue(z, v, k));
+        }
+
+        ArrayList<XYColumn> cols = new ArrayList<XYColumn>(map.values());
+        attColumns.setXYColumns(cols);
+
+        return attColumns;
+    }
+
+
+    @Override
+    protected Chart getChart(
+        ChartLabels  chartLables,
+        ChartTheme   theme,
+        Collection   parameters,
+        Collection   measurements,
+        Collection   dates,
+        Object       result,
+        Locale       locale,
+        String       uuid,
+        boolean      linesVisible,
+        boolean      shapesVisible,
+        CallContext  callContext
+    ) {
+        Chart chart = null;
+
+        if (CACHE_CHART) {
+            log.info("Try to get verticalcrosssection chart from cache.");
+            chart = (Chart) getChartFromCache(uuid, callContext);
+        }
+
+        if (chart != null)
+            return chart;
+
+        log.info("Chart not in cache yet.");
+
+        if (!(result instanceof AttributedXYColumns)) {
+            log.error("result of wrong type");
+            return null;
+        }
+
+        AttributedXYColumns columns = (AttributedXYColumns)result;
+
+        Integer parameterId =
+            (Integer)columns.getAttribute("GROUP1"); // XXX: hardcoded
+
+        if (parameterId == null) {
+            log.error("missing parameter id");
+            return null;
+        }
+
+        Map<Integer, PaletteManager> paletteManagers =
+            getPalettes(callContext);
+
+        PaletteManager paletteManager = paletteManagers.get(parameterId);
+
+        if (paletteManager == null) {
+            log.error("no palette found for parameter id " + parameterId);
+            return null;
+        }
+
+        HashMap<Integer, Paint> special = new HashMap<Integer, Paint>();
+        special.put(GROUND_FILL_INDEX, getGroundFill(callContext));
+
+        chart = new VerticalCrossSectionChart(
+            columns,
+            paletteManager.getBase(),
+            special,
+            locale,
+            chartLables);
+
+        chart.generateChart();
+        ((VerticalCrossSectionChart)chart).setBackgroundPaint(Color.WHITE);
+
+        if (CACHE_CHART) {
+            log.info("Put chart into cache.");
+            purifyChart(chart, uuid);
+        }
+
+        return chart;
+    }
+
+    /**
+     * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#getStatisticsGenerator()
+     */
+    @Override
+    protected Statistics getStatisticsGenerator() {
+        return new VerticalCrossSectionStatistics();
+    }
+
+    /**
+     * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#createCSV(java.io.OutputStream, java.util.Collection)
+     */
+    @Override
+    protected void createCSV(
+        OutputStream       outputStream,
+        Collection<Result> chartResult
+    )
+    throws UnsupportedEncodingException, IOException, StateException 
+    {
+        // TODO: Implement a substitution which makes sense.
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,901 @@
+/**
+ *
+ */
+package de.intevation.gnv.state.timeseries;
+
+import au.com.bytecode.opencsv.CSVWriter;
+
+import de.intevation.artifactdatabase.Config;
+import de.intevation.artifactdatabase.XMLUtils;
+
+import de.intevation.artifacts.ArtifactNamespaceContext;
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+import de.intevation.artifacts.PreferredLocale;
+
+import de.intevation.gnv.artifacts.context.GNVArtifactContext;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import de.intevation.gnv.chart.Chart;
+import de.intevation.gnv.chart.ChartLabels;
+import de.intevation.gnv.chart.TimeSeriesChart;
+import de.intevation.gnv.chart.XMLChartTheme;
+
+import de.intevation.gnv.chart.exception.TechnicalChartException;
+
+import de.intevation.gnv.exports.ChartExportHelper;
+import de.intevation.gnv.exports.DefaultDataCollector;
+import de.intevation.gnv.exports.DefaultExport;
+import de.intevation.gnv.exports.DefaultProfile;
+
+import de.intevation.gnv.exports.Export.Profile;
+
+import de.intevation.gnv.exports.SimpleOdvDataCollector;
+
+import de.intevation.gnv.geobackend.base.Result;
+
+import de.intevation.gnv.state.InputData;
+import de.intevation.gnv.state.OutputStateBase;
+
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+import de.intevation.gnv.state.describedata.NamedCollection;
+
+import de.intevation.gnv.state.exception.StateException;
+
+import de.intevation.gnv.statistics.Statistic;
+import de.intevation.gnv.statistics.StatisticSet;
+import de.intevation.gnv.statistics.Statistics;
+import de.intevation.gnv.statistics.TimeseriesStatistics;
+
+import de.intevation.gnv.statistics.exception.StatisticsException;
+
+import de.intevation.gnv.timeseries.gap.DefaultTimeGap;
+import de.intevation.gnv.timeseries.gap.TimeGap;
+
+import de.intevation.gnv.utils.ArtifactXMLUtilities;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.chart.ChartTheme;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+/**
+ * @author Tim Englich    (tim.englich@intevation.de)
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public class TimeSeriesOutputState extends OutputStateBase {
+
+    protected static final boolean CACHE_CHART =
+        Boolean.parseBoolean(System.getProperty("cache.chart", "false"));
+
+    protected static final boolean PDF_FORMAT_LANDSCAPE =
+        Boolean.parseBoolean(System.getProperty("export.pdf.landscape","true"));
+
+    protected static final String[] IMG_EXPORT_FORMAT = {
+        "PNG", "JPEG", "GIF"
+    };
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 4178407570503098858L;
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(TimeSeriesOutputState.class);
+
+    private static List<TimeGap> timeGapDefinitions = null;
+
+    protected String domainLable = "chart.timeseries.title.xaxis";
+
+    protected String featureValuesName = "featureid";
+    protected String parameterValuesName = "parameterid";
+    protected String measuremenValueName = "measurementid";
+    protected String dateValueName = "dateid";
+
+    public static final String [] TIMESERIES_CSV_PROFILE_COLUMNS = {
+        "XORDINATE",
+        "YORDINATE",
+        "GROUP1",
+        "GROUP2",
+        "GROUP3"
+    };
+
+
+    public static final String [] TIMESERIES_TIMESERIES_CSV_COLUMN_LABEL = {
+        "Date/Time",
+        "Value",
+        "ParameterID",
+        "MeasurementID",
+        "TimeseriesID"
+    };
+
+    public static final String [] TIMESERIES_MESH_CSV_COLUMN_LABEL = {
+        "Date/Time",
+        "Value",
+        "ParameterID",
+        "FeatureID",
+        "MeshID"
+    };
+
+    public static final String [] TIMESERIES_ODV_PROFILE_NAMES = {
+          "CRUISE",
+          "STATION",
+          "TYPE",
+          "SHAPE",
+          "BOTDEPTH",
+          "DEPTH",
+          "TIMEVALUE",
+          "DATAVALUE",
+          "PARAMETER"
+    };
+
+
+    public static final String [] ODV_COLUMN_HEADER = {
+        "Cruise",
+        "Station",
+        "Type",
+        "Longitude [deegrees_east]",
+        "Latitude [deegrees_north]",
+        "Bot. Depth [m]",
+        "Depth [m]",
+        "Date/Time",
+        "Value",
+        "Parameterid"
+    };
+
+    /**
+     * Profile for exporting data to odv
+     * TODO Change TIMESERIES_PROFILE_NAMES, which belong to CSV exports
+     */
+    public static final Profile TIMESERIES_ODV_PROFILE =
+        new DefaultProfile(
+            ODV_COLUMN_HEADER,
+            '\t',
+            CSVWriter.NO_QUOTE_CHARACTER,
+            CSVWriter.NO_ESCAPE_CHARACTER,
+            "ODV",
+            "ISO-8859-1");
+
+    /**
+     * Constructor
+     */
+    public TimeSeriesOutputState() {
+        super();
+    }
+
+
+    @Override
+    public void initialize(String uuid, CallContext context)
+    throws StateException
+    {
+        getChartResult(uuid, context);
+    }
+
+
+    /**
+     * @see de.intevation.gnv.transition.OutputTransition#out(java.lang.String,
+     *      java.util.Collection, java.io.OutputStream, java.lang.String,
+     *      de.intevation.artifacts.CallMeta)
+     */
+    public void out(
+        Document              format,
+        Collection<InputData> inputData,
+        OutputStream          outputStream,
+        String                uuid,
+        CallContext           callContext
+    ) throws StateException
+    {
+        log.debug("TimeSeriesOutputTransition.out");
+
+        String outputMode = XMLUtils.xpathString(
+            format, XPATH_OUTPUT_MODE, ArtifactNamespaceContext.INSTANCE);
+
+        String mimeType = XMLUtils.xpathString(
+            format, XPATH_MIME_TYPE, ArtifactNamespaceContext.INSTANCE);
+
+        CallMeta callMeta         = callContext.getMeta();
+
+        int chartWidth   = 600;
+        int chartHeight  = 400;
+        boolean sVisible = false;
+
+        // lines are always visible. if lines should be configurable we need a
+        // parameter in the user interface
+        boolean lVisible = true;
+
+        try {
+            if (inputData != null) {
+                Iterator<InputData> it = inputData.iterator();
+                while (it.hasNext()) {
+                    InputData ip      = it.next();
+                    String optionName = ip.getName().trim();
+
+                    if (optionName.equals("width")) {
+                        chartWidth = Integer.parseInt(ip.getValue());
+                    }
+                    else if (optionName.equals("height")) {
+                        chartHeight = Integer.parseInt(ip.getValue());
+                    }
+                    else if (optionName.equals("points")) {
+                        sVisible = Boolean.parseBoolean(ip.getValue());
+                    }
+                }
+            }
+        } catch (NumberFormatException e) {
+            log.error(e, e);
+            throw new StateException(e);
+        }
+
+        try {
+            if (outputMode.equalsIgnoreCase("chart")) {
+                log.debug("Chart will be generated.");
+
+                PreferredLocale[] locales = callMeta.getLanguages();
+                Locale[] serverLocales    =
+                    RessourceFactory.getInstance().getLocales();
+                Locale locale             =
+                    callMeta.getPreferredLocale(serverLocales);
+
+                log.debug(
+                    "Best locale - regarding intersection of server and " +
+                    "browser locales -  is " + locale.toString()
+                );
+
+                Collection parameters   = this.getCleanedParameters(uuid);
+                Collection measurements = this.getMeasurements(uuid);
+                Collection dates        = this.getDates(uuid);
+
+                ChartLabels chartLables = createChartLabels(locale, uuid);
+
+                String exportFormat = getExportFormat(mimeType);
+
+                this.createChart(
+                    outputStream,
+                    parameters,
+                    measurements,
+                    dates,
+                    chartLables,
+                    callContext,
+                    uuid,
+                    exportFormat,
+                    locale,
+                    chartWidth,
+                    chartHeight,
+                    lVisible,
+                    sVisible,
+                    callContext
+                );
+            }
+            else if (outputMode.equalsIgnoreCase("pdf")) {
+                log.debug("Output mode == pdf");
+
+                Locale[] serverLocales    =
+                    RessourceFactory.getInstance().getLocales();
+                Locale locale             =
+                    callMeta.getPreferredLocale(serverLocales);
+
+                log.debug(
+                    "Best locale - regarding intersection of server and " +
+                    "browser locales -  is " + locale.toString()
+                );
+
+                createPDF(
+                    outputStream,
+                    getCleanedParameters(uuid),
+                    getMeasurements(uuid),
+                    getDates(uuid),
+                    createChartLabels(locale, uuid),
+                    uuid,
+                    "A4",
+                    true,
+                    lVisible,
+                    sVisible,
+                    locale,
+                    callContext
+                );
+            }
+            else if (outputMode.equalsIgnoreCase("svg")) {
+                log.debug("Output mode == svg");
+
+                Locale[] serverLocales    =
+                    RessourceFactory.getInstance().getLocales();
+                Locale locale             =
+                    callMeta.getPreferredLocale(serverLocales);
+
+                log.debug(
+                    "Best locale - regarding intersection of server and " +
+                    "browser locales -  is " + locale.toString()
+                );
+
+                createSVG(
+                    outputStream,
+                    getCleanedParameters(uuid),
+                    getMeasurements(uuid),
+                    getDates(uuid),
+                    createChartLabels(locale, uuid),
+                    uuid,
+                    locale,
+                    chartWidth,
+                    chartHeight,
+                    lVisible,
+                    sVisible,
+                    callContext
+                );
+            }
+            else if (outputMode.equalsIgnoreCase("csv")) {
+                log.debug("CSV-File will be generated.");
+                Object result = getChartResult(uuid, callContext);
+                if (result instanceof Collection) {
+                    this.createCSV(
+                        outputStream,
+                        (Collection<Result>)result);
+                }
+            } else if (outputMode.equalsIgnoreCase("statistics")) {
+                log.debug("Statistics will be generated.");
+
+                Collection<StatisticSet> statistics;
+
+                Statistics s      = getStatisticsGenerator();
+                Object     result = getChartResult(uuid, callContext);
+
+                if (result != null && s != null) {
+                    Collection<KeyValueDescibeData> parameters = 
+                        getParameters(uuid);
+
+                    Collection<KeyValueDescibeData> measurements = 
+                        getMeasurements(uuid);
+
+                    Collection<KeyValueDescibeData> dates = 
+                         getDates(uuid);
+
+                    statistics = s.calculateStatistics(
+                        result,
+                        parameters,
+                        measurements,
+                        dates);
+                }
+                else {
+                    statistics = new ArrayList<StatisticSet>();
+                }
+
+                Document doc = writeStatistics2XML(statistics);
+
+                XMLUtils.toStream(doc, outputStream);
+
+            } else if (outputMode.equalsIgnoreCase("odv")) {
+                Collection<Result> odvResult = this.getODVResult(uuid);
+                this.createODV(outputStream, odvResult);
+            }
+        } catch (IOException e) {
+            log.error(e, e);
+            throw new StateException(e);
+        } catch (TechnicalChartException e) {
+            log.error(e, e);
+            throw new StateException(e);
+        } catch (StatisticsException e) {
+            log.error(e, e);
+            throw new StateException(e);
+        }
+    }
+
+
+    protected String getExportFormat(String mime) {
+        for(int i = 0; i < IMG_EXPORT_FORMAT.length; i++) {
+            if (mime.trim().toUpperCase().indexOf(IMG_EXPORT_FORMAT[i]) > 0)
+                return IMG_EXPORT_FORMAT[i];
+        }
+
+        // no format found relating to mimeType, default export as PNG
+        return IMG_EXPORT_FORMAT[0];
+    }
+
+
+    protected Collection getCleanedParameters(Collection parameters) {
+        Iterator iter        = parameters.iterator();
+        Collection parameter = new Vector(parameters);
+        while (iter.hasNext()) {
+            KeyValueDescibeData data = (KeyValueDescibeData)iter.next();
+            if (!data.isSelected())
+                parameter.remove(data);
+        }
+
+        return parameter;
+    }
+
+
+    protected Collection getCleanedParameters(String uuid) {
+        return getCleanedParameters(getParameters(uuid));
+    }
+
+
+    protected void createCSV(OutputStream out, Collection<Result> results)
+    throws UnsupportedEncodingException, IOException, StateException
+    {
+        Iterator iter = results.iterator();
+        Result   res  = iter.hasNext() ? (Result) iter.next() : null;
+
+        if (res == null)
+            return;
+
+        Profile profile = null;
+        int     dataid  = res.getInteger("DATAID").intValue();
+
+        // on meshes
+        if (dataid == 2) {
+            profile =  new DefaultProfile(
+                TIMESERIES_MESH_CSV_COLUMN_LABEL,
+                ',',
+                '"',
+                '"',
+                "CSV",
+                "ISO-8859-1");
+        }
+
+        // on timeseries
+        else {
+            profile =  new DefaultProfile(
+                TIMESERIES_TIMESERIES_CSV_COLUMN_LABEL,
+                ',',
+                '"',
+                '"',
+                "CSV",
+                "ISO-8859-1");
+        }
+
+        DefaultExport export = new DefaultExport(
+            new DefaultDataCollector(TIMESERIES_CSV_PROFILE_COLUMNS));
+        export.create(profile, out, results);
+    }
+
+
+    /**
+     * TODO Result is not used at the moment. Change result with correct data.
+     */
+    protected void createODV(OutputStream outputStream, Collection result)
+    throws IOException, StateException {
+
+        DefaultExport export = new DefaultExport(new SimpleOdvDataCollector(
+            TIMESERIES_ODV_PROFILE_NAMES));
+
+        if (result == null)
+            log.error("#################### RESULT == NULL #################");
+        export.create(TIMESERIES_ODV_PROFILE, outputStream, result);
+    }
+
+    /**
+     * @return
+     */
+    protected Statistics getStatisticsGenerator() {
+        Statistics s = new TimeseriesStatistics();
+        return s;
+    }
+
+    protected Document writeStatistics2XML( Collection<StatisticSet> statistic) {
+        ArtifactXMLUtilities xmlUtilities = new ArtifactXMLUtilities();
+        Document doc = XMLUtils.newDocument();
+        if (statistic != null) {
+            Node statisticResults = xmlUtilities.createArtifactElement(doc,
+                    "statistics");
+            doc.appendChild(statisticResults);
+            Iterator<StatisticSet> it = statistic.iterator();
+            while (it.hasNext()) {
+                StatisticSet set = it.next();
+                Element setElement = xmlUtilities.createArtifactElement(doc,
+                                                                       "statistic");
+                setElement.setAttribute("name", set.getName());
+                
+                Iterator<Statistic> sit = set.getStatistics().iterator();
+                while (sit.hasNext()){
+                    Statistic s = sit.next();
+                    Element result = xmlUtilities.createArtifactElement(doc,
+                    "statistic-value");
+                    result.setAttribute("name", s.getKey());
+                    result.setAttribute("value", s.getStringValue());
+                    setElement.appendChild(result);
+                }
+                statisticResults.appendChild(setElement);
+            }
+
+        }
+        return doc;
+    }
+
+
+    protected String getSelectedFeatureName(String uuid) {
+        Collection values = getCollection(featureValuesName, uuid);
+
+        if (values != null) {
+            Iterator it = values.iterator();
+
+            while (it.hasNext()) {
+                KeyValueDescibeData data = (KeyValueDescibeData) it.next();
+
+                if (data.isSelected()) {
+                    return data.getValue();
+                }
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * @param outputStream
+     * @param parameters
+     * @param measurements
+     * @param timeSeriesName
+     * @param chartStyle
+     * @param chartLables
+     * @throws IOException
+     * @throws TechnicalChartException
+     */
+    protected void createChart(
+        OutputStream outputStream,
+        Collection   parameters,
+        Collection   measurements,
+        Collection   dates,
+        ChartLabels  chartLables,
+        CallContext  context,
+        String       uuid,
+        String       exportFormat,
+        Locale       locale,
+        int          width,
+        int          height,
+        boolean      linesVisible,
+        boolean      shapesVisible,
+        CallContext  callContext
+    )
+    throws IOException, TechnicalChartException
+    {
+        log.debug("Create chart.");
+        Chart chart = getChart(
+            chartLables,
+            createStyle(context),
+            parameters,
+            measurements,
+            dates,
+            getChartResult(uuid, callContext),
+            locale, // Locale
+            uuid,
+            linesVisible,
+            shapesVisible,
+            callContext
+        );
+
+        if (chart == null) {
+            log.error("Could not initialize chart.");
+            return;
+        }
+
+        log.debug(
+            "export chart as " + exportFormat +
+            " in " + width + "x" + height
+        );
+
+        ChartExportHelper.exportImage(
+            outputStream,
+            chart.generateChart(),
+            exportFormat,
+            width,
+            height
+        );
+    }
+
+
+    protected void createPDF(
+        OutputStream outputStream,
+        Collection   parameters,
+        Collection   measurements,
+        Collection   dates,
+        ChartLabels  chartLables,
+        String       uuid,
+        String       exportFormat,
+        boolean      landscape,
+        boolean      linesVisible,
+        boolean      shapesVisible,
+        Locale       locale,
+        CallContext  context
+    ) {
+        Chart chart = getChart(
+            chartLables,
+            createStyle(context),
+            parameters,
+            measurements,
+            dates,
+            getChartResult(uuid, context),
+            locale,
+            uuid,
+            linesVisible,
+            shapesVisible,
+            context
+        );
+
+        if (chart == null) {
+            log.error("Could not initialize chart.");
+            return;
+        }
+
+        ChartExportHelper.exportPDF(
+            outputStream,
+            chart.generateChart(),
+            "A4",
+            PDF_FORMAT_LANDSCAPE,
+            50F, 50F, 50F, 50F
+        );
+    }
+
+
+    protected void createSVG(
+        OutputStream outputStream,
+        Collection   parameters,
+        Collection   measurements,
+        Collection   dates,
+        ChartLabels  chartLables,
+        String       uuid,
+        Locale       locale,
+        int          width,
+        int          height,
+        boolean      linesVisible,
+        boolean      shapesVisible,
+        CallContext  callContext
+    ) {
+        Chart chart = getChart(
+            chartLables,
+            createStyle(callContext),
+            parameters,
+            measurements,
+            dates,
+            getChartResult(uuid, callContext),
+            locale,
+            uuid,
+            linesVisible,
+            shapesVisible,
+            callContext
+        );
+
+        if (chart == null) {
+            log.error("Could not initialize chart.");
+            return;
+        }
+
+        ChartExportHelper.exportSVG(
+            outputStream,
+            chart.generateChart(),
+            null,
+            600, 400
+        );
+
+        log.debug("svg export finished.");
+    }
+
+
+    protected Chart getChart(
+        ChartLabels  chartLables,
+        ChartTheme   theme,
+        Collection   parameters,
+        Collection   measurements,
+        Collection   dates,
+        Object       result,
+        Locale       locale,
+        String       uuid,
+        boolean      linesVisible,
+        boolean      shapesVisible,
+        CallContext  callContext
+    ) {
+        Chart chart = null;
+
+        if (CACHE_CHART) {
+            log.info("Try to get timeseries chart from cache.");
+            chart = (Chart) getChartFromCache(uuid, callContext);
+        }
+
+        if (chart != null)
+            return chart;
+
+        log.info("Chart not in cache yet.");
+        chart = new TimeSeriesChart(
+            chartLables,
+            theme,
+            parameters,
+            measurements,
+            dates,
+            (Collection)result,
+            timeGapDefinitions,
+            locale,
+            linesVisible,
+            shapesVisible
+        );
+        chart.generateChart();
+
+        if (CACHE_CHART) {
+            log.info("Put chart into cache.");
+            purifyChart(chart, uuid);
+        }
+
+        return chart;
+    }
+
+    protected ChartTheme createStyle(CallContext callContext) {
+        log.debug("Fetch chart theme from global context");
+
+        GNVArtifactContext context =
+            (GNVArtifactContext) callContext.globalContext();
+
+        XMLChartTheme theme = (XMLChartTheme) context.get(
+            GNVArtifactContext.CHART_TEMPLATE_KEY);
+
+        return theme;
+    }
+
+    protected ChartLabels createChartLabels(Locale locale, String uuid) {
+        return new ChartLabels(
+            createChartTitle(locale, uuid),
+            createChartSubtitle(locale, uuid),
+            RessourceFactory.getInstance().getRessource(
+                locale,
+                domainLable,
+                domainLable
+            )
+        );
+    }
+
+
+    protected String createChartTitle(Locale locale, String uuid) {
+        return getFisName(locale);
+
+    }
+
+
+    protected String createChartSubtitle(Locale locale, String uuid) {
+        return getSelectedFeatureName(uuid);
+    }
+
+
+    protected String getFisName(Locale locale) {
+        String    returnValue = "";
+        InputData input       = inputData.get("fisname");
+
+        if (input != null) {
+            String value = input.getValue();
+
+            returnValue = RessourceFactory.getInstance().getRessource(
+                locale,
+                value,
+                value
+            );
+        }
+        return returnValue;
+    }
+
+
+    protected String getSelectedInputDataName(String uuid, String key) {
+        Collection values = getCollection(key, uuid);
+
+        if (values != null) {
+            Iterator it = values.iterator();
+
+            while (it.hasNext()) {
+                KeyValueDescibeData data = (KeyValueDescibeData) it.next();
+
+                if (data.isSelected()) {
+                    return data.getValue();
+                }
+            }
+        }
+        return null;
+    }
+
+
+    protected Collection<KeyValueDescibeData> getParameters(String uuid) {
+        return this.getCollection(parameterValuesName, uuid);
+    }
+
+    protected Collection<KeyValueDescibeData> getMeasurements(String uuid) {
+        return this.getCollection(measuremenValueName, uuid);
+    }
+    protected Collection<KeyValueDescibeData> getDates(String uuid) {
+        return this.getCollection(dateValueName,uuid);
+    }
+
+    @Override
+    public void setup(Node configuration) {
+        super.setup(configuration);
+        String featureNameValue = Config.getStringXPath(configuration,
+                "value-names/value-name[@name='feature']/@value");
+        if (featureNameValue != null) {
+            this.featureValuesName = featureNameValue;
+        }
+        String parameterNameValue = Config.getStringXPath(configuration,
+                "value-names/value-name[@name='parameter']/@value");
+        if (parameterNameValue != null) {
+            this.parameterValuesName = parameterNameValue;
+        }
+        String measurementNameValue = Config.getStringXPath(configuration,
+                "value-names/value-name[@name='measurement']/@value");
+        if (measurementNameValue != null) {
+            this.measuremenValueName = measurementNameValue;
+        }
+        
+        String dateNameValue = Config.getStringXPath(configuration,
+        "value-names/value-name[@name='date']/@value");
+        if (dateNameValue != null) {
+            this.dateValueName = dateNameValue;
+        }
+        if (timeGapDefinitions == null){
+            Element gapDefinition =  (Element)Config.getNodeXPath(configuration,
+                                                                 "time-gap-definition");
+            synchronized (this.getClass()) {
+                if (gapDefinition != null){
+                    String link = gapDefinition.getAttribute("xlink:href");
+                    if (link != null ){
+                        String absolutFileName = Config.replaceConfigDir(link);
+                        gapDefinition = (Element)new ArtifactXMLUtilities().
+                                                     readConfiguration(absolutFileName);
+                    }
+                    
+                    NodeList gapDefinitions = Config.getNodeSetXPath(gapDefinition, 
+                                                                    "/time-gaps/time-gap");
+                    if (gapDefinition != null){
+                        timeGapDefinitions = new ArrayList<TimeGap>(gapDefinitions.
+                                                                    getLength());
+                        for (int i = 0; i < gapDefinitions.getLength(); i++){
+                            Element gapNode = (Element)gapDefinitions.item(i);
+                            String unit = gapNode.getAttribute("unit");
+                            int key = Integer.parseInt(gapNode.getAttribute("key"));
+                            int value = Integer.parseInt(gapNode.getAttribute("gap"));
+                            log.info("Add new Timegap: "+key+" "+value+" "+ unit);
+                            timeGapDefinitions.add(new DefaultTimeGap(unit, 
+                                                                      key, 
+                                                                      value));
+                        }
+                    }
+                    
+                }
+            }
+        }
+    }
+    
+    /**
+     * @param collectionName
+     * @return
+     */
+    protected Collection<KeyValueDescibeData> getCollection(
+                                                            String collectionName, 
+                                                            String uuid) {
+        Iterator<Object> it = this.getDescibeData(uuid).iterator();
+        while (it.hasNext()) {
+
+            Object o = it.next();
+
+            if (o instanceof NamedCollection<?>) {
+                NamedCollection<KeyValueDescibeData> nc = (NamedCollection<KeyValueDescibeData>) o;
+                if (nc.getName().equals(collectionName)) {
+                    return nc;
+                }
+            }
+        }
+        return null;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,97 @@
+package de.intevation.gnv.statistics;
+
+import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
+
+import org.apache.commons.math.stat.regression.SimpleRegression;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public abstract class AbstractStatistics
+implements            Statistics
+{
+    private static Logger log = Logger.getLogger(
+        AbstractStatistics.class);
+
+    public AbstractStatistics() {
+    }
+
+    protected StatisticSet generateStatisticsValues(
+        DescriptiveStatistics lStatistics,
+        SimpleRegression      lRegression, 
+        String                statisticName
+    ) {
+        StatisticSet statisticSet = new StatisticSet(statisticName);
+        
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.arithmeticMean",
+                lStatistics.getMean()));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.kurtosis", 
+                lStatistics.getKurtosis()));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.max",
+                lStatistics.getMax()));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.min",
+                lStatistics.getMin()));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.n",
+                lStatistics.getN()));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.percentile.90",
+                lStatistics.getPercentile(90)));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.percentile.75",
+                lStatistics.getPercentile(75)));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.percentile.50",
+                lStatistics.getPercentile(50)));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.percentile.10",
+                lStatistics.getPercentile(10)));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.deviation",
+                lStatistics.getStandardDeviation()));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.variance",
+                lStatistics.getVariance()));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.intercept", 
+                lRegression.getIntercept()));
+
+        statisticSet.addStatistic(
+            new Statistic(
+                "gnviewer.statistics.descriptive.slope",
+                lRegression.getSlope()));
+
+        return statisticSet;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,86 @@
+/**
+ *
+ */
+package de.intevation.gnv.statistics;
+
+import java.sql.SQLException;
+import java.util.Collection;
+
+import org.apache.log4j.Logger;
+
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.io.WKTReader;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+import de.intevation.gnv.utils.DistanceCalculator;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class HorizontalProfileStatistics extends TimeseriesStatistics {
+    
+    private static Logger log = Logger.getLogger(HorizontalProfileStatistics.class);
+
+    private WKTReader wktReader = new WKTReader();
+    
+    private DistanceCalculator dc = new DistanceCalculator();
+    
+    private double distance = 0;
+    
+    /**
+     * Constructor
+     */
+    public HorizontalProfileStatistics() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.statistics.TimeseriesStatistics#calculateXOrdinateValue(de.intevation.gnv.geobackend.base.Result, de.intevation.gnv.geobackend.base.Result)
+     */
+    @Override
+    protected double calculateXOrdinateValue(Result previousRow,Result row)
+                     throws SQLException {
+        try {
+            Point start = (Point)this.wktReader.read(previousRow.getString("SHAPE"));
+            Point current = (Point)this.wktReader.read(row.getString("SHAPE"));
+            double delta = this.dc.calculateDistance(start, current);
+            
+            if (!Double.isNaN(delta)){
+                this.distance = this.distance + delta;
+            }
+        } catch (ParseException e) {
+            log.error(e,e);
+        }
+        return this.distance;
+    }
+
+    /**
+     * @see de.intevation.gnv.statistics.TimeseriesStatistics#generateStatisticsName(java.lang.String, java.lang.String, java.lang.String, java.util.Collection, java.util.Collection, java.util.Collection)
+     */
+    @Override
+    protected String generateStatisticsName(
+                                            String break1,
+                                            String break2,
+                                            String break3,
+                                            Collection<KeyValueDescibeData> parameters,
+                                            Collection<KeyValueDescibeData> measurements,
+                                            Collection<KeyValueDescibeData> dates) {
+        return (this.findValueTitle(parameters, break1)+ " "+ 
+                this.findValueTitle(measurements,break2)).trim()+" "+
+                this.findValueTitle(dates,break3);
+    }
+    
+    /**
+     * @see de.intevation.gnv.statistics.TimeseriesStatistics#clearStatistics()
+     */
+    @Override
+    protected void clearStatistics() {
+        log.debug("HorizontalProfileStatistics.clearStatistics");
+        super.clearStatistics();
+        this.distance = 0;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/Statistic.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,61 @@
+/**
+ * Title:           Statistic, $Header: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/Statistic.java,v 1.2 2007/12/21 12:31:15 blume Exp $
+ * Source:          $Source: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/Statistic.java,v $
+ * created by:      Stefan Blume (blume)
+ * erstellt am:     14.12.2007
+ * Copyright:       con terra GmbH, 2005
+ *
+ * modified by:     $Author: blume $
+ * modified on:     $Date: 2007/12/21 12:31:15 $
+ * Version:         $Revision: 1.2 $
+ * TAG:             $Name:  $
+ * locked from:     $Locker:  $
+ * CVS State:       $State: Exp $
+ * Project:         $ProjectName$
+ */
+package de.intevation.gnv.statistics;
+
+import org.apache.log4j.Logger;
+
+/**
+ * The class <code>Statistic</code> fulfills the following purposes:
+ * <ol>
+ * <li></li>
+ * </ol>
+ * 
+ * @author blume
+ * @version 1.0
+ * @serial 1.0
+ * @see
+ * @since 14.12.2007 09:38:18
+ */
+public class Statistic {
+
+    /**
+     * Default Logging instance
+     */
+    private static Logger sLogger = Logger.getLogger(Statistic.class);
+    private static boolean sDebug = sLogger.isDebugEnabled();
+
+    private double mValue;
+    private String mKey;
+
+    public Statistic(String pKey, double pValue) {
+        mKey = pKey;
+        mValue = pValue;
+    }
+
+    public double getValue() {
+        return mValue;
+    }
+
+    public String getKey() {
+        return mKey;
+    }
+
+    public String getStringValue() {
+        java.text.DecimalFormat df = new java.text.DecimalFormat("#.##");
+        return df.format(mValue);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/StatisticSet.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,40 @@
+/**
+ *
+ */
+package de.intevation.gnv.statistics;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class StatisticSet {
+
+    
+    private String name = null;
+    
+    private Collection<Statistic> statistics = new ArrayList<Statistic>();
+    
+    /**
+     * Constructor
+     */
+    public StatisticSet(String name) {
+        this.name = name;
+    }
+    
+    
+    public void addStatistic(Statistic statistic){
+        this.statistics.add(statistic);
+    }
+    
+    public Collection<Statistic> getStatistics(){
+        return this.statistics;
+    }
+    
+    public String getName(){
+        return this.name;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/Statistics.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,54 @@
+/**
+ * Title:           Statistics, $Header: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/Statistics.java,v 1.2 2008/01/30 12:38:34 blume Exp $
+ * Source:          $Source: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/Statistics.java,v $
+ * created by:      Stefan Blume (blume)
+ * erstellt am:     14.12.2007
+ * Copyright:       con terra GmbH, 2005
+ *
+ * modified by:     $Author: blume $
+ * modified on:     $Date: 2008/01/30 12:38:34 $
+ * Version:         $Revision: 1.2 $
+ * TAG:             $Name:  $
+ * locked from:     $Locker:  $
+ * CVS State:       $State: Exp $
+ * Project:         $ProjectName$
+ */
+package de.intevation.gnv.statistics;
+
+import java.util.Collection;
+
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+
+import de.intevation.gnv.statistics.exception.StatisticsException;
+
+/**
+ * The interface <code>Statistics</code> fulfills the following purposes:
+ * <ol>
+ * <li>Providng a marker interface for statistics.</li>
+ * </ol>
+ * 
+ * @author blume
+ * @version 1.0
+ * @serial 1.0
+ * @see
+ * @since 14.12.2007 09:34:32
+ */
+public interface Statistics {
+
+   /**
+    * 
+    * @param resultSet
+    * @param parameters
+    * @param measurements
+    * @param dates
+    * @return
+    * @throws StatisticsException
+    */
+    public Collection<StatisticSet>  calculateStatistics(
+         Object                          resultSet,
+         Collection<KeyValueDescibeData> parameters,
+         Collection<KeyValueDescibeData> measurements,
+         Collection<KeyValueDescibeData> dates
+    )
+    throws StatisticsException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,235 @@
+/**
+ * Title:           TimeseriesStatistics, $Header: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/TimeseriesStatistics.java,v 1.3 2008/08/18 14:50:33 drewnak Exp $
+ * Source:          $Source: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/TimeseriesStatistics.java,v $
+ * created by:      Stefan Blume (blume)
+ * erstellt am:     06.12.2007
+ * Copyright:       con terra GmbH, 2005
+ *
+ * modified by:     $Author: drewnak $
+ * modified on:     $Date: 2008/08/18 14:50:33 $
+ * Version:         $Revision: 1.3 $
+ * TAG:             $Name:  $
+ * locked from:     $Locker:  $
+ * CVS State:       $State: Exp $
+ * Project:         $ProjectName$
+ */
+package de.intevation.gnv.statistics;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
+import org.apache.commons.math.stat.regression.SimpleRegression;
+import org.apache.log4j.Logger;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.geobackend.base.ResultDescriptor;
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+import de.intevation.gnv.statistics.exception.StatisticsException;
+
+/**
+ * The class <code>TimeseriesStatistics</code> fulfills the following purposes:
+ * <ol>
+ * <li></li>
+ * </ol>
+ * 
+ * @author blume
+ * @author Tim Englich <tim.englich@intevation.de>
+ * @version 1.0
+ * @serial 1.0
+ * @see
+ * @since 06.12.2007 18:02:27
+ */
+public class TimeseriesStatistics 
+extends      AbstractStatistics
+{
+
+    /**
+     * Default Logging instance
+     */
+    private static Logger log = Logger.getLogger(TimeseriesStatistics.class);
+
+    /**
+     * Constructor
+     */
+    public TimeseriesStatistics() {
+    }
+
+    /**
+     * @see de.intevation.gnv.statistics.Statistics#calculateStatistics(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Collection)
+     */
+    public Collection<StatisticSet> calculateStatistics(
+        Object                          result,
+        Collection<KeyValueDescibeData> parameters,
+        Collection<KeyValueDescibeData> measurements,
+        Collection<KeyValueDescibeData> dates
+    )
+    throws StatisticsException {
+
+        if (!(result instanceof Collection)) {
+            return new ArrayList<StatisticSet>();
+        }
+
+        Collection<Result> resultSet = (Collection<Result>)result;
+
+        clearStatistics();
+
+        DescriptiveStatistics lStatistics = null;
+        SimpleRegression lRegression = null;
+        Collection<StatisticSet> statisticSets = new ArrayList<StatisticSet>();
+        String break1, break2, break3;
+        int lSeries = 1;
+
+        if (resultSet == null) {
+            return statisticSets;
+        }
+
+        int b1Idx = -1;
+        int b2Idx = -1;
+        int b3Idx = -1;
+        int yIdx  = -1;
+        try {
+
+            Iterator<Result> resultIterator = resultSet.iterator();
+            if (resultIterator.hasNext()) {
+                Result row = resultIterator.next();
+                Result previousRow = row;
+
+                if (b1Idx == -1) {
+                    ResultDescriptor rd = row.getResultDescriptor();
+                    b1Idx = rd.getColumnIndex("GROUP1");
+                    b2Idx = rd.getColumnIndex("GROUP2");
+                    b3Idx = rd.getColumnIndex("GROUP3");
+                    yIdx  = rd.getColumnIndex("YORDINATE");
+
+                    if (b1Idx == -1 || b2Idx == -1 || b3Idx == -1 || yIdx == -1) {
+                        return statisticSets;
+                    }
+                }
+                break1 = row.getString(b1Idx);
+                break2 = row.getString(b2Idx);
+                break3 = row.getString(b3Idx);
+                lRegression = new SimpleRegression();
+                lStatistics = new DescriptiveStatistics();
+                while (resultIterator.hasNext()) {
+
+                    if (!break1.equals(row.getString(b1Idx))
+                        || !break2.equals(row.getString(b2Idx))
+                        || !break3.equals(row.getString(b3Idx))
+                        ) {
+                        String statisticsName = generateStatisticsName(
+                            break1, break2, 
+                            break3, parameters, 
+                            measurements, dates);
+
+                        statisticSets.add(
+                            generateStatisticsValues(
+                                lStatistics, 
+                                lRegression,
+                                statisticsName));
+
+                        lStatistics.clear();
+                        lRegression.clear();
+                        
+                        clearStatistics();
+
+                        Double yValue = row.getDouble(yIdx);
+
+                        if (yValue != null) {
+                            lStatistics.addValue(yValue);
+                            Double x = calculateXOrdinateValue(previousRow,row);
+                            lRegression.addData(x, yValue);
+                        }
+
+                        break1 = row.getString(b1Idx);
+                        break2 = row.getString(b2Idx);
+                        break3 = row.getString(b3Idx);
+                        previousRow = row;
+                        row = resultIterator.next();
+                        lSeries++;
+                    } else {
+
+                        Double value = row.getDouble(yIdx);
+                        if (value != null) {
+                            lStatistics.addValue(value.doubleValue());
+                            Double x = calculateXOrdinateValue(previousRow,row);
+                            lRegression.addData(x, value.doubleValue());
+                        }
+                        previousRow = row;
+                        row = resultIterator.next();
+                    }
+
+                }
+
+                Double yValue = row.getDouble(yIdx);
+
+                if (yValue != null) {
+                    lStatistics.addValue(yValue);
+                    Double x = calculateXOrdinateValue(previousRow, row);
+                    lRegression.addData(x, yValue);
+                }
+                
+                String statisticsName = generateStatisticsName(
+                    break1, break2, 
+                    break3, parameters, 
+                    measurements, dates);
+                
+                statisticSets.add(generateStatisticsValues(
+                    lStatistics, 
+                    lRegression, 
+                    statisticsName));
+                lStatistics.clear();
+                lRegression.clear();
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+
+        return statisticSets;
+    }
+
+    protected void clearStatistics(){}
+    
+    /**
+     * 
+     * @param break1
+     * @param break2
+     * @param break3
+     * @param parameters
+     * @param measurements
+     * @param dates
+     * @return
+     */
+    protected String generateStatisticsName(String break1, 
+                                            String break2,
+                                            String break3,
+                                            Collection<KeyValueDescibeData> parameters,
+                                            Collection<KeyValueDescibeData> measurements,
+                                            Collection<KeyValueDescibeData> dates){
+        log.debug("TimeseriesStatistics.generateStatisticsName");
+        return this.findValueTitle(parameters,break1)+ " "+
+               this.findValueTitle(measurements,break2) + "m";
+    }
+    
+    
+    protected String findValueTitle(Collection<KeyValueDescibeData> values,
+                                  String id) {
+        log.debug("TimeseriesStatistics.findValueTitle "+ id);
+        if (values != null) {
+            Iterator<KeyValueDescibeData> it = values.iterator();
+            while (it.hasNext()) {
+                KeyValueDescibeData data = it.next();
+                if (id.equals(data.getKey())) {
+                    return data.getValue();
+                }
+            }
+        }
+        return "";
+    }
+    protected double calculateXOrdinateValue(Result previousRow, Result row) throws SQLException {
+        return new Double((row.getDate("XORDINATE")).getTime() / 1000 / 3600);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/VerticalCrossSectionStatistics.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,52 @@
+package de.intevation.gnv.statistics;
+
+import java.util.Collection;
+import java.util.ArrayList;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+
+import de.intevation.gnv.statistics.exception.StatisticsException;
+
+import de.intevation.gnv.math.AttributedXYColumns;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class VerticalCrossSectionStatistics
+extends      AbstractStatistics
+{
+    private static Logger log = Logger.getLogger(
+        VerticalCrossSectionStatistics.class);
+
+    public VerticalCrossSectionStatistics() {
+    }
+
+    public Collection<StatisticSet> calculateStatistics(
+         Object                          result,
+         Collection<KeyValueDescibeData> parameters,
+         Collection<KeyValueDescibeData> measurements,
+         Collection<KeyValueDescibeData> dates
+    )
+    throws StatisticsException {
+
+        boolean debug = log.isDebugEnabled();
+
+        if (debug) {
+            log.debug("calculateStatistics --------------");
+        }
+
+        ArrayList<StatisticSet> statisticSet =
+            new ArrayList<StatisticSet>();
+
+        if (!(result instanceof AttributedXYColumns)) {
+            log.error("wrong type of result");
+            return statisticSet;
+        }
+        AttributedXYColumns columns = (AttributedXYColumns)result;
+
+        return statisticSet;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,45 @@
+/**
+ *
+ */
+package de.intevation.gnv.statistics;
+
+import java.sql.SQLException;
+import java.util.Collection;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.state.describedata.KeyValueDescibeData;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class VerticalProfileStatistics extends TimeseriesStatistics {
+
+    /**
+     * Constructor
+     */
+    public VerticalProfileStatistics() {
+        super();
+    }
+
+    @Override
+    protected double calculateXOrdinateValue(Result previousRow, Result row) throws SQLException {
+        return row.getDouble("XORDINATE");
+    }
+
+    @Override
+    protected String generateStatisticsName(
+                                            String break1,
+                                            String break2,
+                                            String break3,
+                                            Collection<KeyValueDescibeData> parameters,
+                                            Collection<KeyValueDescibeData> measurements,
+                                            Collection<KeyValueDescibeData> dates) {
+        
+        return (this.findValueTitle(parameters, break1)+ " "+ 
+               this.findValueTitle(measurements,break2)).trim();
+    }
+    
+    
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/exception/StatisticsException.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,51 @@
+/**
+ *
+ */
+package de.intevation.gnv.statistics.exception;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class StatisticsException extends Exception {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -7324280565076343394L;
+
+    /**
+     * Constructor
+     */
+    public StatisticsException() {
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param arg0
+     */
+    public StatisticsException(String arg0) {
+        super(arg0);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param arg0
+     */
+    public StatisticsException(Throwable arg0) {
+        super(arg0);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param arg0
+     * @param arg1
+     */
+    public StatisticsException(String arg0, Throwable arg1) {
+        super(arg0, arg1);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,48 @@
+/**
+ *
+ */
+package de.intevation.gnv.timeseries;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.gnv.artifacts.GNVArtifactBase;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ *
+ */
+public class TimeSeriesArtifact extends GNVArtifactBase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(TimeSeriesArtifact.class);
+
+    /**
+     * The UID of this class
+     */
+    private static final long serialVersionUID = -8291547966693867205L;
+
+    /**
+     * Constructor
+     */
+    public TimeSeriesArtifact() {
+        super();
+        log.debug("TimeSeriesArtifact.Constructor");
+        this.name = "timeSeries";
+    }
+
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String,
+     *      de.intevation.artifacts.ArtifactFactory, java.lang.Object)
+     */
+    @Override
+    public void setup(String identifier, ArtifactFactory factory, Object context) {
+        log.debug("TimeSeriesArtifact.setup");
+        super.setup(identifier, factory, context);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/TimeSeriesMeshArtifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,19 @@
+package de.intevation.gnv.timeseries;
+
+public class TimeSeriesMeshArtifact extends TimeSeriesArtifact {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 5680432486700275986L;
+
+    /**
+     * 
+     * Constructor
+     */
+    public TimeSeriesMeshArtifact() {
+        super();
+        super.name = super.name + "Mesh";
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/gap/DefaultTimeGap.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,64 @@
+/**
+ *
+ */
+package de.intevation.gnv.timeseries.gap;
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class DefaultTimeGap implements TimeGap{
+
+    /**
+     * The UNIT of the TimeGap
+     * See the Constants in de.intevation.gnv.timeseries.gap.TimeGap
+     */
+    private String unit;
+    
+    /**
+     * The Key of the TimeGap which must be equivalent to the
+     * Key used in the DWH
+     */
+    private int key;
+    
+    /**
+     * The Value of the Gap.
+     * Use the Unit and the Time Constants to Calculate the
+     * value in Milliseconds
+     */
+    private int value;
+    
+    /**
+     * Constructor
+     * @param unit
+     * @param key
+     * @param value
+     */
+    public DefaultTimeGap(String unit, int key, int value) {
+        super();
+        this.unit = unit;
+        this.key = key;
+        this.value = value;
+    }
+
+    /**
+     * @see de.intevation.gnv.timeseries.gap.TimeGap#getUnit()
+     */
+    public String getUnit() {
+        return this.unit;
+    }
+
+    /**
+     * @see de.intevation.gnv.timeseries.gap.TimeGap#getKey()
+     */
+    public int getKey() {
+        return this.key;
+    }
+
+    /**
+     * @see de.intevation.gnv.timeseries.gap.TimeGap#getValue()
+     */
+    public int getValue() {
+        return this.value;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/gap/TimeGap.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,35 @@
+package de.intevation.gnv.timeseries.gap;
+public interface TimeGap {
+    
+    public final static String TIME_UNIT_MINUTE = "m";
+    public final static String TIME_UNIT_HOUR = "h";
+    public final static String TIME_UNIT_DAY = "D";
+    public final static String TIME_UNIT_WEEK = "W";
+    public final static String TIME_UNIT_MONTH = "M";
+    public final static String TIME_UNIT_YEAR = "Y";
+    
+    public final static long  MINUTE_IN_MILLIS = 60 * 1000;
+    public final static long  HOUR_IN_MILLIS = 60 * MINUTE_IN_MILLIS;
+    public final static long  DAY_IN_MILLIS = 24 * HOUR_IN_MILLIS;
+    public final static long  WEEK_IN_MILLIS = 7 * DAY_IN_MILLIS;
+    
+    
+    /**
+     * Returns the Lookup-Key for the TimeGap
+     * @return
+     */
+    int getKey();
+    
+    /**
+     * Returns the Value of the TimeValue in the Unit which is also given.
+     * @return
+     */
+    int getValue();
+    
+    /**
+     * Returns the Unit of the Timegap (e.g. Minutes, Hours, Days, Weeks, Months, Years)
+     * @return
+     */
+    String getUnit();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/DefaultTransition.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,33 @@
+/**
+ *
+ */
+package de.intevation.gnv.transition;
+
+import de.intevation.gnv.state.State;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class DefaultTransition extends TransitionBase {
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = -2610338646743984581L;
+
+    /**
+     * Constructor
+     */
+    public DefaultTransition() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.transition.Transition#isValid(de.intevation.gnv.state.State)
+     */
+    public boolean isValid(State state) {
+        return true;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/Transition.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,41 @@
+package de.intevation.gnv.transition;
+
+import java.io.Serializable;
+
+import org.w3c.dom.Node;
+
+import de.intevation.gnv.state.State;
+
+/**
+ * 
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public interface Transition extends Serializable{
+    
+    /**
+     * Returns the ID of the State from which the Transition could be used
+     * @return the ID of the State from which the Transition could be used
+     */
+    public String getFrom();
+    
+    /**
+     * Returns the ID of the State where it is possible to go as next.
+     * @return the ID of the State where it is possible to go as next.
+     */
+    public String getTo();
+    
+    /**
+     * Determines if it is possible to go along this Transition or not.
+     * @param state the current State
+     * @return
+     */
+    public boolean isValid(State state);
+    
+    /**
+     * Configures the Transition.
+     * @param configuration
+     */
+    public void setup(Node configuration);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/TransitionBase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,52 @@
+/**
+ *
+ */
+package de.intevation.gnv.transition;
+
+import org.w3c.dom.Node;
+
+import de.intevation.artifactdatabase.Config;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public abstract class TransitionBase implements Transition {
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = -8542097519466477977L;
+
+    private String from = null;
+    
+    private String to = null;
+    /**
+     * Constructor
+     */
+    public TransitionBase() {
+    }
+
+    /**
+     * @see de.intevation.gnv.transition.Transition#getFrom()
+     */
+    public String getFrom() {
+        return this.from;
+    }
+
+    /**
+     * @see de.intevation.gnv.transition.Transition#getTo()
+     */
+    public String getTo() {
+        return this.to;
+    }
+    
+    /**
+     * @see de.intevation.gnv.transition.Transition#setup(org.w3c.dom.Node)
+     */
+    public void setup(Node configuration) {
+      this.from = Config.getStringXPath(configuration,"from/@state");
+      this.to = Config.getStringXPath(configuration,"to/@state");
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/TransitionFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,55 @@
+/**
+ *
+ */
+package de.intevation.gnv.transition;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Node;
+
+import de.intevation.gnv.artifacts.GNVArtifactBase;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class TransitionFactory {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(GNVArtifactBase.class);
+
+    private static TransitionFactory instance = null;
+
+    /**
+     * Constructor
+     */
+    public TransitionFactory() {
+        super();
+    }
+
+    public static TransitionFactory getInstance() {
+        if (instance == null) {
+            instance = new TransitionFactory();
+        }
+        return instance;
+    }
+
+    public Transition createTransition(Node configuration) {
+        log.debug("TransitionFactory.createTransition");
+        Transition state = null;
+        try {
+            String classname = ((org.w3c.dom.Element)configuration).getAttribute("transition");
+            state = (Transition) (Class.forName(classname).newInstance());
+            state.setup(configuration);
+        } catch (InstantiationException e) {
+            log.error(e, e);
+        } catch (IllegalAccessException e) {
+            log.error(e, e);
+        } catch (ClassNotFoundException e) {
+            log.error(e, e);
+        }
+        return state;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/ValueCompareTransition.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,82 @@
+/**
+ *
+ */
+package de.intevation.gnv.transition;
+
+import java.util.Iterator;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Node;
+
+import de.intevation.artifactdatabase.Config;
+import de.intevation.gnv.state.InputData;
+import de.intevation.gnv.state.State;
+import de.intevation.gnv.state.exception.StateException;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class ValueCompareTransition extends TransitionBase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(ValueCompareTransition.class);
+    
+    private String dataName = null;
+    private String dataValue = null;
+    private String operator = null;
+    
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = -7846722158776823205L;
+
+    /**
+     * Constructor
+     */
+    public ValueCompareTransition() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.transition.Transition#isValid(de.intevation.gnv.state.State)
+     */
+    public boolean isValid(State state) {
+        
+        try {
+            Iterator<InputData> it = state.getInputData().iterator();
+            while (it.hasNext()){
+                InputData inputData = it.next();
+                if (inputData.getName().equals(this.dataName)){
+                    boolean returnValue = false;
+                    if (operator.equals("equal")){
+                        returnValue = this.dataValue.equals(inputData.getValue());
+                    }else if (operator.equals("notequal")){
+                        returnValue = !this.dataValue.equals(inputData.getValue());
+                    }
+                    return returnValue;
+                }
+            }
+            if (operator.equals("notequal")){
+                // data is not given. So the constraint not Equals is fullfilled.
+                return true;
+            }
+        } catch (StateException e) {
+            log.error(e,e);
+            return false;
+        }
+        return false;
+    }
+
+    @Override
+    public void setup(Node configuration) {
+        super.setup(configuration);
+        this.dataName = Config.getStringXPath(configuration,"condition/@inputvalue");
+        this.dataValue = Config.getStringXPath(configuration,"condition/@value");
+        this.operator = Config.getStringXPath(configuration,"condition/@operator");
+    }
+    
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/ArtifactFactoryUtilities.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,55 @@
+/**
+ *
+ */
+package de.intevation.gnv.utils;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+import de.intevation.artifacts.ArtifactFactory;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class ArtifactFactoryUtilities {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(ArtifactFactoryUtilities.class);
+
+    /**
+     * Constructor
+     */
+    public ArtifactFactoryUtilities() {
+    }
+
+    public ArtifactFactory createArtitfactFactor(Document config,
+                                                 Node artifactFactoryNode) {
+        String className = artifactFactoryNode.getTextContent();
+
+        ArtifactFactory factory = null;
+
+        try {
+            Class clazz = Class.forName(className);
+            factory = (ArtifactFactory) clazz.newInstance();
+        } catch (ClassNotFoundException cnfe) {
+            log.error(cnfe.getLocalizedMessage(), cnfe);
+        } catch (InstantiationException ie) {
+            log.error(ie.getLocalizedMessage(), ie);
+        } catch (ClassCastException cce) {
+            log.error(cce.getLocalizedMessage(), cce);
+        } catch (IllegalAccessException iae) {
+            log.error(iae.getLocalizedMessage(), iae);
+        }
+
+        if (factory != null) {
+            factory.setup(config, artifactFactoryNode);
+            log.info("Registering '" + factory.getName()
+                     + "' as artifact factory.");
+        }
+        return factory;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,162 @@
+/**
+ *
+ */
+package de.intevation.gnv.utils;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+import de.intevation.artifacts.ArtifactNamespaceContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class ArtifactXMLUtilities implements Serializable {
+    /**
+     *
+     */
+    private static final long serialVersionUID = -6236340358303411758L;
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(ArtifactXMLUtilities.class);
+
+    public static final String XFORM_URL = "http://www.w3.org/2002/xforms";
+    public static final String XFORM_PREFIX = "xform";
+
+    /**
+     * Constructor
+     */
+    public ArtifactXMLUtilities() {
+    }
+
+    /**
+     * @param document
+     * @return
+     */
+    public Element createArtifactElement(Document document, String name) {
+        Element node = document.createElementNS(
+                ArtifactNamespaceContext.NAMESPACE_URI, name);
+        node.setPrefix(ArtifactNamespaceContext.NAMESPACE_PREFIX);
+        return node;
+    }
+
+    public String writeDocument2String(Document document) {
+        try {
+            TransformerFactory transformerFactory = TransformerFactory
+                    .newInstance();
+            Transformer transformer = transformerFactory.newTransformer();
+            DOMSource source = new DOMSource(document);
+            StringWriter sw = new StringWriter();
+            StreamResult result = new StreamResult(sw);
+            transformer.transform(source, result);
+            return sw.getBuffer().toString();
+        } catch (TransformerConfigurationException e) {
+            log.error(e, e);
+        } catch (TransformerFactoryConfigurationError e) {
+            log.error(e, e);
+        } catch (TransformerException e) {
+            log.error(e, e);
+        }
+        return null;
+    }
+
+    public static Document readDocument(InputStream inputStream) {
+        Document returnValue = null;
+        try {
+            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
+                    .newInstance();
+            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
+            returnValue = docBuilder.parse(inputStream);
+        } catch (ParserConfigurationException e) {
+            log.error(e, e);
+        } catch (SAXException e) {
+            log.error(e, e);
+        } catch (IOException e) {
+            log.error(e, e);
+        }
+        return returnValue;
+    }
+
+    public Document reInitDocument(Document document) {
+        try {
+            byte[] barray = this.writeDocument2String(document).getBytes(
+                    "UTF-8");
+            InputStream inputStream = new ByteArrayInputStream(barray);
+            return this.readDocument(inputStream);
+        } catch (UnsupportedEncodingException e) {
+            log.error(e, e);
+        }
+        return document;
+    }
+
+    public static Element createXFormElement(Document document, String name) {
+        Element node = document.createElementNS(XFORM_URL, name);
+        node.setPrefix(XFORM_PREFIX);
+        return node;
+    }
+
+    public Document createExceptionReport(String message, Document document) {
+        log.debug("ArtifactXMLUtilities.createExceptionReport");
+        Element exceptionReportNode = this.createArtifactElement(document,
+                "exceptionreport");
+        document.appendChild(exceptionReportNode);
+        Element exceptionNode = this.createArtifactElement(document,
+                "exception");
+        exceptionNode.setTextContent(message);
+        exceptionReportNode.appendChild(exceptionNode);
+        return document;
+    }
+
+    public Document createSuccessReport(String message, Document document) {
+        log.debug("ArtifactXMLUtilities.creatSuccessReport");
+        Element reportNode = this.createArtifactElement(document, "result");
+        document.appendChild(reportNode);
+        Element successNode = this.createArtifactElement(document, "success");
+        successNode.setTextContent(message);
+        reportNode.appendChild(successNode);
+        return document;
+    }
+    
+    public Node readConfiguration(String fileName){
+        try {
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            factory.setValidating(false); 
+            return factory.newDocumentBuilder().parse(fileName).getChildNodes().item(0);
+        } catch (SAXException e) {
+            log.error(e,e);
+            return null;
+        } catch (IOException e) {
+            log.error(e,e);
+            return null;
+        } catch (ParserConfigurationException e) {
+            log.error(e,e);
+            return null;
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/DistanceCalculator.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,84 @@
+/**
+ *
+ */
+package de.intevation.gnv.utils;
+
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.geom.Coordinate;
+
+import java.util.List;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class DistanceCalculator {
+
+    private final static double flattening = 1.0 / 298.257233563;
+    
+    private final static double earthRadius = 6378137.0 / 1000.0 ;
+    
+    /**
+     * Constructor
+     */
+    public DistanceCalculator() {
+    }
+    
+    public static double calculateDistance(Point p1, Point p2){
+        return calculateDistance(p1.getCoordinate(), p2.getCoordinate());
+    }
+
+    public static double calculateDistance(Coordinate p1, Coordinate p2){
+        double resultValue = 0.0;
+        
+        double b1 = p1.y;
+        double b2 = p2.y;
+        
+        double l1 = p1.x;
+        double l2 = p2.x;
+        
+        
+        double F = (b1 + b2) / 2.0;
+        double G = (b1 - b2) / 2.0;
+        double l = (l1 - l2) / 2.0;
+        
+        F = (Math.PI / 180.0) * F;
+        G = (Math.PI / 180.0) * G;
+        l = (Math.PI / 180.0) * l;
+        
+        double S = ((Math.sin(G) * Math.sin(G)) * ((Math.cos(l) * Math.cos(l))))+
+                   ((Math.cos(F) * Math.cos(F)) * ((Math.sin(l) * Math.sin(l))));
+        
+        double C = ((Math.cos(G) * Math.cos(G)) * ((Math.cos(l) * Math.cos(l))))+
+                   ((Math.sin(F) * Math.sin(F)) * ((Math.sin(l) * Math.sin(l))));
+        
+        double w = Math.atan(Math.sqrt((S/C)));
+        
+        double D = 2.0 * w * earthRadius;
+        
+        double R = Math.sqrt((S*C)) / w;
+        
+        double H1 = (3.0 * R - 1.0 ) / (2.0 * C);
+        double H2 = (3.0 * R + 1.0 ) / (2.0 * S);
+        
+        resultValue = D * (1 + (flattening * H1 * (Math.sin(F) * Math.sin(F)) * 
+                                                  (Math.cos(G) * Math.cos(G))) - 
+                           (flattening * H2 * (Math.cos(F) * Math.cos(F)) * 
+                                              (Math.sin(G) * Math.sin(G))));
+        
+        return resultValue;
+    }
+
+    public static final double calculateDistance(List<Coordinate> path) {
+        int N = path.size();
+        if (N < 2) {
+            return 0d;
+        }
+        double sum = 0d;
+        for (int i = 1; i < N; ++i) {
+            sum += calculateDistance(path.get(i-1), path.get(i));
+        }
+        return sum;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/FileUtils.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,129 @@
+package de.intevation.gnv.utils;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import java.util.Stack;
+
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public final class FileUtils
+{
+    private FileUtils() {
+    }
+
+    public final static boolean deleteRecursive(File file) {
+
+        if (file == null) {
+            return false;
+        }
+
+        if (file.isDirectory()) {
+            File [] files = file.listFiles();
+            if (files != null) {
+                for (File sub: files) {
+                    if (!deleteRecursive(sub)) {
+                        return false;
+                    }
+                }
+            }
+        }
+
+        return file.delete();
+    }
+
+    public static void createZipArchive(
+        File         file,
+        OutputStream outputStream
+    )
+    throws IOException
+    {
+        ZipOutputStream out = new ZipOutputStream(outputStream);
+
+        if (file.isFile()) {
+            copyFileToZip("", file, out);
+        }
+        else if (file.isDirectory()) {
+
+            Stack<PrefixDir> stack = new Stack<PrefixDir>();
+            stack.push(new PrefixDir(file.getName() + "/", file));
+
+            while (!stack.isEmpty()) {
+                PrefixDir pd = stack.pop();
+
+                ZipEntry dirEntry = new ZipEntry(pd.prefix);
+                out.putNextEntry(dirEntry);
+                out.closeEntry();
+
+                File [] files = pd.dir.listFiles();
+                if (files != null) {
+                    for (File sub: files) {
+                        if (sub.isDirectory()) {
+                            stack.push(new PrefixDir(
+                                pd.prefix + sub.getName() + "/",
+                                sub));
+                        }
+                        else if (sub.isFile()) {
+                            copyFileToZip(pd.prefix, sub, out);
+                        }
+                    }
+                }
+            }
+        }
+
+        out.finish();
+    }
+
+    private static final class PrefixDir {
+
+        String prefix;
+        File   dir;
+
+        public PrefixDir(String prefix, File dir) {
+            this.prefix = prefix;
+            this.dir    = dir;
+        }
+
+    } // class PrefixDir
+
+    private static void copyFileToZip(
+        String          prefix,
+        File            file,
+        ZipOutputStream out
+    )
+    throws IOException
+    {
+        String   entryName = prefix + file.getName();
+        ZipEntry entry     = new ZipEntry(entryName);
+        out.putNextEntry(entry);
+        InputStream in = null;
+        try {
+            in =
+                new BufferedInputStream(
+                new FileInputStream(file), 20*1024);
+
+            byte [] buf = new byte[2048];
+
+            int r;
+            while ((r = in.read(buf)) > 0) {
+                out.write(buf, 0, r);
+            }
+        }
+        finally {
+            if (in != null) {
+                try { in.close(); }
+                catch (IOException ioe) {}
+            }
+        }
+        out.closeEntry();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/IndexBuffer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,169 @@
+package de.intevation.gnv.utils;
+
+import java.awt.geom.Point2D;
+
+import java.awt.Point;
+
+import java.util.List;
+
+/**
+ * Create buffers around integer pairs (i_1..n), j_1..n).
+ *
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class IndexBuffer
+{
+    public static final double EPSILON = 1e-6d;
+    public static final double OFFSET  = 1.0d;
+
+    public static final String I_COLUMN = "IPOSITION";
+    public static final String J_COLUMN = "JPOSITION";
+
+    public static final class Segment {
+
+        private Segment next;
+
+        private Point2D.Double n;
+        private double         d1;
+        private double         d2;
+
+        private int iMin;
+        private int iMax;
+
+        private int jMin;
+        private int jMax;
+
+        public Segment(Point a, Point b, Segment next) {
+
+            this.next = next;
+
+            iMin = Math.min(a.x, b.x)-1;
+            iMax = Math.max(a.x, b.x)+1;
+
+            jMin = Math.min(a.y, b.y)-1;
+            jMax = Math.max(a.y, b.y)+1;
+
+            if (a.x > b.x) {
+                Point p = a; a = b; b = p;
+            }
+
+            Point2D.Double p1, p2, p3;
+
+            if (a.y < b.y) {
+                p1 = new Point2D.Double(a.x -     OFFSET, a.y + 1 + OFFSET);
+                p2 = new Point2D.Double(b.x -     OFFSET, b.y + 1 + OFFSET);
+                p3 = new Point2D.Double(a.x + 1 + OFFSET, a.y     - OFFSET);
+            }
+            else {
+                p1 = new Point2D.Double(a.x + 1 + OFFSET, a.y + 1 + OFFSET);
+                p2 = new Point2D.Double(b.x + 1 + OFFSET, b.y + 1 + OFFSET);
+                p3 = new Point2D.Double(b.x     - OFFSET, b.y     - OFFSET);
+            }
+
+            n = normalize(orthogonal(sub(p1, p2)));
+
+            d1 = dot(n, p1);
+            d2 = dot(n, p3);
+
+            if (d1 > d2) {
+                double d = d1;
+                d1 = d2;
+                d2 = d;
+            }
+        }
+
+        public boolean check(int i, int j) {
+            if (i < iMin || i > iMax || j < jMin || j > jMax) {
+                return false;
+            }
+            double v = dot(n, i, j);
+            return v >= d1 && v <= d2;
+        }
+
+        public void toWhereClause(StringBuilder sb, String iColumn, String jColumn) {
+            sb.append('(')
+              .append(iColumn).append(" >= ").append(iMin).append(" AND ")
+              .append(iColumn).append(" <= ").append(iMax).append(" AND ")
+              .append(jColumn).append(" >= ").append(jMin).append(" AND ")
+              .append(jColumn).append(" <= ").append(jMax).append(" AND (")
+              .append(n.x).append('*').append(iColumn).append(" + ")
+              .append(n.y).append('*').append(jColumn)
+              .append(") BETWEEN ").append(d1).append(" AND ").append(d2).append(')');
+        }
+    } // class Segment
+
+    protected Segment head;
+
+    protected String iColumn;
+    protected String jColumn;
+
+    public IndexBuffer(List<? extends Point> points) {
+        this(points, I_COLUMN, J_COLUMN);
+    }
+
+    public IndexBuffer(List<? extends Point> points, String iColumn, String jColumn) {
+        this.iColumn = iColumn;
+        this.jColumn = jColumn;
+
+        for (int i = 1, N = points.size(); i < N; ++i) {
+            Point p1 = (Point)points.get(i-1);
+            Point p2 = (Point)points.get(i);
+            head = new Segment(p1, p2, head);
+        }
+    }
+
+    public boolean check(int i, int j) {
+
+        Segment current = head;
+        while (current != null) {
+            if (current.check(i, j)) {
+                return true;
+            }
+            current = current.next;
+        }
+        return false;
+    }
+
+    public String toWhereClause() {
+
+        StringBuilder sb = new StringBuilder();
+
+        Segment current = head;
+
+        while (current != null) {
+            if (current != head) {
+                sb.append(" OR ");
+            }
+            current.toWhereClause(sb, iColumn, jColumn);
+            current = current.next;
+        }
+
+        return sb.toString();
+    }
+
+    public static Point2D.Double sub(Point2D.Double p1, Point2D.Double p2) {
+        return new Point2D.Double(p1.x - p2.x, p1.y - p2.y);
+    }
+
+    public static final double dot(Point2D.Double p1, Point2D.Double p2) {
+        return p1.x*p2.x + p1.y*p2.y;
+    }
+
+    public static final double dot(Point2D.Double p1, double x, double y) {
+        return p1.x*x + p1.y*y;
+    }
+
+    public static final Point2D.Double scale(Point2D.Double p, double s) {
+        return new Point2D.Double(s*p.x, s*p.y);
+    }
+
+    public static final Point2D.Double normalize(Point2D.Double p) {
+        double len2 = Math.sqrt(dot(p, p));
+        return len2 > EPSILON ? scale(p, 1d/len2) : p;
+    }
+
+    public static final Point2D.Double orthogonal(Point2D.Double p) {
+        return new Point2D.Double(p.y, -p.x);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/InputValidator.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,154 @@
+/**
+ *
+ */
+package de.intevation.gnv.utils;
+
+import java.util.Date;
+
+import org.apache.commons.validator.GenericValidator;
+import org.apache.log4j.Logger;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.Point;
+
+import de.intevation.gnv.geobackend.util.DateUtils;
+import de.intevation.gnv.utils.exception.ValidationException;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class InputValidator {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(InputValidator.class);
+    
+    
+    public final static String NODATASELECTEDVALUE = "n/n";
+
+    /**
+     * Constructor
+     */
+    public InputValidator() {
+        super();
+    }
+
+    public boolean isInputValid(String minInput, String maxInput, String type) {
+        log.debug("InputValidator.isInputValid " + minInput + " " + maxInput + " " +type);
+        boolean returnValue = false;
+        if ("Date".equalsIgnoreCase(type)) {
+            try {
+                Date min = DateUtils.getDateFromString(minInput,DateUtils.DATE_PATTERN);
+                Date max = DateUtils.getDateFromString(maxInput,DateUtils.DATE_PATTERN);
+                int value = max.compareTo(min);
+                returnValue = value >= 0;
+            } catch (Exception e) {
+                log.error(e,e);
+            }
+        } else if ("Double".equalsIgnoreCase(type)) {
+            try {
+                double min = Double.parseDouble(minInput);
+                double max = Double.parseDouble(maxInput);
+                returnValue = max >= min;
+            } catch (Exception e) {
+                log.error(e,e);
+            }
+        }
+        log.debug("Is valid? " + returnValue);
+        return returnValue;
+    }
+    
+    public boolean isInputValid(String input, String type) {
+        log.debug("InputValidator.isInputValid " + input + " " + type);
+        boolean returnValue = false;
+        String[] values = input.split(",");
+        for (int i = 0; i < values.length; i++) {
+            boolean valid;
+            
+            if (NODATASELECTEDVALUE.equals(values[i].trim())){
+                valid = true;
+            } else if ("Integer".equalsIgnoreCase(type)) {
+                valid = GenericValidator.isInt(values[i].trim());
+            } else if ("Double".equalsIgnoreCase(type)) {
+                valid = GenericValidator.isDouble(values[i].trim());
+            } else if ("String".equalsIgnoreCase(type)) {
+                valid = GenericValidator.matchRegexp(values[i], "[a-zA-Z0-9]"); // TODO:
+                                                                                // FIXME:
+                                                                                // VALIDATE
+                                                                                // REGEXP
+            } else if ("Date".equalsIgnoreCase(type)) {
+                valid = GenericValidator.isDate(values[i].trim(),
+                        DateUtils.DATE_PATTERN, true);
+            } else if ("Point".equalsIgnoreCase(type)) {
+                valid = GenericValidator.matchRegexp(values[i], "[0-9]"); // TODO:
+                                                                          // FIXME:
+                                                                          // VALIDATE
+                                                                          // REGEXP
+            } else if ("AttributeName".equalsIgnoreCase(type)) {
+                valid = org.apache.commons.validator.GenericValidator
+                        .matchRegexp(values[i], "[a-zA-Z0-9]"); // TODO: FIXME:
+                                                                // VALIDATE
+                                                                // REGEXP
+            } else if ("Coordinate".equalsIgnoreCase(type)) {
+                    try {
+                        valid = this.getPointValue(values[i]) != null;
+                    } catch (ValidationException e) {
+                        log.debug(e.getMessage());
+                        valid = false;
+                    }
+            } else {
+                valid = false;
+            }
+            if (!valid) {
+                returnValue = false;
+                break;
+            } else {
+                returnValue = true;
+            }
+        }
+        log.debug("Is valid? " + returnValue);
+        return returnValue;
+    }
+    
+    
+    public Point getPointValue(String value) throws ValidationException{
+        log.debug("InputValidator.getPointValue " + value);
+        String[] s, p;
+        
+        double x=0,y=0;
+        log.info("Position :"+value);
+        s = value.split(" ");
+        if (s.length != 2) {
+              throw new ValidationException("Kein Blank separiert Breite und Länge");
+        }
+        p = s[0].split("[nNsS]");
+        try {
+            if (p.length == 1)
+                y = new Double(p[0]);
+            else
+                y = new Double(p[0]) +   new Double(p[1]) / new Double(60.);
+            if (s[0].toLowerCase().contains("s"))
+                y = -y;
+        }
+        catch (Exception e) {
+            throw new ValidationException("Kein N|S oder nicht im ersten Substring, zB 56n42");
+        
+        } 
+        p = s[1].split("[eEwW]");
+        try {
+            if (p.length ==1)
+                x = new Double(p[0]);
+            else
+                x = new Double(p[0]) +  new Double(p[1]) / new Double(60.) ;
+            if (s[1].toLowerCase().contains("w"))
+                x = -x;
+        }
+        catch (Exception e) {
+            throw new ValidationException("Kein E|W oder nicht im zweiten Substring");
+        } 
+        return new GeometryFactory().createPoint(new Coordinate(x,y));
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/Pair.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,30 @@
+package de.intevation.gnv.utils;
+
+import java.io.Serializable;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public final class Pair<A, B>
+implements         Serializable
+{
+    private A a;
+    private B b;
+
+    private Pair() {
+    }
+
+    public Pair(A a, B b) {
+        this.a = a;
+        this.b = b;
+    }
+
+    public A getA() {
+        return a;
+    }
+
+    public B getB() {
+        return b;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,294 @@
+package de.intevation.gnv.utils;
+
+import com.vividsolutions.jts.geom.MultiLineString;
+import com.vividsolutions.jts.geom.MultiPolygon;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Serializable;
+
+import java.net.MalformedURLException;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import org.geotools.data.DataStoreFactorySpi;
+import org.geotools.data.DataUtilities;
+import org.geotools.data.DefaultTransaction;
+import org.geotools.data.FeatureStore;
+import org.geotools.data.Transaction;
+
+import org.geotools.data.shapefile.ShapefileDataStore;
+import org.geotools.data.shapefile.ShapefileDataStoreFactory;
+
+import org.geotools.feature.FeatureCollection;
+import org.geotools.feature.FeatureCollections;
+import org.geotools.feature.SchemaException;
+
+import org.geotools.feature.simple.SimpleFeatureBuilder;
+
+import org.geotools.referencing.crs.DefaultGeographicCRS;
+
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public final class ShapeFileWriter
+{
+    private static Logger log = Logger.getLogger(
+        ShapeFileWriter.class);
+
+    private ShapeFileWriter() {
+    }
+
+    public static boolean writeMultiLineStringsToFile(
+        File                                shapeFile,
+        Integer                             parameterId,
+        Integer                             layer,
+        Date                                date,
+        List<Pair<Object, MultiLineString>> multiLineStrings
+    ) {
+        return writeMultiLineStringsToFile(
+            shapeFile,
+            parameterId,
+            layer,
+            date,
+            multiLineStrings, 
+            "isolines");
+    }
+
+    public static boolean writeMultiLineStringsToFile(
+        File                                shapeFile,
+        Integer                             parameterId,
+        Integer                             layer,
+        Date                                date,
+        List<Pair<Object, MultiLineString>> multiLineStrings,
+        String                              name
+    ) {
+        Map<String, Serializable> params = new HashMap<String, Serializable>();
+
+        try {
+            params.put("url", shapeFile.toURI().toURL());
+        }
+        catch (MalformedURLException mue) {
+            log.error(mue.getLocalizedMessage(), mue);
+            return false;
+        }
+
+        params.put("create spatial index", Boolean.TRUE);
+
+
+        if (name == null) {
+            name = shapeFile.getName();
+        }
+
+        SimpleFeatureType TYPE;
+        
+        try { 
+            TYPE = DataUtilities.createType(
+                name,
+                "geom:MultiLineString:srid=4326," +
+                "PARAMETER:Integer," + 
+                "LAYER:Integer,"     +
+                "DATE:Date,"         +
+                "VALUE:Double");
+        }
+        catch (SchemaException se) {
+            log.error(se.getLocalizedMessage(), se);
+            return false;
+        }
+
+        SimpleFeatureBuilder featureBuilder =
+            new SimpleFeatureBuilder(TYPE);
+
+        FeatureCollection<SimpleFeatureType, SimpleFeature> collection = 
+            FeatureCollections.newCollection();
+
+        for (Pair<Object, MultiLineString> pair: multiLineStrings) {
+            featureBuilder.add(pair.getB());
+            featureBuilder.add(parameterId);
+            featureBuilder.add(layer);
+            featureBuilder.add(date);
+            featureBuilder.add(pair.getA());
+            SimpleFeature feature = featureBuilder.buildFeature(null);
+            collection.add(feature);
+        }
+
+        DataStoreFactorySpi dataStoreFactory = new ShapefileDataStoreFactory();
+
+        Transaction transaction = null;
+
+        boolean success = false;
+        try {
+            ShapefileDataStore newDataStore =
+                (ShapefileDataStore)dataStoreFactory.createNewDataStore(params);
+
+            newDataStore.createSchema(TYPE);
+            newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84);
+
+            transaction = new DefaultTransaction("create");
+
+            String typeName = newDataStore.getTypeNames()[0];
+
+            FeatureStore<SimpleFeatureType, SimpleFeature> featureStore =
+                (FeatureStore<SimpleFeatureType, SimpleFeature>)
+                    newDataStore.getFeatureSource(typeName);
+
+            featureStore.setTransaction(transaction);
+
+            featureStore.addFeatures(collection);
+            transaction.commit();
+            success = true;
+        } 
+        catch (IOException ioe) {
+            log.error(ioe.getLocalizedMessage(), ioe);
+        }
+        finally {
+            if (transaction != null) {
+                if (!success) {
+                    try { transaction.rollback(); }
+                    catch (IOException ioe) {}
+                }
+                try { transaction.close(); }
+                catch (IOException ioe) {}
+            }
+        }
+
+        return success;
+    }
+
+    public static boolean writeMultiPolygonsToFile(
+        File                       shapeFile,
+        Integer                    parameterId,
+        Integer                    layer,
+        Date                       date,
+        Map<Integer, MultiPolygon> multiPolygons
+    ) {
+        return writeMultiPolygonsToFile(
+            shapeFile, 
+            parameterId,
+            layer,
+            date,
+            multiPolygons, 
+            "polygons");
+    }
+
+    public static boolean writeMultiPolygonsToFile(
+        File                       shapeFile,
+        Integer                    parameterId,
+        Integer                    layer,
+        Date                       date,
+        Map<Integer, MultiPolygon> multiPolygons,
+        String                     name
+    ) {
+        Map<String, Serializable> params = new HashMap<String, Serializable>();
+
+        try {
+            params.put("url", shapeFile.toURI().toURL());
+        }
+        catch (MalformedURLException mue) {
+            log.error(mue.getLocalizedMessage(), mue);
+            return false;
+        }
+
+        params.put("create spatial index", Boolean.TRUE);
+
+
+        if (name == null) {
+            name = shapeFile.getName();
+        }
+
+        SimpleFeatureType TYPE;
+        
+        try { 
+            TYPE = DataUtilities.createType(
+                name,
+                "geom:MultiPolygon:srid=4326," +
+                "PARAMETER:Integer," + 
+                "LAYER:Integer,"     +
+                "DATE:Date,"         +
+                "CLASS:Integer");
+        }
+        catch (SchemaException se) {
+            log.error(se.getLocalizedMessage(), se);
+            return false;
+        }
+
+        SimpleFeatureBuilder featureBuilder =
+            new SimpleFeatureBuilder(TYPE);
+
+        FeatureCollection<SimpleFeatureType, SimpleFeature> collection = 
+            FeatureCollections.newCollection();
+
+        for (Map.Entry<Integer, MultiPolygon> entry:
+            multiPolygons.entrySet()
+        ) {
+            featureBuilder.add(entry.getValue());
+            featureBuilder.add(parameterId);
+            featureBuilder.add(layer);
+            featureBuilder.add(date);
+            featureBuilder.add(entry.getKey());
+            SimpleFeature feature = featureBuilder.buildFeature(null);
+            collection.add(feature);
+        }
+
+        DataStoreFactorySpi dataStoreFactory = new ShapefileDataStoreFactory();
+
+        Transaction transaction = null;
+
+        boolean success = false;
+        try {
+            ShapefileDataStore newDataStore =
+                (ShapefileDataStore)dataStoreFactory.createNewDataStore(params);
+
+            newDataStore.createSchema(TYPE);
+            newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84);
+
+            transaction = new DefaultTransaction("create");
+
+            String typeName = newDataStore.getTypeNames()[0];
+
+            FeatureStore<SimpleFeatureType, SimpleFeature> featureStore =
+                (FeatureStore<SimpleFeatureType, SimpleFeature>)
+                    newDataStore.getFeatureSource(typeName);
+
+            featureStore.setTransaction(transaction);
+
+            featureStore.addFeatures(collection);
+            transaction.commit();
+            success = true;
+        } 
+        catch (IOException ioe) {
+            log.error(ioe.getLocalizedMessage(), ioe);
+        }
+        finally {
+            if (transaction != null) {
+                if (!success) {
+                    try { transaction.rollback(); }
+                    catch (IOException ioe) {}
+                }
+                try { transaction.close(); }
+                catch (IOException ioe) {}
+            }
+        }
+
+        return success;
+    }
+
+    private static final Double asDouble(Object a) {
+        if (a instanceof Double) {
+            return (Double)a;
+        }
+        if (a instanceof Number) {
+            return Double.valueOf(((Number)a).doubleValue());
+        }
+        return 0d;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/StringUtils.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,45 @@
+package de.intevation.gnv.utils;
+
+/**
+ * @author Sascha L. Teichmann <sascha.teichmann@intevation.de>
+ */
+public final class StringUtils
+{
+    private StringUtils() {
+    }
+
+    public static final String [] append(String [] haystack, String straw) {
+        if (haystack == null) {
+            return new String [] { straw };
+        }
+        String [] nhaystack = new String[haystack.length + 1];
+        System.arraycopy(haystack, 0, nhaystack, 0, haystack.length);
+        nhaystack[haystack.length] = straw;
+        return nhaystack;
+    }
+
+    public static final boolean contains(String [] haystack, String needle) {
+        if (haystack == null) {
+            return false;
+        }
+
+        if (needle == null) {
+            for (int i = haystack.length - 1; i >= 0; --i) {
+                if (haystack[i] == null) {
+                    return true;
+                }
+            }
+        }
+        else {
+            for (int i = haystack.length - 1; i >= 0; --i) {
+                String straw = haystack[i];
+                if (straw != null && straw.equals(needle)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/WKTUtils.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,422 @@
+package de.intevation.gnv.utils;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.LineString;
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.geom.Polygon;
+
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.io.WKTReader;
+
+import de.intevation.gnv.artifacts.ressource.RessourceFactory;
+
+import de.intevation.gnv.geobackend.base.Result;
+
+import de.intevation.gnv.geobackend.base.query.QueryExecutor;
+import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
+
+import de.intevation.gnv.geobackend.base.query.exception.QueryException;
+
+import de.intevation.gnv.math.LinearFunction;
+
+import java.text.MessageFormat;
+import java.text.NumberFormat;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.commons.math.FunctionEvaluationException;
+
+import org.apache.commons.math.optimization.OptimizationException;
+
+import org.apache.commons.math.optimization.fitting.CurveFitter;
+
+import org.apache.commons.math.optimization.general.GaussNewtonOptimizer;
+
+import org.apache.log4j.Logger;
+
+public abstract class WKTUtils {
+
+    private static Logger log = Logger.getLogger(WKTUtils.class);
+
+    public static final double NAUTICAL_MILE = 1852.216d;
+    public static final double KILOMETER     = 1000d;
+
+    public static final String I_NAME = "MEDIAN.MESHPOINT.IPOSITION";
+    public static final String J_NAME = "MEDIAN.MESHPOINT.JPOSITION";
+
+    public static final String TRUE_EXPRESSION = "FEATUREID=FEATUREID";
+
+    public static final String[] COORDINATE_OUT_FORMAT = {
+        "coordinate.template.northeast",
+        "coordinate.template.southeast",
+        "coordinate.template.northwest",
+        "coordinate.template.southwest"
+    };
+
+    public static final String DEFAULT_COORDINATE_TEMPLATE =
+        "{0}\u00b0N {1}'' {2}\u00b0E {3}''";
+
+    public static boolean different(Result a, Result b, int [] indices) {
+        for (int i = 0; i < indices.length; ++i) {
+            String oa = a.getString(indices[i]);
+            String ob = b.getString(indices[i]);
+
+            if (oa == null && ob == null)  {
+                continue;
+            }
+
+            if (oa == null || ob == null) {
+                return true;
+            }
+
+            if (!oa.equals(ob)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static Coordinate toCoordinate(String shape) {
+        try {
+            return shape != null
+                ? ((Point)(new WKTReader().read(shape))).getCoordinate()
+                : null;
+        }
+        catch (ParseException pe) {
+            log.error(pe);
+        }
+		catch (ClassCastException cce) {
+			log.error("cannot read WKT point", cce);
+		}
+        return null;
+    }
+
+    public static Polygon toPolygon(String shape) {
+        try {
+            return (Polygon)new WKTReader().read(shape);
+        }
+        catch (ParseException pe) {
+            log.error(pe);
+        }
+		catch (ClassCastException cce) {
+			log.error("cannot read WKT polygon", cce);
+		}
+        return null;
+    }
+
+    public static final double toKM(double distance) {
+        return (distance * NAUTICAL_MILE) / KILOMETER;
+    }
+
+
+    public static String toWKT(Coordinate coordinate) {
+        StringBuilder sb = new StringBuilder("POINT(");
+        sb.append(coordinate.x)
+          .append(' ')
+          .append(coordinate.y)
+          .append(')');
+        return sb.toString();
+    }
+
+    public static final String indexBox(
+        java.awt.Point a, 
+        java.awt.Point b,
+        String         iName,
+        String         jName
+    ) {
+        int minI = Math.min(a.x, b.x) - 1;
+        int maxI = Math.max(a.x, b.x) + 1;
+        int minJ = Math.min(a.y, b.y) - 1;
+        int maxJ = Math.max(a.y, b.y) + 1;
+        StringBuilder sb = new StringBuilder("(")
+                          .append(iName).append(" >= ").append(minI)
+          .append(" AND ").append(iName).append(" <= ").append(maxI)
+          .append(" AND ").append(jName).append(" >= ").append(minJ)
+          .append(" AND ").append(jName).append(" <= ").append(maxJ)
+          .append(')');
+        return sb.toString();
+    }
+
+    public static final String diagonalBox(List<java.awt.Point> points) {
+
+        if (points.get(0) != null && points.get(2) != null) {
+            return indexBox(
+                points.get(0), points.get(2),
+                I_NAME,
+                J_NAME);
+        }
+
+        if (points.get(1) != null && points.get(3) != null) {
+            return indexBox(
+                points.get(1), points.get(3),
+                I_NAME,
+                J_NAME);
+        }
+
+        return null;
+    }
+
+    public static String worldEnvelopeCoordinatesToIndex(
+         Coordinate []       coords,
+         String              meshid,
+         String              ijkQueryID
+    )
+    throws QueryException
+    {
+        List<java.awt.Point> points =
+            new ArrayList<java.awt.Point>(coords.length);
+
+        ArrayList<Object []> missingPoints =
+            new ArrayList<Object []>();
+
+        createIJKPoints(coords, meshid, ijkQueryID, points, missingPoints);
+        
+        String additionWhere = null;
+
+        if (missingPoints.size() == coords.length) {
+            log.debug("cannot create index buffer");
+        }
+        else {
+            additionWhere = diagonalBox(points);
+
+            if (additionWhere == null) {
+                // 3 Points are missing or are on one side of the envelope
+                boolean remainsMissingPoints = calculateIJ4MissingPoints(
+                    coords, points, missingPoints);
+
+                if (!remainsMissingPoints) {
+                    additionWhere = diagonalBox(points);
+                }
+            }
+        }
+
+        return additionWhere != null
+            ? additionWhere
+            : TRUE_EXPRESSION;
+    }
+
+    public static String worldCoordinatesToIndex(
+		Coordinate []       coords,
+        Collection<Result>  result,
+		String              meshid,
+        String              ijkQueryID
+    )
+	throws QueryException
+    {
+        List<java.awt.Point> points = new ArrayList<java.awt.Point>(coords.length);
+
+        ArrayList<Object []> missingPoints = new ArrayList<Object []>();
+
+        createIJKPoints(coords, meshid, ijkQueryID, points, missingPoints);
+        
+        String additionWhere = TRUE_EXPRESSION;
+
+        if (missingPoints.size() == coords.length) {
+            log.debug("cannot create index buffer");
+        }
+        else { // generate index filter
+            boolean remainsMissingPoints = calculateIJ4MissingPoints(
+                coords, points, missingPoints);
+
+            if (!remainsMissingPoints) {
+                // TODO: Make Tablenames and Columns Configurable
+                IndexBuffer ib = new IndexBuffer(
+                    points, 
+                    I_NAME, 
+                    J_NAME );
+                additionWhere = ib.toWhereClause();
+                log.debug("Additional Where Clause = "+additionWhere);
+            }
+        } // if generate index filter
+
+        return additionWhere;
+    }
+
+
+    /**
+     * @param coords
+     * @param points
+     * @param missingPoints
+     * @return
+     */
+    private static boolean calculateIJ4MissingPoints(
+        Coordinate []        coords,
+        List<java.awt.Point> points,
+        ArrayList<Object[]>  missingPoints
+    ) {
+        boolean remainsMissingPoints = !missingPoints.isEmpty();
+
+        if (remainsMissingPoints) {
+            // try to guess the missing (i, j)
+            CurveFitter iFitter = new CurveFitter(new GaussNewtonOptimizer(true));
+            CurveFitter jFitter = new CurveFitter(new GaussNewtonOptimizer(true));
+
+            for (int i = 0, N = points.size(); i < N; ++i) {
+                java.awt.Point p = (java.awt.Point)points.get(i);
+                if (p != null) {
+                    Coordinate coord = coords[i];
+                    iFitter.addObservedPoint(coord.x, p.x);
+                    jFitter.addObservedPoint(coord.y, p.y);
+                }
+            }
+            try {
+                // XXX: Assumption: (i, j) are created by componentwise linear function.
+                // This is surely not correct because (x, y) are in a ellipsoid projection.
+                // TODO: use ellipsoid functions and fit with Levenberg Marquardt.
+                double [] iParams = iFitter.fit(
+                    LinearFunction.INSTANCE, new double [] { 1d, 1d });
+
+                double [] jParams = jFitter.fit(
+                    LinearFunction.INSTANCE, new double [] { 1d, 1d });
+
+                for (int i = missingPoints.size()-1; i >= 0; --i) {
+                    Object [] a = (Object [])missingPoints.get(i);
+                    Coordinate coord = (Coordinate)a[1];
+                    int pi = (int)Math.round(iParams[0]*coord.x + iParams[1]);
+                    int pj = (int)Math.round(jParams[0]*coord.y + jParams[1]);
+                    points.set(
+                        ((Integer)a[0]).intValue(),
+                        new java.awt.Point(pi, pj));
+                }
+
+                remainsMissingPoints = false; // we filled the gaps
+            }
+            catch (FunctionEvaluationException fee) {
+                log.error(fee);
+            }
+            catch (OptimizationException oe) {
+                log.error(oe);
+            }
+        }
+        return remainsMissingPoints;
+    }
+
+
+    /**
+     * @param coords
+     * @param meshid
+     * @param ijkQueryID
+     * @param points
+     * @param missingPoints
+     * @throws QueryException
+     */
+    private static void createIJKPoints(
+        Coordinate[]         coords,
+        String               meshid,
+        String               ijkQueryID,
+        List<java.awt.Point> points,
+        ArrayList<Object []> missingPoints
+    )
+    throws QueryException 
+    {
+        boolean debug = log.isDebugEnabled();
+
+        QueryExecutor queryExecutor = QueryExecutorFactory
+            .getInstance()
+            .getQueryExecutor();
+        
+        for (int i = 0; i < coords.length; i++) {
+
+            String wkt = toWKT(coords[i]);
+
+            Collection<Result> result = queryExecutor.executeQuery(
+                ijkQueryID,
+                new String [] {meshid, wkt});
+
+            if (!result.isEmpty()) {
+                Result resultValue = result.iterator().next();
+                int iPos = resultValue.getInteger(1);
+                int jPos = resultValue.getInteger(0);
+                if (debug) {
+                    log.debug("Found Pos "+iPos+"/"+jPos +" for "+wkt);
+                }
+                points.add(i, new java.awt.Point(iPos,jPos));
+            }
+            else {
+                if (debug) {
+                    log.debug("No i/j Pos found for "+wkt);
+                }
+                missingPoints.add(new Object [] { Integer.valueOf(i), coords[i] });
+                points.add(i, null);
+                // Special Case no i,j found for Coordinate
+            }
+        }
+    }
+
+	public static Coordinate [] toCoordinates(String wkt) {
+		try {
+			LineString ls = (LineString)new WKTReader().read(wkt);
+			return ls.getCoordinates();
+		}
+		catch (ParseException pe) {
+			log.error("cannot read WKT line string", pe);
+		}
+		catch (ClassCastException cce) {
+			log.error("cannot read WKT line string", cce);
+		}
+		return null;
+	}
+
+    public static String toText(String wkt) {
+        return toText(Locale.getDefault(), wkt);
+    }
+
+    public static String toText(Locale locale, String wkt) {
+        String formattedCoordinate = null;
+        try {
+            Point p = (Point)new WKTReader().read(wkt);
+            double lat = p.getY();
+            double lon =p.getX();
+
+            int choice = 0;
+
+            if (lat <0 ) {
+                choice += 1;
+                lat=-lat;
+            }
+
+            if (lon <0 ) {
+                choice += 2;
+                lon=-lon;
+            }
+
+            RessourceFactory factory = RessourceFactory.getInstance();
+            String template = factory.getRessource(
+                locale,
+                COORDINATE_OUT_FORMAT[choice],
+                DEFAULT_COORDINATE_TEMPLATE
+            );
+
+            NumberFormat minFormatter = NumberFormat.getInstance(locale);
+            minFormatter.setMaximumFractionDigits(3);
+            minFormatter.setMinimumFractionDigits(3);
+
+            String minLat = minFormatter.format(60.*(lat-((int)lat)));
+            String minLon = minFormatter.format(60.*(lon-((int)lon)));
+
+            NumberFormat degFormatter = NumberFormat.getInstance(locale);
+            degFormatter.setMinimumIntegerDigits(2);
+
+            String formLat = degFormatter.format((int)lat);
+            String formLon = degFormatter.format((int)lon);
+
+            MessageFormat formatter = new MessageFormat(template);
+
+            Object[] args = {
+                formLat, minLat,
+                formLon, minLon
+            };
+
+            return formatter.format(args);
+
+        }
+        catch (ParseException e) {
+            log.warn(e,e);
+        }
+
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/exception/ValidationException.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,48 @@
+/**
+ *
+ */
+package de.intevation.gnv.utils.exception;
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class ValidationException extends Exception {
+
+    /**
+     * The Uid of this Class
+     */
+    private static final long serialVersionUID = -6189218101861801079L;
+
+    /**
+     * Constructor
+     */
+    public ValidationException() {
+        super();
+    }
+
+    /**
+     * Constructor
+     * @param arg0
+     */
+    public ValidationException(String arg0) {
+        super(arg0);
+    }
+
+    /**
+     * Constructor
+     * @param arg0
+     */
+    public ValidationException(Throwable arg0) {
+        super(arg0);
+    }
+
+    /**
+     * Constructor
+     * @param arg0
+     * @param arg1
+     */
+    public ValidationException(String arg0, Throwable arg1) {
+        super(arg0, arg1);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/resources/lang/artifactMessages.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,67 @@
+fis_marnet = Marnet
+fis_imis = IMIS
+fis_staun = STAUN
+fis_modeldata = Modeldata
+fis_delphin = Delphin
+fis_thermosalinograph = Thermosalinograph
+fis_chemusurvey = Chemusurvey
+fis_gts = GTS
+fis_bsh_ctd = CTD
+fis_bsh_xbt = XBT
+fis_eisklimatologie = Eisklimatologie
+fis_sst = SST
+fis_seastate = Sea State
+fis_seacat = SeaCat
+fis_currentmeter = Current Meter
+fis_icestations = Ice Station Report
+
+meshid= Mesh
+fis = Data set
+product= Product
+timeSeries= Timeseries
+verticalProfile = Verticalprofile
+horizontalProfile = Horizontalprofile
+horizontalProfileCross = Horizontales Schnittprofil
+horizontalCrossSection = Horizontal cross-section
+verticalcrosssection = Vertical cross-section
+featureid = Station
+mesh_coordinate = Geographic position (e.g. 56n30 6e20)
+mesh_linestring = Line (WKT)
+mesh_polygon = Area (WKT)
+mesh_point = Mesh Point
+measurementid = Measurement depth/height [m]
+depthrange = Measurementarea depth/height [m]
+mindepthid = Deepest Layer
+maxdepthid = Highest Layer
+parameterid = Parameter
+yearid = Year
+timeinterval = Time period
+minvalue = from
+maxvalue = to
+dateid = Measurement date
+vehicleid = Ship
+cruiseid = Cruise
+trackid = Track
+seriesid = Series
+surveyid = Survey Info
+axisid = Axis
+depthid = Layer and Depth range [m]
+iposition = West-East-Axis
+jposition = North-South-Axis
+instantaneouspoint_point = Momentanmesspunkt
+areaid=Area
+subareaid=Subarea
+depth=depth
+coordinate=coordinate
+coordinate.template.northeast={0}\u00b0N {1}'' {2}\u00b0E {3}''
+coordinate.template.southeast={0}\u00b0S {1}'' {2}\u00b0E {3}''
+coordinate.template.northwest={0}\u00b0N {1}'' {2}\u00b0W {3}''
+coordinate.template.southwest={0}\u00b0S {1}'' {2}\u00b0W {3}''
+
+chart.timeseries.date.format=yyyy-MMM-dd
+chart.timeseries.title.xaxis=Time [UTC]
+chart.verticalprofile.title.xaxis=Depth [m]
+chart.verticalcrosssection.title.xaxis=Distance [km]
+chart.verticalcrosssection.title.yaxis=Depth [m]
+chart.horizontalprofile.title.xaxis=Distance [km]
+chart.horizontalcrosssection.title.xaxis=Latitude [m]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/resources/lang/artifactMessages_de.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,67 @@
+fis_marnet = Marnet
+fis_imis = IMIS
+fis_staun = STAUN
+fis_modeldata = Modelldaten
+fis_delphin = Delphin
+fis_thermosalinograph = Thermosalinograph
+fis_chemusurvey = Chemusurvey
+fis_gts = GTS
+fis_bsh_ctd = CTD
+fis_bsh_xbt = XBT
+fis_eisklimatologie = Eisklimatologie
+fis_sst = SST
+fis_seastate = Seegangsarchiv
+fis_seacat = SeaCat
+fis_currentmeter = Strommesser
+fis_icestations = Eismeldungen
+
+fis = Fachinformationssystem
+product= Produkt
+timeSeries= Zeitserie
+verticalProfile = Vertikalprofil
+horizontalProfile = Horizontalprofil
+horizontalProfileCross = Horizontales Schnittprofil
+horizontalCrossSection = Horizontalschnitt
+verticalcrosssection = Profilschnitt
+featureid = Station
+meshid= Datengitter
+mesh_coordinate = Geographische Position (z.B. 56n30 6e20)
+mesh_linestring = Linienzug als WKT
+mesh_polygon = Fläche als WKT
+mesh_point = Gitterzelle/Knotenpunkt
+measurementid = Messung Tiefe/Höhe [m]
+depthrange = Messbereich Tiefe/Höhe [m]
+mindepthid = Untere Grenzschicht
+maxdepthid = Obere Grenzschicht
+parameterid = Parameter
+yearid = Jahr
+timeinterval = Zeitfenster
+minvalue = von
+maxvalue = bis
+dateid = Zeitpunkt
+vehicleid = Schiff
+cruiseid = Reise
+trackid = Track
+seriesid = Mess-Serie
+surveyid = Messabschnitt
+axisid = Achse
+depthid = Ebene und Tiefenbereich [m]
+iposition = West-Ost-Achse
+jposition = Nord-S\u00fcd-Achse
+instantaneouspoint_point = Messpunkt
+areaid=Gebiet
+subareaid=Teilgebiet
+depth=Tiefe
+coordinate=Koordinate
+coordinate.template.northeast={0}\u00b0N {1}'' {2}\u00b0O {3}''
+coordinate.template.southeast={0}\u00b0S {1}'' {2}\u00b0O {3}''
+coordinate.template.northwest={0}\u00b0N {1}'' {2}\u00b0W {3}''
+coordinate.template.southwest={0}\u00b0S {1}'' {2}\u00b0W {3}''
+
+chart.timeseries.date.format=dd-MMM-yyyy
+chart.timeseries.title.xaxis=Zeit [UTC]
+chart.verticalprofile.title.xaxis=Tiefe [m]
+chart.verticalcrosssection.title.xaxis=Distanz [km]
+chart.verticalcrosssection.title.yaxis=Tiefe [m]
+chart.horizontalprofile.title.xaxis=Distanz [km]
+chart.horizontalcrosssection.title.xaxis=Ausdehnung [m]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/resources/lang/artifactMessages_de_DE.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,67 @@
+fis_marnet = Marnet
+fis_imis = IMIS
+fis_staun = STAUN
+fis_modeldata = Modelldaten
+fis_delphin = Delphin
+fis_thermosalinograph = Thermosalinograph
+fis_chemusurvey = Chemusurvey
+fis_gts = GTS
+fis_bsh_ctd = CTD
+fis_bsh_xbt = XBT
+fis_eisklimatologie = Eisklimatologie
+fis_sst = SST
+fis_seastate = Seegangsarchiv
+fis_seacat = SeaCat
+fis_currentmeter = Strommesser
+fis_icestations = Eismeldungen
+
+fis= Fachinformationssystem
+product= Produkt
+timeSeries= Zeitserie
+verticalProfile = Vertikalprofil
+horizontalProfile = Horizontalprofil
+horizontalProfileCross = Horizontales Schnittprofil
+horizontalCrossSection = Horizontalschnitt
+verticalcrosssection = Profilschnitt
+featureid = Station
+meshid= Datengitter
+mesh_coordinate = Geographische Position (z.B. 56n30 6e20)
+mesh_linestring = Linienzug als WKT
+mesh_polygon = Fläche als WKT
+mesh_point = Gitterzelle/Knotenpunkt
+measurementid = Messung Tiefe/Höhe [m]
+depthrange = Messbereich Tiefe/Höhe [m]
+mindepthid = Untere Grenzschicht
+maxdepthid = Obere Grenzschicht
+parameterid = Parameter
+yearid = Jahr
+timeinterval = Zeitfenster
+minvalue = von
+maxvalue = bis
+dateid = Zeitpunkt
+vehicleid = Schiff
+cruiseid = Reise
+trackid = Track
+seriesid = Mess-Serie
+surveyid = Messabschnitt
+axisid = Achse
+depthid = Ebene und Tiefenbereich [m]
+iposition = West-Ost-Achse
+jposition = Nord-S\u00fcd-Achse
+instantaneouspoint_point = Messpunkt
+areaid=Gebiet
+subareaid=Teilgebiet
+depth=Tiefe
+coordinate=Koordinate
+coordinate.template.northeast={0}\u00b0N {1}'' {2}\u00b0O {3}''
+coordinate.template.southeast={0}\u00b0S {1}'' {2}\u00b0O {3}''
+coordinate.template.northwest={0}\u00b0N {1}'' {2}\u00b0W {3}''
+coordinate.template.southwest={0}\u00b0S {1}'' {2}\u00b0W {3}''
+
+chart.timeseries.date.format=dd-MMM-yyyy
+chart.timeseries.title.xaxis=Zeit [UTC]
+chart.verticalprofile.title.xaxis=Tiefe [m]
+chart.verticalcrosssection.title.xaxis=Distanz [km]
+chart.verticalcrosssection.title.yaxis=Tiefe [m]
+chart.horizontalprofile.title.xaxis=Distanz [km]
+chart.horizontalcrosssection.title.xaxis=Ausdehnung [m]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/resources/lang/artifactMessages_en.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,68 @@
+fis_marnet = Marnet
+fis_imis = IMIS
+fis_staun = STAUN
+fis_modeldata = Modeldata
+fis_delphin = Delphin
+fis_thermosalinograph = Thermosalinograph
+fis_chemusurvey = Chemusurvey
+fis_gts = GTS
+fis_bsh_ctd = CTD
+fis_bsh_xbt = XBT
+fis_eisklimatologie = Iceclimatology
+fis_sst = SST
+fis_seastate = Sea State
+fis_seacat = SeaCat
+fis_currentmeter = Current Meter
+fis_icestations = Ice Station Report
+
+meshid= Mesh
+fis = Data set
+product= Product
+timeSeries= Timeseries
+verticalProfile = Verticalprofile
+horizontalProfile = Horizontalprofile
+horizontalProfileCross = Horizontales Schnittprofil
+horizontalCrossSection = Horizontal cross-section
+verticalcrosssection = Vertical cross-section
+featureid = Station
+mesh_coordinate = Geographic position (e.g. 56n30 6e20)
+mesh_linestring = Line (WKT)
+mesh_polygon = Area (WKT)
+mesh_point = Mesh Point
+measurementid = Measurement depth/height [m]
+depthrange = Measurementarea depth/height [m]
+mindepthid = Deepest Layer
+maxdepthid = Highest Layer
+parameterid = Parameter
+yearid = Year
+timeinterval = Time period
+minvalue = from
+maxvalue = to
+dateid = Measurement date
+vehicleid = Ship
+cruiseid = Cruise
+trackid = Track
+seriesid = Series
+surveyid = Survey Info
+axisid = Axis
+depthid = Layer and Depth range [m]
+iposition = West-East-Axis
+jposition = North-South-Axis
+instantaneouspoint_point = Instantaneouspoint
+areaid=Area
+subareaid=Subarea
+depth=depth
+coordinate=coordinate
+coordinate.template.northeast={0}\u00b0N {1}'' {2}\u00b0E {3}''
+coordinate.template.southeast={0}\u00b0S {1}'' {2}\u00b0E {3}''
+coordinate.template.northwest={0}\u00b0N {1}'' {2}\u00b0W {3}''
+coordinate.template.southwest={0}\u00b0S {1}'' {2}\u00b0W {3}''
+
+
+chart.timeseries.date.format=yyyy-MMM-dd
+chart.timeseries.title.xaxis=Time [UTC]
+chart.verticalprofile.title.xaxis=Depth [m]
+chart.verticalcrosssection.title.xaxis=Distance [km]
+chart.verticalcrosssection.title.yaxis=Depth [m]
+chart.horizontalprofile.title.xaxis=Distance [km]
+chart.horizontalcrosssection.title.xaxis=Latitude [m]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/resources/lang/lang.conf	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,3 @@
+de_DE
+de
+en
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,177 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import junit.framework.TestCase;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import de.intevation.artifactdatabase.Config;
+import de.intevation.artifactdatabase.DefaultCallMeta;
+import de.intevation.artifactdatabase.DefaultPreferredLocale;
+import de.intevation.artifactdatabase.FactoryBootstrap;
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+import de.intevation.artifacts.PreferredLocale;
+import de.intevation.gnv.utils.ArtifactXMLUtilities;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public abstract class GNVArtifactsTestCaseBase extends TestCase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = null;
+
+    static {
+        BasicConfigurator.configure();
+        log = Logger.getLogger(GNVArtifactsTestCaseBase.class);
+    }
+    
+    private String configurationDir = "doc/conf";
+
+    protected FactoryBootstrap bootstrap = null;
+    
+    /**
+     * Constructor
+     */
+    public GNVArtifactsTestCaseBase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public GNVArtifactsTestCaseBase(String name) {
+        super(name);
+    }
+    
+    public abstract void testArtifact();
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        log.debug("GNVArtifactsTestCase.setUp");
+        super.setUp();
+        log.info(Config.CONFIG_DIR + " ==> " + configurationDir);
+        System.setProperty(Config.CONFIG_DIR, configurationDir);
+        log.info("Bootstrap wird initialisiert.");
+        bootstrap = new FactoryBootstrap();
+        bootstrap.boot();
+    }
+    
+    protected void writeDocument2Log(Document document) {
+        log.debug(new ArtifactXMLUtilities().writeDocument2String(document));
+    }
+
+    protected Document readDocument(String fileName) {
+        Document returnValue = null;
+        try {
+            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
+                    .newInstance();
+            docBuilderFactory.setNamespaceAware(true);
+            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
+            returnValue = docBuilder.parse(new File(fileName));
+        } catch (ParserConfigurationException e) {
+            log.error(e, e);
+        } catch (SAXException e) {
+            log.error(e, e);
+        } catch (IOException e) {
+            log.error(e, e);
+        }
+        return returnValue;
+    }
+
+    protected void check4ExceptionReport(Document document) throws Exception {
+        document = new ArtifactXMLUtilities().reInitDocument(document);
+        String message = Config.getStringXPath(document,
+                "/exceptionreport/exception");
+        if (message != null) {
+            throw new Exception(message);
+        }
+    }
+    
+    /**
+     * @return
+     */
+    protected CallContext createCallContext(ArtifactFactory artifactFactory) {
+        CallMeta callMeta = new DefaultCallMeta(
+                new PreferredLocale[] { new DefaultPreferredLocale("de_DE",
+                        1.0f) });
+        CallContext cc = new TestCallContext(bootstrap.getContext(), callMeta,artifactFactory);
+        return cc;
+    }
+
+    /**
+     * @param artifact
+     * @param cc
+     * @param describeDocument TODO
+     * @throws Exception
+     */
+    protected void doNextStep(Artifact artifact, CallContext cc,
+                            String feedDocument, String advanceDocument, Document describeDocument)
+                                                                        throws Exception {
+        Document outputData = artifact.describe(describeDocument,cc);
+//      this.writeDocument2Log(outputData);
+        outputData = artifact.feed(this.readDocument(feedDocument), cc);
+        this.check4ExceptionReport(outputData);
+        outputData = artifact.advance(this.readDocument(advanceDocument), cc);
+//        this.writeDocument2Log(outputData);
+        this.check4ExceptionReport(outputData);
+
+    }
+    
+    protected void createFile(byte[] content, String fileName) {
+        try {
+            FileOutputStream fos = new FileOutputStream(new File(fileName));
+            ByteArrayInputStream bis = new ByteArrayInputStream(content);
+            byte[] buf = new byte[4096];
+            while (bis.read(buf) > 0) {
+                fos.write(buf);
+            }
+            fos.flush();
+            fos.close();
+        } catch (FileNotFoundException e) {
+            log.error(e, e);
+        } catch (IOException e) {
+            log.error(e, e);
+        }
+    }
+
+    /**
+     * @param artefactName
+     */
+    protected ArtifactFactory getArtifactFactory(String artefactName) {
+        log.debug("GNVArtifactsTestCase.getArtifactFactory");
+        ArtifactFactory[] artifactFactories = bootstrap.getArtifactFactories();
+        for (int i = 0; i < artifactFactories.length; i++) {
+            if (artifactFactories[i].getName().equals(artefactName)) {
+                log.debug("ArtifactFactory wurde gefunden.");
+                return artifactFactories[i];
+            }
+        }
+        return null;
+    }
+
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestSuite.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,22 @@
+package de.intevation.gnv.artifacts;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class GNVArtifactsTestSuite {
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for de.intevation.gnv.artifacts");
+        suite.addTestSuite(TimeSeriesPointTimeSeriesTestCase.class);
+        suite.addTestSuite(MeshVerticalProfileTestCase.class);
+        suite.addTestSuite(MeshHorizontalProfileTestCase.class);
+        suite.addTestSuite(MeshHorizontalCrossSectionTestCase.class);
+        suite.addTestSuite(MeshTimeSeriesTestCase.class);
+        suite.addTestSuite(TimeSeriesPointVerticalProfileTestCase.class);
+        suite.addTestSuite(MeshVerticalCrossSectionTestCase.class);
+        suite.addTestSuite(InstantaneousPointHorizontalProfileTestCase.class);
+        suite.addTestSuite(InstantaneousPointVerticalProfileTestCase.class);
+        return suite;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/InstantaneousPointHorizontalProfileTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,128 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.FileOutputStream;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class InstantaneousPointHorizontalProfileTestCase extends
+                                                        GNVArtifactsTestCaseBase {
+
+    private static Logger log = Logger.getLogger(InstantaneousPointHorizontalProfileTestCase.class);
+    
+    /**
+     * Constructor
+     */
+    public InstantaneousPointHorizontalProfileTestCase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public InstantaneousPointHorizontalProfileTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact()
+     */
+    @Override
+    public void testArtifact() {
+        try {
+            log.debug("GNVArtifactsTestCase." +
+                      "testHorizontalProfileInstantaneousPointArtifact");
+            String artefactName = "fis_delphin";
+            ArtifactFactory artifactFactory = this
+                    .getArtifactFactory(artefactName);
+            assertNotNull(artifactFactory);
+            log.debug("VerticalProfile-ArtifactFactory is available");
+            Artifact artifact = artifactFactory.createArtifact(
+                    "" + System.currentTimeMillis(), bootstrap.getContext());
+            assertNotNull(artifact);
+            log.debug("VerticalProfile-Artifact is available");
+
+            CallContext cc = createCallContext(artifactFactory);
+            Document describeDocument = this.readDocument("src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_describe.xml");
+            
+            int steps = 9;
+            
+            for (int i = 0; i < steps; i++){
+            
+                this.doNextStep(
+                            artifact,
+                            cc,
+                            "src/test/ressources/horizontalProfile_instantaneouspoint/" +
+                            "horizontalprofile_step_0"+i+"_feed.xml",
+                            "src/test/ressources/horizontalProfile_instantaneouspoint/" +
+                            "horizontalprofile_step_0"+i+"_advance.xml", 
+                            describeDocument);
+            }
+
+            Document outputData = artifact.describe(describeDocument, cc);
+            FileOutputStream fos = null;
+            FileOutputStream fos2 = null;
+            FileOutputStream fos3 = null;
+            FileOutputStream fos4 = null;
+            try {
+                fos = new FileOutputStream(
+                        "src/test/results/horizontalprofile_instantaneouspoint"
+                                + System.currentTimeMillis() + ".png");
+                fos2 = new FileOutputStream(
+                        "src/test/results/horizontalprofile_instantaneouspoint"
+                                + System.currentTimeMillis() + ".xml");
+                fos3 = new FileOutputStream(
+                        "src/test/results/horizontalprofile_instantaneouspoint"
+                                + System.currentTimeMillis() + ".csv");
+                fos4 = new FileOutputStream(
+                        "src/test/results/horizontalprofile_instantaneouspoint"
+                                + System.currentTimeMillis() + ".odv");
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalProfile_instantaneouspoint/" +
+                                               "horizontalprofile_step_08_out_statistics.xml"),
+                             fos2,cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalProfile_instantaneouspoint/" +
+                                               "horizontalprofile_step_08_out_chart.xml"),
+                             fos,cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalProfile_instantaneouspoint/" +
+                                               "horizontalprofile_step_08_out_csv.xml"),
+                             fos3,cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalProfile_instantaneouspoint/" +
+                                               "horizontalprofile_step_08_out_odv.xml"),
+                            fos4,cc);
+            } catch (Exception e) {
+                log.error(e, e);
+                fail();
+            } finally {
+                try {
+                    fos.flush();
+                    fos.close();
+                    fos2.flush();
+                    fos2.close();
+                    fos3.flush();
+                    fos3.close();
+                } catch (Exception e) {
+                    log.error(e, e);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/InstantaneousPointVerticalProfileTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,127 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.FileOutputStream;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class InstantaneousPointVerticalProfileTestCase extends
+                                                      GNVArtifactsTestCaseBase {
+
+    private static Logger log = Logger.getLogger(InstantaneousPointVerticalProfileTestCase.class);
+    
+    /**
+     * Constructor
+     */
+    public InstantaneousPointVerticalProfileTestCase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public InstantaneousPointVerticalProfileTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact()
+     */
+    @Override
+    public void testArtifact() {
+        try {
+            log.debug("GNVArtifactsTestCase.testVerticalProfileArtifact");
+            String artefactName = "fis_bsh_ctd";
+            ArtifactFactory artifactFactory = this
+                    .getArtifactFactory(artefactName);
+            assertNotNull(artifactFactory);
+            log.debug("VerticalProfile-ArtifactFactory is available");
+            Artifact artifact = artifactFactory.createArtifact(
+                    "" + System.currentTimeMillis(), bootstrap.getContext());
+            assertNotNull(artifact);
+            log.debug("VerticalProfile-Artifact is available");
+
+            CallContext cc = createCallContext(artifactFactory);
+            Document describeDocument = this.readDocument("src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_describe.xml");
+            
+           int steps = 5;
+            
+            for (int i = 1; i <= steps; i++){
+                this.doNextStep(
+                            artifact,
+                            cc,
+                            "src/test/ressources/verticalprofile_instantaneouspoint/" +
+                            "verticalprofile_step_0"+i+"_feed.xml",
+                            "src/test/ressources/verticalprofile_instantaneouspoint/" +
+                            "verticalprofile_step_0"+i+"_advance.xml", 
+                            describeDocument);
+            }
+
+            // Vierter Schritt
+            Document outputData = artifact.describe(describeDocument,cc);
+            FileOutputStream fos = null;
+            FileOutputStream fos2 = null;
+            FileOutputStream fos3 = null;
+            FileOutputStream fos4 = null;
+            try {
+                fos = new FileOutputStream(
+                        "src/test/results/verticalprofile_instantaneouspoint"
+                                + System.currentTimeMillis() + ".png");
+                fos2 = new FileOutputStream(
+                        "src/test/results/verticalprofile_instantaneouspoint"
+                                + System.currentTimeMillis() + ".xml");
+                fos3 = new FileOutputStream(
+                        "src/test/results/verticalprofile_instantaneouspoint"
+                                + System.currentTimeMillis() + ".csv");
+                fos4 = new FileOutputStream(
+                        "src/test/results/verticalprofile_instantaneouspoint"
+                                + System.currentTimeMillis() + ".odv");
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile_instantaneouspoint/" +
+                                               "verticalprofile_step_05_out_statistics.xml"),
+                             fos2, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile_instantaneouspoint/" +
+                                               "verticalprofile_step_05_out_chart.xml"),
+                             fos, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile_instantaneouspoint/" +
+                                               "verticalprofile_step_05_out_csv.xml"),
+                             fos3, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile_instantaneouspoint/" +
+                                               "verticalprofile_step_05_out_odv.xml"),
+                             fos4, cc);
+            } catch (Exception e) {
+                log.error(e, e);
+                fail();
+            } finally {
+                try {
+                    fos.flush();
+                    fos.close();
+                    fos2.flush();
+                    fos2.close();
+                    fos3.flush();
+                    fos3.close();
+                } catch (Exception e) {
+                    log.error(e, e);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,107 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.FileOutputStream;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class MeshHorizontalCrossSectionTestCase extends
+                                               GNVArtifactsTestCaseBase {
+
+    private static Logger log = Logger.getLogger(MeshHorizontalCrossSectionTestCase.class);
+    
+    /**
+     * Constructor
+     */
+    public MeshHorizontalCrossSectionTestCase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public MeshHorizontalCrossSectionTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact()
+     */
+    @Override
+    public void testArtifact() {
+        try {
+            log.debug("GNVArtifactsTestCase.testHorizontalCrossSectionMeshArtifact");
+            String artefactName = "fis_modeldata";
+            ArtifactFactory artifactFactory = this
+                    .getArtifactFactory(artefactName);
+            assertNotNull(artifactFactory);
+            log.debug("HorizontalCrossSectionMesh-ArtifactFactory is available");
+            Artifact artifact = artifactFactory.createArtifact(
+                    "" + System.currentTimeMillis(), bootstrap.getContext());
+            assertNotNull(artifact);
+            log.debug("HorizontalCrossSectionMesh-Artifact is available");
+
+            CallContext cc = createCallContext(artifactFactory);
+            Document describeDocument = this.readDocument("src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_describe.xml");
+            int steps = 7;
+            
+            for (int i = 1; i <= steps; i++){
+                this.doNextStep(
+                            artifact,
+                            cc,
+                            "src/test/ressources/horizontalcrosssection_mesh/" +
+                            "horizontalcrosssection_step_0"+i+"_feed.xml",
+                            "src/test/ressources/horizontalcrosssection_mesh/" +
+                            "horizontalcrosssection_step_0"+i+"_advance.xml", 
+                            describeDocument);
+            }
+            
+            Document outputData = artifact.describe(describeDocument,cc);
+            FileOutputStream fos = null;
+            FileOutputStream fos2 = null;
+            try {
+                fos = new FileOutputStream(
+                        "src/test/results/horizontalcrosssection_mesh"
+                                + System.currentTimeMillis() + ".zip");
+                fos2 = new FileOutputStream(
+                        "src/test/results/horizontalcrosssection_mesh"
+                                + System.currentTimeMillis() + ".txt");
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalcrosssection_mesh/" +
+                                               "horizontalcrosssection_step_07_out_zip.xml"),
+                              fos, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalcrosssection_mesh/" +
+                                               "horizontalcrosssection_step_07_out_wms.xml"),
+                             fos2,cc);
+            } catch (Exception e) {
+                log.error(e, e);
+                fail();
+            } finally {
+                try {
+                    fos.flush();
+                    fos.close();
+                    fos2.flush();
+                    fos2.close();
+                } catch (Exception e) {
+                    log.error(e, e);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshHorizontalProfileTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,132 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.FileOutputStream;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class MeshHorizontalProfileTestCase extends GNVArtifactsTestCaseBase {
+
+    private static Logger log = Logger.getLogger(MeshHorizontalProfileTestCase.class);
+    
+    /**
+     * Constructor
+     */
+    public MeshHorizontalProfileTestCase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public MeshHorizontalProfileTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact()
+     */
+    @Override
+    public void testArtifact() {
+        try {
+            log.debug("GNVArtifactsTestCase." +
+                      "testHorizontalProfileInstantaneousPointArtifact");
+            String artefactName = "fis_modeldata";
+            ArtifactFactory artifactFactory = this
+                    .getArtifactFactory(artefactName);
+            assertNotNull(artifactFactory);
+            log.debug("VerticalProfile-ArtifactFactory is available");
+            Artifact artifact = artifactFactory.createArtifact(
+                    "" + System.currentTimeMillis(), bootstrap.getContext());
+            assertNotNull(artifact);
+            log.debug("VerticalProfile-Artifact is available");
+
+            CallContext cc = createCallContext(artifactFactory);
+            Document describeDocument = this.readDocument("src/test/ressources/horizontalProfile_mesh/horizontalprofile_describe.xml");
+            
+            int steps = 10;
+            
+            for (int i = 1; i <= steps; i++){
+                String number = ""+i;
+                if (i < 10){
+                    number = "0"+number;
+                }
+                this.doNextStep(
+                            artifact,
+                            cc,
+                            "src/test/ressources/horizontalProfile_mesh/" +
+                            "horizontalprofile_step_"+number+"_feed.xml",
+                            "src/test/ressources/horizontalProfile_mesh/" +
+                            "horizontalprofile_step_"+number+"_advance.xml", 
+                            describeDocument);
+            }
+            
+            Document outputData = artifact.describe(describeDocument,cc);
+            FileOutputStream fos = null;
+            FileOutputStream fos2 = null;
+            FileOutputStream fos3 = null;
+            FileOutputStream fos4 = null;
+            try {
+                fos = new FileOutputStream(
+                        "src/test/results/horizontalProfile_mesh"
+                                + System.currentTimeMillis() + ".png");
+                fos2 = new FileOutputStream(
+                        "src/test/results/horizontalProfile_mesh"
+                                + System.currentTimeMillis() + ".xml");
+                fos3 = new FileOutputStream(
+                        "src/test/results/horizontalProfile_mesh"
+                                + System.currentTimeMillis() + ".csv");
+                fos4 = new FileOutputStream(
+                        "src/test/results/horizontalProfile_mesh"
+                                + System.currentTimeMillis() + ".odv");
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalProfile_mesh/" +
+                                               "horizontalprofile_step_10_out_statistics.xml"),
+                             fos2, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalProfile_mesh/" +
+                                               "horizontalprofile_step_10_out_chart.xml"),
+                                fos, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalProfile_mesh/" +
+                                               "horizontalprofile_step_10_out_csv.xml"),
+                             fos3, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "horizontalProfile_mesh/" +
+                                               "horizontalprofile_step_10_out_odv.xml"),
+                             fos4, cc);
+            } catch (Exception e) {
+                log.error(e, e);
+                fail();
+            } finally {
+                try {
+                    fos.flush();
+                    fos.close();
+                    fos2.flush();
+                    fos2.close();
+                    fos3.flush();
+                    fos3.close();
+                    fos4.flush();
+                    fos4.close();
+                } catch (Exception e) {
+                    log.error(e, e);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshTimeSeriesTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,130 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.FileOutputStream;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class MeshTimeSeriesTestCase extends GNVArtifactsTestCaseBase {
+
+    private static Logger log = Logger.getLogger(MeshTimeSeriesTestCase.class);
+    
+    /**
+     * Constructor
+     */
+    public MeshTimeSeriesTestCase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public MeshTimeSeriesTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact()
+     */
+    @Override
+    public void testArtifact() {
+        try {
+            log.debug("GNVArtifactsTestCase.testTimeSeriesMeshArtifact");
+            String artefactName = "fis_modeldata";
+            ArtifactFactory artifactFactory = this
+                    .getArtifactFactory(artefactName);
+            assertNotNull(artifactFactory);
+            log.debug("TimeSeriesMesh-ArtifactFactory is available");
+            Artifact artifact = artifactFactory.createArtifact(
+                    "" + System.currentTimeMillis(), bootstrap.getContext());
+            assertNotNull(artifact);
+            log.debug("TimeSeriesMesh-Artifact is available");
+
+            CallContext cc = createCallContext(artifactFactory);
+
+            Document describeDocument = this.readDocument("src/test/ressources/timeseries_mesh/timeseries_describe.xml");
+            
+            int steps = 8;
+            
+            for (int i = 1; i <= steps; i++){
+                this.doNextStep(
+                            artifact,
+                            cc,
+                            "src/test/ressources/timeseries_mesh/" +
+                            "timeseries_step_0"+i+"_feed.xml",
+                            "src/test/ressources/timeseries_mesh/" +
+                            "timeseries_step_0"+i+"_advance.xml", 
+                            describeDocument);
+            }
+            // Achter Schritt
+            Document outputData = artifact.describe(describeDocument,cc);
+            FileOutputStream fos = null;
+            FileOutputStream fos2 = null;
+            FileOutputStream fos3 = null;
+            FileOutputStream fos4 = null;
+            try {
+                fos = new FileOutputStream("src/test/results/timeseries_mesh"
+                                           + System.currentTimeMillis()
+                                           + ".png");
+                fos2 = new FileOutputStream("src/test/results/timeseries_mesh"
+                                            + System.currentTimeMillis()
+                                            + ".xml");
+                fos3 = new FileOutputStream("src/test/results/timeseries_mesh"
+                                            + System.currentTimeMillis()
+                                            + ".csv");
+                fos4 = new FileOutputStream("src/test/results/timeseries_mesh"
+                        + System.currentTimeMillis()
+                        + ".odv");
+                artifact
+                        .out(
+                                this
+                                        .readDocument("src/test/ressources/timeseries_mesh/timeseries_step_08_out_statistics.xml"),
+                                fos2, cc);
+                artifact
+                        .out(
+                                this
+                                        .readDocument("src/test/ressources/timeseries_mesh/timeseries_step_08_out_chart.xml"),
+                                fos, cc);
+                artifact
+                        .out(
+                                this
+                                        .readDocument("src/test/ressources/timeseries_mesh/timeseries_step_08_out_csv.xml"),
+                                fos3, cc);
+                artifact
+                .out(
+                        this
+                                .readDocument("src/test/ressources/timeseries_mesh/timeseries_step_08_out_odv.xml"),
+                        fos4, cc);
+            } catch (Exception e) {
+                log.error(e, e);
+                fail();
+            } finally {
+                try {
+                    fos.flush();
+                    fos.close();
+                    fos2.flush();
+                    fos2.close();
+                    fos3.flush();
+                    fos3.close();
+                } catch (Exception e) {
+                    log.error(e, e);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,122 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.FileOutputStream;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class MeshVerticalCrossSectionTestCase extends GNVArtifactsTestCaseBase {
+
+    private static Logger log = Logger.getLogger(MeshVerticalCrossSectionTestCase.class);
+    
+    /**
+     * Constructor
+     */
+    public MeshVerticalCrossSectionTestCase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public MeshVerticalCrossSectionTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact()
+     */
+    @Override
+    public void testArtifact() {
+        try {
+            log.debug("GNVArtifactsTestCase." +
+                      "testHVerticalCrossSectionMeshArtifact");
+            String artefactName = "fis_modeldata";
+            ArtifactFactory artifactFactory = this
+                    .getArtifactFactory(artefactName);
+            assertNotNull(artifactFactory);
+            log.debug("VerticalProfile-ArtifactFactory is available");
+            Artifact artifact = artifactFactory.createArtifact(
+                    "" + System.currentTimeMillis(), bootstrap.getContext());
+            assertNotNull(artifact);
+            log.debug("VerticalProfile-Artifact is available");
+
+            CallContext cc = createCallContext(artifactFactory);
+            Document describeDocument = this.readDocument("src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_describe.xml");
+            
+            int steps = 6;
+            
+            for (int i = 1; i <= steps; i++){
+            
+                this.doNextStep(
+                            artifact,
+                            cc,
+                            "src/test/ressources/verticalcrosssection_mesh/" +
+                            "verticalcrosssection_step_0"+i+"_feed.xml",
+                            "src/test/ressources/verticalcrosssection_mesh/" +
+                            "verticalcrosssection_step_0"+i+"_advance.xml", 
+                            describeDocument);
+            }
+            
+            Document outputData = artifact.describe(describeDocument,cc);
+            FileOutputStream fos = null;
+            FileOutputStream fos2 = null;
+            FileOutputStream fos3 = null;
+            try {
+                fos = new FileOutputStream(
+                        "src/test/results/verticalcrosssection_mesh"
+                                + System.currentTimeMillis() + ".png");
+                
+                fos2 = new FileOutputStream(
+                        "src/test/results/verticalcrosssection_mesh"
+                                + System.currentTimeMillis() + ".csv");
+                fos3 = new FileOutputStream(
+                        "src/test/results/verticalcrosssection_mesh"
+                                + System.currentTimeMillis() + ".odv");
+               artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalcrosssection_mesh/" +
+                                               "verticalcrosssection_step_06_out_chart.xml"),
+                             fos, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalcrosssection_mesh/" +
+                                               "verticalcrosssection_step_06_out_csv.xml"),
+                             fos2,cc);
+                // TODO: FIXME: ODV-Export nach Reparatur wieder Testbar machen.
+//                artifact.out(this.readDocument("src/test/ressources/" +
+//                                               "verticalcrosssection_mesh/" +
+//                                               "verticalcrosssection_step_06_out_odv.xml"),
+//                             fos3,cc);
+                
+            } catch (Exception e) {
+                log.error(e, e);
+                fail();
+            } finally {
+                try {
+                    fos.flush();
+                    fos.close();
+                    fos2.flush();
+                    fos2.close();
+                    fos3.flush();
+                    fos3.close();
+                } catch (Exception e) {
+                    log.error(e, e);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshVerticalProfileTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,133 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.FileOutputStream;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class MeshVerticalProfileTestCase extends GNVArtifactsTestCaseBase {
+
+    private static Logger log = Logger.getLogger(MeshVerticalProfileTestCase.class);
+    
+    /**
+     * Constructor
+     */
+    public MeshVerticalProfileTestCase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public MeshVerticalProfileTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact()
+     */
+    @Override
+    public void testArtifact() {
+        try {
+            log.debug("GNVArtifactsTestCase.testVerticalProfileArtifact");
+            String artefactName = "fis_modeldata";
+            ArtifactFactory artifactFactory = this
+                    .getArtifactFactory(artefactName);
+            assertNotNull(artifactFactory);
+            log.debug("VerticalProfile-ArtifactFactory is available");
+            Artifact artifact = artifactFactory.createArtifact(
+                    "" + System.currentTimeMillis(), bootstrap.getContext());
+            assertNotNull(artifact);
+            log.debug("VerticalProfile-Artifact is available");
+
+            CallContext cc = createCallContext(artifactFactory);
+            Document describeDocument = this.readDocument("src/test/ressources/" +
+                                                          "verticalprofile_mesh/" +
+                                                          "verticalprofile_describe.xml");
+            
+            int steps = 10;
+            
+            for (int i = 1; i <= steps; i++){
+                String number = ""+i;
+                if (i < 10){
+                    number = "0"+number;
+                }
+                this.doNextStep(
+                            artifact,
+                            cc,
+                            "src/test/ressources/verticalprofile_mesh/" +
+                            "verticalprofile_step_"+number+"_feed.xml",
+                            "src/test/ressources/verticalprofile_mesh/" +
+                            "verticalprofile_step_"+number+"_advance.xml", 
+                            describeDocument);
+            }
+            // 10. Schritt
+            Document outputData = artifact.describe(describeDocument,cc);
+            FileOutputStream fos = null;
+            FileOutputStream fos2 = null;
+            FileOutputStream fos3 = null;
+            FileOutputStream fos4 = null;
+            try {
+                fos = new FileOutputStream(
+                        "src/test/results/verticalprofile_mesh"
+                                + System.currentTimeMillis() + ".png");
+                fos2 = new FileOutputStream(
+                        "src/test/results/verticalprofile_mesh"
+                                + System.currentTimeMillis() + ".xml");
+                fos3 = new FileOutputStream(
+                        "src/test/results/verticalprofile_mesh"
+                                + System.currentTimeMillis() + ".csv");
+                fos4 = new FileOutputStream(
+                        "src/test/results/verticalprofile_mesh"
+                                + System.currentTimeMillis() + ".odv");
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile_mesh/" +
+                                               "verticalprofile_step_10_out_statistics.xml"),
+                             fos2, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile_mesh/" +
+                                               "verticalprofile_step_10_out_chart.xml"),
+                             fos, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                              "verticalprofile_mesh/" +
+                                              "verticalprofile_step_10_out_csv.xml"),
+                             fos3, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile_mesh/" +
+                                               "verticalprofile_step_10_out_odv.xml"),
+                             fos4, cc);
+            } catch (Exception e) {
+                log.error(e, e);
+                fail();
+            } finally {
+                try {
+                    fos.flush();
+                    fos.close();
+                    fos2.flush();
+                    fos2.close();
+                    fos3.flush();
+                    fos3.close();
+                    fos4.flush();
+                    fos4.close();
+                } catch (Exception e) {
+                    log.error(e, e);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TestArtifactDatabase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,96 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.ArtifactDatabase;
+import de.intevation.artifacts.ArtifactDatabaseException;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallMeta;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class TestArtifactDatabase implements ArtifactDatabase {
+
+    private ArtifactFactory artifactFactory = null;
+    /**
+     * Constructor
+     */
+    public TestArtifactDatabase(ArtifactFactory artifactFactory) {
+        this.artifactFactory = artifactFactory;
+    }
+
+    /**
+     * @see de.intevation.artifacts.ArtifactDatabase#advance(java.lang.String, org.w3c.dom.Document, de.intevation.artifacts.CallMeta)
+     */
+    public Document advance(String artifact, Document target, CallMeta callMeta)
+                                                                                throws ArtifactDatabaseException {
+
+        return null;
+    }
+
+    /**
+     * @see de.intevation.artifacts.ArtifactDatabase#artifactFactoryNamesAndDescriptions()
+     */
+    public String[][] artifactFactoryNamesAndDescriptions() {
+
+        return null;
+    }
+
+    /**
+     * @see de.intevation.artifacts.ArtifactDatabase#createArtifactWithFactory(java.lang.String, de.intevation.artifacts.CallMeta)
+     */
+    public Document createArtifactWithFactory(String factory, CallMeta callMeta)
+                                                                                throws ArtifactDatabaseException {
+
+        return null;
+    }
+
+    /**
+     * @see de.intevation.artifacts.ArtifactDatabase#describe(java.lang.String, org.w3c.dom.Document, de.intevation.artifacts.CallMeta)
+     */
+    public Document describe(String artifact, Document data, CallMeta callMeta)
+                                                                               throws ArtifactDatabaseException {
+
+        return null;
+    }
+
+    /**
+     * @see de.intevation.artifacts.ArtifactDatabase#feed(java.lang.String, org.w3c.dom.Document, de.intevation.artifacts.CallMeta)
+     */
+    public Document feed(String artifact, Document data, CallMeta callMeta)
+                                                                           throws ArtifactDatabaseException {
+
+        return null;
+    }
+
+    /**
+     * @see de.intevation.artifacts.ArtifactDatabase#getInternalArtifactFactory(java.lang.String)
+     */
+    public ArtifactFactory getInternalArtifactFactory(String factoryName) {
+        return this.artifactFactory;
+    }
+
+    /**
+     * @see de.intevation.artifacts.ArtifactDatabase#out(java.lang.String, org.w3c.dom.Document, de.intevation.artifacts.CallMeta)
+     */
+    public DeferredOutput out(String artifact, Document format,
+                              CallMeta callMeta)
+                                                throws ArtifactDatabaseException {
+
+        return null;
+    }
+
+    public Document process(String service, Document input, CallMeta callMeta) {
+        return null;
+    }
+
+    public String[][] serviceNamesAndDescriptions() {
+        return null;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TestCallContext.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,68 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import de.intevation.artifacts.ArtifactDatabase;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class TestCallContext implements CallContext {
+
+
+
+    private Object globalContext = null;
+    private CallMeta callMeta = null;
+    private ArtifactFactory artifactFactory = null;
+    private ArtifactDatabase artifactDatabase = null;
+    /**
+     * Constructor
+     */
+    public TestCallContext(Object globalContext, 
+                           CallMeta callMeta, 
+                           ArtifactFactory artifactFactory) {
+        this.globalContext = globalContext;
+        this.callMeta = callMeta;
+        this.artifactDatabase  = new TestArtifactDatabase(artifactFactory);
+    }
+
+    /**
+     * @see de.intevation.artifacts.CallContext#afterBackground(int)
+     */
+    public void afterBackground(int action) {
+    }
+
+    /**
+     * @see de.intevation.artifacts.CallContext#afterCall(int)
+     */
+    public void afterCall(int action) {
+    }
+
+    /**
+     * @see de.intevation.artifacts.CallContext#globalContext()
+     */
+    public Object globalContext() {
+        return this.globalContext;
+    }
+
+    public CallMeta getMeta() {
+        return this.callMeta;
+    }
+
+    public Object getContextValue(Object key) {
+        return null;
+    }
+
+    public Object putContextValue(Object key, Object value) {
+        return null;
+    }
+
+    public ArtifactDatabase getDatabase() {
+        return this.artifactDatabase;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,126 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.FileOutputStream;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class TimeSeriesPointTimeSeriesTestCase extends GNVArtifactsTestCaseBase {
+
+    
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(TimeSeriesPointTimeSeriesTestCase.class);
+    
+    /**
+     * Constructor
+     */
+    public TimeSeriesPointTimeSeriesTestCase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public TimeSeriesPointTimeSeriesTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact()
+     */
+    @Override
+    public void testArtifact() {
+        log.debug("GNVArtifactsTestCase.testTimeSeriesArtifact");
+        try {
+            String artefactName = "fis_marnet";
+            ArtifactFactory artifactFactory = this
+                    .getArtifactFactory(artefactName);
+            assertNotNull(artifactFactory);
+            log.debug("TimeSeries-ArtifactFactory is available");
+            Artifact artifact = artifactFactory.createArtifact(
+                    "" + System.currentTimeMillis(), bootstrap.getContext());
+            assertNotNull(artifact);
+            log.debug("TimeSeries-Artifact is available");
+    
+            CallContext cc = createCallContext(artifactFactory);
+    
+            // Erster Schritt
+    
+            Document describeDocument = this.readDocument("src/test/ressources/timeseries/timeseries_describe.xml");
+            
+            int steps = 6;
+            
+            for (int i = 1; i <= steps; i++){
+            
+                this.doNextStep(
+                            artifact,
+                            cc,
+                            "src/test/ressources/timeseries/" +
+                            "timeseries_step_0"+i+"_feed.xml",
+                            "src/test/ressources/timeseries/" +
+                            "timeseries_step_0"+i+"_advance.xml", 
+                            describeDocument);
+            }
+            
+            Document outputData = artifact.describe(describeDocument,cc);
+            FileOutputStream fos = null;
+            FileOutputStream fos2 = null;
+            FileOutputStream fos3 = null;
+            FileOutputStream fos4 = null;
+            try {
+                fos = new FileOutputStream("src/test/results/timeseries"
+                                           + System.currentTimeMillis()
+                                           + ".png");
+                fos2 = new FileOutputStream("src/test/results/timeseries"
+                                            + System.currentTimeMillis()
+                                            + ".xml");
+                fos3 = new FileOutputStream("src/test/results/timeseries"
+                                            + System.currentTimeMillis()
+                                            + ".csv");
+                fos4 = new FileOutputStream("src/test/results/timeseries"
+                        + System.currentTimeMillis()
+                        + ".odv");
+            
+                artifact.out(this
+                             .readDocument("src/test/ressources/timeseries/timeseries_step_06_out_chart.xml"),
+                                           fos, cc);
+                artifact.out(this
+                        .readDocument("src/test/ressources/timeseries/timeseries_step_06_out_statistics.xml"),
+                                      fos2, cc);
+                artifact.out(this
+                        .readDocument("src/test/ressources/timeseries/timeseries_step_06_out_csv.xml"),
+                                      fos3, cc);
+                artifact.out(this
+                        .readDocument("src/test/ressources/timeseries/timeseries_step_06_out_odv.xml"),
+                                      fos4, cc);
+            } catch (Exception e) {
+                log.error(e, e);
+                fail();
+            } finally {
+                try {
+                    fos.flush();
+                    fos.close();
+                } catch (Exception e) {
+                    log.error(e, e);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,129 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts;
+
+import java.io.FileOutputStream;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.CallContext;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class TimeSeriesPointVerticalProfileTestCase extends
+                                                   GNVArtifactsTestCaseBase {
+
+    private static Logger log = Logger.getLogger(TimeSeriesPointVerticalProfileTestCase.class);
+    
+    /**
+     * Constructor
+     */
+    public TimeSeriesPointVerticalProfileTestCase() {
+    }
+
+    /**
+     * Constructor
+     * @param name
+     */
+    public TimeSeriesPointVerticalProfileTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact()
+     */
+    @Override
+    public void testArtifact() {
+        try {
+            log.debug("GNVArtifactsTestCase.testVerticalProfileArtifact");
+            String artefactName = "fis_marnet";
+            ArtifactFactory artifactFactory = this
+                    .getArtifactFactory(artefactName);
+            assertNotNull(artifactFactory);
+            log.debug("VerticalProfile-ArtifactFactory is available");
+            Artifact artifact = artifactFactory.createArtifact(
+                    "" + System.currentTimeMillis(), bootstrap.getContext());
+            assertNotNull(artifact);
+            log.debug("VerticalProfile-Artifact is available");
+
+            CallContext cc = createCallContext(artifactFactory);
+
+            Document describeDocument = this.readDocument("src/test/ressources/verticalprofile/verticalprofile_describe.xml");
+            int steps = 7;
+            
+            for (int i = 1; i <= steps; i++){
+                this.doNextStep(
+                            artifact,
+                            cc,
+                            "src/test/ressources/verticalprofile/" +
+                            "verticalprofile_step_0"+i+"_feed.xml",
+                            "src/test/ressources/verticalprofile/" +
+                            "verticalprofile_step_0"+i+"_advance.xml", 
+                            describeDocument);
+            }
+
+            // Vierter Schritt
+            Document outputData = artifact.describe(describeDocument,cc);
+            FileOutputStream fos = null;
+            FileOutputStream fos2 = null;
+            FileOutputStream fos3 = null;
+            FileOutputStream fos4 = null;
+            try {
+                fos = new FileOutputStream("src/test/results/verticalprofile"
+                                           + System.currentTimeMillis()
+                                           + ".png");
+                fos2 = new FileOutputStream("src/test/results/verticalprofile"
+                                            + System.currentTimeMillis()
+                                            + ".xml");
+                fos3 = new FileOutputStream("src/test/results/verticalprofile"
+                                            + System.currentTimeMillis()
+                                            + ".csv");
+                fos4 = new FileOutputStream("src/test/results/verticalprofile"
+                        + System.currentTimeMillis()
+                        + ".odv");
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile/" +
+                                               "verticalprofile_step_07_out_statistics.xml"),
+                             fos2, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile/" +
+                                               "verticalprofile_step_07_out_chart.xml"),
+                             fos, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile/" +
+                                               "verticalprofile_step_07_out_csv.xml"),
+                             fos3, cc);
+                artifact.out(this.readDocument("src/test/ressources/" +
+                                               "verticalprofile/" +
+                                               "verticalprofile_step_07_out_odv.xml"),
+                            fos4, cc);
+            } catch (Exception e) {
+                log.error(e, e);
+                fail();
+            } finally {
+                try {
+                    fos.flush();
+                    fos.close();
+                    fos2.flush();
+                    fos2.close();
+                    fos3.flush();
+                    fos3.close();
+                    fos4.flush();
+                    fos4.close();
+                } catch (Exception e) {
+                    log.error(e, e);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/ressource/RessourceFactoryTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,59 @@
+package de.intevation.gnv.artifacts.ressource;
+
+import junit.framework.TestCase;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Logger;
+
+import de.intevation.artifactdatabase.DefaultPreferredLocale;
+import de.intevation.artifacts.PreferredLocale;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class RessourceFactoryTestCase extends TestCase {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = null;
+
+    static {
+        BasicConfigurator.configure();
+        log = Logger.getLogger(RessourceFactoryTestCase.class);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param name
+     */
+    public RessourceFactoryTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // System.setProperty("artifact.ressource.dir",
+        // "src/test/ressources/lang");
+    }
+
+    public void testRessurceFactoryTestCase() {
+        ;
+        String value = RessourceFactory.getInstance()
+                .getRessource(
+                        new PreferredLocale[] { new DefaultPreferredLocale(
+                                "de", 1.0f) }, "fis_modeldata", "N/N");
+        log.debug(value);
+        value = RessourceFactory.getInstance()
+                .getRessource(
+                        new PreferredLocale[] { new DefaultPreferredLocale(
+                                "en", 1.0f) }, "fis_modeldata", "N/N");
+        log.debug(value);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/util/DistanceCalculatorTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,30 @@
+package de.intevation.gnv.artifacts.util;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.Point;
+
+import de.intevation.gnv.utils.DistanceCalculator;
+
+import junit.framework.TestCase;
+
+public class DistanceCalculatorTestCase extends TestCase {
+
+    public DistanceCalculatorTestCase(String name) {
+        super(name);
+    }
+    
+    public void testDistanceCalculator(){
+        
+        GeometryFactory gf = new GeometryFactory();
+        
+        // Distance between Berlin and Tokio
+        Point p1 = gf.createPoint(new Coordinate(13.4000, 52.5167));
+        Point p2 = gf.createPoint(new Coordinate(139.7667, 35.7000));
+        
+        double s = new DistanceCalculator().calculateDistance(p1, p2);
+        
+        assertEquals(8941.201227763724, s);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/util/ShapeFileWriterTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,88 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifacts.util;
+
+import java.io.File;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Logger;
+
+import com.vividsolutions.jts.geom.MultiLineString;
+import com.vividsolutions.jts.io.WKTReader;
+
+import de.intevation.gnv.utils.Pair;
+import de.intevation.gnv.utils.ShapeFileWriter;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class ShapeFileWriterTestCase extends TestCase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = null;
+
+    static {
+        BasicConfigurator.configure();
+        log = Logger.getLogger(ShapeFileWriterTestCase.class);
+    }
+    
+    /**
+     * Constructor
+     * @param name
+     */
+    public ShapeFileWriterTestCase(String name) {
+        super(name);
+    }
+    
+    
+    public void testMultiLineStringWriter(){
+        
+        try {
+            String wkt = "MULTILINESTRING ((10 10, 20 20),(15 15, 30 15))";
+            String wkt1 = "MULTILINESTRING ((10 5, 20 20),(15 15, 30 15))";
+            String wkt2 = "MULTILINESTRING ((10 10, 8 20),(15 15, 30 15))";
+            String wkt3 = "MULTILINESTRING ((8 10, 20 20),(15 15, 30 15))";
+            File isolineFile = new File("src/test/ressources/isolines.wkt");
+            MultiLineString multiLineString = (MultiLineString)new WKTReader().read(new FileReader(isolineFile));
+            MultiLineString multiLineString1 = (MultiLineString)new WKTReader().read(wkt1);
+            MultiLineString multiLineString2 = (MultiLineString)new WKTReader().read(wkt2);
+            MultiLineString multiLineString3 = (MultiLineString)new WKTReader().read(wkt3);
+            ArrayList<Pair<Object, MultiLineString>> multiLineStrings =
+                new ArrayList<Pair<Object, MultiLineString>>();
+            multiLineStrings.add(
+                    new Pair<Object, MultiLineString>(
+                            1.2,
+                            multiLineString));
+            multiLineStrings.add(
+                    new Pair<Object, MultiLineString>(
+                            1.3,
+                            multiLineString1));
+            multiLineStrings.add(
+                    new Pair<Object, MultiLineString>(
+                            1.4,
+                            multiLineString2));
+            multiLineStrings.add(
+                    new Pair<Object, MultiLineString>(
+                            1.5,
+                            multiLineString3));
+            
+            java.io.File shapeFile = new java.io.File("/tmp/test"+System.currentTimeMillis()+".shp"); 
+            
+            ShapeFileWriter.writeMultiLineStringsToFile(shapeFile, 1, 1, new Date(), multiLineStrings);
+            
+        } catch (Exception e) {
+           log.error(e,e);
+           fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_describe.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="describe" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:include-ui>true</art:include-ui>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_00_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:target name="horizontalProfile" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_00_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:data>
+		<art:input name="product" value="horizontalProfile" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_01_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:target name="horizontalprofile_instantaneouspoint_subarea"/>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_01_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:data>
+		<art:input name="areaid" value="3"/>
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_02_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:target name="horizontalprofile_instantaneouspoint_vehicle"/>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_02_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:data>
+		<art:input name="subareaid" value="30"/>
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_03_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:target name="horizontalprofile_instantaneouspoint_cruise_with_area"/>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_03_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:data>
+		<art:input name="vehicleid" value="8402" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_04_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:target name="horizontalprofile_instantaneouspoint_track_with_area" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_04_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:data>
+		<art:input name="cruiseid" value="47" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_05_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:target name="horizontalprofile_instantaneouspoint_surveyinfo" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_05_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:data>
+		<art:input name="trackid" value="1671" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:target name="horizontalprofile_instantaneouspoint_parameter" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:data>
+		<art:input name="surveyid" value="2063" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_07_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:target name="horizontalprofile_instantaneouspoint_depth" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_07_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:data>
+		<art:input name="parameterid" value="2" />
+		<art:input name="parameterid" value="1" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:target name="horizontalprofile_instantaneouspoint_calculate_results" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="5437874" />
+	<art:data>
+		<art:input name="measurementid" value="-5.943" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_chart.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="27021384" />
+	<art:out name="chart">
+		<art:mime-type value="image/png" />
+		<art:params>
+			<art:input name="width" value="600" />
+			<art:input name="height" value="400" />
+		</art:params>
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_csv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="out" />
+    <art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+    <art:hash value="27021384" />
+    <art:out name="csv">
+        <art:out value="text/plain" />
+        <art:params />
+    </art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_odv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="out" />
+    <art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+    <art:hash value="27021384" />
+    <art:out name="odv">
+        <art:out value="text/plain" />
+        <art:params />
+    </art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_statistics.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="3637e455-944f-46ef-997d-8cd61d9ad2d3" />
+	<art:hash value="27021384" />
+	<art:out name="statistics">
+		<art:out value="text/xml" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_describe.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="describe" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:include-ui>true</art:include-ui>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_01_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:target name="horizontalProfile" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_01_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+		<art:input name="product" value="horizontalProfile" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:target name="horizontalprofile_mesh_subarea" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+		<art:input name="areaid" value="3" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_03_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:target name="horizontalprofile_mesh" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_03_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+		<art:input name="subareaid" value="41"/>
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_04_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:target name="horizontalprofile_mesh_coordinate" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_04_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+		<art:input name="meshid" value="3" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_05_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="86a0e5c5-e98d-4c7d-93ff-76b099a2de4e" />
+	<art:hash value="7390092" />
+	<art:target name="horizontalprofile_mesh_point" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_05_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+        <art:input name="mesh_coordinate" value="56n30 6e20" />
+    </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_06_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="86a0e5c5-e98d-4c7d-93ff-76b099a2de4e" />
+	<art:hash value="7390092" />
+	<art:target name="horizontalprofile_mesh_axis" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_06_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+		<art:input name="mesh_point" value="2003771" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_07_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:target name="horizontalprofile_meshpoint_parameter" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_07_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+		<art:input name="axisid" value="JPOSITION" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_08_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:target name="horizontalprofile_meshpoint_depth" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_08_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+		<art:input name="parameterid" value="2" />
+		<art:input name="parameterid" value="1" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_09_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:target name="horizontalprofile_mesh_date" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_09_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+		<art:input name="depthid" value="1" />
+		<art:input name="depthid" value="2" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:target name="horizontalprofile_mesh_calculate_results" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:data>
+		<art:input name="dateid" value="2010.01.03 00:00:00" />
+		<art:input name="dateid" value="2010.01.02 00:00:00" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_out_chart.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:out name="chart">
+		<art:mime-type value="image/png" />
+		<art:params>
+			<art:input name="width" value="600" />
+			<art:input name="height" value="400" />
+		</art:params>
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_out_csv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:out name="csv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_out_odv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:out name="odv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_out_statistics.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="1f6a63e2-c9d6-4ab1-830e-1effbc189d68" />
+	<art:hash value="29647319" />
+	<art:out name="statistics">
+		<art:out value="text/xml" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_describe.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="describe" />
+    <art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+    <art:hash value="6292125" />
+    <art:include-ui>true</art:include-ui>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_01_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="advance" />
+    <art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+    <art:hash value="6292125" />
+    <art:target name="horizontalCrossSection" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_01_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="feed" />
+    <art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+    <art:hash value="6292125" />
+    <art:data>
+        <art:input name="product" value="horizontalCrossSection" />
+    </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_02_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="advance" />
+    <art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+    <art:hash value="6292125" />
+    <art:target name="horizontalcrosssection_mesh_without_geom"/>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_02_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+	<art:hash value="6292125" />
+	   <art:data>
+        <art:input name="areaid" value="n/n" />
+    </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_03_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="advance" />
+    <art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+    <art:hash value="6292125" />
+    <art:target name="verticalcrosssection_mesh_polygon"/>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_03_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+	<art:hash value="6292125" />
+	<art:data>
+		<art:input name="meshid" value="3" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_04_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="advance" />
+    <art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+    <art:hash value="6292125" />
+    <art:target name="horizontalcrosssection_meshpoint_depth"/>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_04_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+	<art:hash value="6292125" />
+	<art:data>
+		<art:input name="mesh_polygon" value="POLYGON (( 3.619257904890151 60.124073114994786, -0.0100024331643465 58.22749190607598, 0.0602413153141276 54.73871906497843, 1.0436537940127657 53.33384409540895, 2.2612121009729846 52.13970037127489, 3.619257904890151 52.116285788448735, 4.789987046198053 53.544575340844375, 6.358764095550643 54.15335449432448, 8.021199476207865 54.10652532867217, 7.904126562077074 55.62847321237244, 8.021199476207865 57.22066484455119, 9.496318194255823 57.478225255638925, 9.941195267952825 57.876273163683614, 10.877778580999147 57.73578566672666, 10.760705666868358 57.05676276476808, 10.526559838606776 56.75237318802803, 11.228997323391518 56.28408153150487, 10.620218169911409 55.815789874981704, 11.346070237522309 55.2070107215016, 12.235824384916315 55.97969195476481, 12.306068133394788 56.61188569107108, 11.55680148295773 57.73578566672666, 10.924607746651462 58.64895439694683, 10.47973067295446 58.906514808034565,  9.777293188169718 58.57871064846835, 8.466076549904868 57.85285858085746, 7.014372414683068 57.45481067281277, 5.937301604679798 58.04017524346672,  4.930474543155002 59.11724605346999, 4.602670383588789 59.70261062412394, 4.5324266351103155 59.91334186955937,  4.321695389674892 59.889927286733204, 4.064134978587155 59.81968353825473, 3.619257904890151 60.10065853216863,  3.619257904890151 60.124073114994786))" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_05_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+	<art:hash value="6292125" />
+	<art:target name="horizontalcrosssection_meshpoint_parameter" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_05_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+	<art:hash value="6292125" />
+	<art:data>
+		<art:input name="depthid" value="1" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+	<art:hash value="6292125" />
+	<art:target name="horizontalcrosssection_mesh_date" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+	<art:hash value="6292125" />
+	<art:data>
+		<art:input name="parameterid" value="2" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+	<art:hash value="6292125" />
+	<art:target name="horizontalcrosssection_mesh_calculate_results" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+	<art:hash value="6292125" />
+	<art:data>
+		<art:input name="dateid" value="2010.01.03 00:00:00" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_wms.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+    <art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+    <art:hash value="6292125" />
+	<art:out name="wms">
+		<art:out value="text/url" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_zip.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+    <art:uuid value="74baff94-b172-4667-b6d8-db21abeb1b81" />
+    <art:hash value="6292125" />
+	<art:out name="zip">
+		<art:mime-type value="application/zip" />
+		<art:params>
+		</art:params>
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/isolines.wkt	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,52 @@
+MULTILINESTRING ((4.355421574235005 -7.503513066218794, 3.1939758211056706 -7.503513066218794, 3.1939758211056706 -7.81615944397791, 0.5807228765646674 -7.81615944397791, 0.5807228765646674 -8.128805821737027, 0 -8.128805821737027), 
+  (297.3301128011097 -67.21897121821003, 296.4590284862627 -67.21897121821003, 296.4590284862627 -67.53161759596915, 295.29758273313337 -67.53161759596915, 295.29758273313337 -67.84426397372826, 294.42649841828637 -67.84426397372826, 294.42649841828637 -68.15691035148738, 293.5554141034394 -68.15691035148738, 293.5554141034394 -68.46955672924649, 292.39396835031005 -68.46955672924649, 292.39396835031005 -68.78220310700561, 291.522884035463 -68.78220310700561, 291.522884035463 -69.09484948476472, 290.651799720616 -69.09484948476472, 290.651799720616 -69.40749586252385, 289.49035396748667 -69.40749586252385, 289.49035396748667 -69.72014224028295, 288.6192696526397 -69.72014224028295, 288.6192696526397 -70.03278861804208, 287.7481853377927 -70.03278861804208, 287.7481853377927 -70.3454349958012, 280.198787942452 -70.3454349958012, 280.198787942452 -70.65808137356031, 276.714450683064 -70.65808137356031, 276.714450683064 -70.97072775131943, 276.13372780649934 -70.97072775131943, 276.13372780649934 -70.65808137356031, 274.97228205337 -70.65808137356031, 274.97228205337 -70.3454349958012, 273.52047486195835 -70.3454349958012, 273.52047486195835 -70.03278861804208, 272.359029108829 -70.03278861804208, 272.359029108829 -69.72014224028295, 270.9072219174173 -69.72014224028295, 270.9072219174173 -69.40749586252385, 269.45541472600564 -69.40749586252385, 269.45541472600564 -69.09484948476472, 268.003607534594 -69.09484948476472, 268.003607534594 -68.78220310700561, 266.2614389049 -68.78220310700561, 266.2614389049 -68.46955672924649, 264.519270275206 -68.46955672924649, 264.519270275206 -68.15691035148738, 262.777101645512 -68.15691035148738, 262.777101645512 -67.84426397372826, 261.03493301581796 -67.84426397372826, 261.03493301581796 -67.53161759596915, 259.29276438612396 -67.53161759596915, 259.29276438612396 -67.21897121821003, 257.55059575642997 -67.21897121821003, 257.55059575642997 -66.9063248404509, 255.80842712673598 -66.9063248404509, 255.80842712673598 -66.5936784626918, 254.06625849704199 -66.5936784626918, 254.06625849704199 -66.28103208493268, 249.1301140462423 -66.28103208493268, 249.1301140462423 -65.96838570717357, 245.35541534857197 -65.96838570717357, 245.35541534857197 -65.65573932941444, 242.45180096574862 -65.65573932941444, 242.45180096574862 -65.34309295165534, 239.25782514464296 -65.34309295165534, 239.25782514464296 -65.03044657389621, 236.64457220010195 -65.03044657389621, 236.64457220010195 -64.71780019613709, 233.74095781727863 -64.71780019613709, 233.74095781727863 -64.40515381837798, 231.1277048727376 -64.40515381837798, 231.1277048727376 -64.09250744061886, 229.96625911960828 -64.09250744061886, 229.96625911960828 -63.77986106285975, 228.51445192819662 -63.77986106285975, 228.51445192819662 -63.46721468510063, 227.35300617506726 -63.46721468510063, 227.35300617506726 -63.15456830734151, 225.9011989836556 -63.15456830734151, 225.9011989836556 -62.8419219295824, 224.44939179224394 -62.8419219295824, 224.44939179224394 -62.52927555182328, 222.99758460083228 -62.52927555182328, 222.99758460083228 -62.21662917406417, 221.5457774094206 -62.21662917406417, 221.5457774094206 -61.90398279630505, 219.8036087797266 -61.90398279630505, 219.8036087797266 -61.591336418545936, 218.0614401500326 -61.591336418545936, 218.0614401500326 -61.27869004078681, 215.73854864377392 -61.27869004078681, 215.73854864377392 -60.9660436630277, 212.8349342609506 -60.9660436630277, 212.8349342609506 -60.65339728526858, 199.47830809996324 -60.65339728526858, 199.47830809996324 -60.34075090750947, 195.7036094022929 -60.34075090750947, 195.7036094022929 -60.65339728526858, 194.54216364916357 -60.65339728526858, 194.54216364916357 -60.9660436630277, 193.0903564577519 -60.9660436630277, 193.0903564577519 -61.27869004078681, 191.92891070462255 -61.27869004078681, 191.92891070462255 -61.591336418545936, 190.4771035132109 -61.591336418545936, 190.4771035132109 -61.90398279630505, 189.31565776008156 -61.90398279630505, 189.31565776008156 -62.21662917406417, 188.15421200695224 -62.21662917406417, 188.15421200695224 -62.52927555182328, 186.99276625382288 -62.52927555182328, 186.99276625382288 -62.8419219295824, 185.83132050069355 -62.8419219295824, 185.83132050069355 -63.15456830734151, 184.96023618584655 -63.15456830734151, 184.96023618584655 -63.46721468510063, 184.08915187099956 -63.46721468510063, 184.08915187099956 -63.77986106285975, 183.21806755615256 -63.77986106285975, 183.21806755615256 -64.09250744061886, 182.05662180302323 -64.09250744061886, 182.05662180302323 -64.40515381837798, 181.1855374881762 -64.40515381837798, 181.1855374881762 -64.71780019613709, 180.3144531733292 -64.71780019613709, 180.3144531733292 -65.03044657389621, 179.15300742019988 -65.03044657389621, 179.15300742019988 -65.34309295165534, 178.2819231053529 -65.34309295165534, 178.2819231053529 -65.65573932941444, 177.12047735222356 -65.65573932941444, 177.12047735222356 -65.96838570717357, 176.24939303737654 -65.96838570717357, 176.24939303737654 -66.28103208493268, 175.0879472842472 -66.28103208493268, 175.0879472842472 -66.5936784626918, 173.92650153111788 -66.5936784626918, 173.92650153111788 -66.9063248404509, 171.02288714829453 -66.9063248404509, 171.02288714829453 -67.21897121821003, 167.82891132718888 -67.21897121821003, 167.82891132718888 -67.53161759596915, 164.34457406780086 -67.53161759596915, 164.34457406780086 -67.84426397372826, 160.2795139318482 -67.84426397372826, 160.2795139318482 -68.15691035148738, 155.3433694810485 -68.15691035148738, 155.3433694810485 -68.46955672924649, 149.2457792771195 -68.46955672924649, 149.2457792771195 -68.78220310700561, 137.0505988692615 -68.78220310700561, 137.0505988692615 -68.46955672924649, 133.85662304815583 -68.46955672924649, 133.85662304815583 -68.15691035148738, 131.24337010361484 -68.15691035148738, 131.24337010361484 -67.84426397372826, 129.50120147392082 -67.84426397372826, 129.50120147392082 -67.53161759596915, 127.75903284422682 -67.53161759596915, 127.75903284422682 -67.21897121821003, 126.30722565281515 -67.21897121821003, 126.30722565281515 -66.9063248404509, 124.85541846140349 -66.9063248404509, 124.85541846140349 -66.5936784626918, 123.40361126999181 -66.5936784626918, 123.40361126999181 -66.28103208493268, 122.24216551686249 -66.28103208493268, 122.24216551686249 -65.96838570717357, 120.79035832545081 -65.96838570717357, 120.79035832545081 -65.65573932941444, 119.62891257232148 -65.65573932941444, 119.62891257232148 -65.34309295165534, 118.46746681919214 -65.34309295165534, 118.46746681919214 -65.03044657389621, 116.14457531293347 -65.03044657389621, 116.14457531293347 -64.71780019613709, 112.9505994918278 -64.71780019613709, 112.9505994918278 -64.40515381837798, 110.62770798556913 -64.40515381837798, 110.62770798556913 -64.09250744061886, 108.30481647931046 -64.09250744061886, 108.30481647931046 -63.77986106285975, 106.56264784961647 -63.77986106285975, 106.56264784961647 -63.46721468510063, 98.14216613942878 -63.46721468510063, 98.14216613942878 -63.15456830734151, 92.91566025034678 -63.15456830734151, 92.91566025034678 -63.46721468510063, 89.14096155267644 -63.46721468510063, 89.14096155267644 -63.77986106285975, 86.52770860813544 -63.77986106285975, 86.52770860813544 -64.09250744061886, 84.20481710187677 -64.09250744061886, 84.20481710187677 -64.40515381837798, 76.36505826825376 -64.40515381837798, 76.36505826825376 -64.71780019613709, 72.59035957058342 -64.71780019613709), 
+  (72.29999813230108 -64.71780019613709, 69.68674518776008 -64.71780019613709, 69.68674518776008 -64.40515381837798, 66.78313080493675 -64.40515381837798, 66.78313080493675 -64.09250744061886, 64.16987786039574 -64.09250744061886, 64.16987786039574 -63.77986106285975, 61.55662491585474 -63.77986106285975, 61.55662491585474 -63.46721468510063, 59.81445628616074 -63.46721468510063, 59.81445628616074 -63.15456830734151, 58.653010533031406 -63.15456830734151, 58.653010533031406 -62.8419219295824, 57.49156477990207 -62.8419219295824, 57.49156477990207 -62.52927555182328, 56.330119026772735 -62.52927555182328, 56.330119026772735 -62.21662917406417, 55.45903471192573 -62.21662917406417, 55.45903471192573 -61.90398279630505, 54.297588958796396 -61.90398279630505, 54.297588958796396 -61.591336418545936, 53.4265046439494 -61.591336418545936, 53.4265046439494 -61.27869004078681, 52.5554203291024 -61.27869004078681, 52.5554203291024 -60.9660436630277, 51.68433601425539 -60.9660436630277, 51.68433601425539 -60.65339728526858, 50.8132516994084 -60.65339728526858, 50.8132516994084 -60.34075090750947, 50.232528822843726 -60.34075090750947, 50.232528822843726 -60.02810452975035, 49.36144450799673 -60.02810452975035, 49.36144450799673 -59.715458151991236, 47.909637316585055 -59.715458151991236, 47.909637316585055 -59.40281177423212, 46.74819156345572 -59.40281177423212, 46.74819156345572 -59.090165396473004, 45.29638437204405 -59.090165396473004, 45.29638437204405 -58.77751901871389, 44.13493861891472 -58.77751901871389, 44.13493861891472 -58.464872640954766, 42.97349286578539 -58.464872640954766, 42.97349286578539 -58.15222626319565, 41.81204711265605 -58.15222626319565, 41.81204711265605 -57.839579885436535, 40.65060135952672 -57.839579885436535, 40.65060135952672 -57.52693350767742, 39.48915560639738 -57.52693350767742, 39.48915560639738 -57.214287129918304, 38.32770985326805 -57.214287129918304, 38.32770985326805 -56.90164075215919, 37.16626410013871 -56.90164075215919, 37.16626410013871 -56.58899437440007, 35.714456908727044 -56.58899437440007, 35.714456908727044 -56.27634799664095, 33.972288279033044 -56.27634799664095, 33.972288279033044 -55.963701618881835, 32.23011964933904 -55.963701618881835, 32.23011964933904 -55.65105524112272, 30.48795101964504 -55.65105524112272, 30.48795101964504 -55.338408863363604, 28.165059513386367 -55.338408863363604, 28.165059513386367 -55.02576248560449, 24.971083692280697 -55.02576248560449, 24.971083692280697 -55.338408863363604, 22.93855362430436 -55.338408863363604, 22.93855362430436 -55.65105524112272, 21.777107871175026 -55.65105524112272, 21.777107871175026 -55.963701618881835, 20.61566211804569 -55.963701618881835, 20.61566211804569 -56.27634799664095, 19.74457780319869 -56.27634799664095), 
+  (4.355421574235005 -55.02576248560449, 3.774698697670338 -55.02576248560449, 3.774698697670338 -55.338408863363604, 2.6132529445410033 -55.338408863363604, 2.6132529445410033 -55.65105524112272, 1.7421686296940022 -55.65105524112272, 1.7421686296940022 -55.963701618881835, 0.5807228765646674 -55.963701618881835, 0.5807228765646674 -56.27634799664095, 0 -56.27634799664095), 
+  (25.551806568845365 0, 25.551806568845365 -0.3126463777591164, 25.842168007127697 -0.3126463777591164, 25.842168007127697 -0.6252927555182328, 26.132529445410032 -0.6252927555182328, 26.132529445410032 -0.9379391332773492, 26.422890883692364 -0.9379391332773492, 26.422890883692364 -1.2505855110364656, 26.7132523219747 -1.2505855110364656, 26.7132523219747 -1.563231888795582, 27.003613760257032 -1.563231888795582, 27.003613760257032 -2.8138173998320477, 26.7132523219747 -2.8138173998320477, 26.7132523219747 -3.126463777591164, 26.422890883692364 -3.126463777591164, 26.422890883692364 -3.4391101553502805, 26.132529445410032 -3.4391101553502805, 26.132529445410032 -3.751756533109397, 25.551806568845365 -3.751756533109397, 25.551806568845365 -4.064402910868513, 24.680722253998365 -4.064402910868513, 24.680722253998365 -4.37704928862763, 23.80963793915136 -4.37704928862763, 23.80963793915136 -4.689695666386746, 22.648192186022026 -4.689695666386746, 22.648192186022026 -5.002342044145863, 21.486746432892694 -5.002342044145863, 21.486746432892694 -5.314988421904979, 20.034939241481023 -5.314988421904979, 20.034939241481023 -5.627634799664095, 19.74457780319869 -5.627634799664095))MULTILINESTRING ((297.3301128011097 -61.27869004078681, 297.03975136282736 -61.27869004078681, 297.03975136282736 -61.591336418545936, 296.16866704798036 -61.591336418545936, 296.16866704798036 -61.90398279630505, 295.29758273313337 -61.90398279630505, 295.29758273313337 -62.21662917406417, 294.42649841828637 -62.21662917406417, 294.42649841828637 -62.52927555182328, 293.26505266515704 -62.52927555182328, 293.26505266515704 -62.8419219295824, 292.39396835031005 -62.8419219295824, 292.39396835031005 -63.15456830734151, 291.522884035463 -63.15456830734151, 291.522884035463 -63.46721468510063, 290.651799720616 -63.46721468510063, 290.651799720616 -63.77986106285975, 289.780715405769 -63.77986106285975, 289.780715405769 -64.09250744061886, 288.909631090922 -64.09250744061886, 288.909631090922 -64.40515381837798, 288.038546776075 -64.40515381837798, 288.038546776075 -64.71780019613709, 278.7469807510403 -64.71780019613709, 278.7469807510403 -65.03044657389621, 275.5530049299347 -65.03044657389621, 275.5530049299347 -64.71780019613709, 274.39155917680534 -64.71780019613709, 274.39155917680534 -64.40515381837798, 273.230113423676 -64.40515381837798, 273.230113423676 -64.09250744061886, 271.77830623226436 -64.09250744061886, 271.77830623226436 -63.77986106285975, 270.32649904085264 -63.77986106285975, 270.32649904085264 -63.46721468510063, 269.1650532877233 -63.46721468510063, 269.1650532877233 -63.15456830734151, 267.71324609631165 -63.15456830734151, 267.71324609631165 -62.8419219295824, 265.97107746661766 -62.8419219295824, 265.97107746661766 -62.52927555182328, 264.22890883692367 -62.52927555182328, 264.22890883692367 -62.21662917406417, 262.19637876894734 -62.21662917406417, 262.19637876894734 -61.90398279630505, 260.16384870097096 -61.90398279630505, 260.16384870097096 -61.591336418545936, 258.13131863299463 -61.591336418545936, 258.13131863299463 -61.27869004078681, 256.0987885650183 -61.27869004078681, 256.0987885650183 -60.9660436630277, 254.06625849704199 -60.9660436630277, 254.06625849704199 -60.65339728526858, 250.0011983610893 -60.65339728526858, 250.0011983610893 -60.34075090750947, 245.93613822513663 -60.34075090750947, 245.93613822513663 -60.02810452975035, 242.16143952746629 -60.02810452975035, 242.16143952746629 -59.715458151991236, 238.6771022680783 -59.715458151991236, 238.6771022680783 -59.40281177423212, 235.1927650086903 -59.40281177423212, 235.1927650086903 -59.090165396473004, 231.9987891875846 -59.090165396473004, 231.9987891875846 -58.77751901871389, 230.2566205578906 -58.77751901871389, 230.2566205578906 -58.464872640954766, 229.09517480476129 -58.464872640954766, 229.09517480476129 -58.15222626319565, 227.93372905163193 -58.15222626319565, 227.93372905163193 -57.839579885436535, 226.7722832985026 -57.839579885436535, 226.7722832985026 -57.52693350767742, 225.61083754537327 -57.52693350767742, 225.61083754537327 -57.214287129918304, 224.1590303539616 -57.214287129918304, 224.1590303539616 -56.90164075215919, 222.99758460083228 -56.90164075215919, 222.99758460083228 -56.58899437440007, 221.5457774094206 -56.58899437440007, 221.5457774094206 -56.27634799664095, 220.09397021800893 -56.27634799664095, 220.09397021800893 -55.963701618881835, 218.35180158831494 -55.963701618881835, 218.35180158831494 -55.65105524112272, 216.3192715203386 -55.65105524112272, 216.3192715203386 -55.338408863363604, 213.99638001407993 -55.338408863363604, 213.99638001407993 -55.02576248560449, 210.2216813164096 -55.02576248560449, 210.2216813164096 -54.71311610784537, 199.47830809996324 -54.71311610784537, 199.47830809996324 -54.40046973008626, 197.15541659370456 -54.40046973008626, 197.15541659370456 -54.08782335232714, 196.86505515542223 -54.08782335232714, 196.86505515542223 -54.40046973008626, 195.41324796401057 -54.40046973008626, 195.41324796401057 -54.71311610784537, 194.25180221088124 -54.71311610784537, 194.25180221088124 -55.02576248560449, 192.79999501946958 -55.02576248560449, 192.79999501946958 -55.338408863363604, 191.3481878280579 -55.338408863363604, 191.3481878280579 -55.65105524112272, 190.18674207492856 -55.65105524112272, 190.18674207492856 -55.963701618881835, 188.7349348835169 -55.963701618881835, 188.7349348835169 -56.27634799664095, 187.57348913038757 -56.27634799664095, 187.57348913038757 -56.58899437440007, 186.41204337725821 -56.58899437440007, 186.41204337725821 -56.90164075215919, 185.2505976241289 -56.90164075215919, 185.2505976241289 -57.214287129918304, 184.08915187099956 -57.214287129918304, 184.08915187099956 -57.52693350767742, 183.21806755615256 -57.52693350767742, 183.21806755615256 -57.839579885436535, 182.05662180302323 -57.839579885436535, 182.05662180302323 -58.15222626319565, 181.1855374881762 -58.15222626319565, 181.1855374881762 -58.464872640954766, 180.02409173504688 -58.464872640954766, 180.02409173504688 -58.77751901871389, 178.86264598191755 -58.77751901871389, 178.86264598191755 -59.090165396473004, 177.99156166707056 -59.090165396473004, 177.99156166707056 -59.40281177423212, 176.8301159139412 -59.40281177423212, 176.8301159139412 -59.715458151991236, 175.66867016081187 -59.715458151991236, 175.66867016081187 -60.02810452975035, 174.79758584596487 -60.02810452975035, 174.79758584596487 -60.34075090750947, 171.6036100248592 -60.34075090750947, 171.6036100248592 -60.65339728526858, 167.53854988890654 -60.65339728526858, 167.53854988890654 -60.9660436630277, 163.47348975295387 -60.9660436630277, 163.47348975295387 -61.27869004078681, 157.08553811074253 -61.27869004078681, 157.08553811074253 -61.591336418545936, 137.63132174582617 -61.591336418545936, 137.63132174582617 -61.27869004078681, 135.01806880128515 -61.27869004078681, 135.01806880128515 -60.9660436630277, 132.6951772950265 -60.9660436630277, 132.6951772950265 -60.65339728526858, 130.9530086653325 -60.65339728526858, 130.9530086653325 -60.34075090750947, 129.50120147392082 -60.34075090750947, 129.50120147392082 -60.02810452975035, 128.04939428250916 -60.02810452975035, 128.04939428250916 -59.715458151991236, 126.59758709109748 -59.715458151991236, 126.59758709109748 -59.40281177423212, 125.43614133796815 -59.40281177423212, 125.43614133796815 -59.090165396473004, 124.27469558483881 -59.090165396473004, 124.27469558483881 -58.77751901871389, 123.11324983170948 -58.77751901871389, 123.11324983170948 -58.464872640954766, 121.95180407858015 -58.464872640954766, 121.95180407858015 -58.15222626319565, 120.79035832545081 -58.15222626319565, 120.79035832545081 -57.839579885436535, 119.62891257232148 -57.839579885436535, 119.62891257232148 -57.52693350767742, 118.75782825747447 -57.52693350767742, 118.75782825747447 -57.214287129918304, 117.59638250434514 -57.214287129918304, 117.59638250434514 -56.90164075215919, 114.40240668323948 -56.90164075215919, 114.40240668323948 -56.58899437440007, 111.78915373869847 -56.58899437440007, 111.78915373869847 -56.27634799664095, 109.75662367072213 -56.27634799664095, 109.75662367072213 -55.963701618881835, 108.01445504102813 -55.963701618881835, 108.01445504102813 -55.65105524112272, 106.56264784961647 -55.65105524112272, 106.56264784961647 -55.338408863363604, 101.04578052225212 -55.338408863363604, 101.04578052225212 -55.02576248560449, 90.88313018237044 -55.02576248560449, 90.88313018237044 -55.338408863363604, 87.9795157995471 -55.338408863363604, 87.9795157995471 -55.65105524112272, 85.94698573157078 -55.65105524112272, 85.94698573157078 -55.963701618881835, 84.20481710187677 -55.963701618881835, 84.20481710187677 -56.27634799664095, 76.6554197065361 -56.27634799664095, 76.6554197065361 -56.58899437440007, 72.59035957058342 -56.58899437440007), 
+  (72.29999813230108 -56.58899437440007, 69.39638374947775 -56.58899437440007, 69.39638374947775 -56.27634799664095, 66.78313080493675 -56.27634799664095, 66.78313080493675 -55.963701618881835, 64.46023929867808 -55.963701618881835, 64.46023929867808 -55.65105524112272, 61.84698635413707 -55.65105524112272, 61.84698635413707 -55.338408863363604, 60.395179162725405 -55.338408863363604, 60.395179162725405 -55.02576248560449, 59.23373340959607 -55.02576248560449, 59.23373340959607 -54.71311610784537, 58.072287656466735 -54.71311610784537, 58.072287656466735 -54.40046973008626, 57.20120334161974 -54.40046973008626, 57.20120334161974 -54.08782335232714, 56.0397575884904 -54.08782335232714, 56.0397575884904 -53.775176974568026, 55.1686732736434 -53.775176974568026, 55.1686732736434 -53.462530596808904, 54.297588958796396 -53.462530596808904, 54.297588958796396 -53.14988421904979, 53.71686608223173 -53.14988421904979, 53.71686608223173 -52.83723784129067, 52.84578176738473 -52.83723784129067, 52.84578176738473 -52.52459146353156, 51.97469745253773 -52.52459146353156, 51.97469745253773 -52.21194508577244, 51.39397457597306 -52.21194508577244, 51.39397457597306 -51.899298708013326, 50.52289026112606 -51.899298708013326, 50.52289026112606 -51.58665233025421, 49.942167384561394 -51.58665233025421, 49.942167384561394 -51.27400595249509, 49.07108306971439 -51.27400595249509, 49.07108306971439 -50.96135957473597, 47.909637316585055 -50.96135957473597, 47.909637316585055 -50.64871319697686, 46.74819156345572 -50.64871319697686, 46.74819156345572 -50.33606681921774, 45.58674581032639 -50.33606681921774, 45.58674581032639 -50.023420441458626, 44.71566149547939 -50.023420441458626, 44.71566149547939 -49.71077406369951, 43.55421574235005 -49.71077406369951, 43.55421574235005 -49.398127685940395, 42.39276998922072 -49.398127685940395, 42.39276998922072 -49.08548130818128, 41.23132423609138 -49.08548130818128, 41.23132423609138 -48.772834930422164, 40.36023992124438 -48.772834930422164, 40.36023992124438 -48.46018855266304, 39.19879416811505 -48.46018855266304, 39.19879416811505 -48.147542174903926, 38.32770985326805 -48.147542174903926, 38.32770985326805 -47.83489579714481, 37.16626410013871 -47.83489579714481, 37.16626410013871 -47.522249419385695, 35.714456908727044 -47.522249419385695, 35.714456908727044 -47.20960304162658, 34.26264971731538 -47.20960304162658, 34.26264971731538 -46.89695666386746, 32.81084252590371 -46.89695666386746, 32.81084252590371 -46.58431028610835, 31.359035334492038 -46.58431028610835, 31.359035334492038 -46.271663908349225, 29.616866704798035 -46.271663908349225, 29.616866704798035 -45.95901753059011, 27.5843366368217 -45.95901753059011, 27.5843366368217 -45.646371152830994, 24.39036081571603 -45.646371152830994, 24.39036081571603 -45.95901753059011, 22.06746930945736 -45.95901753059011, 22.06746930945736 -46.271663908349225, 20.906023556328027 -46.271663908349225, 20.906023556328027 -46.58431028610835, 19.74457780319869 -46.58431028610835), 
+  (72.29999813230108 -7.81615944397791, 70.26746806432475 -7.81615944397791, 70.26746806432475 -8.128805821737027, 67.07349224321908 -8.128805821737027, 67.07349224321908 -8.441452199496144, 63.29879354554874 -8.441452199496144, 63.29879354554874 -8.75409857725526, 59.5240948478784 -8.75409857725526, 59.5240948478784 -9.066744955014375, 55.74939615020807 -9.066744955014375, 55.74939615020807 -9.379391332773492, 51.68433601425539 -9.379391332773492, 51.68433601425539 -9.69203771053261, 47.61927587830272 -9.69203771053261, 47.61927587830272 -10.004684088291725, 44.13493861891472 -10.004684088291725, 44.13493861891472 -10.31733046605084, 40.06987848296205 -10.31733046605084, 40.06987848296205 -10.629976843809958, 36.29517978529171 -10.629976843809958, 36.29517978529171 -10.942623221569075, 32.23011964933904 -10.942623221569075, 32.23011964933904 -11.25526959932819, 28.165059513386367 -11.25526959932819, 28.165059513386367 -11.567915977087306, 24.680722253998365 -11.567915977087306, 24.680722253998365 -11.880562354846424, 21.777107871175026 -11.880562354846424, 21.777107871175026 -12.193208732605541, 19.74457780319869 -12.193208732605541), 
+  (92.62529881206444 0, 92.62529881206444 -0.3126463777591164, 92.91566025034678 -0.3126463777591164, 92.91566025034678 -0.6252927555182328, 93.20602168862911 -0.6252927555182328, 93.20602168862911 -0.9379391332773492, 93.49638312691144 -0.9379391332773492, 93.49638312691144 -1.2505855110364656, 93.78674456519379 -1.2505855110364656, 93.78674456519379 -1.563231888795582, 94.07710600347612 -1.563231888795582, 94.07710600347612 -3.126463777591164, 93.78674456519379 -3.126463777591164, 93.78674456519379 -3.4391101553502805, 93.20602168862911 -3.4391101553502805, 93.20602168862911 -3.751756533109397, 92.62529881206444 -3.751756533109397, 92.62529881206444 -4.064402910868513, 92.04457593549978 -4.064402910868513, 92.04457593549978 -4.37704928862763, 91.17349162065278 -4.37704928862763, 91.17349162065278 -4.689695666386746, 90.01204586752344 -4.689695666386746, 90.01204586752344 -5.002342044145863, 88.85060011439411 -5.002342044145863, 88.85060011439411 -5.314988421904979, 87.68915436126477 -5.314988421904979, 87.68915436126477 -5.627634799664095, 86.23734716985311 -5.627634799664095, 86.23734716985311 -5.940281177423212, 84.4951785401591 -5.940281177423212, 84.4951785401591 -6.252927555182328, 82.7530099104651 -6.252927555182328, 82.7530099104651 -6.565573932941445, 80.72047984248876 -6.565573932941445, 80.72047984248876 -6.878220310700561, 78.3975883362301 -6.878220310700561, 78.3975883362301 -7.1908666884596775, 76.07469682997143 -7.1908666884596775, 76.07469682997143 -7.503513066218794, 73.46144388543043 -7.503513066218794, 73.46144388543043 -7.81615944397791, 72.59035957058342 -7.81615944397791), 
+  (4.355421574235005 -43.7704928862763, 3.4843372593880044 -43.7704928862763, 3.4843372593880044 -44.08313926403542, 1.4518071914116684 -44.08313926403542, 1.4518071914116684 -44.39578564179453, 0 -44.39578564179453), 
+  (4.355421574235005 -13.13114786588289, 0.5807228765646674 -13.13114786588289, 0.5807228765646674 -13.443794243642007, 0 -13.443794243642007))MULTILINESTRING ((4.355421574235005 -33.765808797984576, 2.9036143828233367 -33.765808797984576, 2.9036143828233367 -34.07845517574369, 0 -34.07845517574369), 
+  (72.29999813230108 -48.46018855266304, 72.00963669401875 -48.46018855266304, 72.00963669401875 -48.147542174903926, 69.39638374947775 -48.147542174903926, 69.39638374947775 -47.83489579714481, 67.07349224321908 -47.83489579714481, 67.07349224321908 -47.522249419385695, 65.04096217524274 -47.522249419385695, 65.04096217524274 -47.20960304162658, 62.718070668984076 -47.20960304162658, 62.718070668984076 -46.89695666386746, 60.97590203929008 -46.89695666386746, 60.97590203929008 -46.58431028610835, 59.81445628616074 -46.58431028610835, 59.81445628616074 -46.271663908349225, 58.94337197131374 -46.271663908349225, 58.94337197131374 -45.95901753059011, 58.072287656466735 -45.95901753059011, 58.072287656466735 -45.646371152830994, 57.20120334161974 -45.646371152830994, 57.20120334161974 -45.33372477507188, 56.330119026772735 -45.33372477507188, 56.330119026772735 -45.02107839731276, 55.74939615020807 -45.02107839731276, 55.74939615020807 -44.70843201955365, 54.87831183536107 -44.70843201955365, 54.87831183536107 -44.39578564179453, 54.297588958796396 -44.39578564179453, 54.297588958796396 -44.08313926403542, 53.4265046439494 -44.08313926403542, 53.4265046439494 -43.7704928862763, 52.84578176738473 -43.7704928862763, 52.84578176738473 -43.45784650851718, 52.265058890820065 -43.45784650851718, 52.265058890820065 -43.14520013075806, 51.68433601425539 -43.14520013075806, 51.68433601425539 -42.83255375299895, 50.8132516994084 -42.83255375299895, 50.8132516994084 -42.51990737523983, 50.232528822843726 -42.51990737523983, 50.232528822843726 -42.20726099748072, 49.65180594627906 -42.20726099748072, 49.65180594627906 -41.8946146197216, 48.78072163143206 -41.8946146197216, 48.78072163143206 -41.581968241962485, 47.61927587830272 -41.581968241962485, 47.61927587830272 -41.26932186420336, 46.74819156345572 -41.26932186420336, 46.74819156345572 -40.95667548644425, 45.58674581032639 -40.95667548644425, 45.58674581032639 -40.64402910868513, 44.71566149547939 -40.64402910868513, 44.71566149547939 -40.331382730926016, 43.55421574235005 -40.331382730926016, 43.55421574235005 -40.0187363531669, 42.68313142750305 -40.0187363531669, 42.68313142750305 -39.706089975407785, 41.81204711265605 -39.706089975407785, 41.81204711265605 -39.39344359764867, 40.65060135952672 -39.39344359764867, 40.65060135952672 -39.080797219889554, 39.779517044679714 -39.080797219889554, 39.779517044679714 -38.76815084213044, 38.61807129155038 -38.76815084213044, 38.61807129155038 -38.455504464371316, 37.746986976703376 -38.455504464371316, 37.746986976703376 -38.1428580866122, 36.29517978529171 -38.1428580866122, 36.29517978529171 -37.830211708853085, 35.13373403216237 -37.830211708853085, 35.13373403216237 -37.51756533109397, 33.681926840750705 -37.51756533109397, 33.681926840750705 -37.204918953334854, 32.23011964933904 -37.204918953334854, 32.23011964933904 -36.89227257557574, 30.48795101964504 -36.89227257557574, 30.48795101964504 -36.57962619781662, 28.745782389951035 -36.57962619781662, 28.745782389951035 -36.2669798200575, 26.132529445410032 -36.2669798200575, 26.132529445410032 -35.954333442298385, 23.51927650086903 -35.954333442298385, 23.51927650086903 -36.2669798200575, 20.61566211804569 -36.2669798200575, 20.61566211804569 -36.57962619781662, 19.74457780319869 -36.57962619781662), 
+  (170.15180283344753 0, 170.15180283344753 -0.3126463777591164, 170.44216427172987 -0.3126463777591164, 170.44216427172987 -0.9379391332773492, 170.7325257100122 -0.9379391332773492, 170.7325257100122 -1.2505855110364656, 171.02288714829453 -1.2505855110364656, 171.02288714829453 -1.8758782665546985, 171.31324858657686 -1.8758782665546985, 171.31324858657686 -2.8138173998320477, 171.02288714829453 -2.8138173998320477, 171.02288714829453 -3.126463777591164, 170.7325257100122 -3.126463777591164, 170.7325257100122 -3.4391101553502805, 170.44216427172987 -3.4391101553502805, 170.44216427172987 -3.751756533109397, 170.15180283344753 -3.751756533109397, 170.15180283344753 -4.064402910868513, 169.57107995688287 -4.064402910868513, 169.57107995688287 -4.37704928862763, 168.69999564203587 -4.37704928862763, 168.69999564203587 -4.689695666386746, 167.82891132718888 -4.689695666386746, 167.82891132718888 -5.002342044145863, 166.95782701234188 -5.002342044145863, 166.95782701234188 -5.314988421904979, 165.79638125921252 -5.314988421904979, 165.79638125921252 -5.627634799664095, 164.6349355060832 -5.627634799664095, 164.6349355060832 -5.940281177423212, 163.18312831467154 -5.940281177423212, 163.18312831467154 -6.252927555182328, 160.86023680841285 -6.252927555182328, 160.86023680841285 -6.565573932941445, 158.24698386387186 -6.565573932941445, 158.24698386387186 -6.878220310700561, 155.63373091933084 -6.878220310700561, 155.63373091933084 -7.1908666884596775, 153.02047797478986 -7.1908666884596775, 153.02047797478986 -7.503513066218794, 150.1168635919665 -7.503513066218794, 150.1168635919665 -7.81615944397791, 147.21324920914319 -7.81615944397791, 147.21324920914319 -8.128805821737027, 144.30963482631984 -8.128805821737027, 144.30963482631984 -8.441452199496144, 141.40602044349652 -8.441452199496144, 141.40602044349652 -8.75409857725526, 137.9216831841085 -8.75409857725526, 137.9216831841085 -9.066744955014375, 134.14698448643816 -9.066744955014375, 134.14698448643816 -9.379391332773492, 130.3722857887678 -9.379391332773492, 130.3722857887678 -9.69203771053261, 126.59758709109748 -9.69203771053261, 126.59758709109748 -10.004684088291725, 122.53252695514482 -10.004684088291725, 122.53252695514482 -10.31733046605084, 118.17710538090981 -10.31733046605084, 118.17710538090981 -10.629976843809958, 114.40240668323948 -10.629976843809958, 114.40240668323948 -10.942623221569075, 110.3373465472868 -10.942623221569075, 110.3373465472868 -11.25526959932819, 106.27228641133412 -11.25526959932819, 106.27228641133412 -11.567915977087306, 102.49758771366379 -11.567915977087306, 102.49758771366379 -11.880562354846424, 98.72288901599346 -11.880562354846424, 98.72288901599346 -12.193208732605541, 94.94819031832311 -12.193208732605541, 94.94819031832311 -12.505855110364656, 91.46385305893511 -12.505855110364656, 91.46385305893511 -12.818501488123772, 87.9795157995471 -12.818501488123772, 87.9795157995471 -13.13114786588289, 84.20481710187677 -13.13114786588289, 84.20481710187677 -13.443794243642007, 80.1397569659241 -13.443794243642007, 80.1397569659241 -13.756440621401122, 75.49397395340675 -13.756440621401122, 75.49397395340675 -14.069086999160238, 72.59035957058342 -14.069086999160238), 
+  (72.29999813230108 -14.069086999160238, 70.84819094088942 -14.069086999160238, 70.84819094088942 -14.381733376919355, 65.91204649008975 -14.381733376919355, 65.91204649008975 -14.694379754678472, 60.68554060100774 -14.694379754678472, 60.68554060100774 -15.007026132437588, 55.74939615020807 -15.007026132437588, 55.74939615020807 -15.319672510196703, 50.232528822843726 -15.319672510196703, 50.232528822843726 -15.63231888795582, 45.87710724860872 -15.63231888795582, 45.87710724860872 -15.944965265714938, 41.521685674373714 -15.944965265714938, 41.521685674373714 -16.257611643474053, 37.16626410013871 -16.257611643474053, 37.16626410013871 -16.57025802123317, 32.23011964933904 -16.57025802123317, 32.23011964933904 -16.882904398992288, 27.003613760257032 -16.882904398992288, 27.003613760257032 -17.195550776751404, 24.099999377433697 -17.195550776751404, 24.099999377433697 -17.50819715451052, 21.19638499461036 -17.50819715451052, 21.19638499461036 -17.820843532269635, 19.74457780319869 -17.820843532269635), 
+  (4.355421574235005 -18.13348991002875, 3.4843372593880044 -18.13348991002875, 3.4843372593880044 -18.44613628778787, 0 -18.44613628778787), 
+  (297.3301128011097 -55.65105524112272, 297.03975136282736 -55.65105524112272, 297.03975136282736 -55.963701618881835, 295.87830560969803 -55.963701618881835, 295.87830560969803 -56.27634799664095, 295.00722129485104 -56.27634799664095, 295.00722129485104 -56.58899437440007, 294.13613698000404 -56.58899437440007, 294.13613698000404 -56.90164075215919, 293.26505266515704 -56.90164075215919, 293.26505266515704 -57.214287129918304, 292.39396835031005 -57.214287129918304, 292.39396835031005 -57.52693350767742, 291.8132454737453 -57.52693350767742, 291.8132454737453 -57.839579885436535, 290.94216115889833 -57.839579885436535, 290.94216115889833 -58.15222626319565, 290.07107684405133 -58.15222626319565, 290.07107684405133 -58.464872640954766, 289.19999252920434 -58.464872640954766, 289.19999252920434 -58.77751901871389, 288.32890821435734 -58.77751901871389, 288.32890821435734 -59.090165396473004, 277.29517355962867 -59.090165396473004, 277.29517355962867 -59.40281177423212, 276.13372780649934 -59.40281177423212, 276.13372780649934 -59.090165396473004, 274.97228205337 -59.090165396473004, 274.97228205337 -58.77751901871389, 273.8108363002407 -58.77751901871389, 273.8108363002407 -58.464872640954766, 272.64939054711135 -58.464872640954766, 272.64939054711135 -58.15222626319565, 271.48794479398197 -58.15222626319565, 271.48794479398197 -57.839579885436535, 270.32649904085264 -57.839579885436535, 270.32649904085264 -57.52693350767742, 268.874691849441 -57.52693350767742, 268.874691849441 -57.214287129918304, 267.71324609631165 -57.214287129918304, 267.71324609631165 -56.90164075215919, 266.2614389049 -56.90164075215919, 266.2614389049 -56.58899437440007, 264.519270275206 -56.58899437440007, 264.519270275206 -56.27634799664095, 262.19637876894734 -56.27634799664095, 262.19637876894734 -55.963701618881835, 259.8734872626886 -55.963701618881835, 259.8734872626886 -55.65105524112272, 257.26023431814764 -55.65105524112272, 257.26023431814764 -55.338408863363604, 254.93734281188898 -55.338408863363604, 254.93734281188898 -55.02576248560449, 251.7433669907833 -55.02576248560449, 251.7433669907833 -54.71311610784537, 247.09758397826596 -54.71311610784537, 247.09758397826596 -54.40046973008626, 242.45180096574862 -54.40046973008626, 242.45180096574862 -54.08782335232714, 238.96746370636063 -54.08782335232714, 238.96746370636063 -53.775176974568026, 235.48312644697262 -53.775176974568026, 235.48312644697262 -53.462530596808904, 232.28915062586694 -53.462530596808904, 232.28915062586694 -53.14988421904979, 230.54698199617295 -53.14988421904979, 230.54698199617295 -52.83723784129067, 229.38553624304362 -52.83723784129067, 229.38553624304362 -52.52459146353156, 228.51445192819662 -52.52459146353156, 228.51445192819662 -52.21194508577244, 227.35300617506726 -52.21194508577244, 227.35300617506726 -51.899298708013326, 226.48192186022027 -51.899298708013326, 226.48192186022027 -51.58665233025421, 225.32047610709094 -51.58665233025421, 225.32047610709094 -51.27400595249509, 224.1590303539616 -51.27400595249509, 224.1590303539616 -50.96135957473597, 222.99758460083228 -50.96135957473597, 222.99758460083228 -50.64871319697686, 221.5457774094206 -50.64871319697686, 221.5457774094206 -50.33606681921774, 220.38433165629127 -50.33606681921774, 220.38433165629127 -50.023420441458626, 218.64216302659727 -50.023420441458626, 218.64216302659727 -49.71077406369951, 216.89999439690325 -49.71077406369951, 216.89999439690325 -49.398127685940395, 214.28674145236226 -49.398127685940395, 214.28674145236226 -49.08548130818128, 211.09276563125658 -49.08548130818128, 211.09276563125658 -48.772834930422164, 202.09156104450423 -48.772834930422164, 202.09156104450423 -48.46018855266304, 198.89758522339858 -48.46018855266304, 198.89758522339858 -48.147542174903926, 195.7036094022929 -48.147542174903926, 195.7036094022929 -48.46018855266304, 194.25180221088124 -48.46018855266304, 194.25180221088124 -48.772834930422164, 192.79999501946958 -48.772834930422164, 192.79999501946958 -49.08548130818128, 191.63854926634022 -49.08548130818128, 191.63854926634022 -49.398127685940395, 190.18674207492856 -49.398127685940395, 190.18674207492856 -49.71077406369951, 188.7349348835169 -49.71077406369951, 188.7349348835169 -50.023420441458626, 187.57348913038757 -50.023420441458626, 187.57348913038757 -50.33606681921774, 186.12168193897588 -50.33606681921774, 186.12168193897588 -50.64871319697686, 184.96023618584655 -50.64871319697686, 184.96023618584655 -50.96135957473597, 183.79879043271723 -50.96135957473597, 183.79879043271723 -51.27400595249509, 182.6373446795879 -51.27400595249509, 182.6373446795879 -51.58665233025421, 181.47589892645854 -51.58665233025421, 181.47589892645854 -51.899298708013326, 180.3144531733292 -51.899298708013326, 180.3144531733292 -52.21194508577244, 179.15300742019988 -52.21194508577244, 179.15300742019988 -52.52459146353156, 177.99156166707056 -52.52459146353156, 177.99156166707056 -52.83723784129067, 176.8301159139412 -52.83723784129067, 176.8301159139412 -53.14988421904979, 175.9590315990942 -53.14988421904979, 175.9590315990942 -53.462530596808904, 174.79758584596487 -53.462530596808904, 174.79758584596487 -53.775176974568026, 170.7325257100122 -53.775176974568026, 170.7325257100122 -54.08782335232714, 165.79638125921252 -54.08782335232714, 165.79638125921252 -54.40046973008626, 157.6662609873072 -54.40046973008626, 157.6662609873072 -54.71311610784537, 142.2771047583435 -54.71311610784537, 142.2771047583435 -54.40046973008626, 138.21204462239083 -54.40046973008626, 138.21204462239083 -54.08782335232714, 135.88915311613218 -54.08782335232714, 135.88915311613218 -53.775176974568026, 133.85662304815583 -53.775176974568026, 133.85662304815583 -53.462530596808904, 132.40481585674416 -53.462530596808904, 132.40481585674416 -53.14988421904979, 130.9530086653325 -53.14988421904979, 130.9530086653325 -52.83723784129067, 129.50120147392082 -52.83723784129067, 129.50120147392082 -52.52459146353156, 128.3397557207915 -52.52459146353156, 128.3397557207915 -52.21194508577244, 127.17830996766216 -52.21194508577244, 127.17830996766216 -51.899298708013326, 126.01686421453282 -51.899298708013326, 126.01686421453282 -51.58665233025421, 125.14577989968582 -51.58665233025421, 125.14577989968582 -51.27400595249509, 123.98433414655648 -51.27400595249509, 123.98433414655648 -50.96135957473597, 123.11324983170948 -50.96135957473597, 123.11324983170948 -50.64871319697686, 122.24216551686249 -50.64871319697686, 122.24216551686249 -50.33606681921774, 121.08071976373314 -50.33606681921774, 121.08071976373314 -50.023420441458626, 120.20963544888615 -50.023420441458626, 120.20963544888615 -49.71077406369951, 119.33855113403915 -49.71077406369951, 119.33855113403915 -49.398127685940395, 118.46746681919214 -49.398127685940395, 118.46746681919214 -49.08548130818128, 117.30602106606281 -49.08548130818128, 117.30602106606281 -48.772834930422164, 114.40240668323948 -48.772834930422164, 114.40240668323948 -48.46018855266304, 112.36987661526314 -48.46018855266304, 112.36987661526314 -48.147542174903926, 110.62770798556913 -48.147542174903926, 110.62770798556913 -47.83489579714481, 108.88553935587512 -47.83489579714481, 108.88553935587512 -47.522249419385695, 107.7240936027458 -47.522249419385695, 107.7240936027458 -47.20960304162658, 106.27228641133412 -47.20960304162658, 106.27228641133412 -46.89695666386746, 101.91686483709913 -46.89695666386746, 101.91686483709913 -46.58431028610835, 96.69035894801712 -46.58431028610835, 96.69035894801712 -46.271663908349225, 92.91566025034678 -46.271663908349225, 92.91566025034678 -46.58431028610835, 89.72168442924111 -46.58431028610835, 89.72168442924111 -46.89695666386746, 87.39879292298244 -46.89695666386746, 87.39879292298244 -47.20960304162658, 85.65662429328843 -47.20960304162658, 85.65662429328843 -47.522249419385695, 83.91445566359444 -47.522249419385695, 83.91445566359444 -47.83489579714481, 76.94578114481843 -47.83489579714481, 76.94578114481843 -48.147542174903926, 72.59035957058342 -48.147542174903926))MULTILINESTRING ((246.80722253998363 0, 246.80722253998363 -0.3126463777591164, 247.09758397826596 -0.3126463777591164, 247.09758397826596 -0.9379391332773492, 247.3879454165483 -0.9379391332773492, 247.3879454165483 -1.8758782665546985, 247.67830685483062 -1.8758782665546985, 247.67830685483062 -2.5011710220729313, 247.3879454165483 -2.5011710220729313, 247.3879454165483 -3.4391101553502805, 247.09758397826596 -3.4391101553502805, 247.09758397826596 -3.751756533109397, 246.80722253998363 -3.751756533109397, 246.80722253998363 -4.064402910868513, 246.5168611017013 -4.064402910868513, 246.5168611017013 -4.37704928862763, 245.93613822513663 -4.37704928862763, 245.93613822513663 -4.689695666386746, 245.6457767868543 -4.689695666386746, 245.6457767868543 -5.002342044145863, 245.06505391028963 -5.002342044145863, 245.06505391028963 -5.314988421904979, 244.48433103372497 -5.314988421904979, 244.48433103372497 -5.627634799664095, 243.61324671887797 -5.627634799664095, 243.61324671887797 -5.940281177423212, 242.74216240403095 -5.940281177423212, 242.74216240403095 -6.252927555182328, 242.16143952746629 -6.252927555182328, 242.16143952746629 -6.565573932941445, 241.2903552126193 -6.565573932941445, 241.2903552126193 -6.878220310700561, 240.4192708977723 -6.878220310700561, 240.4192708977723 -7.1908666884596775, 239.83854802120763 -7.1908666884596775, 239.83854802120763 -7.503513066218794, 238.6771022680783 -7.503513066218794, 238.6771022680783 -7.81615944397791, 237.80601795323128 -7.81615944397791, 237.80601795323128 -8.128805821737027, 236.93493363838428 -8.128805821737027, 236.93493363838428 -8.441452199496144, 235.77348788525495 -8.441452199496144, 235.77348788525495 -8.75409857725526, 234.61204213212562 -8.75409857725526, 234.61204213212562 -9.066744955014375, 233.74095781727863 -9.066744955014375, 233.74095781727863 -9.379391332773492, 232.57951206414927 -9.379391332773492, 232.57951206414927 -9.69203771053261, 231.1277048727376 -9.69203771053261, 231.1277048727376 -10.004684088291725, 229.67589768132595 -10.004684088291725, 229.67589768132595 -10.31733046605084, 228.2240904899143 -10.31733046605084, 228.2240904899143 -10.629976843809958, 226.48192186022027 -10.629976843809958, 226.48192186022027 -10.942623221569075, 224.73975323052628 -10.942623221569075, 224.73975323052628 -11.25526959932819, 222.70722316254992 -11.25526959932819, 222.70722316254992 -11.567915977087306, 220.6746930945736 -11.567915977087306, 220.6746930945736 -11.880562354846424, 218.0614401500326 -11.880562354846424, 218.0614401500326 -12.193208732605541, 214.5771028906446 -12.193208732605541, 214.5771028906446 -12.505855110364656, 210.2216813164096 -12.505855110364656, 210.2216813164096 -12.818501488123772, 200.34939241481024 -12.818501488123772, 200.34939241481024 -13.13114786588289, 192.79999501946958 -13.13114786588289, 192.79999501946958 -13.443794243642007, 187.8638505686699 -13.443794243642007, 187.8638505686699 -13.756440621401122, 183.5084289944349 -13.756440621401122, 183.5084289944349 -14.069086999160238, 180.02409173504688 -14.069086999160238, 180.02409173504688 -14.381733376919355, 176.24939303737654 -14.381733376919355, 176.24939303737654 -14.694379754678472, 171.6036100248592 -14.694379754678472, 171.6036100248592 -15.007026132437588, 166.3771041357772 -15.007026132437588, 166.3771041357772 -15.319672510196703, 157.95662242558953 -15.319672510196703, 157.95662242558953 -15.63231888795582, 148.08433352399018 -15.63231888795582, 148.08433352399018 -15.944965265714938, 139.6638518138025 -15.944965265714938, 139.6638518138025 -16.257611643474053, 132.98553873330883 -16.257611643474053, 132.98553873330883 -16.57025802123317, 127.46867140594449 -16.57025802123317, 127.46867140594449 -16.882904398992288, 123.69397270827415 -16.882904398992288, 123.69397270827415 -17.195550776751404, 119.33855113403915 -17.195550776751404, 119.33855113403915 -17.50819715451052, 115.27349099808647 -17.50819715451052, 115.27349099808647 -17.820843532269635, 111.2084308621338 -17.820843532269635, 111.2084308621338 -18.13348991002875, 107.14337072618113 -18.13348991002875, 107.14337072618113 -18.44613628778787, 102.49758771366379 -18.44613628778787, 102.49758771366379 -18.758782665546985, 98.43252757771111 -18.758782665546985, 98.43252757771111 -19.0714290433061, 94.94819031832311 -19.0714290433061, 94.94819031832311 -19.38407542106522, 90.88313018237044 -19.38407542106522, 90.88313018237044 -19.696721798824335, 86.81807004641777 -19.696721798824335, 86.81807004641777 -20.00936817658345, 82.7530099104651 -20.00936817658345, 82.7530099104651 -20.322014554342566, 78.97831121279476 -20.322014554342566, 78.97831121279476 -20.63466093210168, 74.62288963855976 -20.63466093210168, 74.62288963855976 -20.9473073098608, 72.59035957058342 -20.9473073098608), 
+  (72.29999813230108 -20.9473073098608, 70.55782950260709 -20.9473073098608, 70.55782950260709 -21.259953687619916, 67.65421511978374 -21.259953687619916, 67.65421511978374 -21.57260006537903, 64.75060073696041 -21.57260006537903, 64.75060073696041 -21.88524644313815, 62.137347792419405 -21.88524644313815, 62.137347792419405 -22.197892820897266, 60.10481772444307 -22.197892820897266, 60.10481772444307 -22.51053919865638, 58.653010533031406 -22.51053919865638, 58.653010533031406 -22.823185576415497, 57.20120334161974 -22.823185576415497, 57.20120334161974 -23.135831954174613, 55.74939615020807 -23.135831954174613, 55.74939615020807 -23.44847833193373, 54.587950397078735 -23.44847833193373, 54.587950397078735 -23.761124709692847, 53.71686608223173 -23.761124709692847, 53.71686608223173 -24.073771087451963, 52.84578176738473 -24.073771087451963, 52.84578176738473 -24.386417465211082, 51.97469745253773 -24.386417465211082, 51.97469745253773 -24.699063842970197, 51.39397457597306 -24.699063842970197, 51.39397457597306 -25.011710220729313, 51.10361313769073 -25.011710220729313, 51.10361313769073 -25.32435659848843, 50.52289026112606 -25.32435659848843, 50.52289026112606 -25.637002976247544, 50.232528822843726 -25.637002976247544, 50.232528822843726 -26.26229573176578, 49.942167384561394 -26.26229573176578, 49.942167384561394 -27.20023486504313, 50.232528822843726 -27.20023486504313, 50.232528822843726 -27.82552762056136, 50.52289026112606 -27.82552762056136, 50.52289026112606 -28.450820376079594, 50.8132516994084 -28.450820376079594, 50.8132516994084 -28.76346675383871, 51.10361313769073 -28.76346675383871, 51.10361313769073 -29.076113131597825, 51.39397457597306 -29.076113131597825, 51.39397457597306 -29.388759509356944, 51.68433601425539 -29.388759509356944, 51.68433601425539 -29.70140588711606, 51.97469745253773 -29.70140588711606, 51.97469745253773 -30.014052264875176, 52.5554203291024 -30.014052264875176, 52.5554203291024 -30.32669864263429, 52.84578176738473 -30.32669864263429, 52.84578176738473 -30.639345020393407, 53.13614320566706 -30.639345020393407, 53.13614320566706 -30.951991398152526, 53.71686608223173 -30.951991398152526, 53.71686608223173 -31.26463777591164, 54.007227520514064 -31.26463777591164, 54.007227520514064 -31.577284153670757, 54.587950397078735 -31.577284153670757, 54.587950397078735 -31.889930531429876, 54.87831183536107 -31.889930531429876, 54.87831183536107 -32.20257690918899, 55.45903471192573 -32.20257690918899, 55.45903471192573 -32.51522328694811, 56.0397575884904 -32.51522328694811, 56.0397575884904 -32.82786966470722, 56.62048046505507 -32.82786966470722, 56.62048046505507 -33.14051604246634, 57.20120334161974 -33.14051604246634, 57.20120334161974 -33.45316242022545, 57.49156477990207 -33.45316242022545, 57.49156477990207 -33.765808797984576, 58.072287656466735 -33.765808797984576, 58.072287656466735 -34.07845517574369, 58.653010533031406 -34.07845517574369, 58.653010533031406 -34.39110155350281, 59.5240948478784 -34.39110155350281, 59.5240948478784 -34.70374793126192, 60.10481772444307 -34.70374793126192, 60.10481772444307 -35.01639430902104, 60.68554060100774 -35.01639430902104, 60.68554060100774 -35.329040686780154, 61.84698635413707 -35.329040686780154, 61.84698635413707 -35.64168706453927, 63.00843210726641 -35.64168706453927, 63.00843210726641 -35.954333442298385, 64.46023929867808 -35.954333442298385, 64.46023929867808 -36.2669798200575, 65.91204649008975 -36.2669798200575, 65.91204649008975 -36.57962619781662, 67.36385368150141 -36.57962619781662, 67.36385368150141 -36.89227257557574, 68.81566087291309 -36.89227257557574, 68.81566087291309 -37.204918953334854, 70.55782950260709 -37.204918953334854, 70.55782950260709 -37.51756533109397, 72.29999813230108 -37.51756533109397), 
+  (297.3301128011097 -49.71077406369951, 296.4590284862627 -49.71077406369951, 296.4590284862627 -50.023420441458626, 295.5879441714157 -50.023420441458626, 295.5879441714157 -50.33606681921774, 294.7168598565687 -50.33606681921774, 294.7168598565687 -50.64871319697686, 293.8457755417217 -50.64871319697686, 293.8457755417217 -50.96135957473597, 292.9746912268747 -50.96135957473597, 292.9746912268747 -51.27400595249509, 292.39396835031005 -51.27400595249509, 292.39396835031005 -51.58665233025421, 291.522884035463 -51.58665233025421, 291.522884035463 -51.899298708013326, 290.651799720616 -51.899298708013326, 290.651799720616 -52.21194508577244, 290.07107684405133 -52.21194508577244, 290.07107684405133 -52.52459146353156, 289.19999252920434 -52.52459146353156, 289.19999252920434 -52.83723784129067, 288.6192696526397 -52.83723784129067, 288.6192696526397 -53.14988421904979, 287.7481853377927 -53.14988421904979, 287.7481853377927 -53.462530596808904, 286.58673958466335 -53.462530596808904, 286.58673958466335 -53.14988421904979, 275.843366368217 -53.14988421904979, 275.843366368217 -52.83723784129067, 274.97228205337 -52.83723784129067, 274.97228205337 -52.52459146353156, 274.101197738523 -52.52459146353156, 274.101197738523 -52.21194508577244, 272.9397519853937 -52.21194508577244, 272.9397519853937 -51.899298708013326, 272.0686676705467 -51.899298708013326, 272.0686676705467 -51.58665233025421, 270.9072219174173 -51.58665233025421, 270.9072219174173 -51.27400595249509, 269.745776164288 -51.27400595249509, 269.745776164288 -50.96135957473597, 268.874691849441 -50.96135957473597, 268.874691849441 -50.64871319697686, 267.71324609631165 -50.64871319697686, 267.71324609631165 -50.33606681921774, 266.5518003431823 -50.33606681921774, 266.5518003431823 -50.023420441458626, 265.390354590053 -50.023420441458626, 265.390354590053 -49.71077406369951, 262.777101645512 -49.71077406369951, 262.777101645512 -49.398127685940395, 260.16384870097096 -49.398127685940395, 260.16384870097096 -49.08548130818128, 257.55059575642997 -49.08548130818128, 257.55059575642997 -48.772834930422164, 254.93734281188898 -48.772834930422164, 254.93734281188898 -48.46018855266304, 250.0011983610893 -48.46018855266304, 250.0011983610893 -48.147542174903926, 243.9036081571603 -48.147542174903926, 243.9036081571603 -47.83489579714481, 240.4192708977723 -47.83489579714481, 240.4192708977723 -47.522249419385695, 237.51565651494894 -47.522249419385695, 237.51565651494894 -47.20960304162658, 234.90240357040796 -47.20960304162658, 234.90240357040796 -46.89695666386746, 232.28915062586694 -46.89695666386746, 232.28915062586694 -46.58431028610835, 230.54698199617295 -46.58431028610835, 230.54698199617295 -46.271663908349225, 229.96625911960828 -46.271663908349225, 229.96625911960828 -45.95901753059011, 229.09517480476129 -45.95901753059011, 229.09517480476129 -45.646371152830994, 228.2240904899143 -45.646371152830994, 228.2240904899143 -45.33372477507188, 227.35300617506726 -45.33372477507188, 227.35300617506726 -45.02107839731276, 226.48192186022027 -45.02107839731276, 226.48192186022027 -44.70843201955365, 225.61083754537327 -44.70843201955365, 225.61083754537327 -44.39578564179453, 224.73975323052628 -44.39578564179453, 224.73975323052628 -44.08313926403542, 223.86866891567928 -44.08313926403542, 223.86866891567928 -43.7704928862763, 222.70722316254992 -43.7704928862763, 222.70722316254992 -43.45784650851718, 221.83613884770293 -43.45784650851718, 221.83613884770293 -43.14520013075806, 220.6746930945736 -43.14520013075806, 220.6746930945736 -42.83255375299895, 219.51324734144427 -42.83255375299895, 219.51324734144427 -42.51990737523983, 217.19035583518558 -42.51990737523983, 217.19035583518558 -42.20726099748072, 214.5771028906446 -42.20726099748072, 214.5771028906446 -41.8946146197216, 211.09276563125658 -41.8946146197216, 211.09276563125658 -41.581968241962485, 203.83372967419825 -41.581968241962485, 203.83372967419825 -41.26932186420336, 200.0590309765279 -41.26932186420336, 200.0590309765279 -40.95667548644425, 197.44577803198692 -40.95667548644425, 197.44577803198692 -40.64402910868513, 196.5746937171399 -40.64402910868513, 196.5746937171399 -40.95667548644425, 195.41324796401057 -40.95667548644425, 195.41324796401057 -41.26932186420336, 193.9614407725989 -41.26932186420336, 193.9614407725989 -41.581968241962485, 192.50963358118724 -41.581968241962485, 192.50963358118724 -41.8946146197216, 191.05782638977556 -41.8946146197216, 191.05782638977556 -42.20726099748072, 189.89638063664623 -42.20726099748072, 189.89638063664623 -42.51990737523983, 188.44457344523457 -42.51990737523983, 188.44457344523457 -42.83255375299895, 186.99276625382288 -42.83255375299895, 186.99276625382288 -43.14520013075806, 185.83132050069355 -43.14520013075806, 185.83132050069355 -43.45784650851718, 184.3795133092819 -43.45784650851718, 184.3795133092819 -43.7704928862763, 182.92770611787023 -43.7704928862763, 182.92770611787023 -44.08313926403542, 181.76626036474087 -44.08313926403542, 181.76626036474087 -44.39578564179453, 180.60481461161154 -44.39578564179453, 180.60481461161154 -44.70843201955365, 179.15300742019988 -44.70843201955365, 179.15300742019988 -45.02107839731276, 177.99156166707056 -45.02107839731276, 177.99156166707056 -45.33372477507188, 177.12047735222356 -45.33372477507188, 177.12047735222356 -45.646371152830994, 175.9590315990942 -45.646371152830994, 175.9590315990942 -45.95901753059011, 174.79758584596487 -45.95901753059011, 174.79758584596487 -46.271663908349225, 169.28071851860054 -46.271663908349225, 169.28071851860054 -46.58431028610835, 161.73132112325987 -46.58431028610835, 161.73132112325987 -46.89695666386746, 149.82650215368417 -46.89695666386746, 149.82650215368417 -46.58431028610835, 141.69638188177885 -46.58431028610835, 141.69638188177885 -46.271663908349225, 138.7927674989555 -46.271663908349225, 138.7927674989555 -45.95901753059011, 137.0505988692615 -45.95901753059011, 137.0505988692615 -45.646371152830994, 135.30843023956749 -45.646371152830994, 135.30843023956749 -45.33372477507188, 133.85662304815583 -45.33372477507188, 133.85662304815583 -45.02107839731276, 132.6951772950265 -45.02107839731276, 132.6951772950265 -44.70843201955365, 131.53373154189717 -44.70843201955365, 131.53373154189717 -44.39578564179453, 130.3722857887678 -44.39578564179453, 130.3722857887678 -44.08313926403542, 129.50120147392082 -44.08313926403542, 129.50120147392082 -43.7704928862763, 128.3397557207915 -43.7704928862763, 128.3397557207915 -43.45784650851718, 127.46867140594449 -43.45784650851718, 127.46867140594449 -43.14520013075806, 126.59758709109748 -43.14520013075806, 126.59758709109748 -42.83255375299895, 125.72650277625048 -42.83255375299895, 125.72650277625048 -42.51990737523983, 125.14577989968582 -42.51990737523983, 125.14577989968582 -42.20726099748072, 124.27469558483881 -42.20726099748072, 124.27469558483881 -41.8946146197216, 123.40361126999181 -41.8946146197216, 123.40361126999181 -41.581968241962485, 122.82288839342715 -41.581968241962485, 122.82288839342715 -41.26932186420336, 121.95180407858015 -41.26932186420336, 121.95180407858015 -40.95667548644425, 121.08071976373314 -40.95667548644425, 121.08071976373314 -40.64402910868513, 120.49999688716848 -40.64402910868513, 120.49999688716848 -40.331382730926016, 119.62891257232148 -40.331382730926016, 119.62891257232148 -40.0187363531669, 119.0481896957568 -40.0187363531669, 119.0481896957568 -39.706089975407785, 118.17710538090981 -39.706089975407785, 118.17710538090981 -39.39344359764867, 117.01565962778048 -39.39344359764867, 117.01565962778048 -39.080797219889554, 114.98312955980414 -39.080797219889554, 114.98312955980414 -38.76815084213044, 113.24096093011013 -38.76815084213044, 113.24096093011013 -38.455504464371316, 111.78915373869847 -38.455504464371316, 111.78915373869847 -38.1428580866122, 110.3373465472868 -38.1428580866122, 110.3373465472868 -37.830211708853085, 109.17590079415747 -37.830211708853085, 109.17590079415747 -37.51756533109397, 108.01445504102813 -37.51756533109397, 108.01445504102813 -37.204918953334854, 106.8530092878988 -37.204918953334854, 106.8530092878988 -36.89227257557574, 104.82047921992246 -36.89227257557574, 104.82047921992246 -36.57962619781662, 101.33614196053446 -36.57962619781662, 101.33614196053446 -36.2669798200575, 97.85180470114645 -36.2669798200575, 97.85180470114645 -35.954333442298385, 90.01204586752344 -35.954333442298385, 90.01204586752344 -36.2669798200575, 87.68915436126477 -36.2669798200575, 87.68915436126477 -36.57962619781662, 85.65662429328843 -36.57962619781662, 85.65662429328843 -36.89227257557574, 84.20481710187677 -36.89227257557574, 84.20481710187677 -37.204918953334854, 76.07469682997143 -37.204918953334854, 76.07469682997143 -37.51756533109397, 72.59035957058342 -37.51756533109397))MULTILINESTRING ((179.15300742019988 -30.014052264875176, 179.15300742019988 -29.388759509356944, 179.44336885848222 -29.388759509356944, 179.44336885848222 -29.076113131597825, 179.15300742019988 -29.076113131597825, 179.15300742019988 -28.450820376079594, 178.86264598191755 -28.450820376079594, 178.86264598191755 -28.138173998320475, 178.57228454363522 -28.138173998320475, 178.57228454363522 -27.82552762056136, 177.99156166707056 -27.82552762056136, 177.99156166707056 -27.512881242802244, 177.12047735222356 -27.512881242802244, 177.12047735222356 -27.20023486504313, 175.9590315990942 -27.20023486504313, 175.9590315990942 -26.887588487284013, 172.1843329014239 -26.887588487284013, 172.1843329014239 -27.20023486504313, 170.15180283344753 -27.20023486504313, 170.15180283344753 -27.512881242802244, 168.1192727654712 -27.512881242802244, 168.1192727654712 -27.82552762056136, 166.08674269749486 -27.82552762056136, 166.08674269749486 -28.138173998320475, 164.34457406780086 -28.138173998320475, 164.34457406780086 -28.450820376079594, 162.31204399982454 -28.450820376079594, 162.31204399982454 -28.76346675383871, 159.98915249356585 -28.76346675383871, 159.98915249356585 -29.076113131597825, 158.24698386387186 -29.076113131597825, 158.24698386387186 -29.388759509356944, 157.08553811074253 -29.388759509356944, 157.08553811074253 -29.70140588711606, 155.92409235761318 -29.70140588711606, 155.92409235761318 -30.014052264875176, 155.3433694810485 -30.014052264875176, 155.3433694810485 -30.951991398152526, 155.92409235761318 -30.951991398152526, 155.92409235761318 -31.26463777591164, 156.7951766724602 -31.26463777591164, 156.7951766724602 -31.577284153670757, 158.24698386387186 -31.577284153670757, 158.24698386387186 -31.889930531429876, 159.98915249356585 -31.889930531429876, 159.98915249356585 -32.20257690918899, 162.0216825615422 -32.20257690918899, 162.0216825615422 -32.51522328694811, 166.08674269749486 -32.51522328694811, 166.08674269749486 -32.82786966470722, 171.02288714829453 -32.82786966470722, 171.02288714829453 -33.14051604246634, 174.79758584596487 -33.14051604246634, 174.79758584596487 -32.82786966470722, 175.37830872252954 -32.82786966470722, 175.37830872252954 -32.51522328694811, 175.9590315990942 -32.51522328694811, 175.9590315990942 -32.20257690918899, 176.24939303737654 -32.20257690918899, 176.24939303737654 -31.889930531429876, 176.8301159139412 -31.889930531429876, 176.8301159139412 -31.577284153670757, 177.4108387905059 -31.577284153670757, 177.4108387905059 -31.26463777591164, 177.70120022878822 -31.26463777591164, 177.70120022878822 -30.951991398152526, 178.2819231053529 -30.951991398152526, 178.2819231053529 -30.639345020393407, 178.57228454363522 -30.639345020393407, 178.57228454363522 -30.32669864263429, 178.86264598191755 -30.32669864263429, 178.86264598191755 -30.014052264875176, 179.15300742019988 -30.014052264875176), 
+  (297.3301128011097 -9.69203771053261, 297.03975136282736 -9.69203771053261, 297.03975136282736 -10.004684088291725, 296.749389924545 -10.004684088291725, 296.749389924545 -10.31733046605084, 296.4590284862627 -10.31733046605084, 296.4590284862627 -10.629976843809958, 296.16866704798036 -10.629976843809958, 296.16866704798036 -10.942623221569075, 295.5879441714157 -10.942623221569075, 295.5879441714157 -11.25526959932819, 295.29758273313337 -11.25526959932819, 295.29758273313337 -11.567915977087306, 294.7168598565687 -11.567915977087306, 294.7168598565687 -11.880562354846424, 294.42649841828637 -11.880562354846424, 294.42649841828637 -12.193208732605541, 293.8457755417217 -12.193208732605541, 293.8457755417217 -12.505855110364656, 293.26505266515704 -12.505855110364656, 293.26505266515704 -12.818501488123772, 292.6843297885924 -12.818501488123772, 292.6843297885924 -13.13114786588289, 292.39396835031005 -13.13114786588289, 292.39396835031005 -13.443794243642007, 291.8132454737453 -13.443794243642007, 291.8132454737453 -13.756440621401122, 291.23252259718066 -13.756440621401122, 291.23252259718066 -14.069086999160238, 290.651799720616 -14.069086999160238, 290.651799720616 -14.381733376919355, 290.07107684405133 -14.381733376919355, 290.07107684405133 -14.694379754678472, 289.49035396748667 -14.694379754678472, 289.49035396748667 -15.007026132437588, 288.909631090922 -15.007026132437588, 288.909631090922 -15.319672510196703, 288.32890821435734 -15.319672510196703, 288.32890821435734 -15.63231888795582, 287.7481853377927 -15.63231888795582, 287.7481853377927 -15.944965265714938, 286.8771010229457 -15.944965265714938, 286.8771010229457 -16.257611643474053, 286.0060167080987 -16.257611643474053, 286.0060167080987 -16.57025802123317, 285.425293831534 -16.57025802123317, 285.425293831534 -16.882904398992288, 284.554209516687 -16.882904398992288, 284.554209516687 -17.195550776751404, 283.97348664012236 -17.195550776751404, 283.97348664012236 -17.50819715451052, 283.10240232527536 -17.50819715451052, 283.10240232527536 -17.820843532269635, 282.5216794487107 -17.820843532269635, 282.5216794487107 -18.13348991002875, 281.65059513386365 -18.13348991002875, 281.65059513386365 -18.44613628778787, 281.069872257299 -18.44613628778787, 281.069872257299 -18.758782665546985, 280.4891493807343 -18.758782665546985, 280.4891493807343 -19.0714290433061, 279.6180650658873 -19.0714290433061, 279.6180650658873 -19.38407542106522, 279.03734218932266 -19.38407542106522, 279.03734218932266 -19.696721798824335, 278.456619312758 -19.696721798824335, 278.456619312758 -20.00936817658345, 277.585534997911 -20.00936817658345, 277.585534997911 -20.322014554342566, 277.00481212134633 -20.322014554342566, 277.00481212134633 -20.63466093210168, 276.42408924478167 -20.63466093210168, 276.42408924478167 -20.9473073098608, 274.97228205337 -20.9473073098608, 274.97228205337 -21.259953687619916, 273.8108363002407 -21.259953687619916, 273.8108363002407 -21.57260006537903, 272.359029108829 -21.57260006537903, 272.359029108829 -21.88524644313815, 271.19758335569963 -21.88524644313815, 271.19758335569963 -22.197892820897266, 270.0361376025703 -22.197892820897266, 270.0361376025703 -22.51053919865638, 269.1650532877233 -22.51053919865638, 269.1650532877233 -22.823185576415497, 268.003607534594 -22.823185576415497, 268.003607534594 -23.135831954174613, 267.132523219747 -23.135831954174613, 267.132523219747 -23.44847833193373, 266.2614389049 -23.44847833193373, 266.2614389049 -23.761124709692847, 265.390354590053 -23.761124709692847, 265.390354590053 -24.073771087451963, 263.06746308379434 -24.073771087451963, 263.06746308379434 -24.386417465211082, 260.7445715775356 -24.386417465211082, 260.7445715775356 -24.699063842970197, 258.42168007127697 -24.699063842970197, 258.42168007127697 -25.011710220729313, 256.679511441583 -25.011710220729313, 256.679511441583 -25.32435659848843, 255.2277042501713 -25.32435659848843, 255.2277042501713 -25.637002976247544, 253.19517418219496 -25.637002976247544, 253.19517418219496 -25.949649354006663, 245.93613822513663 -25.949649354006663, 245.93613822513663 -26.26229573176578, 242.16143952746629 -26.26229573176578, 242.16143952746629 -26.574942109524894, 241.2903552126193 -26.574942109524894, 241.2903552126193 -26.887588487284013, 240.4192708977723 -26.887588487284013, 240.4192708977723 -27.20023486504313, 239.5481865829253 -27.20023486504313, 239.5481865829253 -27.512881242802244, 238.6771022680783 -27.512881242802244, 238.6771022680783 -27.82552762056136, 237.80601795323128 -27.82552762056136, 237.80601795323128 -28.138173998320475, 237.2252950766666 -28.138173998320475, 237.2252950766666 -28.450820376079594, 236.35421076181962 -28.450820376079594, 236.35421076181962 -28.76346675383871, 235.77348788525495 -28.76346675383871, 235.77348788525495 -29.076113131597825, 235.1927650086903 -29.076113131597825, 235.1927650086903 -29.388759509356944, 234.61204213212562 -29.388759509356944, 234.61204213212562 -29.70140588711606, 234.3216806938433 -29.70140588711606, 234.3216806938433 -30.014052264875176, 233.74095781727863 -30.014052264875176, 233.74095781727863 -30.32669864263429, 233.4505963789963 -30.32669864263429, 233.4505963789963 -30.639345020393407, 233.16023494071393 -30.639345020393407, 233.16023494071393 -30.951991398152526, 232.8698735024316 -30.951991398152526, 232.8698735024316 -31.26463777591164, 232.57951206414927 -31.26463777591164, 232.57951206414927 -31.577284153670757, 232.28915062586694 -31.577284153670757, 232.28915062586694 -33.14051604246634, 232.57951206414927 -33.14051604246634, 232.57951206414927 -33.765808797984576, 232.8698735024316 -33.765808797984576, 232.8698735024316 -34.07845517574369, 233.16023494071393 -34.07845517574369, 233.16023494071393 -34.39110155350281, 233.4505963789963 -34.39110155350281, 233.4505963789963 -34.70374793126192, 234.03131925556096 -34.70374793126192, 234.03131925556096 -35.01639430902104, 234.61204213212562 -35.01639430902104, 234.61204213212562 -35.329040686780154, 234.90240357040796 -35.329040686780154, 234.90240357040796 -35.64168706453927, 235.77348788525495 -35.64168706453927, 235.77348788525495 -35.954333442298385, 236.35421076181962 -35.954333442298385, 236.35421076181962 -36.2669798200575, 236.93493363838428 -36.2669798200575, 236.93493363838428 -36.57962619781662, 237.80601795323128 -36.57962619781662, 237.80601795323128 -36.89227257557574, 238.6771022680783 -36.89227257557574, 238.6771022680783 -37.204918953334854, 239.5481865829253 -37.204918953334854, 239.5481865829253 -37.51756533109397, 240.4192708977723 -37.51756533109397, 240.4192708977723 -37.830211708853085, 241.58071665090162 -37.830211708853085, 241.58071665090162 -38.1428580866122, 243.03252384231328 -38.1428580866122, 243.03252384231328 -38.455504464371316, 254.64698137360665 -38.455504464371316, 254.64698137360665 -38.76815084213044, 256.0987885650183 -38.76815084213044, 256.0987885650183 -39.080797219889554, 258.13131863299463 -39.080797219889554, 258.13131863299463 -39.39344359764867, 260.4542101392533 -39.39344359764867, 260.4542101392533 -39.706089975407785, 262.777101645512 -39.706089975407785, 262.777101645512 -40.0187363531669, 265.09999315177066 -40.0187363531669, 265.09999315177066 -40.331382730926016, 265.6807160283353 -40.331382730926016, 265.6807160283353 -40.64402910868513, 266.5518003431823 -40.64402910868513, 266.5518003431823 -40.95667548644425, 267.132523219747 -40.95667548644425, 267.132523219747 -41.26932186420336, 267.71324609631165 -41.26932186420336, 267.71324609631165 -41.581968241962485, 268.58433041115865 -41.581968241962485, 268.58433041115865 -41.8946146197216, 269.1650532877233 -41.8946146197216, 269.1650532877233 -42.20726099748072, 269.745776164288 -42.20726099748072, 269.745776164288 -42.51990737523983, 270.61686047913497 -42.51990737523983, 270.61686047913497 -42.83255375299895, 271.19758335569963 -42.83255375299895, 271.19758335569963 -43.14520013075806, 271.77830623226436 -43.14520013075806, 271.77830623226436 -43.45784650851718, 272.64939054711135 -43.45784650851718, 272.64939054711135 -43.7704928862763, 273.230113423676 -43.7704928862763, 273.230113423676 -44.08313926403542, 274.101197738523 -44.08313926403542, 274.101197738523 -44.39578564179453, 274.6819206150877 -44.39578564179453, 274.6819206150877 -44.70843201955365, 275.26264349165234 -44.70843201955365, 275.26264349165234 -45.02107839731276, 276.13372780649934 -45.02107839731276, 276.13372780649934 -45.33372477507188, 280.4891493807343 -45.33372477507188, 280.4891493807343 -45.646371152830994, 283.10240232527536 -45.646371152830994, 283.10240232527536 -45.95901753059011, 285.71565526981635 -45.95901753059011, 285.71565526981635 -46.271663908349225, 288.32890821435734 -46.271663908349225, 288.32890821435734 -45.95901753059011, 288.909631090922 -45.95901753059011, 288.909631090922 -45.646371152830994, 289.49035396748667 -45.646371152830994, 289.49035396748667 -45.33372477507188, 290.07107684405133 -45.33372477507188, 290.07107684405133 -45.02107839731276, 290.651799720616 -45.02107839731276, 290.651799720616 -44.70843201955365, 291.23252259718066 -44.70843201955365, 291.23252259718066 -44.39578564179453, 292.10360691202766 -44.39578564179453, 292.10360691202766 -44.08313926403542, 292.6843297885924 -44.08313926403542, 292.6843297885924 -43.7704928862763, 293.5554141034394 -43.7704928862763, 293.5554141034394 -43.45784650851718, 294.13613698000404 -43.45784650851718, 294.13613698000404 -43.14520013075806, 295.00722129485104 -43.14520013075806, 295.00722129485104 -42.83255375299895, 295.5879441714157 -42.83255375299895, 295.5879441714157 -42.51990737523983, 296.4590284862627 -42.51990737523983, 296.4590284862627 -42.20726099748072, 297.3301128011097 -42.20726099748072))MULTILINESTRING ((297.3301128011097 -109.73887859344985, 296.4590284862627 -109.73887859344985, 296.4590284862627 -109.42623221569075, 295.29758273313337 -109.42623221569075, 295.29758273313337 -109.11358583793162, 294.13613698000404 -109.11358583793162, 294.13613698000404 -108.80093946017251, 292.6843297885924 -108.80093946017251, 292.6843297885924 -108.48829308241339, 291.23252259718066 -108.48829308241339, 291.23252259718066 -108.17564670465428, 289.780715405769 -108.17564670465428, 289.780715405769 -107.86300032689516, 288.038546776075 -107.86300032689516, 288.038546776075 -107.55035394913605, 287.45782389951034 -107.55035394913605, 287.45782389951034 -107.86300032689516, 286.8771010229457 -107.86300032689516, 286.8771010229457 -108.17564670465428, 286.0060167080987 -108.17564670465428, 286.0060167080987 -108.48829308241339, 285.1349323932517 -108.48829308241339, 285.1349323932517 -108.80093946017251, 284.554209516687 -108.80093946017251, 284.554209516687 -109.11358583793162, 283.97348664012236 -109.11358583793162, 283.97348664012236 -109.42623221569075, 283.10240232527536 -109.42623221569075, 283.10240232527536 -109.73887859344985, 282.5216794487107 -109.73887859344985, 282.5216794487107 -110.05152497120898, 281.940956572146 -110.05152497120898, 281.940956572146 -110.3641713489681, 281.3602336955813 -110.3641713489681, 281.3602336955813 -110.67681772672721, 280.77951081901665 -110.67681772672721, 280.77951081901665 -110.98946410448633, 279.90842650416965 -110.98946410448633, 279.90842650416965 -111.30211048224544, 279.327703627605 -111.30211048224544, 279.327703627605 -111.61475686000456, 278.7469807510403 -111.61475686000456, 278.7469807510403 -111.92740323776367, 278.16625787447566 -111.92740323776367, 278.16625787447566 -112.24004961552279, 277.585534997911 -112.24004961552279, 277.585534997911 -112.5526959932819, 276.714450683064 -112.5526959932819, 276.714450683064 -112.86534237104102, 274.97228205337 -112.86534237104102, 274.97228205337 -112.5526959932819, 272.64939054711135 -112.5526959932819, 272.64939054711135 -112.24004961552279, 270.0361376025703 -112.24004961552279, 270.0361376025703 -111.92740323776367, 265.97107746661766 -111.92740323776367, 265.97107746661766 -111.61475686000456, 263.648185960359 -111.61475686000456, 263.648185960359 -111.30211048224544, 262.19637876894734 -111.30211048224544, 262.19637876894734 -110.98946410448633, 261.03493301581796 -110.98946410448633, 261.03493301581796 -110.67681772672721, 259.8734872626886 -110.67681772672721, 259.8734872626886 -110.3641713489681, 259.00240294784163 -110.3641713489681, 259.00240294784163 -110.05152497120898, 258.13131863299463 -110.05152497120898, 258.13131863299463 -109.73887859344985, 257.26023431814764 -109.73887859344985, 257.26023431814764 -109.42623221569075, 256.38915000330064 -109.42623221569075, 256.38915000330064 -109.11358583793162, 255.51806568845365 -109.11358583793162, 255.51806568845365 -108.80093946017251, 254.93734281188898 -108.80093946017251, 254.93734281188898 -108.48829308241339, 254.06625849704199 -108.48829308241339, 254.06625849704199 -108.17564670465428, 253.77589705875965 -108.17564670465428, 253.77589705875965 -108.48829308241339, 253.4855356204773 -108.48829308241339, 253.4855356204773 -109.73887859344985, 253.19517418219496 -109.73887859344985, 253.19517418219496 -111.30211048224544, 252.90481274391263 -111.30211048224544, 252.90481274391263 -112.86534237104102, 252.6144513056303 -112.86534237104102, 252.6144513056303 -115.05386701535484, 252.32408986734796 -115.05386701535484, 252.32408986734796 -117.86768441518689, 252.03372842906563 -117.86768441518689, 252.03372842906563 -122.24473370381452, 251.7433669907833 -122.24473370381452, 251.7433669907833 -131.93677141434713), 
+  (234.61204213212562 -116.61709890415042, 234.61204213212562 -114.74122063759572, 234.3216806938433 -114.74122063759572, 234.3216806938433 -112.5526959932819, 234.03131925556096 -112.5526959932819, 234.03131925556096 -110.67681772672721, 233.74095781727863 -110.67681772672721, 233.74095781727863 -109.42623221569075, 233.4505963789963 -109.42623221569075, 233.4505963789963 -108.17564670465428, 233.16023494071393 -108.17564670465428, 233.16023494071393 -107.23770757137693, 232.8698735024316 -107.23770757137693, 232.8698735024316 -106.29976843809958, 232.57951206414927 -106.29976843809958, 232.57951206414927 -105.36182930482224, 232.28915062586694 -105.36182930482224, 232.28915062586694 -104.42389017154488, 231.9987891875846 -104.42389017154488, 231.9987891875846 -103.79859741602665, 231.70842774930227 -103.79859741602665, 231.70842774930227 -103.17330466050842, 231.41806631101994 -103.17330466050842, 231.41806631101994 -102.54801190499018, 231.1277048727376 -102.54801190499018, 231.1277048727376 -102.23536552723107, 230.54698199617295 -102.23536552723107, 230.54698199617295 -101.92271914947194, 229.96625911960828 -101.92271914947194, 229.96625911960828 -101.61007277171284, 229.09517480476129 -101.61007277171284, 229.09517480476129 -101.29742639395371, 228.51445192819662 -101.29742639395371, 228.51445192819662 -100.9847800161946, 227.93372905163193 -100.9847800161946, 227.93372905163193 -100.67213363843548, 227.06264473678493 -100.67213363843548, 227.06264473678493 -100.35948726067637, 226.48192186022027 -100.35948726067637, 226.48192186022027 -100.04684088291725, 225.61083754537327 -100.04684088291725, 225.61083754537327 -99.73419450515813, 225.0301146688086 -99.73419450515813, 225.0301146688086 -99.42154812739902, 224.1590303539616 -99.42154812739902, 224.1590303539616 -99.1089017496399, 223.28794603911462 -99.1089017496399, 223.28794603911462 -98.79625537188079, 222.4168617242676 -98.79625537188079, 222.4168617242676 -98.48360899412167, 221.83613884770293 -98.48360899412167, 221.83613884770293 -98.17096261636256, 220.96505453285593 -98.17096261636256, 220.96505453285593 -97.85831623860344, 219.8036087797266 -97.85831623860344, 219.8036087797266 -97.54566986084433, 219.51324734144427 -97.54566986084433))MULTILINESTRING ((189.6060191983639 -91.91803506118022, 185.54095906241122 -91.91803506118022, 185.54095906241122 -91.60538868342111, 183.5084289944349 -91.60538868342111, 183.5084289944349 -91.29274230566199, 182.05662180302323 -91.29274230566199, 182.05662180302323 -91.60538868342111, 180.02409173504688 -91.60538868342111, 180.02409173504688 -91.91803506118022, 178.86264598191755 -91.91803506118022, 178.86264598191755 -92.23068143893934, 177.99156166707056 -92.23068143893934, 177.99156166707056 -92.54332781669845, 177.70120022878822 -92.54332781669845, 177.70120022878822 -92.85597419445757, 177.12047735222356 -92.85597419445757, 177.12047735222356 -93.1686205722167, 176.53975447565887 -93.1686205722167, 176.53975447565887 -93.4812669499758, 175.9590315990942 -93.4812669499758, 175.9590315990942 -93.79391332773493, 175.37830872252954 -93.79391332773493, 175.37830872252954 -94.10655970549404, 175.0879472842472 -94.10655970549404, 175.0879472842472 -94.41920608325316, 174.50722440768254 -94.41920608325316, 174.50722440768254 -94.73185246101227, 173.63614009283555 -94.73185246101227, 173.63614009283555 -95.04449883877139, 172.76505577798855 -95.04449883877139, 172.76505577798855 -95.35714521653051, 171.89397146314155 -95.35714521653051, 171.89397146314155 -95.66979159428962, 171.02288714829453 -95.66979159428962, 171.02288714829453 -95.98243797204874, 169.8614413951652 -95.98243797204874, 169.8614413951652 -96.29508434980785, 168.9903570803182 -96.29508434980785, 168.9903570803182 -96.60773072756697, 168.1192727654712 -96.60773072756697, 168.1192727654712 -96.92037710532608, 167.2481884506242 -96.92037710532608, 167.2481884506242 -97.2330234830852, 166.08674269749486 -97.2330234830852, 166.08674269749486 -97.54566986084433, 165.21565838264786 -97.54566986084433, 165.21565838264786 -97.85831623860344, 164.34457406780086 -97.85831623860344, 164.34457406780086 -98.17096261636256, 163.18312831467154 -98.17096261636256, 163.18312831467154 -98.48360899412167, 162.31204399982454 -98.48360899412167, 162.31204399982454 -98.79625537188079, 161.4409596849775 -98.79625537188079, 161.4409596849775 -99.1089017496399, 160.56987537013052 -99.1089017496399, 160.56987537013052 -99.42154812739902, 159.69879105528352 -99.42154812739902, 159.69879105528352 -99.73419450515813, 158.82770674043653 -99.73419450515813, 158.82770674043653 -100.04684088291725, 157.95662242558953 -100.04684088291725, 157.95662242558953 -100.35948726067637, 157.08553811074253 -100.35948726067637, 157.08553811074253 -100.67213363843548, 156.2144537958955 -100.67213363843548, 156.2144537958955 -100.9847800161946, 155.05300804276618 -100.9847800161946, 155.05300804276618 -101.29742639395371, 154.18192372791918 -101.29742639395371, 154.18192372791918 -101.61007277171284, 153.02047797478986 -101.61007277171284, 153.02047797478986 -101.92271914947194, 152.14939365994286 -101.92271914947194, 152.14939365994286 -102.23536552723107, 151.27830934509586 -102.23536552723107, 151.27830934509586 -102.54801190499018, 150.69758646853117 -102.54801190499018, 150.69758646853117 -102.8606582827493, 150.1168635919665 -102.8606582827493, 150.1168635919665 -103.17330466050842, 149.53614071540184 -103.17330466050842, 149.53614071540184 -103.48595103826753, 148.95541783883718 -103.48595103826753, 148.95541783883718 -103.79859741602665, 148.3746949622725 -103.79859741602665, 148.3746949622725 -104.11124379378576, 147.50361064742552 -104.11124379378576, 147.50361064742552 -104.42389017154488, 146.92288777086085 -104.42389017154488, 146.92288777086085 -104.73653654930399, 146.3421648942962 -104.73653654930399, 146.3421648942962 -105.04918292706311, 145.7614420177315 -105.04918292706311, 145.7614420177315 -105.36182930482224, 145.18071914116683 -105.36182930482224, 145.18071914116683 -105.67447568258135, 144.59999626460217 -105.67447568258135, 144.59999626460217 -105.98712206034047, 144.0192733880375 -105.98712206034047, 144.0192733880375 -106.29976843809958, 143.43855051147284 -106.29976843809958, 143.43855051147284 -106.6124148158587, 142.85782763490818 -106.6124148158587, 142.85782763490818 -106.92506119361781, 142.2771047583435 -106.92506119361781, 142.2771047583435 -107.23770757137693, 141.69638188177885 -107.23770757137693, 141.69638188177885 -107.55035394913605, 141.11565900521418 -107.55035394913605, 141.11565900521418 -107.86300032689516, 140.5349361286495 -107.86300032689516, 140.5349361286495 -108.17564670465428, 139.95421325208483 -108.17564670465428, 139.95421325208483 -108.48829308241339, 139.6638518138025 -108.48829308241339, 139.6638518138025 -108.80093946017251, 139.08312893723783 -108.80093946017251, 139.08312893723783 -109.11358583793162, 138.7927674989555 -109.11358583793162, 138.7927674989555 -109.42623221569075, 138.21204462239083 -109.42623221569075, 138.21204462239083 -109.73887859344985, 137.9216831841085 -109.73887859344985, 137.9216831841085 -110.05152497120898, 137.34096030754384 -110.05152497120898, 137.34096030754384 -110.3641713489681, 137.0505988692615 -110.3641713489681, 137.0505988692615 -110.67681772672721, 136.76023743097917 -110.67681772672721, 136.76023743097917 -110.98946410448633, 136.1795145544145 -110.98946410448633, 136.1795145544145 -111.30211048224544, 135.88915311613218 -111.30211048224544, 135.88915311613218 -111.61475686000456, 135.59879167784982 -111.61475686000456, 135.59879167784982 -111.92740323776367, 135.01806880128515 -111.92740323776367, 135.01806880128515 -112.24004961552279, 134.72770736300282 -112.24004961552279, 134.72770736300282 -112.5526959932819, 134.4373459247205 -112.5526959932819, 134.4373459247205 -112.86534237104102, 134.14698448643816 -112.86534237104102, 134.14698448643816 -113.17798874880015, 133.85662304815583 -113.17798874880015, 133.85662304815583 -113.49063512655925, 133.5662616098735 -113.49063512655925, 133.5662616098735 -113.80328150431838, 133.27590017159116 -113.80328150431838, 133.27590017159116 -114.11592788207749, 132.98553873330883 -114.11592788207749, 132.98553873330883 -114.42857425983661, 132.6951772950265 -114.42857425983661, 132.6951772950265 -114.74122063759572, 132.40481585674416 -114.74122063759572, 132.40481585674416 -115.05386701535484, 132.11445441846183 -115.05386701535484, 132.11445441846183 -115.36651339311396, 131.8240929801795 -115.36651339311396, 131.8240929801795 -115.67915977087307, 131.53373154189717 -115.67915977087307, 131.53373154189717 -115.9918061486322, 131.24337010361484 -115.9918061486322, 131.24337010361484 -116.3044525263913, 130.9530086653325 -116.3044525263913, 130.9530086653325 -116.92974528190953, 130.66264722705014 -116.92974528190953, 130.66264722705014 -117.24239165966866, 130.3722857887678 -117.24239165966866, 130.3722857887678 -117.55503803742778, 130.08192435048548 -117.55503803742778, 130.08192435048548 -118.18033079294601, 129.79156291220315 -118.18033079294601, 129.79156291220315 -118.49297717070512, 129.50120147392082 -118.49297717070512, 129.50120147392082 -119.11826992622335, 129.21084003563848 -119.11826992622335, 129.21084003563848 -119.43091630398247, 128.92047859735615 -119.43091630398247, 128.92047859735615 -120.0562090595007, 128.3397557207915 -120.0562090595007, 128.3397557207915 -120.36885543725982, 128.04939428250916 -120.36885543725982, 128.04939428250916 -120.68150181501893, 127.75903284422682 -120.68150181501893, 127.75903284422682 -120.99414819277806, 127.46867140594449 -120.99414819277806, 127.46867140594449 -121.30679457053716, 127.17830996766216 -121.30679457053716, 127.17830996766216 -121.61944094829629, 126.88794852937983 -121.61944094829629, 126.88794852937983 -121.9320873260554, 126.59758709109748 -121.9320873260554, 126.59758709109748 -122.24473370381452, 126.30722565281515 -122.24473370381452, 126.30722565281515 -122.55738008157363, 126.01686421453282 -122.55738008157363, 126.01686421453282 -122.87002645933275, 125.72650277625048 -122.87002645933275, 125.72650277625048 -123.18267283709187, 125.43614133796815 -123.18267283709187, 125.43614133796815 -123.8079655926101, 125.14577989968582 -123.8079655926101, 125.14577989968582 -124.12061197036921, 124.85541846140349 -124.12061197036921, 124.85541846140349 -124.74590472588744, 124.56505702312116 -124.74590472588744, 124.56505702312116 -125.05855110364656, 124.27469558483881 -125.05855110364656, 124.27469558483881 -125.6838438591648, 123.98433414655648 -125.6838438591648, 123.98433414655648 -126.30913661468303, 123.69397270827415 -126.30913661468303, 123.69397270827415 -127.24707574796038, 123.40361126999181 -127.24707574796038, 123.40361126999181 -128.18501488123772, 123.11324983170948 -128.18501488123772, 123.11324983170948 -129.12295401451507, 122.82288839342715 -129.12295401451507, 122.82288839342715 -130.68618590331067, 122.53252695514482 -130.68618590331067, 122.53252695514482 -133.1873569253836, 122.24216551686249 -133.1873569253836, 122.24216551686249 -139.1276381028068, 122.53252695514482 -139.1276381028068, 122.53252695514482 -142.56674825815708, 122.82288839342715 -142.56674825815708, 122.82288839342715 -145.06791928023, 123.11324983170948 -145.06791928023, 123.11324983170948 -147.25644392454382, 123.40361126999181 -147.25644392454382, 123.40361126999181 -149.44496856885763, 123.69397270827415 -149.44496856885763, 123.69397270827415 -151.32084683541234, 123.98433414655648 -151.32084683541234, 123.98433414655648 -152.88407872420794, 124.27469558483881 -152.88407872420794, 124.27469558483881 -154.75995699076262, 124.56505702312116 -154.75995699076262, 124.56505702312116 -156.32318887955822, 124.85541846140349 -156.32318887955822, 124.85541846140349 -158.1990671461129, 125.14577989968582 -158.1990671461129, 125.14577989968582 -159.7622990349085, 125.43614133796815 -159.7622990349085, 125.43614133796815 -161.32553092370406, 125.72650277625048 -161.32553092370406, 125.72650277625048 -163.51405556801788, 126.01686421453282 -163.51405556801788, 126.01686421453282 -165.7025802123317, 126.30722565281515 -165.7025802123317, 126.30722565281515 -167.5784584788864, 126.59758709109748 -167.5784584788864, 126.59758709109748 -168.20375123440462), 
+  (297.3301128011097 -90.66744955014376, 297.03975136282736 -90.66744955014376, 297.03975136282736 -90.98009592790288, 295.5879441714157 -90.98009592790288, 295.5879441714157 -91.29274230566199, 293.8457755417217 -91.29274230566199, 293.8457755417217 -91.60538868342111, 292.39396835031005 -91.60538868342111, 292.39396835031005 -91.91803506118022, 290.651799720616 -91.91803506118022, 290.651799720616 -92.23068143893934, 288.6192696526397 -92.23068143893934, 288.6192696526397 -92.54332781669845, 286.8771010229457 -92.54332781669845, 286.8771010229457 -92.85597419445757, 285.425293831534 -92.85597419445757, 285.425293831534 -93.1686205722167, 284.2638480784047 -93.1686205722167, 284.2638480784047 -93.4812669499758, 282.81204088699303 -93.4812669499758, 282.81204088699303 -93.79391332773493, 281.65059513386365 -93.79391332773493, 281.65059513386365 -94.10655970549404, 280.198787942452 -94.10655970549404, 280.198787942452 -94.41920608325316, 279.327703627605 -94.41920608325316, 279.327703627605 -94.73185246101227, 278.16625787447566 -94.73185246101227, 278.16625787447566 -95.04449883877139, 277.00481212134633 -95.04449883877139, 277.00481212134633 -95.35714521653051, 275.5530049299347 -95.35714521653051, 275.5530049299347 -95.04449883877139, 274.39155917680534 -95.04449883877139, 274.39155917680534 -94.73185246101227, 273.230113423676 -94.73185246101227, 273.230113423676 -94.41920608325316, 272.0686676705467 -94.41920608325316, 272.0686676705467 -94.10655970549404, 270.61686047913497 -94.10655970549404, 270.61686047913497 -93.79391332773493, 269.45541472600564 -93.79391332773493, 269.45541472600564 -93.4812669499758, 268.003607534594 -93.4812669499758, 268.003607534594 -93.1686205722167, 266.5518003431823 -93.1686205722167, 266.5518003431823 -92.85597419445757, 264.80963171348833 -92.85597419445757, 264.80963171348833 -92.54332781669845, 263.93854739864133 -92.54332781669845, 263.93854739864133 -92.23068143893934, 263.06746308379434 -92.23068143893934, 263.06746308379434 -91.91803506118022, 261.906017330665 -91.91803506118022, 261.906017330665 -91.60538868342111, 261.03493301581796 -91.60538868342111, 261.03493301581796 -91.29274230566199, 260.16384870097096 -91.29274230566199, 260.16384870097096 -90.98009592790288, 259.29276438612396 -90.98009592790288, 259.29276438612396 -90.66744955014376, 258.42168007127697 -90.66744955014376, 258.42168007127697 -90.35480317238465, 257.26023431814764 -90.35480317238465, 257.26023431814764 -90.04215679462553, 256.38915000330064 -90.04215679462553, 256.38915000330064 -89.7295104168664, 255.51806568845365 -89.7295104168664, 255.51806568845365 -89.4168640391073, 254.64698137360665 -89.4168640391073, 254.64698137360665 -89.10421766134817, 253.19517418219496 -89.10421766134817, 253.19517418219496 -89.4168640391073, 252.90481274391263 -89.4168640391073, 252.90481274391263 -89.7295104168664, 252.6144513056303 -89.7295104168664, 252.6144513056303 -90.04215679462553, 252.32408986734796 -90.04215679462553, 252.32408986734796 -90.35480317238465, 251.7433669907833 -90.35480317238465, 251.7433669907833 -90.66744955014376, 251.45300555250097 -90.66744955014376, 251.45300555250097 -90.98009592790288, 251.16264411421864 -90.98009592790288, 251.16264411421864 -91.29274230566199, 250.8722826759363 -91.29274230566199, 250.8722826759363 -91.60538868342111, 250.29155979937164 -91.60538868342111, 250.29155979937164 -91.91803506118022, 250.0011983610893 -91.91803506118022, 250.0011983610893 -92.23068143893934, 249.71083692280698 -92.23068143893934, 249.71083692280698 -92.54332781669845, 249.1301140462423 -92.54332781669845, 249.1301140462423 -92.85597419445757, 248.83975260795998 -92.85597419445757, 248.83975260795998 -93.1686205722167, 248.2590297313953 -93.1686205722167, 248.2590297313953 -93.4812669499758, 247.67830685483062 -93.4812669499758, 247.67830685483062 -93.79391332773493, 247.3879454165483 -93.79391332773493, 247.3879454165483 -94.10655970549404, 246.80722253998363 -94.10655970549404, 246.80722253998363 -94.41920608325316, 245.93613822513663 -94.41920608325316, 245.93613822513663 -94.73185246101227, 244.7746924720073 -94.73185246101227, 244.7746924720073 -95.04449883877139, 242.74216240403095 -95.04449883877139, 242.74216240403095 -94.73185246101227, 242.16143952746629 -94.73185246101227, 242.16143952746629 -94.41920608325316, 241.87107808918395 -94.41920608325316, 241.87107808918395 -93.79391332773493, 241.58071665090162 -93.79391332773493, 241.58071665090162 -93.4812669499758, 241.2903552126193 -93.4812669499758, 241.2903552126193 -93.1686205722167, 240.99999377433696 -93.1686205722167, 240.99999377433696 -92.85597419445757, 240.70963233605463 -92.85597419445757, 240.70963233605463 -92.54332781669845, 240.4192708977723 -92.54332781669845, 240.4192708977723 -91.91803506118022, 240.12890945948996 -91.91803506118022, 240.12890945948996 -91.60538868342111, 239.83854802120763 -91.60538868342111, 239.83854802120763 -91.29274230566199, 239.5481865829253 -91.29274230566199, 239.5481865829253 -90.98009592790288, 239.25782514464296 -90.98009592790288, 239.25782514464296 -90.66744955014376, 238.96746370636063 -90.66744955014376, 238.96746370636063 -90.35480317238465, 238.6771022680783 -90.35480317238465, 238.6771022680783 -90.04215679462553, 238.0963793915136 -90.04215679462553, 238.0963793915136 -89.7295104168664, 237.80601795323128 -89.7295104168664, 237.80601795323128 -89.4168640391073, 237.51565651494894 -89.4168640391073, 237.51565651494894 -89.10421766134817, 237.2252950766666 -89.10421766134817, 237.2252950766666 -88.79157128358906, 236.93493363838428 -88.79157128358906, 236.93493363838428 -88.47892490582994, 236.35421076181962 -88.47892490582994, 236.35421076181962 -88.16627852807083, 236.06384932353728 -88.16627852807083, 236.06384932353728 -87.85363215031171, 235.77348788525495 -87.85363215031171, 235.77348788525495 -87.5409857725526, 235.1927650086903 -87.5409857725526, 235.1927650086903 -87.22833939479348, 234.90240357040796 -87.22833939479348, 234.90240357040796 -86.91569301703436, 234.3216806938433 -86.91569301703436, 234.3216806938433 -86.60304663927525, 233.74095781727863 -86.60304663927525, 233.74095781727863 -86.29040026151613, 233.4505963789963 -86.29040026151613, 233.4505963789963 -85.97775388375702, 232.8698735024316 -85.97775388375702, 232.8698735024316 -85.6651075059979, 232.28915062586694 -85.6651075059979, 232.28915062586694 -85.35246112823879, 231.70842774930227 -85.35246112823879, 231.70842774930227 -85.03981475047966, 230.83734343445528 -85.03981475047966, 230.83734343445528 -84.72716837272054, 229.67589768132595 -84.72716837272054, 229.67589768132595 -84.41452199496143, 228.51445192819662 -84.41452199496143, 228.51445192819662 -84.10187561720231, 227.35300617506726 -84.10187561720231, 227.35300617506726 -83.7892292394432, 226.19156042193794 -83.7892292394432, 226.19156042193794 -83.47658286168408, 224.73975323052628 -83.47658286168408, 224.73975323052628 -83.16393648392497, 223.57830747739695 -83.16393648392497, 223.57830747739695 -82.85129010616585, 222.12650028598526 -82.85129010616585, 222.12650028598526 -82.53864372840673, 220.6746930945736 -82.53864372840673, 220.6746930945736 -82.22599735064762, 219.51324734144427 -82.22599735064762, 219.51324734144427 -82.53864372840673, 219.22288590316194 -82.53864372840673, 219.22288590316194 -82.85129010616585, 218.9325244648796 -82.85129010616585, 218.9325244648796 -83.16393648392497, 218.64216302659727 -83.16393648392497, 218.64216302659727 -83.47658286168408, 218.35180158831494 -83.47658286168408, 218.35180158831494 -83.7892292394432, 218.0614401500326 -83.7892292394432, 218.0614401500326 -84.10187561720231, 217.77107871175025 -84.10187561720231, 217.77107871175025 -84.41452199496143, 217.48071727346792 -84.41452199496143, 217.48071727346792 -85.03981475047966, 217.19035583518558 -85.03981475047966, 217.19035583518558 -85.35246112823879))MULTILINESTRING ((106.56264784961647 -229.16979489743233, 106.56264784961647 -224.48009923104559, 106.27228641133412 -224.48009923104559, 106.27228641133412 -224.16745285328648, 105.98192497305179 -224.16745285328648, 105.98192497305179 -230.10773403070968), 
+  (72.29999813230108 -86.91569301703436, 69.68674518776008 -86.91569301703436, 69.68674518776008 -86.60304663927525, 67.07349224321908 -86.60304663927525, 67.07349224321908 -86.29040026151613, 64.46023929867808 -86.29040026151613, 64.46023929867808 -85.97775388375702, 62.137347792419405 -85.97775388375702, 62.137347792419405 -85.6651075059979, 60.395179162725405 -85.6651075059979, 60.395179162725405 -85.35246112823879, 58.653010533031406 -85.35246112823879, 58.653010533031406 -85.03981475047966, 57.49156477990207 -85.03981475047966, 57.49156477990207 -84.72716837272054, 56.0397575884904 -84.72716837272054, 56.0397575884904 -84.41452199496143, 54.87831183536107 -84.41452199496143, 54.87831183536107 -84.10187561720231, 53.71686608223173 -84.10187561720231, 53.71686608223173 -83.7892292394432, 52.84578176738473 -83.7892292394432, 52.84578176738473 -83.47658286168408, 51.68433601425539 -83.47658286168408, 51.68433601425539 -83.16393648392497, 50.8132516994084 -83.16393648392497, 50.8132516994084 -82.85129010616585, 49.942167384561394 -82.85129010616585, 49.942167384561394 -82.53864372840673, 48.78072163143206 -82.53864372840673, 48.78072163143206 -82.22599735064762, 47.61927587830272 -82.22599735064762, 47.61927587830272 -81.9133509728885, 46.45783012517339 -81.9133509728885, 46.45783012517339 -81.60070459512939, 45.29638437204405 -81.60070459512939, 45.29638437204405 -81.28805821737026, 44.13493861891472 -81.28805821737026, 44.13493861891472 -80.97541183961116, 42.97349286578539 -80.97541183961116, 42.97349286578539 -80.66276546185203, 42.102408550938385 -80.66276546185203, 42.102408550938385 -80.35011908409292, 40.94096279780905 -80.35011908409292, 40.94096279780905 -80.0374727063338, 40.06987848296205 -80.0374727063338, 40.06987848296205 -79.72482632857468, 38.90843272983271 -79.72482632857468, 38.90843272983271 -79.41217995081557, 37.746986976703376 -79.41217995081557, 37.746986976703376 -79.09953357305645, 35.714456908727044 -79.09953357305645, 35.714456908727044 -78.78688719529734, 33.39156540246837 -78.78688719529734, 33.39156540246837 -78.47424081753822, 30.77831245792737 -78.47424081753822, 30.77831245792737 -78.16159443977911, 25.551806568845365 -78.16159443977911, 25.551806568845365 -78.47424081753822, 24.39036081571603 -78.47424081753822, 24.39036081571603 -78.78688719529734, 23.228915062586694 -78.78688719529734, 23.228915062586694 -79.09953357305645, 22.357830747739694 -79.09953357305645, 22.357830747739694 -79.41217995081557, 21.486746432892694 -79.41217995081557, 21.486746432892694 -79.72482632857468, 20.61566211804569 -79.72482632857468, 20.61566211804569 -80.0374727063338, 19.74457780319869 -80.0374727063338), 
+  (297.3301128011097 -80.66276546185203, 296.4590284862627 -80.66276546185203, 296.4590284862627 -80.97541183961116, 295.5879441714157 -80.97541183961116, 295.5879441714157 -81.28805821737026, 294.42649841828637 -81.28805821737026, 294.42649841828637 -81.60070459512939, 293.26505266515704 -81.60070459512939, 293.26505266515704 -81.9133509728885, 292.10360691202766 -81.9133509728885, 292.10360691202766 -82.22599735064762, 290.94216115889833 -82.22599735064762, 290.94216115889833 -82.53864372840673, 290.07107684405133 -82.53864372840673, 290.07107684405133 -82.85129010616585, 288.909631090922 -82.85129010616585, 288.909631090922 -83.16393648392497, 287.45782389951034 -83.16393648392497, 287.45782389951034 -83.47658286168408, 284.84457095496936 -83.47658286168408, 284.84457095496936 -83.7892292394432, 282.5216794487107 -83.7892292394432, 282.5216794487107 -84.10187561720231, 280.4891493807343 -84.10187561720231, 280.4891493807343 -84.41452199496143, 278.7469807510403 -84.41452199496143, 278.7469807510403 -84.72716837272054, 277.00481212134633 -84.72716837272054, 277.00481212134633 -85.03981475047966, 275.843366368217 -85.03981475047966, 275.843366368217 -84.72716837272054, 274.6819206150877 -84.72716837272054, 274.6819206150877 -84.41452199496143, 273.52047486195835 -84.41452199496143, 273.52047486195835 -84.10187561720231, 272.359029108829 -84.10187561720231, 272.359029108829 -83.7892292394432, 270.9072219174173 -83.7892292394432, 270.9072219174173 -83.47658286168408, 269.45541472600564 -83.47658286168408, 269.45541472600564 -83.16393648392497, 268.003607534594 -83.16393648392497, 268.003607534594 -82.85129010616585, 266.5518003431823 -82.85129010616585, 266.5518003431823 -82.53864372840673, 265.09999315177066 -82.53864372840673, 265.09999315177066 -82.22599735064762, 263.93854739864133 -82.22599735064762, 263.93854739864133 -81.9133509728885, 262.777101645512 -81.9133509728885, 262.777101645512 -81.60070459512939, 261.6156558923827 -81.60070459512939, 261.6156558923827 -81.28805821737026, 260.4542101392533 -81.28805821737026, 260.4542101392533 -80.97541183961116, 259.29276438612396 -80.97541183961116, 259.29276438612396 -80.66276546185203, 258.13131863299463 -80.66276546185203, 258.13131863299463 -80.35011908409292, 256.9698728798653 -80.35011908409292, 256.9698728798653 -80.0374727063338, 255.80842712673598 -80.0374727063338, 255.80842712673598 -79.72482632857468, 254.64698137360665 -79.72482632857468, 254.64698137360665 -79.41217995081557, 252.6144513056303 -79.41217995081557, 252.6144513056303 -79.72482632857468, 251.45300555250097 -79.72482632857468, 251.45300555250097 -80.0374727063338, 250.0011983610893 -80.0374727063338, 250.0011983610893 -80.35011908409292, 247.67830685483062 -80.35011908409292, 247.67830685483062 -80.66276546185203, 244.7746924720073 -80.66276546185203, 244.7746924720073 -80.35011908409292, 242.45180096574862 -80.35011908409292, 242.45180096574862 -80.0374727063338, 241.87107808918395 -80.0374727063338, 241.87107808918395 -79.72482632857468, 241.2903552126193 -79.72482632857468, 241.2903552126193 -79.41217995081557, 240.4192708977723 -79.41217995081557, 240.4192708977723 -79.09953357305645, 239.83854802120763 -79.09953357305645, 239.83854802120763 -78.78688719529734, 238.96746370636063 -78.78688719529734, 238.96746370636063 -78.47424081753822, 238.0963793915136 -78.47424081753822, 238.0963793915136 -78.16159443977911, 237.2252950766666 -78.16159443977911, 237.2252950766666 -77.84894806201999, 236.35421076181962 -77.84894806201999, 236.35421076181962 -77.53630168426088, 235.48312644697262 -77.53630168426088, 235.48312644697262 -77.22365530650175, 234.3216806938433 -77.22365530650175, 234.3216806938433 -76.91100892874263, 233.16023494071393 -76.91100892874263, 233.16023494071393 -76.59836255098352, 231.9987891875846 -76.59836255098352, 231.9987891875846 -76.2857161732244, 230.54698199617295 -76.2857161732244, 230.54698199617295 -75.97306979546529, 229.38553624304362 -75.97306979546529, 229.38553624304362 -75.66042341770617, 227.93372905163193 -75.66042341770617, 227.93372905163193 -75.34777703994706, 226.48192186022027 -75.34777703994706, 226.48192186022027 -75.03513066218794, 225.0301146688086 -75.03513066218794, 225.0301146688086 -74.72248428442882, 223.57830747739695 -74.72248428442882, 223.57830747739695 -74.40983790666971, 221.83613884770293 -74.40983790666971, 221.83613884770293 -74.09719152891059, 220.09397021800893 -74.09719152891059, 220.09397021800893 -73.78454515115148, 217.48071727346792 -73.78454515115148, 217.48071727346792 -74.09719152891059, 211.67348850782125 -74.09719152891059, 211.67348850782125 -74.40983790666971, 204.99517542732758 -74.40983790666971, 204.99517542732758 -74.72248428442882, 198.60722378511625 -74.72248428442882, 198.60722378511625 -74.40983790666971, 196.86505515542223 -74.40983790666971, 196.86505515542223 -74.72248428442882, 195.7036094022929 -74.72248428442882, 195.7036094022929 -75.03513066218794, 194.8325250874459 -75.03513066218794, 194.8325250874459 -75.34777703994706, 193.67107933431657 -75.34777703994706, 193.67107933431657 -75.66042341770617, 192.79999501946958 -75.66042341770617, 192.79999501946958 -75.97306979546529, 191.63854926634022 -75.97306979546529, 191.63854926634022 -76.2857161732244, 190.76746495149322 -76.2857161732244, 190.76746495149322 -76.59836255098352, 189.6060191983639 -76.59836255098352, 189.6060191983639 -76.91100892874263, 188.7349348835169 -76.91100892874263, 188.7349348835169 -77.22365530650175, 187.57348913038757 -77.22365530650175, 187.57348913038757 -77.53630168426088, 186.70240481554055 -77.53630168426088, 186.70240481554055 -77.84894806201999, 185.54095906241122 -77.84894806201999, 185.54095906241122 -78.16159443977911, 184.3795133092819 -78.16159443977911, 184.3795133092819 -78.47424081753822, 183.5084289944349 -78.47424081753822, 183.5084289944349 -78.78688719529734, 182.34698324130557 -78.78688719529734, 182.34698324130557 -79.09953357305645, 181.47589892645854 -79.09953357305645, 181.47589892645854 -79.41217995081557, 180.60481461161154 -79.41217995081557, 180.60481461161154 -79.72482632857468, 179.44336885848222 -79.72482632857468, 179.44336885848222 -80.0374727063338, 178.57228454363522 -80.0374727063338, 178.57228454363522 -80.35011908409292, 177.99156166707056 -80.35011908409292, 177.99156166707056 -80.66276546185203, 177.12047735222356 -80.66276546185203, 177.12047735222356 -80.97541183961116, 176.53975447565887 -80.97541183961116, 176.53975447565887 -81.28805821737026, 175.66867016081187 -81.28805821737026, 175.66867016081187 -81.60070459512939, 175.0879472842472 -81.60070459512939, 175.0879472842472 -81.9133509728885, 174.50722440768254 -81.9133509728885, 174.50722440768254 -82.22599735064762, 173.05541721627088 -82.22599735064762, 173.05541721627088 -82.53864372840673, 171.31324858657686 -82.53864372840673, 171.31324858657686 -82.85129010616585, 169.8614413951652 -82.85129010616585, 169.8614413951652 -83.16393648392497, 168.1192727654712 -83.16393648392497, 168.1192727654712 -83.47658286168408, 166.3771041357772 -83.47658286168408, 166.3771041357772 -83.7892292394432, 164.6349355060832 -83.7892292394432, 164.6349355060832 -84.10187561720231, 162.60240543810687 -84.10187561720231, 162.60240543810687 -84.41452199496143, 160.86023680841285 -84.41452199496143, 160.86023680841285 -84.72716837272054, 159.11806817871886 -84.72716837272054, 159.11806817871886 -85.03981475047966, 157.37589954902487 -85.03981475047966, 157.37589954902487 -85.35246112823879, 155.05300804276618 -85.35246112823879, 155.05300804276618 -85.6651075059979, 153.02047797478986 -85.6651075059979, 153.02047797478986 -85.97775388375702, 150.9879479068135 -85.97775388375702, 150.9879479068135 -86.29040026151613, 148.95541783883718 -86.29040026151613, 148.95541783883718 -86.60304663927525, 147.21324920914319 -86.60304663927525, 147.21324920914319 -86.91569301703436, 145.18071914116683 -86.91569301703436, 145.18071914116683 -87.22833939479348, 142.85782763490818 -87.22833939479348, 142.85782763490818 -87.5409857725526, 140.24457469036716 -87.5409857725526, 140.24457469036716 -87.85363215031171, 136.1795145544145 -87.85363215031171, 136.1795145544145 -88.16627852807083, 128.92047859735615 -88.16627852807083, 128.92047859735615 -87.85363215031171, 126.88794852937983 -87.85363215031171, 126.88794852937983 -87.5409857725526, 125.14577989968582 -87.5409857725526, 125.14577989968582 -87.22833939479348, 123.69397270827415 -87.22833939479348, 123.69397270827415 -86.91569301703436, 121.95180407858015 -86.91569301703436, 121.95180407858015 -86.60304663927525, 120.49999688716848 -86.60304663927525, 120.49999688716848 -86.29040026151613, 119.0481896957568 -86.29040026151613, 119.0481896957568 -85.97775388375702, 117.59638250434514 -85.97775388375702, 117.59638250434514 -85.6651075059979, 112.9505994918278 -85.6651075059979, 112.9505994918278 -85.35246112823879, 109.4662622324398 -85.35246112823879, 109.4662622324398 -85.03981475047966, 106.8530092878988 -85.03981475047966, 106.8530092878988 -84.72716837272054, 103.65903346679312 -84.72716837272054, 103.65903346679312 -85.03981475047966, 97.85180470114645 -85.03981475047966, 97.85180470114645 -84.72716837272054, 94.07710600347612 -84.72716837272054, 94.07710600347612 -85.03981475047966, 90.88313018237044 -85.03981475047966, 90.88313018237044 -85.35246112823879, 88.26987723782943 -85.35246112823879, 88.26987723782943 -85.6651075059979, 85.65662429328843 -85.6651075059979, 85.65662429328843 -85.97775388375702, 82.46264847218276 -85.97775388375702, 82.46264847218276 -86.29040026151613, 77.52650402138309 -86.29040026151613, 77.52650402138309 -86.60304663927525, 74.33252820027742 -86.60304663927525, 74.33252820027742 -86.91569301703436, 72.59035957058342 -86.91569301703436), 
+  (4.355421574235005 -87.22833939479348, 4.065060135952671 -87.22833939479348, 4.065060135952671 -87.5409857725526, 3.4843372593880044 -87.5409857725526, 3.4843372593880044 -87.85363215031171, 3.1939758211056706 -87.85363215031171, 3.1939758211056706 -88.16627852807083, 2.9036143828233367 -88.16627852807083, 2.9036143828233367 -88.47892490582994, 2.6132529445410033 -88.47892490582994, 2.6132529445410033 -88.79157128358906, 2.3228915062586695 -88.79157128358906, 2.3228915062586695 -89.10421766134817, 2.0325300679763356 -89.10421766134817, 2.0325300679763356 -89.4168640391073, 1.4518071914116684 -89.4168640391073, 1.4518071914116684 -89.7295104168664, 1.1614457531293347 -89.7295104168664, 1.1614457531293347 -90.04215679462553, 0.8710843148470011 -90.04215679462553, 0.8710843148470011 -90.35480317238465, 0.5807228765646674 -90.35480317238465, 0.5807228765646674 -90.66744955014376, 0.2903614382823337 -90.66744955014376, 0.2903614382823337 -90.98009592790288, 0 -90.98009592790288))MULTILINESTRING ((297.3301128011097 -73.15925239563325, 297.03975136282736 -73.15925239563325, 297.03975136282736 -73.47189877339235, 295.87830560969803 -73.47189877339235, 295.87830560969803 -73.78454515115148, 295.00722129485104 -73.78454515115148, 295.00722129485104 -74.09719152891059, 293.8457755417217 -74.09719152891059, 293.8457755417217 -74.40983790666971, 292.9746912268747 -74.40983790666971, 292.9746912268747 -74.72248428442882, 291.8132454737453 -74.72248428442882, 291.8132454737453 -75.03513066218794, 290.94216115889833 -75.03513066218794, 290.94216115889833 -75.34777703994706, 289.780715405769 -75.34777703994706, 289.780715405769 -75.66042341770617, 288.909631090922 -75.66042341770617, 288.909631090922 -75.97306979546529, 287.7481853377927 -75.97306979546529, 287.7481853377927 -76.2857161732244, 283.97348664012236 -76.2857161732244, 283.97348664012236 -76.59836255098352, 280.198787942452 -76.59836255098352, 280.198787942452 -76.91100892874263, 277.585534997911 -76.91100892874263, 277.585534997911 -77.22365530650175, 275.5530049299347 -77.22365530650175, 275.5530049299347 -76.91100892874263, 274.39155917680534 -76.91100892874263, 274.39155917680534 -76.59836255098352, 273.230113423676 -76.59836255098352, 273.230113423676 -76.2857161732244, 271.77830623226436 -76.2857161732244, 271.77830623226436 -75.97306979546529, 270.32649904085264 -75.97306979546529, 270.32649904085264 -75.66042341770617, 268.874691849441 -75.66042341770617, 268.874691849441 -75.34777703994706, 267.4228846580293 -75.34777703994706, 267.4228846580293 -75.03513066218794, 265.6807160283353 -75.03513066218794, 265.6807160283353 -74.72248428442882, 264.22890883692367 -74.72248428442882, 264.22890883692367 -74.40983790666971, 262.777101645512 -74.40983790666971, 262.777101645512 -74.09719152891059, 261.3252944541003 -74.09719152891059, 261.3252944541003 -73.78454515115148, 259.8734872626886 -73.78454515115148, 259.8734872626886 -73.47189877339235, 258.42168007127697 -73.47189877339235, 258.42168007127697 -73.15925239563325, 256.9698728798653 -73.15925239563325, 256.9698728798653 -72.84660601787412, 255.51806568845365 -72.84660601787412, 255.51806568845365 -72.533959640115, 254.06625849704199 -72.533959640115, 254.06625849704199 -72.22131326235589, 245.35541534857197 -72.22131326235589, 245.35541534857197 -71.90866688459677, 242.74216240403095 -71.90866688459677, 242.74216240403095 -71.59602050683766, 240.99999377433696 -71.59602050683766, 240.99999377433696 -71.28337412907854, 239.25782514464296 -71.28337412907854, 239.25782514464296 -70.97072775131943, 237.2252950766666 -70.97072775131943, 237.2252950766666 -70.65808137356031, 235.1927650086903 -70.65808137356031, 235.1927650086903 -70.3454349958012, 233.4505963789963 -70.3454349958012, 233.4505963789963 -70.03278861804208, 231.41806631101994 -70.03278861804208, 231.41806631101994 -69.72014224028295, 229.96625911960828 -69.72014224028295, 229.96625911960828 -69.40749586252385, 228.51445192819662 -69.40749586252385, 228.51445192819662 -69.09484948476472, 227.06264473678493 -69.09484948476472, 227.06264473678493 -68.78220310700561, 225.61083754537327 -68.78220310700561, 225.61083754537327 -68.46955672924649, 224.1590303539616 -68.46955672924649, 224.1590303539616 -68.15691035148738, 222.70722316254992 -68.15691035148738, 222.70722316254992 -67.84426397372826, 220.96505453285593 -67.84426397372826, 220.96505453285593 -67.53161759596915, 218.9325244648796 -67.53161759596915, 218.9325244648796 -67.21897121821003, 216.02891008205626 -67.21897121821003, 216.02891008205626 -66.9063248404509, 210.2216813164096 -66.9063248404509, 210.2216813164096 -66.5936784626918, 208.18915124843326 -66.5936784626918, 208.18915124843326 -66.9063248404509, 198.89758522339858 -66.9063248404509, 198.89758522339858 -66.5936784626918, 196.28433227885756 -66.5936784626918, 196.28433227885756 -66.9063248404509, 195.12288652572823 -66.9063248404509, 195.12288652572823 -67.21897121821003, 193.67107933431657 -67.21897121821003, 193.67107933431657 -67.53161759596915, 192.50963358118724 -67.53161759596915, 192.50963358118724 -67.84426397372826, 191.3481878280579 -67.84426397372826, 191.3481878280579 -68.15691035148738, 190.18674207492856 -68.15691035148738, 190.18674207492856 -68.46955672924649, 189.31565776008156 -68.46955672924649, 189.31565776008156 -68.78220310700561, 188.15421200695224 -68.78220310700561, 188.15421200695224 -69.09484948476472, 186.99276625382288 -69.09484948476472, 186.99276625382288 -69.40749586252385, 185.83132050069355 -69.40749586252385, 185.83132050069355 -69.72014224028295, 184.96023618584655 -69.72014224028295, 184.96023618584655 -70.03278861804208, 184.08915187099956 -70.03278861804208, 184.08915187099956 -70.3454349958012, 183.21806755615256 -70.3454349958012, 183.21806755615256 -70.65808137356031, 182.34698324130557 -70.65808137356031, 182.34698324130557 -70.97072775131943, 181.47589892645854 -70.97072775131943, 181.47589892645854 -71.28337412907854, 180.60481461161154 -71.28337412907854, 180.60481461161154 -71.59602050683766, 179.44336885848222 -71.59602050683766, 179.44336885848222 -71.90866688459677, 178.57228454363522 -71.90866688459677, 178.57228454363522 -72.22131326235589, 177.70120022878822 -72.22131326235589, 177.70120022878822 -72.533959640115, 176.8301159139412 -72.533959640115, 176.8301159139412 -72.84660601787412, 175.9590315990942 -72.84660601787412, 175.9590315990942 -73.15925239563325, 175.0879472842472 -73.15925239563325, 175.0879472842472 -73.47189877339235, 174.2168629694002 -73.47189877339235, 174.2168629694002 -73.78454515115148, 171.89397146314155 -73.78454515115148, 171.89397146314155 -74.09719152891059, 169.57107995688287 -74.09719152891059, 169.57107995688287 -74.40983790666971, 166.95782701234188 -74.40983790666971, 166.95782701234188 -74.72248428442882, 164.34457406780086 -74.72248428442882, 164.34457406780086 -75.03513066218794, 161.73132112325987 -75.03513066218794, 161.73132112325987 -75.34777703994706, 158.82770674043653 -75.34777703994706, 158.82770674043653 -75.66042341770617, 155.3433694810485 -75.66042341770617, 155.3433694810485 -75.97306979546529, 151.5686707833782 -75.97306979546529, 151.5686707833782 -76.2857161732244, 147.79397208570785 -76.2857161732244, 147.79397208570785 -76.59836255098352, 142.85782763490818 -76.59836255098352, 142.85782763490818 -76.91100892874263, 135.59879167784982 -76.91100892874263, 135.59879167784982 -76.59836255098352, 131.53373154189717 -76.59836255098352, 131.53373154189717 -76.2857161732244, 129.21084003563848 -76.2857161732244, 129.21084003563848 -75.97306979546529, 127.17830996766216 -75.97306979546529, 127.17830996766216 -75.66042341770617, 125.72650277625048 -75.66042341770617, 125.72650277625048 -75.34777703994706, 124.27469558483881 -75.34777703994706, 124.27469558483881 -75.03513066218794, 122.82288839342715 -75.03513066218794, 122.82288839342715 -74.72248428442882, 121.37108120201547 -74.72248428442882, 121.37108120201547 -74.40983790666971, 119.91927401060381 -74.40983790666971, 119.91927401060381 -74.09719152891059, 118.46746681919214 -74.09719152891059, 118.46746681919214 -73.78454515115148, 116.4349367512158 -73.78454515115148, 116.4349367512158 -73.47189877339235, 112.66023805354547 -73.47189877339235, 112.66023805354547 -73.15925239563325, 110.04698510900447 -73.15925239563325, 110.04698510900447 -72.84660601787412, 107.7240936027458 -72.84660601787412, 107.7240936027458 -72.533959640115, 98.72288901599346 -72.533959640115, 98.72288901599346 -72.22131326235589, 93.20602168862911 -72.22131326235589, 93.20602168862911 -72.533959640115, 89.14096155267644 -72.533959640115, 89.14096155267644 -72.84660601787412, 86.23734716985311 -72.84660601787412, 86.23734716985311 -73.15925239563325, 83.91445566359444 -73.15925239563325, 83.91445566359444 -73.47189877339235, 74.91325107684209 -73.47189877339235, 74.91325107684209 -73.78454515115148, 72.59035957058342 -73.78454515115148), 
+  (72.29999813230108 -73.78454515115148, 70.55782950260709 -73.78454515115148, 70.55782950260709 -73.47189877339235, 67.65421511978374 -73.47189877339235, 67.65421511978374 -73.15925239563325, 64.75060073696041 -73.15925239563325, 64.75060073696041 -72.84660601787412, 62.427709230701744 -72.84660601787412, 62.427709230701744 -72.533959640115, 60.10481772444307 -72.533959640115, 60.10481772444307 -72.22131326235589, 58.94337197131374 -72.22131326235589, 58.94337197131374 -71.90866688459677, 57.49156477990207 -71.90866688459677, 57.49156477990207 -71.59602050683766, 56.330119026772735 -71.59602050683766, 56.330119026772735 -71.28337412907854, 55.1686732736434 -71.28337412907854, 55.1686732736434 -70.97072775131943, 54.007227520514064 -70.97072775131943, 54.007227520514064 -70.65808137356031, 53.13614320566706 -70.65808137356031, 53.13614320566706 -70.3454349958012, 51.97469745253773 -70.3454349958012, 51.97469745253773 -70.03278861804208, 51.10361313769073 -70.03278861804208, 51.10361313769073 -69.72014224028295, 50.232528822843726 -69.72014224028295, 50.232528822843726 -69.40749586252385, 49.07108306971439 -69.40749586252385, 49.07108306971439 -69.09484948476472, 47.61927587830272 -69.09484948476472, 47.61927587830272 -68.78220310700561, 46.45783012517339 -68.78220310700561, 46.45783012517339 -68.46955672924649, 45.00602293376172 -68.46955672924649, 45.00602293376172 -68.15691035148738, 43.55421574235005 -68.15691035148738, 43.55421574235005 -67.84426397372826, 42.39276998922072 -67.84426397372826, 42.39276998922072 -67.53161759596915, 41.23132423609138 -67.53161759596915, 41.23132423609138 -67.21897121821003, 40.06987848296205 -67.21897121821003, 40.06987848296205 -66.9063248404509, 38.61807129155038 -66.9063248404509, 38.61807129155038 -66.5936784626918, 37.16626410013871 -66.5936784626918, 37.16626410013871 -66.28103208493268, 35.42409547044471 -66.28103208493268, 35.42409547044471 -65.96838570717357, 33.39156540246837 -65.96838570717357, 33.39156540246837 -65.65573932941444, 31.359035334492038 -65.65573932941444, 31.359035334492038 -65.34309295165534, 28.745782389951035 -65.34309295165534, 28.745782389951035 -65.03044657389621, 25.551806568845365 -65.03044657389621, 25.551806568845365 -65.34309295165534, 24.099999377433697 -65.34309295165534, 24.099999377433697 -65.65573932941444, 22.648192186022026 -65.65573932941444, 22.648192186022026 -65.96838570717357, 21.486746432892694 -65.96838570717357, 21.486746432892694 -66.28103208493268, 20.61566211804569 -66.28103208493268, 20.61566211804569 -66.5936784626918, 19.74457780319869 -66.5936784626918), 
+  (4.355421574235005 -68.46955672924649, 4.065060135952671 -68.46955672924649, 4.065060135952671 -68.78220310700561, 3.4843372593880044 -68.78220310700561, 3.4843372593880044 -69.09484948476472, 2.9036143828233367 -69.09484948476472, 2.9036143828233367 -69.40749586252385, 2.3228915062586695 -69.40749586252385, 2.3228915062586695 -69.72014224028295, 1.7421686296940022 -69.72014224028295, 1.7421686296940022 -70.03278861804208, 0.8710843148470011 -70.03278861804208, 0.8710843148470011 -70.3454349958012, 0.2903614382823337 -70.3454349958012, 0.2903614382823337 -70.65808137356031, 0 -70.65808137356031))MULTILINESTRING ((297.3301128011097 -70.03278861804208, 297.03975136282736 -70.03278861804208, 297.03975136282736 -70.3454349958012, 295.87830560969803 -70.3454349958012, 295.87830560969803 -70.65808137356031, 295.00722129485104 -70.65808137356031, 295.00722129485104 -70.97072775131943, 293.8457755417217 -70.97072775131943, 293.8457755417217 -71.28337412907854, 292.9746912268747 -71.28337412907854, 292.9746912268747 -71.59602050683766, 291.8132454737453 -71.59602050683766, 291.8132454737453 -71.90866688459677, 290.94216115889833 -71.90866688459677, 290.94216115889833 -72.22131326235589, 289.780715405769 -72.22131326235589, 289.780715405769 -72.533959640115, 288.909631090922 -72.533959640115, 288.909631090922 -72.84660601787412, 288.038546776075 -72.84660601787412, 288.038546776075 -73.15925239563325, 283.3927637635577 -73.15925239563325, 283.3927637635577 -73.47189877339235, 279.03734218932266 -73.47189877339235, 279.03734218932266 -73.78454515115148, 275.26264349165234 -73.78454515115148, 275.26264349165234 -73.47189877339235, 273.8108363002407 -73.47189877339235, 273.8108363002407 -73.15925239563325, 272.64939054711135 -73.15925239563325, 272.64939054711135 -72.84660601787412, 271.19758335569963 -72.84660601787412, 271.19758335569963 -72.533959640115, 269.745776164288 -72.533959640115, 269.745776164288 -72.22131326235589, 268.2939689728763 -72.22131326235589, 268.2939689728763 -71.90866688459677, 266.5518003431823 -71.90866688459677, 266.5518003431823 -71.59602050683766, 264.80963171348833 -71.59602050683766, 264.80963171348833 -71.28337412907854, 263.35782452207667 -71.28337412907854, 263.35782452207667 -70.97072775131943, 261.6156558923827 -70.97072775131943, 261.6156558923827 -70.65808137356031, 260.16384870097096 -70.65808137356031, 260.16384870097096 -70.3454349958012, 258.42168007127697 -70.3454349958012, 258.42168007127697 -70.03278861804208, 256.9698728798653 -70.03278861804208, 256.9698728798653 -69.72014224028295, 255.2277042501713 -69.72014224028295, 255.2277042501713 -69.40749586252385, 252.6144513056303 -69.40749586252385, 252.6144513056303 -69.09484948476472, 246.80722253998363 -69.09484948476472, 246.80722253998363 -68.78220310700561, 243.61324671887797 -68.78220310700561, 243.61324671887797 -68.46955672924649, 240.99999377433696 -68.46955672924649, 240.99999377433696 -68.15691035148738, 238.6771022680783 -68.15691035148738, 238.6771022680783 -67.84426397372826, 236.35421076181962 -67.84426397372826, 236.35421076181962 -67.53161759596915, 234.03131925556096 -67.53161759596915, 234.03131925556096 -67.21897121821003, 231.70842774930227 -67.21897121821003, 231.70842774930227 -66.9063248404509, 229.96625911960828 -66.9063248404509, 229.96625911960828 -66.5936784626918, 228.80481336647895 -66.5936784626918, 228.80481336647895 -66.28103208493268, 227.35300617506726 -66.28103208493268, 227.35300617506726 -65.96838570717357, 225.9011989836556 -65.96838570717357, 225.9011989836556 -65.65573932941444, 224.44939179224394 -65.65573932941444, 224.44939179224394 -65.34309295165534, 222.99758460083228 -65.34309295165534, 222.99758460083228 -65.03044657389621, 221.25541597113826 -65.03044657389621, 221.25541597113826 -64.71780019613709, 219.8036087797266 -64.71780019613709, 219.8036087797266 -64.40515381837798, 217.48071727346792 -64.40515381837798, 217.48071727346792 -64.09250744061886, 214.86746432892693 -64.09250744061886, 214.86746432892693 -63.77986106285975, 210.51204275469192 -63.77986106285975, 210.51204275469192 -63.46721468510063, 207.60842837186857 -63.46721468510063, 207.60842837186857 -63.77986106285975, 200.34939241481024 -63.77986106285975, 200.34939241481024 -63.46721468510063, 197.15541659370456 -63.46721468510063, 197.15541659370456 -63.15456830734151, 196.86505515542223 -63.15456830734151, 196.86505515542223 -63.46721468510063, 195.7036094022929 -63.46721468510063, 195.7036094022929 -63.77986106285975, 194.25180221088124 -63.77986106285975, 194.25180221088124 -64.09250744061886, 193.0903564577519 -64.09250744061886, 193.0903564577519 -64.40515381837798, 191.92891070462255 -64.40515381837798, 191.92891070462255 -64.71780019613709, 190.76746495149322 -64.71780019613709, 190.76746495149322 -65.03044657389621, 189.6060191983639 -65.03044657389621, 189.6060191983639 -65.34309295165534, 188.44457344523457 -65.34309295165534, 188.44457344523457 -65.65573932941444, 187.28312769210524 -65.65573932941444, 187.28312769210524 -65.96838570717357, 186.12168193897588 -65.96838570717357, 186.12168193897588 -66.28103208493268, 185.2505976241289 -66.28103208493268, 185.2505976241289 -66.5936784626918, 184.3795133092819 -66.5936784626918, 184.3795133092819 -66.9063248404509, 183.5084289944349 -66.9063248404509, 183.5084289944349 -67.21897121821003, 182.34698324130557 -67.21897121821003, 182.34698324130557 -67.53161759596915, 181.47589892645854 -67.53161759596915, 181.47589892645854 -67.84426397372826, 180.60481461161154 -67.84426397372826, 180.60481461161154 -68.15691035148738, 179.73373029676455 -68.15691035148738, 179.73373029676455 -68.46955672924649, 178.57228454363522 -68.46955672924649, 178.57228454363522 -68.78220310700561, 177.70120022878822 -68.78220310700561, 177.70120022878822 -69.09484948476472, 176.8301159139412 -69.09484948476472, 176.8301159139412 -69.40749586252385, 175.66867016081187 -69.40749586252385, 175.66867016081187 -69.72014224028295, 174.79758584596487 -69.72014224028295, 174.79758584596487 -70.03278861804208, 173.05541721627088 -70.03278861804208, 173.05541721627088 -70.3454349958012, 170.44216427172987 -70.3454349958012, 170.44216427172987 -70.65808137356031, 167.53854988890654 -70.65808137356031, 167.53854988890654 -70.97072775131943, 164.6349355060832 -70.97072775131943, 164.6349355060832 -71.28337412907854, 161.4409596849775 -71.28337412907854, 161.4409596849775 -71.59602050683766, 157.6662609873072 -71.59602050683766, 157.6662609873072 -71.90866688459677, 153.02047797478986 -71.90866688459677, 153.02047797478986 -72.22131326235589, 148.08433352399018 -72.22131326235589, 148.08433352399018 -72.533959640115, 135.01806880128515 -72.533959640115, 135.01806880128515 -72.22131326235589, 131.8240929801795 -72.22131326235589, 131.8240929801795 -71.90866688459677, 129.79156291220315 -71.90866688459677, 129.79156291220315 -71.59602050683766, 127.75903284422682 -71.59602050683766, 127.75903284422682 -71.28337412907854, 126.30722565281515 -71.28337412907854, 126.30722565281515 -70.97072775131943, 124.85541846140349 -70.97072775131943, 124.85541846140349 -70.65808137356031, 123.40361126999181 -70.65808137356031, 123.40361126999181 -70.3454349958012, 121.95180407858015 -70.3454349958012, 121.95180407858015 -70.03278861804208, 120.49999688716848 -70.03278861804208, 120.49999688716848 -69.72014224028295, 119.33855113403915 -69.72014224028295, 119.33855113403915 -69.40749586252385, 117.88674394262748 -69.40749586252385, 117.88674394262748 -69.09484948476472, 114.98312955980414 -69.09484948476472, 114.98312955980414 -68.78220310700561, 111.78915373869847 -68.78220310700561, 111.78915373869847 -68.46955672924649, 109.4662622324398 -68.46955672924649, 109.4662622324398 -68.15691035148738, 107.14337072618113 -68.15691035148738, 107.14337072618113 -67.84426397372826, 99.30361189255812 -67.84426397372826, 99.30361189255812 -67.53161759596915, 92.62529881206444 -67.53161759596915, 92.62529881206444 -67.84426397372826, 88.85060011439411 -67.84426397372826, 88.85060011439411 -68.15691035148738, 85.94698573157078 -68.15691035148738, 85.94698573157078 -68.46955672924649, 83.6240942253121 -68.46955672924649, 83.6240942253121 -68.78220310700561, 74.62288963855976 -68.78220310700561, 74.62288963855976 -69.09484948476472, 72.59035957058342 -69.09484948476472), 
+  (4.355421574235005 -61.27869004078681, 4.065060135952671 -61.27869004078681, 4.065060135952671 -61.591336418545936, 3.4843372593880044 -61.591336418545936, 3.4843372593880044 -61.90398279630505, 2.6132529445410033 -61.90398279630505, 2.6132529445410033 -62.21662917406417, 1.7421686296940022 -62.21662917406417, 1.7421686296940022 -62.52927555182328, 1.1614457531293347 -62.52927555182328, 1.1614457531293347 -62.8419219295824, 0.2903614382823337 -62.8419219295824, 0.2903614382823337 -63.15456830734151, 0 -63.15456830734151), 
+  (72.29999813230108 -69.09484948476472, 70.55782950260709 -69.09484948476472, 70.55782950260709 -68.78220310700561, 67.65421511978374 -68.78220310700561, 67.65421511978374 -68.46955672924649, 65.04096217524274 -68.46955672924649, 65.04096217524274 -68.15691035148738, 62.427709230701744 -68.15691035148738, 62.427709230701744 -67.84426397372826, 60.395179162725405 -67.84426397372826, 60.395179162725405 -67.53161759596915, 58.94337197131374 -67.53161759596915, 58.94337197131374 -67.21897121821003, 57.7819262181844 -67.21897121821003, 57.7819262181844 -66.9063248404509, 56.62048046505507 -66.9063248404509, 56.62048046505507 -66.5936784626918, 55.45903471192573 -66.5936784626918, 55.45903471192573 -66.28103208493268, 54.297588958796396 -66.28103208493268, 54.297588958796396 -65.96838570717357, 53.4265046439494 -65.96838570717357, 53.4265046439494 -65.65573932941444, 52.265058890820065 -65.65573932941444, 52.265058890820065 -65.34309295165534, 51.39397457597306 -65.34309295165534, 51.39397457597306 -65.03044657389621, 50.52289026112606 -65.03044657389621, 50.52289026112606 -64.71780019613709, 49.942167384561394 -64.71780019613709, 49.942167384561394 -64.40515381837798, 48.78072163143206 -64.40515381837798, 48.78072163143206 -64.09250744061886, 47.32891444002039 -64.09250744061886, 47.32891444002039 -63.77986106285975, 45.87710724860872 -63.77986106285975, 45.87710724860872 -63.46721468510063, 44.71566149547939 -63.46721468510063, 44.71566149547939 -63.15456830734151, 43.26385430406772 -63.15456830734151, 43.26385430406772 -62.8419219295824, 42.102408550938385 -62.8419219295824, 42.102408550938385 -62.52927555182328, 40.94096279780905 -62.52927555182328, 40.94096279780905 -62.21662917406417, 39.779517044679714 -62.21662917406417, 39.779517044679714 -61.90398279630505, 38.61807129155038 -61.90398279630505, 38.61807129155038 -61.591336418545936, 37.16626410013871 -61.591336418545936, 37.16626410013871 -61.27869004078681, 35.42409547044471 -61.27869004078681, 35.42409547044471 -60.9660436630277, 33.681926840750705 -60.9660436630277, 33.681926840750705 -60.65339728526858, 31.939758211056706 -60.65339728526858, 31.939758211056706 -60.34075090750947, 29.616866704798035 -60.34075090750947, 29.616866704798035 -60.02810452975035, 27.293975198539368 -60.02810452975035, 27.293975198539368 -59.715458151991236, 26.7132523219747 -59.715458151991236, 26.7132523219747 -60.02810452975035, 24.39036081571603 -60.02810452975035, 24.39036081571603 -60.34075090750947, 22.93855362430436 -60.34075090750947, 22.93855362430436 -60.65339728526858, 21.486746432892694 -60.65339728526858, 21.486746432892694 -60.9660436630277, 20.61566211804569 -60.9660436630277, 20.61566211804569 -61.27869004078681, 19.74457780319869 -61.27869004078681))MULTILINESTRING ((4.355421574235005 -10.629976843809958, 1.1614457531293347 -10.629976843809958, 1.1614457531293347 -10.942623221569075, 0 -10.942623221569075), 
+  (4.355421574235005 -49.08548130818128, 4.065060135952671 -49.08548130818128, 4.065060135952671 -49.398127685940395, 2.9036143828233367 -49.398127685940395, 2.9036143828233367 -49.71077406369951, 1.4518071914116684 -49.71077406369951, 1.4518071914116684 -50.023420441458626, 0 -50.023420441458626), 
+  (72.29999813230108 -60.65339728526858, 69.68674518776008 -60.65339728526858, 69.68674518776008 -60.34075090750947, 67.07349224321908 -60.34075090750947, 67.07349224321908 -60.02810452975035, 64.46023929867808 -60.02810452975035, 64.46023929867808 -59.715458151991236, 61.84698635413707 -59.715458151991236, 61.84698635413707 -59.40281177423212, 60.10481772444307 -59.40281177423212, 60.10481772444307 -59.090165396473004, 58.94337197131374 -59.090165396473004, 58.94337197131374 -58.77751901871389, 57.7819262181844 -58.77751901871389, 57.7819262181844 -58.464872640954766, 56.9108419033374 -58.464872640954766, 56.9108419033374 -58.15222626319565, 55.74939615020807 -58.15222626319565, 55.74939615020807 -57.839579885436535, 54.87831183536107 -57.839579885436535, 54.87831183536107 -57.52693350767742, 54.007227520514064 -57.52693350767742, 54.007227520514064 -57.214287129918304, 53.13614320566706 -57.214287129918304, 53.13614320566706 -56.90164075215919, 52.265058890820065 -56.90164075215919, 52.265058890820065 -56.58899437440007, 51.68433601425539 -56.58899437440007, 51.68433601425539 -56.27634799664095, 50.8132516994084 -56.27634799664095, 50.8132516994084 -55.963701618881835, 49.942167384561394 -55.963701618881835, 49.942167384561394 -55.65105524112272, 49.36144450799673 -55.65105524112272, 49.36144450799673 -55.338408863363604, 47.909637316585055 -55.338408863363604, 47.909637316585055 -55.02576248560449, 46.74819156345572 -55.02576248560449, 46.74819156345572 -54.71311610784537, 45.58674581032639 -54.71311610784537, 45.58674581032639 -54.40046973008626, 44.425300057197056 -54.40046973008626, 44.425300057197056 -54.08782335232714, 43.26385430406772 -54.08782335232714, 43.26385430406772 -53.775176974568026, 42.102408550938385 -53.775176974568026, 42.102408550938385 -53.462530596808904, 40.94096279780905 -53.462530596808904, 40.94096279780905 -53.14988421904979, 40.06987848296205 -53.14988421904979, 40.06987848296205 -52.83723784129067, 38.90843272983271 -52.83723784129067, 38.90843272983271 -52.52459146353156, 37.746986976703376 -52.52459146353156, 37.746986976703376 -52.21194508577244, 36.29517978529171 -52.21194508577244, 36.29517978529171 -51.899298708013326, 35.13373403216237 -51.899298708013326, 35.13373403216237 -51.58665233025421, 33.39156540246837 -51.58665233025421, 33.39156540246837 -51.27400595249509, 31.939758211056706 -51.27400595249509, 31.939758211056706 -50.96135957473597, 30.197589581362703 -50.96135957473597, 30.197589581362703 -50.64871319697686, 28.165059513386367 -50.64871319697686, 28.165059513386367 -50.33606681921774, 24.39036081571603 -50.33606681921774, 24.39036081571603 -50.64871319697686, 22.648192186022026 -50.64871319697686, 22.648192186022026 -50.96135957473597, 21.19638499461036 -50.96135957473597, 21.19638499461036 -51.27400595249509, 20.034939241481023 -51.27400595249509, 20.034939241481023 -51.58665233025421, 19.74457780319869 -51.58665233025421), 
+  (297.3301128011097 -64.09250744061886, 297.03975136282736 -64.09250744061886, 297.03975136282736 -64.40515381837798, 296.16866704798036 -64.40515381837798, 296.16866704798036 -64.71780019613709, 295.29758273313337 -64.71780019613709, 295.29758273313337 -65.03044657389621, 294.13613698000404 -65.03044657389621, 294.13613698000404 -65.34309295165534, 293.26505266515704 -65.34309295165534, 293.26505266515704 -65.65573932941444, 292.39396835031005 -65.65573932941444, 292.39396835031005 -65.96838570717357, 291.522884035463 -65.96838570717357, 291.522884035463 -66.28103208493268, 290.651799720616 -66.28103208493268, 290.651799720616 -66.5936784626918, 289.49035396748667 -66.5936784626918, 289.49035396748667 -66.9063248404509, 288.6192696526397 -66.9063248404509, 288.6192696526397 -67.21897121821003, 287.7481853377927 -67.21897121821003, 287.7481853377927 -67.53161759596915, 279.03734218932266 -67.53161759596915, 279.03734218932266 -67.84426397372826, 275.5530049299347 -67.84426397372826, 275.5530049299347 -67.53161759596915, 274.101197738523 -67.53161759596915, 274.101197738523 -67.21897121821003, 272.9397519853937 -67.21897121821003, 272.9397519853937 -66.9063248404509, 271.48794479398197 -66.9063248404509, 271.48794479398197 -66.5936784626918, 270.0361376025703 -66.5936784626918, 270.0361376025703 -66.28103208493268, 268.58433041115865 -66.28103208493268, 268.58433041115865 -65.96838570717357, 267.132523219747 -65.96838570717357, 267.132523219747 -65.65573932941444, 265.390354590053 -65.65573932941444, 265.390354590053 -65.34309295165534, 263.648185960359 -65.34309295165534, 263.648185960359 -65.03044657389621, 261.6156558923827 -65.03044657389621, 261.6156558923827 -64.71780019613709, 259.8734872626886 -64.71780019613709, 259.8734872626886 -64.40515381837798, 257.8409571947123 -64.40515381837798, 257.8409571947123 -64.09250744061886, 256.0987885650183 -64.09250744061886, 256.0987885650183 -63.77986106285975, 254.06625849704199 -63.77986106285975, 254.06625849704199 -63.46721468510063, 250.0011983610893 -63.46721468510063, 250.0011983610893 -63.15456830734151, 245.93613822513663 -63.15456830734151, 245.93613822513663 -62.8419219295824, 242.45180096574862 -62.8419219295824, 242.45180096574862 -62.52927555182328, 239.25782514464296 -62.52927555182328, 239.25782514464296 -62.21662917406417, 236.06384932353728 -62.21662917406417, 236.06384932353728 -61.90398279630505, 232.8698735024316 -61.90398279630505, 232.8698735024316 -61.591336418545936, 230.54698199617295 -61.591336418545936, 230.54698199617295 -61.27869004078681, 229.38553624304362 -61.27869004078681, 229.38553624304362 -60.9660436630277, 228.2240904899143 -60.9660436630277, 228.2240904899143 -60.65339728526858, 227.06264473678493 -60.65339728526858, 227.06264473678493 -60.34075090750947, 225.61083754537327 -60.34075090750947, 225.61083754537327 -60.02810452975035, 224.44939179224394 -60.02810452975035, 224.44939179224394 -59.715458151991236, 222.99758460083228 -59.715458151991236, 222.99758460083228 -59.40281177423212, 221.5457774094206 -59.40281177423212, 221.5457774094206 -59.090165396473004, 219.8036087797266 -59.090165396473004, 219.8036087797266 -58.77751901871389, 218.0614401500326 -58.77751901871389, 218.0614401500326 -58.464872640954766, 216.02891008205626 -58.464872640954766, 216.02891008205626 -58.15222626319565, 213.41565713751527 -58.15222626319565, 213.41565713751527 -57.839579885436535, 201.8011996062219 -57.839579885436535, 201.8011996062219 -57.52693350767742, 198.31686234683391 -57.52693350767742, 198.31686234683391 -57.214287129918304, 196.28433227885756 -57.214287129918304, 196.28433227885756 -57.52693350767742, 194.8325250874459 -57.52693350767742, 194.8325250874459 -57.839579885436535, 193.67107933431657 -57.839579885436535, 193.67107933431657 -58.15222626319565, 192.21927214290488 -58.15222626319565, 192.21927214290488 -58.464872640954766, 191.05782638977556 -58.464872640954766, 191.05782638977556 -58.77751901871389, 189.6060191983639 -58.77751901871389, 189.6060191983639 -59.090165396473004, 188.44457344523457 -59.090165396473004, 188.44457344523457 -59.40281177423212, 187.28312769210524 -59.40281177423212, 187.28312769210524 -59.715458151991236, 186.12168193897588 -59.715458151991236, 186.12168193897588 -60.02810452975035, 184.96023618584655 -60.02810452975035, 184.96023618584655 -60.34075090750947, 184.08915187099956 -60.34075090750947, 184.08915187099956 -60.65339728526858, 183.21806755615256 -60.65339728526858, 183.21806755615256 -60.9660436630277, 182.05662180302323 -60.9660436630277, 182.05662180302323 -61.27869004078681, 181.1855374881762 -61.27869004078681, 181.1855374881762 -61.591336418545936, 180.02409173504688 -61.591336418545936, 180.02409173504688 -61.90398279630505, 179.15300742019988 -61.90398279630505, 179.15300742019988 -62.21662917406417, 177.99156166707056 -62.21662917406417, 177.99156166707056 -62.52927555182328, 176.8301159139412 -62.52927555182328, 176.8301159139412 -62.8419219295824, 175.9590315990942 -62.8419219295824, 175.9590315990942 -63.15456830734151, 174.79758584596487 -63.15456830734151, 174.79758584596487 -63.46721468510063, 172.76505577798855 -63.46721468510063, 172.76505577798855 -63.77986106285975, 169.28071851860054 -63.77986106285975, 169.28071851860054 -64.09250744061886, 165.5060198209302 -64.09250744061886, 165.5060198209302 -64.40515381837798, 161.15059824669518 -64.40515381837798, 161.15059824669518 -64.71780019613709, 155.3433694810485 -64.71780019613709, 155.3433694810485 -65.03044657389621, 146.05180345601383 -65.03044657389621, 146.05180345601383 -65.34309295165534, 141.11565900521418 -65.34309295165534, 141.11565900521418 -65.03044657389621, 136.1795145544145 -65.03044657389621, 136.1795145544145 -64.71780019613709, 133.5662616098735 -64.71780019613709, 133.5662616098735 -64.40515381837798, 131.53373154189717 -64.40515381837798, 131.53373154189717 -64.09250744061886, 129.50120147392082 -64.09250744061886, 129.50120147392082 -63.77986106285975, 128.04939428250916 -63.77986106285975, 128.04939428250916 -63.46721468510063, 126.59758709109748 -63.46721468510063, 126.59758709109748 -63.15456830734151, 125.14577989968582 -63.15456830734151, 125.14577989968582 -62.8419219295824, 123.98433414655648 -62.8419219295824, 123.98433414655648 -62.52927555182328, 122.82288839342715 -62.52927555182328, 122.82288839342715 -62.21662917406417, 121.6614426402978 -62.21662917406417, 121.6614426402978 -61.90398279630505, 120.49999688716848 -61.90398279630505, 120.49999688716848 -61.591336418545936, 119.33855113403915 -61.591336418545936, 119.33855113403915 -61.27869004078681, 118.17710538090981 -61.27869004078681, 118.17710538090981 -60.9660436630277, 115.5638524363688 -60.9660436630277, 115.5638524363688 -60.65339728526858, 112.66023805354547 -60.65339728526858, 112.66023805354547 -60.34075090750947, 110.3373465472868 -60.34075090750947, 110.3373465472868 -60.02810452975035, 108.30481647931046 -60.02810452975035, 108.30481647931046 -59.715458151991236, 106.8530092878988 -59.715458151991236, 106.8530092878988 -59.40281177423212, 100.46505764568745 -59.40281177423212, 100.46505764568745 -59.090165396473004, 91.46385305893511 -59.090165396473004, 91.46385305893511 -59.40281177423212, 88.26987723782943 -59.40281177423212, 88.26987723782943 -59.715458151991236, 85.94698573157078 -59.715458151991236, 85.94698573157078 -60.02810452975035, 84.20481710187677 -60.02810452975035, 84.20481710187677 -60.34075090750947, 76.07469682997143 -60.34075090750947, 76.07469682997143 -60.65339728526858, 72.59035957058342 -60.65339728526858), 
+  (58.362649094749074 0, 58.362649094749074 -0.3126463777591164, 58.653010533031406 -0.3126463777591164, 58.653010533031406 -0.6252927555182328, 59.23373340959607 -0.6252927555182328, 59.23373340959607 -0.9379391332773492, 59.5240948478784 -0.9379391332773492, 59.5240948478784 -1.2505855110364656, 59.81445628616074 -1.2505855110364656, 59.81445628616074 -1.563231888795582, 60.10481772444307 -1.563231888795582, 60.10481772444307 -2.8138173998320477, 59.81445628616074 -2.8138173998320477, 59.81445628616074 -3.126463777591164, 59.5240948478784 -3.126463777591164, 59.5240948478784 -3.4391101553502805, 58.94337197131374 -3.4391101553502805, 58.94337197131374 -3.751756533109397, 58.362649094749074 -3.751756533109397, 58.362649094749074 -4.064402910868513, 57.49156477990207 -4.064402910868513, 57.49156477990207 -4.37704928862763, 56.330119026772735 -4.37704928862763, 56.330119026772735 -4.689695666386746, 54.87831183536107 -4.689695666386746, 54.87831183536107 -5.002342044145863, 53.13614320566706 -5.002342044145863, 53.13614320566706 -5.314988421904979, 51.39397457597306 -5.314988421904979, 51.39397457597306 -5.627634799664095, 49.36144450799673 -5.627634799664095, 49.36144450799673 -5.940281177423212, 47.32891444002039 -5.940281177423212, 47.32891444002039 -6.252927555182328, 45.29638437204405 -6.252927555182328, 45.29638437204405 -6.565573932941445, 42.97349286578539 -6.565573932941445, 42.97349286578539 -6.878220310700561, 40.65060135952672 -6.878220310700561, 40.65060135952672 -7.1908666884596775, 38.037348414985715 -7.1908666884596775, 38.037348414985715 -7.503513066218794, 35.42409547044471 -7.503513066218794, 35.42409547044471 -7.81615944397791, 32.52048108762137 -7.81615944397791, 32.52048108762137 -8.128805821737027, 29.616866704798035 -8.128805821737027, 29.616866704798035 -8.441452199496144, 26.422890883692364 -8.441452199496144, 26.422890883692364 -8.75409857725526, 23.80963793915136 -8.75409857725526, 23.80963793915136 -9.066744955014375, 21.486746432892694 -9.066744955014375, 21.486746432892694 -9.379391332773492, 19.74457780319869 -9.379391332773492))MULTILINESTRING ((297.3301128011097 -52.83723784129067, 296.4590284862627 -52.83723784129067, 296.4590284862627 -53.14988421904979, 295.5879441714157 -53.14988421904979, 295.5879441714157 -53.462530596808904, 294.7168598565687 -53.462530596808904, 294.7168598565687 -53.775176974568026, 293.8457755417217 -53.775176974568026, 293.8457755417217 -54.08782335232714, 292.9746912268747 -54.08782335232714, 292.9746912268747 -54.40046973008626, 292.10360691202766 -54.40046973008626, 292.10360691202766 -54.71311610784537, 291.522884035463 -54.71311610784537, 291.522884035463 -55.02576248560449, 290.651799720616 -55.02576248560449, 290.651799720616 -55.338408863363604, 289.780715405769 -55.338408863363604, 289.780715405769 -55.65105524112272, 289.19999252920434 -55.65105524112272, 289.19999252920434 -55.963701618881835, 288.32890821435734 -55.963701618881835, 288.32890821435734 -56.27634799664095, 275.843366368217 -56.27634799664095, 275.843366368217 -55.963701618881835, 274.6819206150877 -55.963701618881835, 274.6819206150877 -55.65105524112272, 273.52047486195835 -55.65105524112272, 273.52047486195835 -55.338408863363604, 272.359029108829 -55.338408863363604, 272.359029108829 -55.02576248560449, 271.19758335569963 -55.02576248560449, 271.19758335569963 -54.71311610784537, 270.0361376025703 -54.71311610784537, 270.0361376025703 -54.40046973008626, 268.874691849441 -54.40046973008626, 268.874691849441 -54.08782335232714, 267.71324609631165 -54.08782335232714, 267.71324609631165 -53.775176974568026, 266.5518003431823 -53.775176974568026, 266.5518003431823 -53.462530596808904, 265.09999315177066 -53.462530596808904, 265.09999315177066 -53.14988421904979, 262.4867402072297 -53.14988421904979, 262.4867402072297 -52.83723784129067, 259.8734872626886 -52.83723784129067, 259.8734872626886 -52.52459146353156, 257.55059575642997 -52.52459146353156, 257.55059575642997 -52.21194508577244, 254.93734281188898 -52.21194508577244, 254.93734281188898 -51.899298708013326, 250.8722826759363 -51.899298708013326, 250.8722826759363 -51.58665233025421, 245.93613822513663 -51.58665233025421, 245.93613822513663 -51.27400595249509, 241.2903552126193 -51.27400595249509, 241.2903552126193 -50.96135957473597, 238.0963793915136 -50.96135957473597, 238.0963793915136 -50.64871319697686, 234.90240357040796 -50.64871319697686, 234.90240357040796 -50.33606681921774, 231.9987891875846 -50.33606681921774, 231.9987891875846 -50.023420441458626, 230.54698199617295 -50.023420441458626, 230.54698199617295 -49.71077406369951, 229.67589768132595 -49.71077406369951, 229.67589768132595 -49.398127685940395, 228.51445192819662 -49.398127685940395, 228.51445192819662 -49.08548130818128, 227.6433676133496 -49.08548130818128, 227.6433676133496 -48.772834930422164, 226.7722832985026 -48.772834930422164, 226.7722832985026 -48.46018855266304, 225.61083754537327 -48.46018855266304, 225.61083754537327 -48.147542174903926, 224.73975323052628 -48.147542174903926, 224.73975323052628 -47.83489579714481, 223.57830747739695 -47.83489579714481, 223.57830747739695 -47.522249419385695, 222.4168617242676 -47.522249419385695, 222.4168617242676 -47.20960304162658, 221.25541597113826 -47.20960304162658, 221.25541597113826 -46.89695666386746, 220.09397021800893 -46.89695666386746, 220.09397021800893 -46.58431028610835, 218.35180158831494 -46.58431028610835, 218.35180158831494 -46.271663908349225, 216.02891008205626 -46.271663908349225, 216.02891008205626 -45.95901753059011, 213.41565713751527 -45.95901753059011, 213.41565713751527 -45.646371152830994, 209.64095843984492 -45.646371152830994, 209.64095843984492 -45.33372477507188, 201.51083816793957 -45.33372477507188, 201.51083816793957 -45.02107839731276, 198.60722378511625 -45.02107839731276, 198.60722378511625 -44.70843201955365, 195.99397084057523 -44.70843201955365, 195.99397084057523 -45.02107839731276, 194.54216364916357 -45.02107839731276, 194.54216364916357 -45.33372477507188, 193.0903564577519 -45.33372477507188, 193.0903564577519 -45.646371152830994, 191.63854926634022 -45.646371152830994, 191.63854926634022 -45.95901753059011, 190.18674207492856 -45.95901753059011, 190.18674207492856 -46.271663908349225, 189.02529632179923 -46.271663908349225, 189.02529632179923 -46.58431028610835, 187.57348913038757 -46.58431028610835, 187.57348913038757 -46.89695666386746, 186.12168193897588 -46.89695666386746, 186.12168193897588 -47.20960304162658, 184.96023618584655 -47.20960304162658, 184.96023618584655 -47.522249419385695, 183.79879043271723 -47.522249419385695, 183.79879043271723 -47.83489579714481, 182.34698324130557 -47.83489579714481, 182.34698324130557 -48.147542174903926, 181.1855374881762 -48.147542174903926, 181.1855374881762 -48.46018855266304, 180.02409173504688 -48.46018855266304, 180.02409173504688 -48.772834930422164, 178.86264598191755 -48.772834930422164, 178.86264598191755 -49.08548130818128, 177.70120022878822 -49.08548130818128, 177.70120022878822 -49.398127685940395, 176.53975447565887 -49.398127685940395, 176.53975447565887 -49.71077406369951, 175.37830872252954 -49.71077406369951, 175.37830872252954 -50.023420441458626, 174.2168629694002 -50.023420441458626, 174.2168629694002 -50.33606681921774, 168.1192727654712 -50.33606681921774, 168.1192727654712 -50.64871319697686, 161.4409596849775 -50.64871319697686, 161.4409596849775 -50.96135957473597, 144.0192733880375 -50.96135957473597, 144.0192733880375 -50.64871319697686, 139.37349037552016 -50.64871319697686, 139.37349037552016 -50.33606681921774, 137.0505988692615 -50.33606681921774, 137.0505988692615 -50.023420441458626, 135.30843023956749 -50.023420441458626, 135.30843023956749 -49.71077406369951, 133.5662616098735 -49.71077406369951, 133.5662616098735 -49.398127685940395, 132.11445441846183 -49.398127685940395, 132.11445441846183 -49.08548130818128, 130.9530086653325 -49.08548130818128, 130.9530086653325 -48.772834930422164, 129.79156291220315 -48.772834930422164, 129.79156291220315 -48.46018855266304, 128.63011715907382 -48.46018855266304, 128.63011715907382 -48.147542174903926, 127.46867140594449 -48.147542174903926, 127.46867140594449 -47.83489579714481, 126.59758709109748 -47.83489579714481, 126.59758709109748 -47.522249419385695, 125.72650277625048 -47.522249419385695, 125.72650277625048 -47.20960304162658, 124.56505702312116 -47.20960304162658, 124.56505702312116 -46.89695666386746, 123.69397270827415 -46.89695666386746, 123.69397270827415 -46.58431028610835, 122.82288839342715 -46.58431028610835, 122.82288839342715 -46.271663908349225, 121.95180407858015 -46.271663908349225, 121.95180407858015 -45.95901753059011, 121.08071976373314 -45.95901753059011, 121.08071976373314 -45.646371152830994, 120.20963544888615 -45.646371152830994, 120.20963544888615 -45.33372477507188, 119.33855113403915 -45.33372477507188, 119.33855113403915 -45.02107839731276, 118.75782825747447 -45.02107839731276, 118.75782825747447 -44.70843201955365, 117.88674394262748 -44.70843201955365, 117.88674394262748 -44.39578564179453, 115.5638524363688 -44.39578564179453, 115.5638524363688 -44.08313926403542, 113.24096093011013 -44.08313926403542, 113.24096093011013 -43.7704928862763, 111.49879230041614 -43.7704928862763, 111.49879230041614 -43.45784650851718, 110.04698510900447 -43.45784650851718, 110.04698510900447 -43.14520013075806, 108.59517791759279 -43.14520013075806, 108.59517791759279 -42.83255375299895, 107.43373216446346 -42.83255375299895, 107.43373216446346 -42.51990737523983, 106.27228641133412 -42.51990737523983, 106.27228641133412 -42.20726099748072, 102.20722627538146 -42.20726099748072, 102.20722627538146 -41.8946146197216, 97.85180470114645 -41.8946146197216, 97.85180470114645 -41.581968241962485, 91.46385305893511 -41.581968241962485, 91.46385305893511 -41.8946146197216, 88.56023867611178 -41.8946146197216, 88.56023867611178 -42.20726099748072, 86.52770860813544 -42.20726099748072, 86.52770860813544 -42.51990737523983, 85.07590141672377 -42.51990737523983, 85.07590141672377 -42.83255375299895, 83.6240942253121 -42.83255375299895, 83.6240942253121 -43.14520013075806, 75.20361251512442 -43.14520013075806, 75.20361251512442 -43.45784650851718, 72.59035957058342 -43.45784650851718), 
+  (204.99517542732758 0, 204.99517542732758 -0.6252927555182328, 205.2855368656099 -0.6252927555182328, 205.2855368656099 -0.9379391332773492, 205.57589830389225 -0.9379391332773492, 205.57589830389225 -1.2505855110364656, 205.86625974217458 -1.2505855110364656, 205.86625974217458 -2.188524644313815, 206.1566211804569 -2.188524644313815, 206.1566211804569 -2.5011710220729313, 205.86625974217458 -2.5011710220729313, 205.86625974217458 -3.126463777591164, 205.57589830389225 -3.126463777591164, 205.57589830389225 -3.4391101553502805, 205.2855368656099 -3.4391101553502805, 205.2855368656099 -3.751756533109397, 204.99517542732758 -3.751756533109397, 204.99517542732758 -4.064402910868513, 204.41445255076292 -4.064402910868513, 204.41445255076292 -4.37704928862763, 203.54336823591592 -4.37704928862763, 203.54336823591592 -4.689695666386746, 202.67228392106892 -4.689695666386746, 202.67228392106892 -5.002342044145863, 201.8011996062219 -5.002342044145863, 201.8011996062219 -5.314988421904979, 200.63975385309257 -5.314988421904979, 200.63975385309257 -5.627634799664095, 199.47830809996324 -5.627634799664095, 199.47830809996324 -5.940281177423212, 197.73613947026925 -5.940281177423212, 197.73613947026925 -6.252927555182328, 196.5746937171399 -6.252927555182328, 196.5746937171399 -6.565573932941445, 195.12288652572823 -6.565573932941445, 195.12288652572823 -6.878220310700561, 193.9614407725989 -6.878220310700561, 193.9614407725989 -7.1908666884596775, 192.21927214290488 -7.1908666884596775, 192.21927214290488 -7.503513066218794, 190.76746495149322 -7.503513066218794, 190.76746495149322 -7.81615944397791, 189.02529632179923 -7.81615944397791, 189.02529632179923 -8.128805821737027, 186.99276625382288 -8.128805821737027, 186.99276625382288 -8.441452199496144, 185.2505976241289 -8.441452199496144, 185.2505976241289 -8.75409857725526, 183.5084289944349 -8.75409857725526, 183.5084289944349 -9.066744955014375, 181.76626036474087 -9.066744955014375, 181.76626036474087 -9.379391332773492, 180.02409173504688 -9.379391332773492, 180.02409173504688 -9.69203771053261, 177.99156166707056 -9.69203771053261, 177.99156166707056 -10.004684088291725, 175.66867016081187 -10.004684088291725, 175.66867016081187 -10.31733046605084, 172.76505577798855 -10.31733046605084, 172.76505577798855 -10.629976843809958, 169.28071851860054 -10.629976843809958, 169.28071851860054 -10.942623221569075, 165.5060198209302 -10.942623221569075, 165.5060198209302 -11.25526959932819, 160.2795139318482 -11.25526959932819, 160.2795139318482 -11.567915977087306, 153.60120085135452 -11.567915977087306, 153.60120085135452 -11.880562354846424, 148.08433352399018 -11.880562354846424, 148.08433352399018 -12.193208732605541, 142.85782763490818 -12.193208732605541, 142.85782763490818 -12.505855110364656, 137.63132174582617 -12.505855110364656, 137.63132174582617 -12.818501488123772, 132.11445441846183 -12.818501488123772, 132.11445441846183 -13.13114786588289, 127.17830996766216 -13.13114786588289, 127.17830996766216 -13.443794243642007, 122.24216551686249 -13.443794243642007, 122.24216551686249 -13.756440621401122, 117.30602106606281 -13.756440621401122, 117.30602106606281 -14.069086999160238, 113.24096093011013 -14.069086999160238, 113.24096093011013 -14.381733376919355, 108.59517791759279 -14.381733376919355, 108.59517791759279 -14.694379754678472, 104.2397563433578 -14.694379754678472, 104.2397563433578 -15.007026132437588, 99.88433476912279 -15.007026132437588, 99.88433476912279 -15.319672510196703, 95.81927463317011 -15.319672510196703, 95.81927463317011 -15.63231888795582, 91.75421449721745 -15.63231888795582, 91.75421449721745 -15.944965265714938, 87.68915436126477 -15.944965265714938, 87.68915436126477 -16.257611643474053, 83.6240942253121 -16.257611643474053, 83.6240942253121 -16.57025802123317, 78.97831121279476 -16.57025802123317, 78.97831121279476 -16.882904398992288, 74.04216676199509 -16.882904398992288, 74.04216676199509 -17.195550776751404, 72.59035957058342 -17.195550776751404), 
+  (4.355421574235005 -23.44847833193373, 3.774698697670338 -23.44847833193373, 3.774698697670338 -23.761124709692847, 2.9036143828233367 -23.761124709692847, 2.9036143828233367 -24.073771087451963, 2.0325300679763356 -24.073771087451963, 2.0325300679763356 -24.386417465211082, 1.4518071914116684 -24.386417465211082, 1.4518071914116684 -24.699063842970197, 1.1614457531293347 -24.699063842970197, 1.1614457531293347 -25.011710220729313, 0.8710843148470011 -25.011710220729313, 0.8710843148470011 -25.637002976247544, 1.1614457531293347 -25.637002976247544, 1.1614457531293347 -25.949649354006663, 1.7421686296940022 -25.949649354006663, 1.7421686296940022 -26.26229573176578, 2.3228915062586695 -26.26229573176578, 2.3228915062586695 -26.574942109524894, 3.774698697670338 -26.574942109524894, 3.774698697670338 -26.887588487284013, 4.355421574235005 -26.887588487284013), 
+  (72.29999813230108 -17.195550776751404, 69.10602231119542 -17.195550776751404, 69.10602231119542 -17.50819715451052, 64.46023929867808 -17.50819715451052, 64.46023929867808 -17.820843532269635, 60.10481772444307 -17.820843532269635, 60.10481772444307 -18.13348991002875, 56.330119026772735 -18.13348991002875, 56.330119026772735 -18.44613628778787, 52.265058890820065 -18.44613628778787, 52.265058890820065 -18.758782665546985, 48.199998754867394 -18.758782665546985, 48.199998754867394 -19.0714290433061, 45.29638437204405 -19.0714290433061, 45.29638437204405 -19.38407542106522, 42.102408550938385 -19.38407542106522, 42.102408550938385 -19.696721798824335, 39.19879416811505 -19.696721798824335, 39.19879416811505 -20.00936817658345, 36.004818347009376 -20.00936817658345, 36.004818347009376 -20.322014554342566, 32.81084252590371 -20.322014554342566, 32.81084252590371 -20.63466093210168, 29.616866704798035 -20.63466093210168, 29.616866704798035 -20.9473073098608, 26.7132523219747 -20.9473073098608, 26.7132523219747 -21.259953687619916, 24.680722253998365 -21.259953687619916, 24.680722253998365 -21.57260006537903, 22.93855362430436 -21.57260006537903, 22.93855362430436 -21.88524644313815, 21.486746432892694 -21.88524644313815, 21.486746432892694 -22.197892820897266, 19.74457780319869 -22.197892820897266), 
+  (72.29999813230108 -43.45784650851718, 70.26746806432475 -43.45784650851718, 70.26746806432475 -43.14520013075806, 68.23493799634842 -43.14520013075806, 68.23493799634842 -42.83255375299895, 66.20240792837208 -42.83255375299895, 66.20240792837208 -42.51990737523983, 64.46023929867808 -42.51990737523983, 64.46023929867808 -42.20726099748072, 62.718070668984076 -42.20726099748072, 62.718070668984076 -41.8946146197216, 60.97590203929008 -41.8946146197216, 60.97590203929008 -41.581968241962485, 60.10481772444307 -41.581968241962485, 60.10481772444307 -41.26932186420336, 59.23373340959607 -41.26932186420336, 59.23373340959607 -40.95667548644425, 58.362649094749074 -40.95667548644425, 58.362649094749074 -40.64402910868513, 57.7819262181844 -40.64402910868513, 57.7819262181844 -40.331382730926016, 56.9108419033374 -40.331382730926016, 56.9108419033374 -40.0187363531669, 56.330119026772735 -40.0187363531669, 56.330119026772735 -39.706089975407785, 55.45903471192573 -39.706089975407785, 55.45903471192573 -39.39344359764867, 54.87831183536107 -39.39344359764867, 54.87831183536107 -39.080797219889554, 54.297588958796396 -39.080797219889554, 54.297588958796396 -38.76815084213044, 53.4265046439494 -38.76815084213044, 53.4265046439494 -38.455504464371316, 52.84578176738473 -38.455504464371316, 52.84578176738473 -38.1428580866122, 52.265058890820065 -38.1428580866122, 52.265058890820065 -37.830211708853085, 51.68433601425539 -37.830211708853085, 51.68433601425539 -37.51756533109397, 51.10361313769073 -37.51756533109397, 51.10361313769073 -37.204918953334854, 50.52289026112606 -37.204918953334854, 50.52289026112606 -36.89227257557574, 49.942167384561394 -36.89227257557574, 49.942167384561394 -36.57962619781662, 49.07108306971439 -36.57962619781662, 49.07108306971439 -36.2669798200575, 48.199998754867394 -36.2669798200575, 48.199998754867394 -35.954333442298385, 47.32891444002039 -35.954333442298385, 47.32891444002039 -35.64168706453927, 46.167468686891056 -35.64168706453927, 46.167468686891056 -35.329040686780154, 45.29638437204405 -35.329040686780154, 45.29638437204405 -35.01639430902104, 44.425300057197056 -35.01639430902104, 44.425300057197056 -34.70374793126192, 43.26385430406772 -34.70374793126192, 43.26385430406772 -34.39110155350281, 42.39276998922072 -34.39110155350281, 42.39276998922072 -34.07845517574369, 41.521685674373714 -34.07845517574369, 41.521685674373714 -33.765808797984576, 40.65060135952672 -33.765808797984576, 40.65060135952672 -33.45316242022545, 39.48915560639738 -33.45316242022545, 39.48915560639738 -33.14051604246634, 38.61807129155038 -33.14051604246634, 38.61807129155038 -32.82786966470722, 37.746986976703376 -32.82786966470722, 37.746986976703376 -32.51522328694811, 36.58554122357405 -32.51522328694811, 36.58554122357405 -32.20257690918899, 35.13373403216237 -32.20257690918899, 35.13373403216237 -31.889930531429876, 33.972288279033044 -31.889930531429876, 33.972288279033044 -31.577284153670757, 32.52048108762137 -31.577284153670757, 32.52048108762137 -31.26463777591164, 31.068673896209702 -31.26463777591164, 31.068673896209702 -30.951991398152526, 29.616866704798035 -30.951991398152526, 29.616866704798035 -30.639345020393407, 27.874698075104035 -30.639345020393407, 27.874698075104035 -30.32669864263429, 25.842168007127697 -30.32669864263429, 25.842168007127697 -30.014052264875176, 19.74457780319869 -30.014052264875176))MULTILINESTRING ((297.3301128011097 -18.758782665546985, 296.749389924545 -18.758782665546985, 296.749389924545 -19.0714290433061, 296.16866704798036 -19.0714290433061, 296.16866704798036 -19.38407542106522, 295.5879441714157 -19.38407542106522, 295.5879441714157 -19.696721798824335, 295.00722129485104 -19.696721798824335, 295.00722129485104 -20.00936817658345, 294.42649841828637 -20.00936817658345, 294.42649841828637 -20.322014554342566, 293.8457755417217 -20.322014554342566, 293.8457755417217 -20.63466093210168, 293.26505266515704 -20.63466093210168, 293.26505266515704 -20.9473073098608, 292.6843297885924 -20.9473073098608, 292.6843297885924 -21.259953687619916, 292.10360691202766 -21.259953687619916, 292.10360691202766 -21.57260006537903, 291.522884035463 -21.57260006537903, 291.522884035463 -21.88524644313815, 290.94216115889833 -21.88524644313815, 290.94216115889833 -22.197892820897266, 290.07107684405133 -22.197892820897266, 290.07107684405133 -22.51053919865638, 289.49035396748667 -22.51053919865638, 289.49035396748667 -22.823185576415497, 288.6192696526397 -22.823185576415497, 288.6192696526397 -23.135831954174613, 287.7481853377927 -23.135831954174613, 287.7481853377927 -23.44847833193373, 287.167462461228 -23.44847833193373, 287.167462461228 -23.761124709692847, 286.58673958466335 -23.761124709692847, 286.58673958466335 -24.073771087451963, 286.0060167080987 -24.073771087451963, 286.0060167080987 -24.386417465211082, 285.425293831534 -24.386417465211082, 285.425293831534 -24.699063842970197, 284.84457095496936 -24.699063842970197, 284.84457095496936 -25.011710220729313, 284.2638480784047 -25.011710220729313, 284.2638480784047 -25.32435659848843, 283.68312520184 -25.32435659848843, 283.68312520184 -25.637002976247544, 283.3927637635577 -25.637002976247544, 283.3927637635577 -25.949649354006663, 282.81204088699303 -25.949649354006663, 282.81204088699303 -26.26229573176578, 282.23131801042837 -26.26229573176578, 282.23131801042837 -26.574942109524894, 281.65059513386365 -26.574942109524894, 281.65059513386365 -26.887588487284013, 281.3602336955813 -26.887588487284013, 281.3602336955813 -27.20023486504313, 280.77951081901665 -27.20023486504313, 280.77951081901665 -27.512881242802244, 280.198787942452 -27.512881242802244, 280.198787942452 -27.82552762056136, 279.90842650416965 -27.82552762056136, 279.90842650416965 -28.138173998320475, 279.327703627605 -28.138173998320475, 279.327703627605 -28.450820376079594, 278.7469807510403 -28.450820376079594, 278.7469807510403 -28.76346675383871, 278.456619312758 -28.76346675383871, 278.456619312758 -29.076113131597825, 277.87589643619333 -29.076113131597825, 277.87589643619333 -29.388759509356944, 277.29517355962867 -29.388759509356944, 277.29517355962867 -29.70140588711606, 277.00481212134633 -29.70140588711606, 277.00481212134633 -30.014052264875176, 276.42408924478167 -30.014052264875176, 276.42408924478167 -30.32669864263429, 276.13372780649934 -30.32669864263429, 276.13372780649934 -30.639345020393407, 275.843366368217 -30.639345020393407, 275.843366368217 -30.951991398152526, 275.5530049299347 -30.951991398152526, 275.5530049299347 -31.26463777591164, 275.26264349165234 -31.26463777591164, 275.26264349165234 -31.577284153670757, 274.97228205337 -31.577284153670757, 274.97228205337 -31.889930531429876, 274.6819206150877 -31.889930531429876, 274.6819206150877 -32.20257690918899, 274.39155917680534 -32.20257690918899, 274.39155917680534 -32.82786966470722, 274.101197738523 -32.82786966470722, 274.101197738523 -35.329040686780154, 274.39155917680534 -35.329040686780154, 274.39155917680534 -36.2669798200575, 274.6819206150877 -36.2669798200575, 274.6819206150877 -36.57962619781662, 274.97228205337 -36.57962619781662, 274.97228205337 -37.204918953334854, 275.26264349165234 -37.204918953334854, 275.26264349165234 -37.51756533109397, 275.5530049299347 -37.51756533109397, 275.5530049299347 -37.830211708853085, 275.843366368217 -37.830211708853085, 275.843366368217 -38.1428580866122, 276.13372780649934 -38.1428580866122, 276.13372780649934 -38.455504464371316, 277.00481212134633 -38.455504464371316, 277.00481212134633 -38.76815084213044, 278.16625787447566 -38.76815084213044, 278.16625787447566 -39.080797219889554, 279.6180650658873 -39.080797219889554, 279.6180650658873 -39.39344359764867, 280.4891493807343 -39.39344359764867, 280.4891493807343 -39.706089975407785, 281.65059513386365 -39.706089975407785, 281.65059513386365 -40.0187363531669, 282.81204088699303 -40.0187363531669, 282.81204088699303 -40.331382730926016, 283.68312520184 -40.331382730926016, 283.68312520184 -40.64402910868513, 284.84457095496936 -40.64402910868513, 284.84457095496936 -40.95667548644425, 286.296378146381 -40.95667548644425, 286.296378146381 -41.26932186420336, 287.45782389951034 -41.26932186420336, 287.45782389951034 -41.581968241962485, 287.7481853377927 -41.581968241962485, 287.7481853377927 -41.26932186420336, 288.32890821435734 -41.26932186420336, 288.32890821435734 -40.95667548644425, 288.909631090922 -40.95667548644425, 288.909631090922 -40.64402910868513, 289.19999252920434 -40.64402910868513, 289.19999252920434 -40.331382730926016, 289.780715405769 -40.331382730926016, 289.780715405769 -40.0187363531669, 290.36143828233367 -40.0187363531669, 290.36143828233367 -39.706089975407785, 290.94216115889833 -39.706089975407785, 290.94216115889833 -39.39344359764867, 291.522884035463 -39.39344359764867, 291.522884035463 -39.080797219889554, 292.10360691202766 -39.080797219889554, 292.10360691202766 -38.76815084213044, 292.6843297885924 -38.76815084213044, 292.6843297885924 -38.455504464371316, 293.26505266515704 -38.455504464371316, 293.26505266515704 -38.1428580866122, 293.8457755417217 -38.1428580866122, 293.8457755417217 -37.830211708853085, 294.42649841828637 -37.830211708853085, 294.42649841828637 -37.51756533109397, 295.29758273313337 -37.51756533109397, 295.29758273313337 -37.204918953334854, 295.87830560969803 -37.204918953334854, 295.87830560969803 -36.89227257557574, 296.749389924545 -36.89227257557574, 296.749389924545 -36.57962619781662, 297.3301128011097 -36.57962619781662))MULTILINESTRING ((72.29999813230108 -100.67213363843548, 68.81566087291309 -100.67213363843548, 68.81566087291309 -100.35948726067637, 64.16987786039574 -100.35948726067637, 64.16987786039574 -100.04684088291725, 60.97590203929008 -100.04684088291725, 60.97590203929008 -99.73419450515813, 58.653010533031406 -99.73419450515813, 58.653010533031406 -99.42154812739902, 56.9108419033374 -99.42154812739902, 56.9108419033374 -99.1089017496399, 55.45903471192573 -99.1089017496399, 55.45903471192573 -98.79625537188079, 54.007227520514064 -98.79625537188079, 54.007227520514064 -98.48360899412167, 52.84578176738473 -98.48360899412167, 52.84578176738473 -98.17096261636256, 51.68433601425539 -98.17096261636256, 51.68433601425539 -97.85831623860344, 50.52289026112606 -97.85831623860344, 50.52289026112606 -97.54566986084433, 49.65180594627906 -97.54566986084433, 49.65180594627906 -97.2330234830852, 49.07108306971439 -97.2330234830852, 49.07108306971439 -96.92037710532608, 48.490360193149726 -96.92037710532608, 48.490360193149726 -96.60773072756697, 47.61927587830272 -96.60773072756697, 47.61927587830272 -96.29508434980785, 47.03855300173806 -96.29508434980785, 47.03855300173806 -95.98243797204874, 46.45783012517339 -95.98243797204874, 46.45783012517339 -95.66979159428962, 45.87710724860872 -95.66979159428962, 45.87710724860872 -95.35714521653051, 45.29638437204405 -95.35714521653051, 45.29638437204405 -95.04449883877139, 45.00602293376172 -95.04449883877139, 45.00602293376172 -94.73185246101227, 44.425300057197056 -94.73185246101227, 44.425300057197056 -94.41920608325316, 43.844577180632385 -94.41920608325316, 43.844577180632385 -94.10655970549404, 43.26385430406772 -94.10655970549404, 43.26385430406772 -93.79391332773493, 42.68313142750305 -93.79391332773493, 42.68313142750305 -93.4812669499758, 42.102408550938385 -93.4812669499758, 42.102408550938385 -93.1686205722167, 41.521685674373714 -93.1686205722167, 41.521685674373714 -92.85597419445757, 40.94096279780905 -92.85597419445757, 40.94096279780905 -92.54332781669845, 40.36023992124438 -92.54332781669845, 40.36023992124438 -92.23068143893934, 40.06987848296205 -92.23068143893934, 40.06987848296205 -91.91803506118022, 39.48915560639738 -91.91803506118022, 39.48915560639738 -91.60538868342111, 38.90843272983271 -91.60538868342111, 38.90843272983271 -91.29274230566199, 38.32770985326805 -91.29274230566199, 38.32770985326805 -90.98009592790288, 37.16626410013871 -90.98009592790288, 37.16626410013871 -90.66744955014376, 35.714456908727044 -90.66744955014376, 35.714456908727044 -90.35480317238465, 34.26264971731538 -90.35480317238465, 34.26264971731538 -90.04215679462553, 32.52048108762137 -90.04215679462553, 32.52048108762137 -89.7295104168664, 30.48795101964504 -89.7295104168664, 30.48795101964504 -89.4168640391073, 28.165059513386367 -89.4168640391073, 28.165059513386367 -89.10421766134817, 26.422890883692364 -89.10421766134817, 26.422890883692364 -89.4168640391073, 25.26144513056303 -89.4168640391073, 25.26144513056303 -89.7295104168664, 24.39036081571603 -89.7295104168664, 24.39036081571603 -90.04215679462553, 23.228915062586694 -90.04215679462553, 23.228915062586694 -90.35480317238465, 22.357830747739694 -90.35480317238465, 22.357830747739694 -90.66744955014376, 21.19638499461036 -90.66744955014376, 21.19638499461036 -90.98009592790288, 20.32530067976336 -90.98009592790288, 20.32530067976336 -91.29274230566199, 19.74457780319869 -91.29274230566199), 
+  (47.61927587830272 -150.69555407989412, 47.61927587830272 -150.382907702135, 47.32891444002039 -150.382907702135, 47.32891444002039 -149.75761494661677, 47.03855300173806 -149.75761494661677, 47.03855300173806 -149.13232219109852, 46.74819156345572 -149.13232219109852, 46.74819156345572 -148.5070294355803, 46.45783012517339 -148.5070294355803, 46.45783012517339 -147.88173668006206, 46.167468686891056 -147.88173668006206, 46.167468686891056 -147.56909030230295, 45.87710724860872 -147.56909030230295, 45.87710724860872 -146.9437975467847, 45.58674581032639 -146.9437975467847, 45.58674581032639 -146.6311511690256, 45.29638437204405 -146.6311511690256, 45.29638437204405 -146.3185047912665, 45.00602293376172 -146.3185047912665, 45.00602293376172 -145.69321203574825, 44.71566149547939 -145.69321203574825, 44.71566149547939 -145.38056565798914, 44.425300057197056 -145.38056565798914, 44.425300057197056 -145.06791928023, 44.13493861891472 -145.06791928023, 44.13493861891472 -144.7552729024709, 43.844577180632385 -144.7552729024709, 43.844577180632385 -144.44262652471178, 43.55421574235005 -144.44262652471178, 43.55421574235005 -144.12998014695268, 43.26385430406772 -144.12998014695268, 43.26385430406772 -143.81733376919354, 42.68313142750305 -143.81733376919354, 42.68313142750305 -143.50468739143443, 42.39276998922072 -143.50468739143443, 42.39276998922072 -143.19204101367532, 41.81204711265605 -143.19204101367532, 41.81204711265605 -142.8793946359162, 41.521685674373714 -142.8793946359162, 41.521685674373714 -142.56674825815708, 40.94096279780905 -142.56674825815708, 40.94096279780905 -142.25410188039797, 40.06987848296205 -142.25410188039797, 40.06987848296205 -141.94145550263886, 39.48915560639738 -141.94145550263886, 39.48915560639738 -141.62880912487972, 38.61807129155038 -141.62880912487972, 38.61807129155038 -141.31616274712061, 38.32770985326805 -141.31616274712061, 38.32770985326805 -141.62880912487972, 38.037348414985715 -141.62880912487972, 38.037348414985715 -142.56674825815708, 37.746986976703376 -142.56674825815708, 37.746986976703376 -143.81733376919354, 37.456625538421044 -143.81733376919354, 37.456625538421044 -145.06791928023, 37.16626410013871 -145.06791928023, 37.16626410013871 -146.6311511690256, 36.87590266185638 -146.6311511690256, 36.87590266185638 -147.88173668006206, 36.58554122357405 -147.88173668006206, 36.58554122357405 -149.75761494661677, 36.29517978529171 -149.75761494661677, 36.29517978529171 -151.32084683541234, 36.004818347009376 -151.32084683541234, 36.004818347009376 -152.88407872420794), 
+  (297.3301128011097 -85.35246112823879, 296.16866704798036 -85.35246112823879, 296.16866704798036 -85.6651075059979, 295.00722129485104 -85.6651075059979, 295.00722129485104 -85.97775388375702, 293.5554141034394 -85.97775388375702, 293.5554141034394 -86.29040026151613, 292.39396835031005 -86.29040026151613, 292.39396835031005 -86.60304663927525, 291.23252259718066 -86.60304663927525, 291.23252259718066 -86.91569301703436, 289.780715405769 -86.91569301703436, 289.780715405769 -87.22833939479348, 288.32890821435734 -87.22833939479348, 288.32890821435734 -87.5409857725526, 286.8771010229457 -87.5409857725526, 286.8771010229457 -87.85363215031171, 284.84457095496936 -87.85363215031171, 284.84457095496936 -88.16627852807083, 283.10240232527536 -88.16627852807083, 283.10240232527536 -88.47892490582994, 281.3602336955813 -88.47892490582994, 281.3602336955813 -88.79157128358906, 279.90842650416965 -88.79157128358906, 279.90842650416965 -89.10421766134817, 278.456619312758 -89.10421766134817, 278.456619312758 -89.4168640391073, 277.29517355962867 -89.4168640391073, 277.29517355962867 -89.7295104168664, 275.5530049299347 -89.7295104168664, 275.5530049299347 -89.4168640391073, 274.39155917680534 -89.4168640391073, 274.39155917680534 -89.10421766134817, 273.230113423676 -89.10421766134817, 273.230113423676 -88.79157128358906, 272.0686676705467 -88.79157128358906, 272.0686676705467 -88.47892490582994, 270.9072219174173 -88.47892490582994, 270.9072219174173 -88.16627852807083, 269.45541472600564 -88.16627852807083, 269.45541472600564 -87.85363215031171, 268.003607534594 -87.85363215031171, 268.003607534594 -87.5409857725526, 266.5518003431823 -87.5409857725526, 266.5518003431823 -87.22833939479348, 265.09999315177066 -87.22833939479348, 265.09999315177066 -86.91569301703436, 263.93854739864133 -86.91569301703436, 263.93854739864133 -86.60304663927525, 262.777101645512 -86.60304663927525, 262.777101645512 -86.29040026151613, 261.906017330665 -86.29040026151613, 261.906017330665 -85.97775388375702, 260.7445715775356 -85.97775388375702, 260.7445715775356 -85.6651075059979, 259.8734872626886 -85.6651075059979, 259.8734872626886 -85.35246112823879, 258.7120415095593 -85.35246112823879, 258.7120415095593 -85.03981475047966, 257.8409571947123 -85.03981475047966, 257.8409571947123 -84.72716837272054, 256.679511441583 -84.72716837272054, 256.679511441583 -84.41452199496143, 255.80842712673598 -84.41452199496143, 255.80842712673598 -84.10187561720231, 254.64698137360665 -84.10187561720231, 254.64698137360665 -83.7892292394432, 253.19517418219496 -83.7892292394432, 253.19517418219496 -84.10187561720231, 252.32408986734796 -84.10187561720231, 252.32408986734796 -84.41452199496143, 251.7433669907833 -84.41452199496143, 251.7433669907833 -84.72716837272054, 251.16264411421864 -84.72716837272054, 251.16264411421864 -85.03981475047966, 250.29155979937164 -85.03981475047966, 250.29155979937164 -85.35246112823879, 249.71083692280698 -85.35246112823879, 249.71083692280698 -85.6651075059979, 248.83975260795998 -85.6651075059979, 248.83975260795998 -85.97775388375702, 247.67830685483062 -85.97775388375702, 247.67830685483062 -86.29040026151613, 246.22649966341896 -86.29040026151613, 246.22649966341896 -86.60304663927525, 243.3228852805956 -86.60304663927525, 243.3228852805956 -86.29040026151613, 242.16143952746629 -86.29040026151613, 242.16143952746629 -85.97775388375702, 241.87107808918395 -85.97775388375702, 241.87107808918395 -85.6651075059979, 241.58071665090162 -85.6651075059979, 241.58071665090162 -85.35246112823879, 240.99999377433696 -85.35246112823879, 240.99999377433696 -85.03981475047966, 240.70963233605463 -85.03981475047966, 240.70963233605463 -84.72716837272054, 240.12890945948996 -84.72716837272054, 240.12890945948996 -84.41452199496143, 239.83854802120763 -84.41452199496143, 239.83854802120763 -84.10187561720231, 239.25782514464296 -84.10187561720231, 239.25782514464296 -83.7892292394432, 238.6771022680783 -83.7892292394432, 238.6771022680783 -83.47658286168408, 238.38674082979597 -83.47658286168408, 238.38674082979597 -83.16393648392497, 237.80601795323128 -83.16393648392497, 237.80601795323128 -82.85129010616585, 237.2252950766666 -82.85129010616585, 237.2252950766666 -82.53864372840673, 236.64457220010195 -82.53864372840673, 236.64457220010195 -82.22599735064762, 236.06384932353728 -82.22599735064762, 236.06384932353728 -81.9133509728885, 235.1927650086903 -81.9133509728885, 235.1927650086903 -81.60070459512939, 234.61204213212562 -81.60070459512939, 234.61204213212562 -81.28805821737026, 233.74095781727863 -81.28805821737026, 233.74095781727863 -80.97541183961116, 232.8698735024316 -80.97541183961116, 232.8698735024316 -80.66276546185203, 231.9987891875846 -80.66276546185203, 231.9987891875846 -80.35011908409292, 231.1277048727376 -80.35011908409292, 231.1277048727376 -80.0374727063338, 229.96625911960828 -80.0374727063338, 229.96625911960828 -79.72482632857468, 228.80481336647895 -79.72482632857468, 228.80481336647895 -79.41217995081557, 227.35300617506726 -79.41217995081557, 227.35300617506726 -79.09953357305645, 226.19156042193794 -79.09953357305645, 226.19156042193794 -78.78688719529734, 224.73975323052628 -78.78688719529734, 224.73975323052628 -78.47424081753822, 223.28794603911462 -78.47424081753822, 223.28794603911462 -78.16159443977911, 221.5457774094206 -78.16159443977911, 221.5457774094206 -77.84894806201999, 220.09397021800893 -77.84894806201999, 220.09397021800893 -77.53630168426088, 219.51324734144427 -77.53630168426088, 219.51324734144427 -77.84894806201999, 218.64216302659727 -77.84894806201999, 218.64216302659727 -78.16159443977911, 217.77107871175025 -78.16159443977911, 217.77107871175025 -78.47424081753822, 217.19035583518558 -78.47424081753822, 217.19035583518558 -78.78688719529734, 216.89999439690325 -78.78688719529734, 216.89999439690325 -79.09953357305645, 216.3192715203386 -79.09953357305645, 216.3192715203386 -79.41217995081557, 216.02891008205626 -79.41217995081557, 216.02891008205626 -79.72482632857468, 215.4481872054916 -79.72482632857468, 215.4481872054916 -80.0374727063338, 215.15782576720926 -80.0374727063338), 
+  (4.355421574235005 -101.92271914947194, 4.065060135952671 -101.92271914947194, 4.065060135952671 -102.23536552723107, 3.774698697670338 -102.23536552723107, 3.774698697670338 -102.8606582827493, 3.4843372593880044 -102.8606582827493, 3.4843372593880044 -103.17330466050842, 3.1939758211056706 -103.17330466050842, 3.1939758211056706 -103.48595103826753, 2.9036143828233367 -103.48595103826753, 2.9036143828233367 -104.11124379378576, 2.6132529445410033 -104.11124379378576, 2.6132529445410033 -104.42389017154488, 2.3228915062586695 -104.42389017154488, 2.3228915062586695 -104.73653654930399, 2.0325300679763356 -104.73653654930399, 2.0325300679763356 -105.36182930482224, 1.7421686296940022 -105.36182930482224, 1.7421686296940022 -105.67447568258135, 1.4518071914116684 -105.67447568258135, 1.4518071914116684 -105.98712206034047, 1.1614457531293347 -105.98712206034047, 1.1614457531293347 -106.6124148158587, 0.8710843148470011 -106.6124148158587, 0.8710843148470011 -106.92506119361781, 0.5807228765646674 -106.92506119361781, 0.5807228765646674 -107.55035394913605, 0.2903614382823337 -107.55035394913605, 0.2903614382823337 -107.86300032689516, 0 -107.86300032689516), 
+  (193.38071789603424 -82.22599735064762, 192.21927214290488 -82.22599735064762, 192.21927214290488 -82.53864372840673, 191.05782638977556 -82.53864372840673, 191.05782638977556 -82.85129010616585, 189.6060191983639 -82.85129010616585, 189.6060191983639 -83.16393648392497, 188.15421200695224 -83.16393648392497, 188.15421200695224 -83.47658286168408, 186.70240481554055 -83.47658286168408, 186.70240481554055 -83.7892292394432, 184.96023618584655 -83.7892292394432, 184.96023618584655 -84.10187561720231, 182.92770611787023 -84.10187561720231, 182.92770611787023 -84.41452199496143, 181.47589892645854 -84.41452199496143, 181.47589892645854 -84.72716837272054, 180.3144531733292 -84.72716837272054, 180.3144531733292 -85.03981475047966, 179.15300742019988 -85.03981475047966, 179.15300742019988 -85.35246112823879, 178.2819231053529 -85.35246112823879, 178.2819231053529 -85.6651075059979, 177.70120022878822 -85.6651075059979, 177.70120022878822 -85.97775388375702, 177.12047735222356 -85.97775388375702, 177.12047735222356 -86.29040026151613, 176.53975447565887 -86.29040026151613, 176.53975447565887 -86.60304663927525, 175.9590315990942 -86.60304663927525, 175.9590315990942 -86.91569301703436, 175.37830872252954 -86.91569301703436, 175.37830872252954 -87.22833939479348, 174.79758584596487 -87.22833939479348, 174.79758584596487 -87.5409857725526, 173.92650153111788 -87.5409857725526, 173.92650153111788 -87.85363215031171, 172.47469433970622 -87.85363215031171, 172.47469433970622 -88.16627852807083, 171.31324858657686 -88.16627852807083, 171.31324858657686 -88.47892490582994, 170.15180283344753 -88.47892490582994, 170.15180283344753 -88.79157128358906, 168.69999564203587 -88.79157128358906, 168.69999564203587 -89.10421766134817, 167.53854988890654 -89.10421766134817, 167.53854988890654 -89.4168640391073, 166.08674269749486 -89.4168640391073, 166.08674269749486 -89.7295104168664, 164.6349355060832 -89.7295104168664, 164.6349355060832 -90.04215679462553, 163.18312831467154 -90.04215679462553, 163.18312831467154 -90.35480317238465, 162.0216825615422 -90.35480317238465, 162.0216825615422 -90.66744955014376, 160.56987537013052 -90.66744955014376, 160.56987537013052 -90.98009592790288, 159.4084296170012 -90.98009592790288, 159.4084296170012 -91.29274230566199, 157.95662242558953 -91.29274230566199, 157.95662242558953 -91.60538868342111, 156.50481523417787 -91.60538868342111, 156.50481523417787 -91.91803506118022, 155.05300804276618 -91.91803506118022, 155.05300804276618 -92.23068143893934, 153.3108394130722 -92.23068143893934, 153.3108394130722 -92.54332781669845, 151.5686707833782 -92.54332781669845, 151.5686707833782 -92.85597419445757, 150.40722503024884 -92.85597419445757, 150.40722503024884 -93.1686205722167, 149.2457792771195 -93.1686205722167, 149.2457792771195 -93.4812669499758, 148.08433352399018 -93.4812669499758, 148.08433352399018 -93.79391332773493, 146.92288777086085 -93.79391332773493, 146.92288777086085 -94.10655970549404, 145.7614420177315 -94.10655970549404, 145.7614420177315 -94.41920608325316, 144.30963482631984 -94.41920608325316, 144.30963482631984 -94.73185246101227, 143.1481890731905 -94.73185246101227, 143.1481890731905 -95.04449883877139, 141.69638188177885 -95.04449883877139, 141.69638188177885 -95.35714521653051, 140.24457469036716 -95.35714521653051, 140.24457469036716 -95.66979159428962, 138.7927674989555 -95.66979159428962, 138.7927674989555 -95.98243797204874, 137.34096030754384 -95.98243797204874, 137.34096030754384 -96.29508434980785, 135.59879167784982 -96.29508434980785, 135.59879167784982 -96.60773072756697, 133.85662304815583 -96.60773072756697, 133.85662304815583 -96.92037710532608, 132.11445441846183 -96.92037710532608, 132.11445441846183 -97.2330234830852, 129.50120147392082 -97.2330234830852, 129.50120147392082 -97.54566986084433, 128.04939428250916 -97.54566986084433, 128.04939428250916 -97.2330234830852, 125.72650277625048 -97.2330234830852, 125.72650277625048 -96.92037710532608, 123.69397270827415 -96.92037710532608, 123.69397270827415 -96.60773072756697, 121.95180407858015 -96.60773072756697, 121.95180407858015 -96.29508434980785, 120.20963544888615 -96.29508434980785, 120.20963544888615 -95.98243797204874, 118.46746681919214 -95.98243797204874, 118.46746681919214 -95.66979159428962, 110.62770798556913 -95.66979159428962, 110.62770798556913 -95.35714521653051, 106.56264784961647 -95.35714521653051, 106.56264784961647 -95.04449883877139, 105.98192497305179 -95.04449883877139, 105.98192497305179 -95.35714521653051, 101.6265033988168 -95.35714521653051, 101.6265033988168 -95.66979159428962, 95.81927463317011 -95.66979159428962, 95.81927463317011 -95.35714521653051, 94.65782888004078 -95.35714521653051, 94.65782888004078 -95.66979159428962, 93.20602168862911 -95.66979159428962, 93.20602168862911 -95.98243797204874, 91.46385305893511 -95.98243797204874, 91.46385305893511 -96.29508434980785, 90.01204586752344 -96.29508434980785, 90.01204586752344 -96.60773072756697, 88.26987723782943 -96.60773072756697, 88.26987723782943 -96.92037710532608, 86.52770860813544 -96.92037710532608, 86.52770860813544 -97.2330234830852, 85.07590141672377 -97.2330234830852, 85.07590141672377 -97.54566986084433, 83.33373278702977 -97.54566986084433, 83.33373278702977 -97.85831623860344, 81.59156415733577 -97.85831623860344, 81.59156415733577 -98.17096261636256, 79.84939552764176 -98.17096261636256, 79.84939552764176 -98.48360899412167, 78.68794977451243 -98.48360899412167, 78.68794977451243 -98.79625537188079, 77.23614258310076 -98.79625537188079, 77.23614258310076 -99.1089017496399, 76.07469682997143 -99.1089017496399, 76.07469682997143 -99.42154812739902, 75.20361251512442 -99.42154812739902, 75.20361251512442 -99.73419450515813, 74.33252820027742 -99.73419450515813, 74.33252820027742 -100.04684088291725, 73.46144388543043 -100.04684088291725, 73.46144388543043 -100.35948726067637, 72.59035957058342 -100.35948726067637), 
+  (112.0795151769808 -211.3489513651627, 112.0795151769808 -209.16042672084887, 111.78915373869847 -209.16042672084887, 111.78915373869847 -206.34660932101684, 111.49879230041614 -206.34660932101684, 111.49879230041614 -203.8454382989439, 111.2084308621338 -203.8454382989439, 111.2084308621338 -201.65691365463007, 110.91806942385146 -201.65691365463007, 110.91806942385146 -199.7810353880754, 110.62770798556913 -199.7810353880754, 110.62770798556913 -197.9051571215207, 110.3373465472868 -197.9051571215207, 110.3373465472868 -196.34192523272512, 110.04698510900447 -196.34192523272512, 110.04698510900447 -194.77869334392952, 109.75662367072213 -194.77869334392952, 109.75662367072213 -193.21546145513395, 109.4662622324398 -193.21546145513395, 109.4662622324398 -191.96487594409749, 109.17590079415747 -191.96487594409749, 109.17590079415747 -190.71429043306102, 108.88553935587512 -190.71429043306102, 108.88553935587512 -189.46370492202453, 108.59517791759279 -189.46370492202453, 108.59517791759279 -188.5257657887472, 108.30481647931046 -188.5257657887472, 108.30481647931046 -187.27518027771072, 108.01445504102813 -187.27518027771072, 108.01445504102813 -186.3372411444334, 107.7240936027458 -186.3372411444334, 107.7240936027458 -185.39930201115604, 107.43373216446346 -185.39930201115604, 107.43373216446346 -184.46136287787868, 107.14337072618113 -184.46136287787868, 107.14337072618113 -183.52342374460133, 106.8530092878988 -183.52342374460133, 106.8530092878988 -182.8981309890831, 106.56264784961647 -182.8981309890831, 106.56264784961647 -181.96019185580576, 106.27228641133412 -181.96019185580576, 106.27228641133412 -181.64754547804662, 101.33614196053446 -181.64754547804662, 101.33614196053446 -181.33489910028752, 99.59397333084046 -181.33489910028752, 99.59397333084046 -181.0222527225284, 98.72288901599346 -181.0222527225284, 98.72288901599346 -180.7096063447693, 98.14216613942878 -180.7096063447693, 98.14216613942878 -180.39695996701016, 97.56144326286412 -180.39695996701016, 97.56144326286412 -180.08431358925105, 97.27108182458178 -180.08431358925105, 97.27108182458178 -179.77166721149194, 96.69035894801712 -179.77166721149194, 96.69035894801712 -179.4590208337328, 96.39999750973479 -179.4590208337328, 96.39999750973479 -179.1463744559737, 96.10963607145244 -179.1463744559737, 96.10963607145244 -178.8337280782146, 95.81927463317011 -178.8337280782146, 95.81927463317011 -178.20843532269635, 95.52891319488778 -178.20843532269635, 95.52891319488778 -177.89578894493724, 95.23855175660545 -177.89578894493724, 95.23855175660545 -177.58314256717813, 94.94819031832311 -177.58314256717813, 94.94819031832311 -176.95784981165988, 94.65782888004078 -176.95784981165988, 94.65782888004078 -176.33255705614167, 94.36746744175845 -176.33255705614167, 94.36746744175845 -175.70726430062342, 94.07710600347612 -175.70726430062342, 94.07710600347612 -175.0819715451052, 93.78674456519379 -175.0819715451052, 93.78674456519379 -174.76932516734607, 93.49638312691144 -174.76932516734607, 93.49638312691144 -174.14403241182785, 93.20602168862911 -174.14403241182785, 93.20602168862911 -173.5187396563096, 92.91566025034678 -173.5187396563096, 92.91566025034678 -172.8934469007914, 92.62529881206444 -172.8934469007914, 92.62529881206444 -172.26815414527314, 92.33493737378211 -172.26815414527314, 92.33493737378211 -171.6428613897549, 92.04457593549978 -171.6428613897549, 92.04457593549978 -171.3302150119958, 91.75421449721745 -171.3302150119958, 91.75421449721745 -170.70492225647757, 91.46385305893511 -170.70492225647757, 91.46385305893511 -170.07962950095933, 91.17349162065278 -170.07962950095933, 91.17349162065278 -169.45433674544108, 90.88313018237044 -169.45433674544108, 90.88313018237044 -169.14169036768197, 90.5927687440881 -169.14169036768197, 90.5927687440881 -168.51639761216376, 90.30240730580577 -168.51639761216376, 90.30240730580577 -167.8911048566455, 90.01204586752344 -167.8911048566455, 90.01204586752344 -167.26581210112727, 89.72168442924111 -167.26581210112727, 89.72168442924111 -166.95316572336816, 89.43132299095878 -166.95316572336816, 89.43132299095878 -166.32787296784994, 89.14096155267644 -166.32787296784994, 89.14096155267644 -165.7025802123317, 88.85060011439411 -165.7025802123317, 88.85060011439411 -165.07728745681345, 88.56023867611178 -165.07728745681345, 88.56023867611178 -164.76464107905434, 88.26987723782943 -164.76464107905434, 88.26987723782943 -164.13934832353613, 87.9795157995471 -164.13934832353613, 87.9795157995471 -163.51405556801788, 87.68915436126477 -163.51405556801788, 87.68915436126477 -163.20140919025877, 87.39879292298244 -163.20140919025877, 87.39879292298244 -162.57611643474053, 87.1084314847001 -162.57611643474053, 87.1084314847001 -161.9508236792223, 86.81807004641777 -161.9508236792223, 86.81807004641777 -161.63817730146317, 86.52770860813544 -161.63817730146317, 86.52770860813544 -161.01288454594496, 86.23734716985311 -161.01288454594496, 86.23734716985311 -160.70023816818585, 85.94698573157078 -160.70023816818585, 85.94698573157078 -160.0749454126676, 85.65662429328843 -160.0749454126676, 85.65662429328843 -159.44965265714936, 85.3662628550061 -159.44965265714936, 85.3662628550061 -159.13700627939025, 85.07590141672377 -159.13700627939025, 85.07590141672377 -158.51171352387203, 84.78553997844143 -158.51171352387203, 84.78553997844143 -158.1990671461129, 84.4951785401591 -158.1990671461129, 84.4951785401591 -157.57377439059468, 84.20481710187677 -157.57377439059468, 84.20481710187677 -157.26112801283554, 83.91445566359444 -157.26112801283554, 83.91445566359444 -156.63583525731732, 83.6240942253121 -156.63583525731732, 83.6240942253121 -156.32318887955822, 83.33373278702977 -156.32318887955822, 83.33373278702977 -156.01054250179908, 83.04337134874743 -156.01054250179908, 83.04337134874743 -155.69789612403997, 82.46264847218276 -155.69789612403997, 82.46264847218276 -155.38524974628086, 82.17228703390043 -155.38524974628086, 82.17228703390043 -155.07260336852175, 81.59156415733577 -155.07260336852175, 81.59156415733577 -154.75995699076262, 81.30120271905344 -154.75995699076262, 81.30120271905344 -154.4473106130035, 81.0108412807711 -154.4473106130035, 81.0108412807711 -154.1346642352444, 80.43011840420642 -154.1346642352444, 80.43011840420642 -153.82201785748526, 80.1397569659241 -153.82201785748526, 80.1397569659241 -153.50937147972616, 79.55903408935943 -153.50937147972616, 79.55903408935943 -153.19672510196705, 79.2686726510771 -153.19672510196705, 79.2686726510771 -152.88407872420794, 78.68794977451243 -152.88407872420794, 78.68794977451243 -152.5714323464488, 78.10722689794775 -152.5714323464488, 78.10722689794775 -152.2587859686897, 77.81686545966542 -152.2587859686897, 77.81686545966542 -151.94613959093058, 77.23614258310076 -151.94613959093058, 77.23614258310076 -151.63349321317145, 76.94578114481843 -151.63349321317145, 76.94578114481843 -151.32084683541234, 76.36505826825376 -151.32084683541234, 76.36505826825376 -151.00820045765323, 75.7843353916891 -151.00820045765323, 75.7843353916891 -150.69555407989412, 75.49397395340675 -150.69555407989412, 75.49397395340675 -150.382907702135, 74.91325107684209 -150.382907702135, 74.91325107684209 -150.07026132437588, 74.62288963855976 -150.07026132437588, 74.62288963855976 -149.75761494661677, 74.04216676199509 -149.75761494661677, 74.04216676199509 -149.44496856885763, 73.46144388543043 -149.44496856885763, 73.46144388543043 -149.13232219109852, 73.1710824471481 -149.13232219109852, 73.1710824471481 -148.81967581333942, 72.59035957058342 -148.81967581333942), 
+  (198.02650090855158 -81.9133509728885, 197.73613947026925 -81.9133509728885, 197.73613947026925 -81.60070459512939, 197.44577803198692 -81.60070459512939, 197.44577803198692 -81.28805821737026, 197.15541659370456 -81.28805821737026, 197.15541659370456 -80.97541183961116, 196.28433227885756 -80.97541183961116, 196.28433227885756 -81.28805821737026, 195.41324796401057 -81.28805821737026, 195.41324796401057 -81.60070459512939), 
+  (72.29999813230108 -148.19438305782117, 72.00963669401875 -148.19438305782117, 72.00963669401875 -147.88173668006206, 71.71927525573642 -147.88173668006206, 71.71927525573642 -147.56909030230295, 71.42891381745409 -147.56909030230295, 71.42891381745409 -147.25644392454382, 71.13855237917176 -147.25644392454382, 71.13855237917176 -146.9437975467847, 70.84819094088942 -146.9437975467847, 70.84819094088942 -146.6311511690256, 70.55782950260709 -146.6311511690256, 70.55782950260709 -146.3185047912665, 70.26746806432475 -146.3185047912665, 70.26746806432475 -146.00585841350735, 69.97710662604241 -146.00585841350735, 69.97710662604241 -145.69321203574825, 69.68674518776008 -145.69321203574825, 69.68674518776008 -145.38056565798914, 69.39638374947775 -145.38056565798914, 69.39638374947775 -145.06791928023, 69.10602231119542 -145.06791928023, 69.10602231119542 -144.7552729024709, 68.81566087291309 -144.7552729024709, 68.81566087291309 -144.12998014695268, 68.52529943463075 -144.12998014695268, 68.52529943463075 -143.81733376919354, 68.23493799634842 -143.81733376919354, 68.23493799634842 -143.50468739143443, 67.94457655806609 -143.50468739143443, 67.94457655806609 -143.19204101367532, 67.65421511978374 -143.19204101367532, 67.65421511978374 -142.8793946359162, 67.36385368150141 -142.8793946359162, 67.36385368150141 -142.56674825815708, 67.07349224321908 -142.56674825815708, 67.07349224321908 -142.25410188039797, 66.78313080493675 -142.25410188039797, 66.78313080493675 -141.94145550263886, 66.49276936665441 -141.94145550263886, 66.49276936665441 -141.31616274712061, 66.20240792837208 -141.31616274712061, 66.20240792837208 -141.0035163693615, 65.91204649008975 -141.0035163693615, 65.91204649008975 -140.6908699916024, 65.62168505180742 -140.6908699916024, 65.62168505180742 -140.37822361384326, 65.33132361352507 -140.37822361384326, 65.33132361352507 -140.06557723608415, 65.04096217524274 -140.06557723608415, 65.04096217524274 -139.75293085832504, 64.75060073696041 -139.75293085832504, 64.75060073696041 -139.4402844805659, 64.46023929867808 -139.4402844805659, 64.46023929867808 -138.8149917250477, 64.16987786039574 -138.8149917250477, 64.16987786039574 -138.50234534728858, 63.87951642211341 -138.50234534728858, 63.87951642211341 -138.18969896952945, 63.58915498383108 -138.18969896952945, 63.58915498383108 -137.87705259177034, 63.29879354554874 -137.87705259177034, 63.29879354554874 -137.56440621401123, 63.00843210726641 -137.56440621401123, 63.00843210726641 -137.2517598362521, 62.718070668984076 -137.2517598362521, 62.718070668984076 -136.93911345849298, 62.427709230701744 -136.93911345849298, 62.427709230701744 -136.62646708073387, 62.137347792419405 -136.62646708073387, 62.137347792419405 -136.00117432521563, 61.84698635413707 -136.00117432521563, 61.84698635413707 -135.68852794745652, 61.55662491585474 -135.68852794745652, 61.55662491585474 -135.3758815696974, 61.26626347757241 -135.3758815696974, 61.26626347757241 -135.0632351919383, 60.97590203929008 -135.0632351919383, 60.97590203929008 -134.75058881417917, 60.10481772444307 -134.75058881417917, 60.10481772444307 -134.43794243642006, 58.653010533031406 -134.43794243642006, 58.653010533031406 -134.12529605866095, 57.20120334161974 -134.12529605866095, 57.20120334161974 -134.43794243642006, 55.74939615020807 -134.43794243642006, 55.74939615020807 -134.75058881417917, 55.1686732736434 -134.75058881417917, 55.1686732736434 -135.0632351919383, 54.587950397078735 -135.0632351919383, 54.587950397078735 -135.3758815696974, 54.297588958796396 -135.3758815696974, 54.297588958796396 -135.68852794745652, 54.007227520514064 -135.68852794745652, 54.007227520514064 -136.00117432521563, 53.71686608223173 -136.00117432521563, 53.71686608223173 -136.31382070297477, 53.4265046439494 -136.31382070297477, 53.4265046439494 -136.62646708073387, 53.13614320566706 -136.62646708073387, 53.13614320566706 -136.93911345849298, 52.84578176738473 -136.93911345849298, 52.84578176738473 -137.56440621401123, 52.5554203291024 -137.56440621401123, 52.5554203291024 -138.18969896952945, 52.265058890820065 -138.18969896952945, 52.265058890820065 -138.8149917250477, 51.97469745253773 -138.8149917250477, 51.97469745253773 -139.4402844805659, 51.68433601425539 -139.4402844805659, 51.68433601425539 -140.37822361384326, 51.39397457597306 -140.37822361384326, 51.39397457597306 -141.31616274712061, 51.10361313769073 -141.31616274712061, 51.10361313769073 -142.56674825815708, 50.8132516994084 -142.56674825815708, 50.8132516994084 -144.12998014695268, 50.52289026112606 -144.12998014695268, 50.52289026112606 -146.3185047912665, 50.232528822843726 -146.3185047912665, 50.232528822843726 -148.81967581333942, 49.942167384561394 -148.81967581333942, 49.942167384561394 -151.00820045765323), 
+  (95.23855175660545 -236.04801520813288, 95.23855175660545 -227.29391663087762, 94.94819031832311 -227.29391663087762, 94.94819031832311 -215.1007078982721, 94.65782888004078 -215.1007078982721, 94.65782888004078 -220.10304994241795, 94.36746744175845 -220.10304994241795, 94.36746744175845 -225.1053919865638, 94.07710600347612 -225.1053919865638, 94.07710600347612 -229.79508765295057, 93.78674456519379 -229.79508765295057, 93.78674456519379 -231.67096591950525))MULTILINESTRING ((4.355421574235005 -38.76815084213044, 2.3228915062586695 -38.76815084213044, 2.3228915062586695 -39.080797219889554, 0 -39.080797219889554), 
+  (130.08192435048548 0, 130.08192435048548 -0.3126463777591164, 130.66264722705014 -0.3126463777591164, 130.66264722705014 -0.6252927555182328, 130.9530086653325 -0.6252927555182328, 130.9530086653325 -0.9379391332773492, 131.24337010361484 -0.9379391332773492, 131.24337010361484 -1.2505855110364656, 131.53373154189717 -1.2505855110364656, 131.53373154189717 -1.563231888795582, 131.8240929801795 -1.563231888795582, 131.8240929801795 -2.8138173998320477, 131.53373154189717 -2.8138173998320477, 131.53373154189717 -3.126463777591164, 131.24337010361484 -3.126463777591164, 131.24337010361484 -3.4391101553502805, 130.9530086653325 -3.4391101553502805, 130.9530086653325 -3.751756533109397, 130.08192435048548 -3.751756533109397, 130.08192435048548 -4.064402910868513, 129.21084003563848 -4.064402910868513, 129.21084003563848 -4.37704928862763, 128.3397557207915 -4.37704928862763, 128.3397557207915 -4.689695666386746, 127.17830996766216 -4.689695666386746, 127.17830996766216 -5.002342044145863, 125.72650277625048 -5.002342044145863, 125.72650277625048 -5.314988421904979, 123.98433414655648 -5.314988421904979, 123.98433414655648 -5.627634799664095, 121.95180407858015 -5.627634799664095, 121.95180407858015 -5.940281177423212, 119.62891257232148 -5.940281177423212, 119.62891257232148 -6.252927555182328, 117.30602106606281 -6.252927555182328, 117.30602106606281 -6.565573932941445, 114.98312955980414 -6.565573932941445, 114.98312955980414 -6.878220310700561, 112.66023805354547 -6.878220310700561, 112.66023805354547 -7.1908666884596775, 109.75662367072213 -7.1908666884596775, 109.75662367072213 -7.503513066218794, 106.8530092878988 -7.503513066218794, 106.8530092878988 -7.81615944397791, 104.2397563433578 -7.81615944397791, 104.2397563433578 -8.128805821737027, 101.6265033988168 -8.128805821737027, 101.6265033988168 -8.441452199496144, 98.72288901599346 -8.441452199496144, 98.72288901599346 -8.75409857725526, 95.81927463317011 -8.75409857725526, 95.81927463317011 -9.066744955014375, 93.20602168862911 -9.066744955014375, 93.20602168862911 -9.379391332773492, 90.30240730580577 -9.379391332773492, 90.30240730580577 -9.69203771053261, 87.39879292298244 -9.69203771053261, 87.39879292298244 -10.004684088291725, 84.4951785401591 -10.004684088291725, 84.4951785401591 -10.31733046605084, 81.0108412807711 -10.31733046605084, 81.0108412807711 -10.629976843809958, 77.23614258310076 -10.629976843809958, 77.23614258310076 -10.942623221569075, 73.46144388543043 -10.942623221569075, 73.46144388543043 -11.25526959932819, 72.59035957058342 -11.25526959932819), 
+  (72.29999813230108 -11.25526959932819, 69.10602231119542 -11.25526959932819, 69.10602231119542 -11.567915977087306, 64.46023929867808 -11.567915977087306, 64.46023929867808 -11.880562354846424, 59.5240948478784 -11.880562354846424, 59.5240948478784 -12.193208732605541, 54.87831183536107 -12.193208732605541, 54.87831183536107 -12.505855110364656, 49.36144450799673 -12.505855110364656, 49.36144450799673 -12.818501488123772, 45.00602293376172 -12.818501488123772, 45.00602293376172 -13.13114786588289, 40.65060135952672 -13.13114786588289, 40.65060135952672 -13.443794243642007, 36.004818347009376 -13.443794243642007, 36.004818347009376 -13.756440621401122, 31.359035334492038 -13.756440621401122, 31.359035334492038 -14.069086999160238, 26.422890883692364 -14.069086999160238, 26.422890883692364 -14.381733376919355, 23.228915062586694 -14.381733376919355, 23.228915062586694 -14.694379754678472, 20.32530067976336 -14.694379754678472, 20.32530067976336 -15.007026132437588, 19.74457780319869 -15.007026132437588), 
+  (4.355421574235005 -15.319672510196703, 4.065060135952671 -15.319672510196703, 4.065060135952671 -15.63231888795582, 0 -15.63231888795582), 
+  (297.3301128011097 -58.464872640954766, 297.03975136282736 -58.464872640954766, 297.03975136282736 -58.77751901871389, 296.16866704798036 -58.77751901871389, 296.16866704798036 -59.090165396473004, 295.29758273313337 -59.090165396473004, 295.29758273313337 -59.40281177423212, 294.42649841828637 -59.40281177423212, 294.42649841828637 -59.715458151991236, 293.5554141034394 -59.715458151991236, 293.5554141034394 -60.02810452975035, 292.6843297885924 -60.02810452975035, 292.6843297885924 -60.34075090750947, 291.8132454737453 -60.34075090750947, 291.8132454737453 -60.65339728526858, 290.94216115889833 -60.65339728526858, 290.94216115889833 -60.9660436630277, 290.07107684405133 -60.9660436630277, 290.07107684405133 -61.27869004078681, 289.19999252920434 -61.27869004078681, 289.19999252920434 -61.591336418545936, 288.32890821435734 -61.591336418545936, 288.32890821435734 -61.90398279630505, 278.456619312758 -61.90398279630505, 278.456619312758 -62.21662917406417, 275.843366368217 -62.21662917406417, 275.843366368217 -61.90398279630505, 274.6819206150877 -61.90398279630505, 274.6819206150877 -61.591336418545936, 273.52047486195835 -61.591336418545936, 273.52047486195835 -61.27869004078681, 272.0686676705467 -61.27869004078681, 272.0686676705467 -60.9660436630277, 270.9072219174173 -60.9660436630277, 270.9072219174173 -60.65339728526858, 269.45541472600564 -60.65339728526858, 269.45541472600564 -60.34075090750947, 268.003607534594 -60.34075090750947, 268.003607534594 -60.02810452975035, 266.5518003431823 -60.02810452975035, 266.5518003431823 -59.715458151991236, 265.09999315177066 -59.715458151991236, 265.09999315177066 -59.40281177423212, 263.06746308379434 -59.40281177423212, 263.06746308379434 -59.090165396473004, 260.7445715775356 -59.090165396473004, 260.7445715775356 -58.77751901871389, 258.42168007127697 -58.77751901871389, 258.42168007127697 -58.464872640954766, 256.38915000330064 -58.464872640954766, 256.38915000330064 -58.15222626319565, 254.06625849704199 -58.15222626319565, 254.06625849704199 -57.839579885436535, 250.29155979937164 -57.839579885436535, 250.29155979937164 -57.52693350767742, 245.93613822513663 -57.52693350767742, 245.93613822513663 -57.214287129918304, 241.87107808918395 -57.214287129918304, 241.87107808918395 -56.90164075215919, 238.0963793915136 -56.90164075215919, 238.0963793915136 -56.58899437440007, 234.90240357040796 -56.58899437440007, 234.90240357040796 -56.27634799664095, 231.70842774930227 -56.27634799664095, 231.70842774930227 -55.963701618881835, 230.2566205578906 -55.963701618881835, 230.2566205578906 -55.65105524112272, 229.09517480476129 -55.65105524112272, 229.09517480476129 -55.338408863363604, 227.93372905163193 -55.338408863363604, 227.93372905163193 -55.02576248560449, 226.7722832985026 -55.02576248560449, 226.7722832985026 -54.71311610784537, 225.61083754537327 -54.71311610784537, 225.61083754537327 -54.40046973008626, 224.44939179224394 -54.40046973008626, 224.44939179224394 -54.08782335232714, 223.28794603911462 -54.08782335232714, 223.28794603911462 -53.775176974568026, 221.83613884770293 -53.775176974568026, 221.83613884770293 -53.462530596808904, 220.38433165629127 -53.462530596808904, 220.38433165629127 -53.14988421904979, 218.9325244648796 -53.14988421904979, 218.9325244648796 -52.83723784129067, 217.19035583518558 -52.83723784129067, 217.19035583518558 -52.52459146353156, 214.86746432892693 -52.52459146353156, 214.86746432892693 -52.21194508577244, 211.67348850782125 -52.21194508577244, 211.67348850782125 -51.899298708013326, 201.8011996062219 -51.899298708013326, 201.8011996062219 -51.58665233025421, 198.60722378511625 -51.58665233025421, 198.60722378511625 -51.27400595249509, 195.99397084057523 -51.27400595249509, 195.99397084057523 -51.58665233025421, 194.54216364916357 -51.58665233025421, 194.54216364916357 -51.899298708013326, 193.0903564577519 -51.899298708013326, 193.0903564577519 -52.21194508577244, 191.63854926634022 -52.21194508577244, 191.63854926634022 -52.52459146353156, 190.4771035132109 -52.52459146353156, 190.4771035132109 -52.83723784129067, 189.02529632179923 -52.83723784129067, 189.02529632179923 -53.14988421904979, 187.8638505686699 -53.14988421904979, 187.8638505686699 -53.462530596808904, 186.41204337725821 -53.462530596808904, 186.41204337725821 -53.775176974568026, 185.2505976241289 -53.775176974568026, 185.2505976241289 -54.08782335232714, 184.3795133092819 -54.08782335232714, 184.3795133092819 -54.40046973008626, 183.21806755615256 -54.40046973008626, 183.21806755615256 -54.71311610784537, 182.05662180302323 -54.71311610784537, 182.05662180302323 -55.02576248560449, 180.89517604989388 -55.02576248560449, 180.89517604989388 -55.338408863363604, 179.73373029676455 -55.338408863363604, 179.73373029676455 -55.65105524112272, 178.86264598191755 -55.65105524112272, 178.86264598191755 -55.963701618881835, 177.70120022878822 -55.963701618881835, 177.70120022878822 -56.27634799664095, 176.53975447565887 -56.27634799664095, 176.53975447565887 -56.58899437440007, 175.37830872252954 -56.58899437440007, 175.37830872252954 -56.90164075215919, 174.2168629694002 -56.90164075215919, 174.2168629694002 -57.214287129918304, 169.8614413951652 -57.214287129918304, 169.8614413951652 -57.52693350767742, 165.21565838264786 -57.52693350767742, 165.21565838264786 -57.839579885436535, 158.82770674043653 -57.839579885436535, 158.82770674043653 -58.15222626319565, 139.08312893723783 -58.15222626319565, 139.08312893723783 -57.839579885436535, 136.1795145544145 -57.839579885436535, 136.1795145544145 -57.52693350767742, 134.14698448643816 -57.52693350767742, 134.14698448643816 -57.214287129918304, 132.11445441846183 -57.214287129918304, 132.11445441846183 -56.90164075215919, 130.66264722705014 -56.90164075215919, 130.66264722705014 -56.58899437440007, 129.21084003563848 -56.58899437440007, 129.21084003563848 -56.27634799664095, 128.04939428250916 -56.27634799664095, 128.04939428250916 -55.963701618881835, 126.59758709109748 -55.963701618881835, 126.59758709109748 -55.65105524112272, 125.43614133796815 -55.65105524112272, 125.43614133796815 -55.338408863363604, 124.56505702312116 -55.338408863363604, 124.56505702312116 -55.02576248560449, 123.40361126999181 -55.02576248560449, 123.40361126999181 -54.71311610784537, 122.24216551686249 -54.71311610784537, 122.24216551686249 -54.40046973008626, 121.37108120201547 -54.40046973008626, 121.37108120201547 -54.08782335232714, 120.20963544888615 -54.08782335232714, 120.20963544888615 -53.775176974568026, 119.33855113403915 -53.775176974568026, 119.33855113403915 -53.462530596808904, 118.17710538090981 -53.462530596808904, 118.17710538090981 -53.14988421904979, 116.4349367512158 -53.14988421904979, 116.4349367512158 -52.83723784129067, 113.8216838066748 -52.83723784129067, 113.8216838066748 -52.52459146353156, 111.49879230041614 -52.52459146353156, 111.49879230041614 -52.21194508577244, 109.75662367072213 -52.21194508577244, 109.75662367072213 -51.899298708013326, 108.01445504102813 -51.899298708013326, 108.01445504102813 -51.58665233025421, 106.8530092878988 -51.58665233025421, 106.8530092878988 -51.27400595249509, 102.78794915194612 -51.27400595249509, 102.78794915194612 -50.96135957473597, 96.69035894801712 -50.96135957473597, 96.69035894801712 -50.64871319697686, 93.20602168862911 -50.64871319697686, 93.20602168862911 -50.96135957473597, 89.72168442924111 -50.96135957473597, 89.72168442924111 -51.27400595249509, 87.39879292298244 -51.27400595249509, 87.39879292298244 -51.58665233025421, 85.3662628550061 -51.58665233025421, 85.3662628550061 -51.899298708013326, 83.91445566359444 -51.899298708013326, 83.91445566359444 -52.21194508577244, 76.07469682997143 -52.21194508577244, 76.07469682997143 -52.52459146353156, 72.59035957058342 -52.52459146353156), 
+  (72.29999813230108 -52.52459146353156, 69.68674518776008 -52.52459146353156, 69.68674518776008 -52.21194508577244, 67.36385368150141 -52.21194508577244, 67.36385368150141 -51.899298708013326, 65.04096217524274 -51.899298708013326, 65.04096217524274 -51.58665233025421, 62.718070668984076 -51.58665233025421, 62.718070668984076 -51.27400595249509, 60.68554060100774 -51.27400595249509, 60.68554060100774 -50.96135957473597, 59.5240948478784 -50.96135957473597, 59.5240948478784 -50.64871319697686, 58.653010533031406 -50.64871319697686, 58.653010533031406 -50.33606681921774, 57.7819262181844 -50.33606681921774, 57.7819262181844 -50.023420441458626, 56.9108419033374 -50.023420441458626, 56.9108419033374 -49.71077406369951, 56.0397575884904 -49.71077406369951, 56.0397575884904 -49.398127685940395, 55.1686732736434 -49.398127685940395, 55.1686732736434 -49.08548130818128, 54.297588958796396 -49.08548130818128, 54.297588958796396 -48.772834930422164, 53.71686608223173 -48.772834930422164, 53.71686608223173 -48.46018855266304, 52.84578176738473 -48.46018855266304, 52.84578176738473 -48.147542174903926, 52.265058890820065 -48.147542174903926, 52.265058890820065 -47.83489579714481, 51.39397457597306 -47.83489579714481, 51.39397457597306 -47.522249419385695, 50.8132516994084 -47.522249419385695, 50.8132516994084 -47.20960304162658, 50.232528822843726 -47.20960304162658, 50.232528822843726 -46.89695666386746, 49.36144450799673 -46.89695666386746, 49.36144450799673 -46.58431028610835, 48.490360193149726 -46.58431028610835, 48.490360193149726 -46.271663908349225, 47.32891444002039 -46.271663908349225, 47.32891444002039 -45.95901753059011, 46.167468686891056 -45.95901753059011, 46.167468686891056 -45.646371152830994, 45.00602293376172 -45.646371152830994, 45.00602293376172 -45.33372477507188, 44.13493861891472 -45.33372477507188, 44.13493861891472 -45.02107839731276, 42.97349286578539 -45.02107839731276, 42.97349286578539 -44.70843201955365, 42.102408550938385 -44.70843201955365, 42.102408550938385 -44.39578564179453, 40.94096279780905 -44.39578564179453, 40.94096279780905 -44.08313926403542, 40.06987848296205 -44.08313926403542, 40.06987848296205 -43.7704928862763, 38.90843272983271 -43.7704928862763, 38.90843272983271 -43.45784650851718, 38.037348414985715 -43.45784650851718, 38.037348414985715 -43.14520013075806, 36.87590266185638 -43.14520013075806, 36.87590266185638 -42.83255375299895, 35.42409547044471 -42.83255375299895, 35.42409547044471 -42.51990737523983, 34.26264971731538 -42.51990737523983, 34.26264971731538 -42.20726099748072, 32.81084252590371 -42.20726099748072, 32.81084252590371 -41.8946146197216, 31.068673896209702 -41.8946146197216, 31.068673896209702 -41.581968241962485, 29.616866704798035 -41.581968241962485, 29.616866704798035 -41.26932186420336, 27.5843366368217 -41.26932186420336, 27.5843366368217 -40.95667548644425, 23.51927650086903 -40.95667548644425, 23.51927650086903 -41.26932186420336, 21.19638499461036 -41.26932186420336, 21.19638499461036 -41.581968241962485, 20.034939241481023 -41.581968241962485, 20.034939241481023 -41.8946146197216, 19.74457780319869 -41.8946146197216))MULTILINESTRING ((297.3301128011097 -76.59836255098352, 297.03975136282736 -76.59836255098352, 297.03975136282736 -76.91100892874263, 295.87830560969803 -76.91100892874263, 295.87830560969803 -77.22365530650175, 295.00722129485104 -77.22365530650175, 295.00722129485104 -77.53630168426088, 293.8457755417217 -77.53630168426088, 293.8457755417217 -77.84894806201999, 292.9746912268747 -77.84894806201999, 292.9746912268747 -78.16159443977911, 291.8132454737453 -78.16159443977911, 291.8132454737453 -78.47424081753822, 290.94216115889833 -78.47424081753822, 290.94216115889833 -78.78688719529734, 289.780715405769 -78.78688719529734, 289.780715405769 -79.09953357305645, 288.6192696526397 -79.09953357305645, 288.6192696526397 -79.41217995081557, 287.45782389951034 -79.41217995081557, 287.45782389951034 -79.72482632857468, 284.2638480784047 -79.72482632857468, 284.2638480784047 -80.0374727063338, 281.069872257299 -80.0374727063338, 281.069872257299 -80.35011908409292, 278.7469807510403 -80.35011908409292, 278.7469807510403 -80.66276546185203, 277.00481212134633 -80.66276546185203, 277.00481212134633 -80.97541183961116, 276.13372780649934 -80.97541183961116, 276.13372780649934 -80.66276546185203, 274.6819206150877 -80.66276546185203, 274.6819206150877 -80.35011908409292, 273.52047486195835 -80.35011908409292, 273.52047486195835 -80.0374727063338, 272.359029108829 -80.0374727063338, 272.359029108829 -79.72482632857468, 270.9072219174173 -79.72482632857468, 270.9072219174173 -79.41217995081557, 269.45541472600564 -79.41217995081557, 269.45541472600564 -79.09953357305645, 268.003607534594 -79.09953357305645, 268.003607534594 -78.78688719529734, 266.5518003431823 -78.78688719529734, 266.5518003431823 -78.47424081753822, 264.80963171348833 -78.47424081753822, 264.80963171348833 -78.16159443977911, 263.648185960359 -78.16159443977911, 263.648185960359 -77.84894806201999, 262.4867402072297 -77.84894806201999, 262.4867402072297 -77.53630168426088, 261.03493301581796 -77.53630168426088, 261.03493301581796 -77.22365530650175, 259.8734872626886 -77.22365530650175, 259.8734872626886 -76.91100892874263, 258.7120415095593 -76.91100892874263, 258.7120415095593 -76.59836255098352, 257.26023431814764 -76.59836255098352, 257.26023431814764 -76.2857161732244, 256.0987885650183 -76.2857161732244, 256.0987885650183 -75.97306979546529, 254.64698137360665 -75.97306979546529, 254.64698137360665 -75.66042341770617, 251.45300555250097 -75.66042341770617, 251.45300555250097 -75.97306979546529, 245.35541534857197 -75.97306979546529, 245.35541534857197 -75.66042341770617, 242.74216240403095 -75.66042341770617, 242.74216240403095 -75.34777703994706, 241.58071665090162 -75.34777703994706, 241.58071665090162 -75.03513066218794, 240.4192708977723 -75.03513066218794, 240.4192708977723 -74.72248428442882, 239.25782514464296 -74.72248428442882, 239.25782514464296 -74.40983790666971, 237.80601795323128 -74.40983790666971, 237.80601795323128 -74.09719152891059, 236.35421076181962 -74.09719152891059, 236.35421076181962 -73.78454515115148, 234.90240357040796 -73.78454515115148, 234.90240357040796 -73.47189877339235, 233.4505963789963 -73.47189877339235, 233.4505963789963 -73.15925239563325, 231.70842774930227 -73.15925239563325, 231.70842774930227 -72.84660601787412, 230.2566205578906 -72.84660601787412, 230.2566205578906 -72.533959640115, 228.80481336647895 -72.533959640115, 228.80481336647895 -72.22131326235589, 227.6433676133496 -72.22131326235589, 227.6433676133496 -71.90866688459677, 226.19156042193794 -71.90866688459677, 226.19156042193794 -71.59602050683766, 224.44939179224394 -71.59602050683766, 224.44939179224394 -71.28337412907854, 222.99758460083228 -71.28337412907854, 222.99758460083228 -70.97072775131943, 221.25541597113826 -70.97072775131943, 221.25541597113826 -70.65808137356031, 219.22288590316194 -70.65808137356031, 219.22288590316194 -70.3454349958012, 197.15541659370456 -70.3454349958012, 197.15541659370456 -70.03278861804208, 196.86505515542223 -70.03278861804208, 196.86505515542223 -70.3454349958012, 195.7036094022929 -70.3454349958012, 195.7036094022929 -70.65808137356031, 194.54216364916357 -70.65808137356031, 194.54216364916357 -70.97072775131943, 193.38071789603424 -70.97072775131943, 193.38071789603424 -71.28337412907854, 192.21927214290488 -71.28337412907854, 192.21927214290488 -71.59602050683766, 191.3481878280579 -71.59602050683766, 191.3481878280579 -71.90866688459677, 190.18674207492856 -71.90866688459677, 190.18674207492856 -72.22131326235589, 189.02529632179923 -72.22131326235589, 189.02529632179923 -72.533959640115, 188.15421200695224 -72.533959640115, 188.15421200695224 -72.84660601787412, 186.99276625382288 -72.84660601787412, 186.99276625382288 -73.15925239563325, 186.12168193897588 -73.15925239563325, 186.12168193897588 -73.47189877339235, 184.96023618584655 -73.47189877339235, 184.96023618584655 -73.78454515115148, 184.08915187099956 -73.78454515115148, 184.08915187099956 -74.09719152891059, 183.21806755615256 -74.09719152891059, 183.21806755615256 -74.40983790666971, 182.34698324130557 -74.40983790666971, 182.34698324130557 -74.72248428442882, 181.47589892645854 -74.72248428442882, 181.47589892645854 -75.03513066218794, 180.60481461161154 -75.03513066218794, 180.60481461161154 -75.34777703994706, 179.73373029676455 -75.34777703994706, 179.73373029676455 -75.66042341770617, 178.86264598191755 -75.66042341770617, 178.86264598191755 -75.97306979546529, 177.99156166707056 -75.97306979546529, 177.99156166707056 -76.2857161732244, 177.12047735222356 -76.2857161732244, 177.12047735222356 -76.59836255098352, 176.24939303737654 -76.59836255098352, 176.24939303737654 -76.91100892874263, 175.66867016081187 -76.91100892874263, 175.66867016081187 -77.22365530650175, 174.79758584596487 -77.22365530650175, 174.79758584596487 -77.53630168426088, 173.34577865455321 -77.53630168426088, 173.34577865455321 -77.84894806201999, 171.6036100248592 -77.84894806201999, 171.6036100248592 -78.16159443977911, 169.57107995688287 -78.16159443977911, 169.57107995688287 -78.47424081753822, 167.53854988890654 -78.47424081753822, 167.53854988890654 -78.78688719529734, 165.5060198209302 -78.78688719529734, 165.5060198209302 -79.09953357305645, 163.18312831467154 -79.09953357305645, 163.18312831467154 -79.41217995081557, 160.86023680841285 -79.41217995081557, 160.86023680841285 -79.72482632857468, 158.5373453021542 -79.72482632857468, 158.5373453021542 -80.0374727063338, 155.92409235761318 -80.0374727063338, 155.92409235761318 -80.35011908409292, 153.02047797478986 -80.35011908409292, 153.02047797478986 -80.66276546185203, 150.1168635919665 -80.66276546185203, 150.1168635919665 -80.97541183961116, 147.50361064742552 -80.97541183961116, 147.50361064742552 -81.28805821737026, 144.30963482631984 -81.28805821737026, 144.30963482631984 -81.60070459512939, 140.24457469036716 -81.60070459512939, 140.24457469036716 -81.9133509728885, 133.5662616098735 -81.9133509728885, 133.5662616098735 -81.60070459512939, 129.50120147392082 -81.60070459512939, 129.50120147392082 -81.28805821737026, 127.46867140594449 -81.28805821737026, 127.46867140594449 -80.97541183961116, 125.72650277625048 -80.97541183961116, 125.72650277625048 -80.66276546185203, 124.27469558483881 -80.66276546185203, 124.27469558483881 -80.35011908409292, 122.82288839342715 -80.35011908409292, 122.82288839342715 -80.0374727063338, 121.37108120201547 -80.0374727063338, 121.37108120201547 -79.72482632857468, 119.91927401060381 -79.72482632857468, 119.91927401060381 -79.41217995081557, 118.46746681919214 -79.41217995081557, 118.46746681919214 -79.09953357305645, 116.14457531293347 -79.09953357305645, 116.14457531293347 -78.78688719529734, 112.36987661526314 -78.78688719529734, 112.36987661526314 -78.47424081753822, 109.4662622324398 -78.47424081753822, 109.4662622324398 -78.16159443977911, 107.14337072618113 -78.16159443977911, 107.14337072618113 -77.84894806201999, 91.75421449721745 -77.84894806201999, 91.75421449721745 -78.16159443977911, 88.26987723782943 -78.16159443977911, 88.26987723782943 -78.47424081753822, 85.65662429328843 -78.47424081753822, 85.65662429328843 -78.78688719529734, 80.43011840420642 -78.78688719529734, 80.43011840420642 -79.09953357305645, 74.62288963855976 -79.09953357305645, 74.62288963855976 -79.41217995081557, 72.59035957058342 -79.41217995081557), 
+  (4.355421574235005 -76.91100892874263, 3.774698697670338 -76.91100892874263, 3.774698697670338 -77.22365530650175, 3.4843372593880044 -77.22365530650175, 3.4843372593880044 -77.53630168426088, 2.9036143828233367 -77.53630168426088, 2.9036143828233367 -77.84894806201999, 2.3228915062586695 -77.84894806201999, 2.3228915062586695 -78.16159443977911, 2.0325300679763356 -78.16159443977911, 2.0325300679763356 -78.47424081753822, 1.4518071914116684 -78.47424081753822, 1.4518071914116684 -78.78688719529734, 1.1614457531293347 -78.78688719529734, 1.1614457531293347 -79.09953357305645, 0.5807228765646674 -79.09953357305645, 0.5807228765646674 -79.41217995081557, 0.2903614382823337 -79.41217995081557, 0.2903614382823337 -79.72482632857468, 0 -79.72482632857468), 
+  (72.29999813230108 -79.41217995081557, 70.26746806432475 -79.41217995081557, 70.26746806432475 -79.09953357305645, 67.65421511978374 -79.09953357305645, 67.65421511978374 -78.78688719529734, 65.04096217524274 -78.78688719529734, 65.04096217524274 -78.47424081753822, 62.427709230701744 -78.47424081753822, 62.427709230701744 -78.16159443977911, 60.395179162725405 -78.16159443977911, 60.395179162725405 -77.84894806201999, 58.94337197131374 -77.84894806201999, 58.94337197131374 -77.53630168426088, 57.7819262181844 -77.53630168426088, 57.7819262181844 -77.22365530650175, 56.330119026772735 -77.22365530650175, 56.330119026772735 -76.91100892874263, 55.1686732736434 -76.91100892874263, 55.1686732736434 -76.59836255098352, 54.007227520514064 -76.59836255098352, 54.007227520514064 -76.2857161732244, 53.13614320566706 -76.2857161732244, 53.13614320566706 -75.97306979546529, 51.97469745253773 -75.97306979546529, 51.97469745253773 -75.66042341770617, 51.10361313769073 -75.66042341770617, 51.10361313769073 -75.34777703994706, 50.232528822843726 -75.34777703994706, 50.232528822843726 -75.03513066218794, 49.07108306971439 -75.03513066218794, 49.07108306971439 -74.72248428442882, 47.61927587830272 -74.72248428442882, 47.61927587830272 -74.40983790666971, 46.45783012517339 -74.40983790666971, 46.45783012517339 -74.09719152891059, 45.00602293376172 -74.09719152891059, 45.00602293376172 -73.78454515115148, 43.55421574235005 -73.78454515115148, 43.55421574235005 -73.47189877339235, 42.39276998922072 -73.47189877339235, 42.39276998922072 -73.15925239563325, 41.23132423609138 -73.15925239563325, 41.23132423609138 -72.84660601787412, 40.06987848296205 -72.84660601787412, 40.06987848296205 -72.533959640115, 38.90843272983271 -72.533959640115, 38.90843272983271 -72.22131326235589, 37.16626410013871 -72.22131326235589, 37.16626410013871 -71.90866688459677, 35.13373403216237 -71.90866688459677, 35.13373403216237 -71.59602050683766, 33.10120396418604 -71.59602050683766, 33.10120396418604 -71.28337412907854, 30.48795101964504 -71.28337412907854, 30.48795101964504 -70.97072775131943, 25.26144513056303 -70.97072775131943, 25.26144513056303 -71.28337412907854, 23.80963793915136 -71.28337412907854, 23.80963793915136 -71.59602050683766, 22.648192186022026 -71.59602050683766, 22.648192186022026 -71.90866688459677, 21.777107871175026 -71.90866688459677, 21.777107871175026 -72.22131326235589, 20.61566211804569 -72.22131326235589, 20.61566211804569 -72.533959640115, 19.74457780319869 -72.533959640115))MULTILINESTRING ((297.3301128011097 -98.17096261636256, 295.00722129485104 -98.17096261636256, 295.00722129485104 -98.48360899412167, 290.07107684405133 -98.48360899412167, 290.07107684405133 -98.79625537188079, 287.167462461228 -98.79625537188079, 287.167462461228 -99.1089017496399, 286.0060167080987 -99.1089017496399, 286.0060167080987 -99.42154812739902, 284.84457095496936 -99.42154812739902, 284.84457095496936 -99.73419450515813, 283.97348664012236 -99.73419450515813, 283.97348664012236 -100.04684088291725, 282.81204088699303 -100.04684088291725, 282.81204088699303 -100.35948726067637, 281.940956572146 -100.35948726067637, 281.940956572146 -100.67213363843548, 281.069872257299 -100.67213363843548, 281.069872257299 -100.9847800161946, 280.198787942452 -100.9847800161946, 280.198787942452 -101.29742639395371, 279.327703627605 -101.29742639395371, 279.327703627605 -101.61007277171284, 278.456619312758 -101.61007277171284, 278.456619312758 -101.92271914947194, 277.87589643619333 -101.92271914947194, 277.87589643619333 -102.23536552723107, 277.00481212134633 -102.23536552723107, 277.00481212134633 -102.54801190499018, 275.5530049299347 -102.54801190499018, 275.5530049299347 -102.23536552723107, 274.39155917680534 -102.23536552723107, 274.39155917680534 -101.92271914947194, 272.9397519853937 -101.92271914947194, 272.9397519853937 -101.61007277171284, 271.77830623226436 -101.61007277171284, 271.77830623226436 -101.29742639395371, 270.32649904085264 -101.29742639395371, 270.32649904085264 -100.9847800161946, 268.874691849441 -100.9847800161946, 268.874691849441 -100.67213363843548, 267.4228846580293 -100.67213363843548, 267.4228846580293 -100.35948726067637, 265.6807160283353 -100.35948726067637, 265.6807160283353 -100.04684088291725, 264.22890883692367 -100.04684088291725, 264.22890883692367 -99.73419450515813, 263.35782452207667 -99.73419450515813, 263.35782452207667 -99.42154812739902, 262.4867402072297 -99.42154812739902, 262.4867402072297 -99.1089017496399, 261.6156558923827 -99.1089017496399, 261.6156558923827 -98.79625537188079, 260.7445715775356 -98.79625537188079, 260.7445715775356 -98.48360899412167, 259.8734872626886 -98.48360899412167, 259.8734872626886 -98.17096261636256, 259.00240294784163 -98.17096261636256, 259.00240294784163 -97.85831623860344, 258.13131863299463 -97.85831623860344, 258.13131863299463 -97.54566986084433, 257.26023431814764 -97.54566986084433, 257.26023431814764 -97.2330234830852, 256.38915000330064 -97.2330234830852, 256.38915000330064 -96.92037710532608, 255.80842712673598 -96.92037710532608, 255.80842712673598 -96.60773072756697, 254.93734281188898 -96.60773072756697, 254.93734281188898 -96.29508434980785, 254.06625849704199 -96.29508434980785, 254.06625849704199 -95.98243797204874, 253.4855356204773 -95.98243797204874, 253.4855356204773 -96.60773072756697, 253.19517418219496 -96.60773072756697, 253.19517418219496 -96.92037710532608, 252.90481274391263 -96.92037710532608, 252.90481274391263 -97.54566986084433, 252.6144513056303 -97.54566986084433, 252.6144513056303 -97.85831623860344, 252.32408986734796 -97.85831623860344, 252.32408986734796 -98.48360899412167, 252.03372842906563 -98.48360899412167, 252.03372842906563 -98.79625537188079, 251.7433669907833 -98.79625537188079, 251.7433669907833 -99.42154812739902, 251.45300555250097 -99.42154812739902, 251.45300555250097 -100.04684088291725, 251.16264411421864 -100.04684088291725, 251.16264411421864 -100.35948726067637, 250.8722826759363 -100.35948726067637, 250.8722826759363 -100.9847800161946, 250.58192123765397 -100.9847800161946, 250.58192123765397 -101.61007277171284, 250.29155979937164 -101.61007277171284, 250.29155979937164 -102.23536552723107, 250.0011983610893 -102.23536552723107, 250.0011983610893 -102.54801190499018, 249.71083692280698 -102.54801190499018, 249.71083692280698 -103.17330466050842, 249.42047548452464 -103.17330466050842, 249.42047548452464 -103.79859741602665, 249.1301140462423 -103.79859741602665, 249.1301140462423 -104.42389017154488, 248.83975260795998 -104.42389017154488, 248.83975260795998 -105.04918292706311, 248.54939116967762 -105.04918292706311, 248.54939116967762 -105.67447568258135, 248.2590297313953 -105.67447568258135, 248.2590297313953 -105.98712206034047, 247.96866829311296 -105.98712206034047, 247.96866829311296 -106.6124148158587, 247.67830685483062 -106.6124148158587, 247.67830685483062 -107.23770757137693, 247.3879454165483 -107.23770757137693, 247.3879454165483 -107.86300032689516, 247.09758397826596 -107.86300032689516, 247.09758397826596 -108.48829308241339, 246.80722253998363 -108.48829308241339, 246.80722253998363 -109.11358583793162, 246.5168611017013 -109.11358583793162, 246.5168611017013 -109.73887859344985, 246.22649966341896 -109.73887859344985, 246.22649966341896 -110.3641713489681, 245.93613822513663 -110.3641713489681, 245.93613822513663 -110.98946410448633, 245.6457767868543 -110.98946410448633), 
+  (186.12168193897588 -106.92506119361781, 185.83132050069355 -106.92506119361781, 185.83132050069355 -106.6124148158587, 185.54095906241122 -106.6124148158587, 185.54095906241122 -105.98712206034047, 185.2505976241289 -105.98712206034047, 185.2505976241289 -105.67447568258135, 184.96023618584655 -105.67447568258135, 184.96023618584655 -105.04918292706311, 184.66987474756422 -105.04918292706311, 184.66987474756422 -104.73653654930399, 184.3795133092819 -104.73653654930399, 184.3795133092819 -104.42389017154488, 184.08915187099956 -104.42389017154488, 184.08915187099956 -104.11124379378576, 183.79879043271723 -104.11124379378576, 183.79879043271723 -103.79859741602665, 183.5084289944349 -103.79859741602665, 183.5084289944349 -103.48595103826753, 183.21806755615256 -103.48595103826753, 183.21806755615256 -103.17330466050842, 182.92770611787023 -103.17330466050842, 182.92770611787023 -102.8606582827493, 182.34698324130557 -102.8606582827493, 182.34698324130557 -102.54801190499018, 181.47589892645854 -102.54801190499018, 181.47589892645854 -102.23536552723107, 178.2819231053529 -102.23536552723107, 178.2819231053529 -102.54801190499018, 177.99156166707056 -102.54801190499018, 177.99156166707056 -102.8606582827493, 177.70120022878822 -102.8606582827493, 177.70120022878822 -103.17330466050842, 177.12047735222356 -103.17330466050842, 177.12047735222356 -103.48595103826753, 176.8301159139412 -103.48595103826753, 176.8301159139412 -103.79859741602665, 176.53975447565887 -103.79859741602665, 176.53975447565887 -104.11124379378576, 175.9590315990942 -104.11124379378576, 175.9590315990942 -104.42389017154488, 175.66867016081187 -104.42389017154488, 175.66867016081187 -104.73653654930399, 175.37830872252954 -104.73653654930399, 175.37830872252954 -105.04918292706311, 174.79758584596487 -105.04918292706311, 174.79758584596487 -105.36182930482224, 174.50722440768254 -105.36182930482224, 174.50722440768254 -105.67447568258135, 174.2168629694002 -105.67447568258135, 174.2168629694002 -105.98712206034047, 173.63614009283555 -105.98712206034047, 173.63614009283555 -106.29976843809958, 173.05541721627088 -106.29976843809958, 173.05541721627088 -106.6124148158587, 172.47469433970622 -106.6124148158587, 172.47469433970622 -106.92506119361781, 171.89397146314155 -106.92506119361781, 171.89397146314155 -107.23770757137693, 171.6036100248592 -107.23770757137693, 171.6036100248592 -107.55035394913605, 171.02288714829453 -107.55035394913605, 171.02288714829453 -107.86300032689516, 170.44216427172987 -107.86300032689516, 170.44216427172987 -108.17564670465428, 170.15180283344753 -108.17564670465428, 170.15180283344753 -108.48829308241339, 169.57107995688287 -108.48829308241339, 169.57107995688287 -108.80093946017251, 168.9903570803182 -108.80093946017251, 168.9903570803182 -109.11358583793162, 168.69999564203587 -109.11358583793162, 168.69999564203587 -109.42623221569075, 168.1192727654712 -109.42623221569075, 168.1192727654712 -109.73887859344985, 167.53854988890654 -109.73887859344985, 167.53854988890654 -110.05152497120898, 167.2481884506242 -110.05152497120898, 167.2481884506242 -110.3641713489681, 166.66746557405955 -110.3641713489681, 166.66746557405955 -110.67681772672721, 166.3771041357772 -110.67681772672721, 166.3771041357772 -110.98946410448633, 165.79638125921252 -110.98946410448633, 165.79638125921252 -111.30211048224544, 165.5060198209302 -111.30211048224544, 165.5060198209302 -111.61475686000456, 164.92529694436553 -111.61475686000456, 164.92529694436553 -111.92740323776367, 164.6349355060832 -111.92740323776367, 164.6349355060832 -112.24004961552279, 164.05421262951853 -112.24004961552279, 164.05421262951853 -112.5526959932819, 163.7638511912362 -112.5526959932819, 163.7638511912362 -112.86534237104102, 163.18312831467154 -112.86534237104102, 163.18312831467154 -113.17798874880015, 162.8927668763892 -113.17798874880015, 162.8927668763892 -113.49063512655925, 162.60240543810687 -113.49063512655925, 162.60240543810687 -113.80328150431838, 162.31204399982454 -113.80328150431838, 162.31204399982454 -114.11592788207749, 162.0216825615422 -114.11592788207749, 162.0216825615422 -114.42857425983661, 161.4409596849775 -114.42857425983661, 161.4409596849775 -114.74122063759572, 161.15059824669518 -114.74122063759572, 161.15059824669518 -115.05386701535484, 160.86023680841285 -115.05386701535484, 160.86023680841285 -115.36651339311396, 160.56987537013052 -115.36651339311396, 160.56987537013052 -115.67915977087307, 160.2795139318482 -115.67915977087307, 160.2795139318482 -115.9918061486322, 159.98915249356585 -115.9918061486322, 159.98915249356585 -116.3044525263913, 159.69879105528352 -116.3044525263913, 159.69879105528352 -116.61709890415042, 159.4084296170012 -116.61709890415042, 159.4084296170012 -116.92974528190953, 159.11806817871886 -116.92974528190953, 159.11806817871886 -117.24239165966866, 158.82770674043653 -117.24239165966866, 158.82770674043653 -117.55503803742778, 158.5373453021542 -117.55503803742778, 158.5373453021542 -118.18033079294601, 158.24698386387186 -118.18033079294601, 158.24698386387186 -118.49297717070512, 157.95662242558953 -118.49297717070512, 157.95662242558953 -118.80562354846424, 157.6662609873072 -118.80562354846424, 157.6662609873072 -119.11826992622335, 157.37589954902487 -119.11826992622335, 157.37589954902487 -119.43091630398247, 157.08553811074253 -119.43091630398247, 157.08553811074253 -120.0562090595007, 156.7951766724602 -120.0562090595007, 156.7951766724602 -120.36885543725982, 156.50481523417787 -120.36885543725982, 156.50481523417787 -120.99414819277806, 156.2144537958955 -120.99414819277806, 156.2144537958955 -121.30679457053716, 155.92409235761318 -121.30679457053716, 155.92409235761318 -121.9320873260554, 155.63373091933084 -121.9320873260554, 155.63373091933084 -122.55738008157363, 155.3433694810485 -122.55738008157363, 155.3433694810485 -123.18267283709187, 155.05300804276618 -123.18267283709187, 155.05300804276618 -123.8079655926101, 154.76264660448385 -123.8079655926101, 154.76264660448385 -124.74590472588744, 154.47228516620152 -124.74590472588744, 154.47228516620152 -125.6838438591648, 154.18192372791918 -125.6838438591648, 154.18192372791918 -126.93442937020126, 153.89156228963685 -126.93442937020126, 153.89156228963685 -129.43560039227418, 153.60120085135452 -129.43560039227418, 153.60120085135452 -134.12529605866095, 153.89156228963685 -134.12529605866095, 153.89156228963685 -139.4402844805659, 154.18192372791918 -139.4402844805659, 154.18192372791918 -141.0035163693615), 
+  (239.5481865829253 -103.48595103826753, 239.5481865829253 -103.17330466050842, 239.25782514464296 -103.17330466050842, 239.25782514464296 -102.54801190499018, 238.96746370636063 -102.54801190499018, 238.96746370636063 -101.92271914947194, 238.6771022680783 -101.92271914947194, 238.6771022680783 -101.29742639395371, 238.38674082979597 -101.29742639395371, 238.38674082979597 -100.67213363843548, 238.0963793915136 -100.67213363843548, 238.0963793915136 -100.04684088291725, 237.80601795323128 -100.04684088291725, 237.80601795323128 -99.42154812739902, 237.51565651494894 -99.42154812739902, 237.51565651494894 -98.79625537188079, 237.2252950766666 -98.79625537188079, 237.2252950766666 -98.48360899412167, 236.93493363838428 -98.48360899412167, 236.93493363838428 -97.85831623860344, 236.64457220010195 -97.85831623860344, 236.64457220010195 -97.54566986084433, 236.35421076181962 -97.54566986084433, 236.35421076181962 -96.92037710532608, 236.06384932353728 -96.92037710532608, 236.06384932353728 -96.60773072756697, 235.77348788525495 -96.60773072756697, 235.77348788525495 -96.29508434980785, 235.48312644697262 -96.29508434980785, 235.48312644697262 -95.66979159428962, 235.1927650086903 -95.66979159428962, 235.1927650086903 -95.35714521653051, 234.90240357040796 -95.35714521653051, 234.90240357040796 -95.04449883877139, 234.61204213212562 -95.04449883877139, 234.61204213212562 -94.73185246101227, 234.3216806938433 -94.73185246101227, 234.3216806938433 -94.41920608325316, 234.03131925556096 -94.41920608325316, 234.03131925556096 -94.10655970549404, 233.74095781727863 -94.10655970549404, 233.74095781727863 -93.79391332773493, 233.4505963789963 -93.79391332773493, 233.4505963789963 -93.4812669499758, 233.16023494071393 -93.4812669499758, 233.16023494071393 -93.1686205722167, 232.8698735024316 -93.1686205722167, 232.8698735024316 -92.85597419445757, 232.57951206414927 -92.85597419445757, 232.57951206414927 -92.54332781669845, 232.28915062586694 -92.54332781669845, 232.28915062586694 -92.23068143893934, 231.9987891875846 -92.23068143893934, 231.9987891875846 -91.91803506118022, 231.70842774930227 -91.91803506118022, 231.70842774930227 -91.60538868342111, 231.41806631101994 -91.60538868342111, 231.41806631101994 -91.29274230566199, 230.54698199617295 -91.29274230566199, 230.54698199617295 -90.98009592790288, 229.38553624304362 -90.98009592790288, 229.38553624304362 -90.66744955014376, 228.51445192819662 -90.66744955014376, 228.51445192819662 -90.35480317238465, 227.35300617506726 -90.35480317238465, 227.35300617506726 -90.04215679462553, 226.48192186022027 -90.04215679462553, 226.48192186022027 -89.7295104168664, 225.32047610709094 -89.7295104168664, 225.32047610709094 -89.4168640391073, 224.1590303539616 -89.4168640391073, 224.1590303539616 -89.10421766134817, 222.99758460083228 -89.10421766134817, 222.99758460083228 -88.79157128358906, 221.83613884770293 -88.79157128358906, 221.83613884770293 -88.47892490582994, 220.6746930945736 -88.47892490582994, 220.6746930945736 -88.16627852807083, 219.51324734144427 -88.16627852807083, 219.51324734144427 -88.79157128358906, 219.22288590316194 -88.79157128358906, 219.22288590316194 -89.4168640391073, 218.9325244648796 -89.4168640391073, 218.9325244648796 -90.04215679462553, 218.64216302659727 -90.04215679462553, 218.64216302659727 -90.66744955014376, 218.35180158831494 -90.66744955014376, 218.35180158831494 -91.29274230566199))MULTILINESTRING ((280.4891493807343 -146.6311511690256, 280.4891493807343 -144.12998014695268, 280.198787942452 -144.12998014695268, 280.198787942452 -142.56674825815708, 279.90842650416965 -142.56674825815708, 279.90842650416965 -141.31616274712061, 279.6180650658873 -141.31616274712061, 279.6180650658873 -140.37822361384326, 279.327703627605 -140.37822361384326, 279.327703627605 -139.4402844805659, 279.03734218932266 -139.4402844805659, 279.03734218932266 -138.50234534728858, 278.7469807510403 -138.50234534728858, 278.7469807510403 -137.87705259177034, 278.456619312758 -137.87705259177034, 278.456619312758 -137.56440621401123, 278.16625787447566 -137.56440621401123, 278.16625787447566 -136.93911345849298, 277.87589643619333 -136.93911345849298, 277.87589643619333 -136.62646708073387, 277.585534997911 -136.62646708073387, 277.585534997911 -136.00117432521563, 277.29517355962867 -136.00117432521563, 277.29517355962867 -135.68852794745652, 277.00481212134633 -135.68852794745652, 277.00481212134633 -135.3758815696974, 276.714450683064 -135.3758815696974, 276.714450683064 -135.0632351919383, 276.13372780649934 -135.0632351919383, 276.13372780649934 -135.3758815696974, 275.843366368217 -135.3758815696974, 275.843366368217 -136.00117432521563, 275.5530049299347 -136.00117432521563, 275.5530049299347 -136.62646708073387, 275.26264349165234 -136.62646708073387, 275.26264349165234 -137.2517598362521, 274.97228205337 -137.2517598362521, 274.97228205337 -137.87705259177034, 274.6819206150877 -137.87705259177034, 274.6819206150877 -138.8149917250477, 274.39155917680534 -138.8149917250477, 274.39155917680534 -139.4402844805659, 274.101197738523 -139.4402844805659, 274.101197738523 -140.37822361384326, 273.8108363002407 -140.37822361384326, 273.8108363002407 -141.31616274712061, 273.52047486195835 -141.31616274712061, 273.52047486195835 -142.56674825815708, 273.230113423676 -142.56674825815708, 273.230113423676 -144.12998014695268, 272.9397519853937 -144.12998014695268, 272.9397519853937 -145.69321203574825, 272.64939054711135 -145.69321203574825, 272.64939054711135 -147.88173668006206, 272.359029108829 -147.88173668006206, 272.359029108829 -156.32318887955822))MULTILINESTRING ((286.296378146381 0, 286.296378146381 -1.563231888795582, 286.58673958466335 -1.563231888795582, 286.58673958466335 -2.8138173998320477, 286.296378146381 -2.8138173998320477, 286.296378146381 -4.064402910868513, 286.0060167080987 -4.064402910868513, 286.0060167080987 -4.689695666386746, 285.71565526981635 -4.689695666386746, 285.71565526981635 -5.314988421904979, 285.425293831534 -5.314988421904979, 285.425293831534 -5.627634799664095, 285.1349323932517 -5.627634799664095, 285.1349323932517 -5.940281177423212, 284.84457095496936 -5.940281177423212, 284.84457095496936 -6.252927555182328, 284.554209516687 -6.252927555182328, 284.554209516687 -6.565573932941445, 284.2638480784047 -6.565573932941445, 284.2638480784047 -6.878220310700561, 283.97348664012236 -6.878220310700561, 283.97348664012236 -7.1908666884596775, 283.68312520184 -7.1908666884596775, 283.68312520184 -7.503513066218794, 283.3927637635577 -7.503513066218794, 283.3927637635577 -7.81615944397791, 282.81204088699303 -7.81615944397791, 282.81204088699303 -8.128805821737027, 282.5216794487107 -8.128805821737027, 282.5216794487107 -8.441452199496144, 281.940956572146 -8.441452199496144, 281.940956572146 -8.75409857725526, 281.65059513386365 -8.75409857725526, 281.65059513386365 -9.066744955014375, 281.069872257299 -9.066744955014375, 281.069872257299 -9.379391332773492, 280.4891493807343 -9.379391332773492, 280.4891493807343 -9.69203771053261, 279.90842650416965 -9.69203771053261, 279.90842650416965 -10.004684088291725, 279.6180650658873 -10.004684088291725, 279.6180650658873 -10.31733046605084, 279.03734218932266 -10.31733046605084, 279.03734218932266 -10.629976843809958, 278.456619312758 -10.629976843809958, 278.456619312758 -10.942623221569075, 277.87589643619333 -10.942623221569075, 277.87589643619333 -11.25526959932819, 277.29517355962867 -11.25526959932819, 277.29517355962867 -11.567915977087306, 276.714450683064 -11.567915977087306, 276.714450683064 -11.880562354846424, 275.5530049299347 -11.880562354846424, 275.5530049299347 -12.193208732605541, 274.101197738523 -12.193208732605541, 274.101197738523 -12.505855110364656, 272.64939054711135 -12.505855110364656, 272.64939054711135 -12.818501488123772, 271.19758335569963 -12.818501488123772, 271.19758335569963 -13.13114786588289, 269.745776164288 -13.13114786588289, 269.745776164288 -13.443794243642007, 268.2939689728763 -13.443794243642007, 268.2939689728763 -13.756440621401122, 266.84216178146465 -13.756440621401122, 266.84216178146465 -14.069086999160238, 265.6807160283353 -14.069086999160238, 265.6807160283353 -14.381733376919355, 262.777101645512 -14.381733376919355, 262.777101645512 -14.694379754678472, 259.00240294784163 -14.694379754678472, 259.00240294784163 -15.007026132437588, 256.0987885650183 -15.007026132437588, 256.0987885650183 -15.319672510196703, 253.4855356204773 -15.319672510196703, 253.4855356204773 -15.63231888795582, 250.8722826759363 -15.63231888795582, 250.8722826759363 -15.944965265714938, 248.54939116967762 -15.944965265714938, 248.54939116967762 -16.257611643474053, 245.93613822513663 -16.257611643474053, 245.93613822513663 -16.57025802123317, 243.3228852805956 -16.57025802123317, 243.3228852805956 -16.882904398992288, 241.58071665090162 -16.882904398992288, 241.58071665090162 -17.195550776751404, 239.83854802120763 -17.195550776751404, 239.83854802120763 -17.50819715451052, 238.38674082979597 -17.50819715451052, 238.38674082979597 -17.820843532269635, 236.93493363838428 -17.820843532269635, 236.93493363838428 -18.13348991002875, 235.48312644697262 -18.13348991002875, 235.48312644697262 -18.44613628778787, 233.74095781727863 -18.44613628778787, 233.74095781727863 -18.758782665546985, 232.28915062586694 -18.758782665546985, 232.28915062586694 -19.0714290433061, 230.2566205578906 -19.0714290433061, 230.2566205578906 -19.38407542106522, 223.86866891567928 -19.38407542106522, 223.86866891567928 -19.696721798824335, 213.99638001407993 -19.696721798824335, 213.99638001407993 -19.38407542106522, 207.0277054953039 -19.38407542106522, 207.0277054953039 -19.0714290433061, 203.54336823591592 -19.0714290433061, 203.54336823591592 -18.758782665546985, 199.47830809996324 -18.758782665546985, 199.47830809996324 -18.44613628778787, 184.08915187099956 -18.44613628778787, 184.08915187099956 -18.758782665546985, 177.4108387905059 -18.758782665546985, 177.4108387905059 -19.0714290433061, 171.6036100248592 -19.0714290433061, 171.6036100248592 -19.38407542106522, 166.3771041357772 -19.38407542106522, 166.3771041357772 -19.696721798824335, 158.5373453021542 -19.696721798824335, 158.5373453021542 -20.00936817658345, 140.24457469036716 -20.00936817658345, 140.24457469036716 -20.322014554342566, 135.01806880128515 -20.322014554342566, 135.01806880128515 -20.63466093210168, 130.3722857887678 -20.63466093210168, 130.3722857887678 -20.9473073098608, 127.75903284422682 -20.9473073098608, 127.75903284422682 -21.259953687619916, 126.01686421453282 -21.259953687619916, 126.01686421453282 -21.57260006537903, 123.98433414655648 -21.57260006537903, 123.98433414655648 -21.88524644313815, 122.24216551686249 -21.88524644313815, 122.24216551686249 -22.197892820897266, 120.49999688716848 -22.197892820897266, 120.49999688716848 -22.51053919865638, 119.0481896957568 -22.51053919865638, 119.0481896957568 -22.823185576415497, 117.59638250434514 -22.823185576415497, 117.59638250434514 -23.135831954174613, 115.85421387465114 -23.135831954174613, 115.85421387465114 -23.44847833193373, 114.40240668323948 -23.44847833193373, 114.40240668323948 -23.761124709692847, 112.9505994918278 -23.761124709692847, 112.9505994918278 -24.073771087451963, 112.0795151769808 -24.073771087451963, 112.0795151769808 -24.386417465211082, 110.91806942385146 -24.386417465211082, 110.91806942385146 -24.699063842970197, 110.3373465472868 -24.699063842970197, 110.3373465472868 -25.011710220729313, 109.4662622324398 -25.011710220729313, 109.4662622324398 -25.32435659848843, 109.17590079415747 -25.32435659848843, 109.17590079415747 -25.637002976247544, 108.59517791759279 -25.637002976247544, 108.59517791759279 -25.949649354006663, 108.30481647931046 -25.949649354006663, 108.30481647931046 -26.574942109524894, 108.01445504102813 -26.574942109524894, 108.01445504102813 -27.20023486504313, 108.30481647931046 -27.20023486504313, 108.30481647931046 -27.82552762056136, 108.59517791759279 -27.82552762056136, 108.59517791759279 -28.138173998320475, 108.88553935587512 -28.138173998320475, 108.88553935587512 -28.450820376079594, 109.17590079415747 -28.450820376079594, 109.17590079415747 -28.76346675383871, 109.75662367072213 -28.76346675383871, 109.75662367072213 -29.076113131597825, 110.3373465472868 -29.076113131597825, 110.3373465472868 -29.388759509356944, 110.62770798556913 -29.388759509356944, 110.62770798556913 -29.70140588711606, 111.49879230041614 -29.70140588711606, 111.49879230041614 -30.014052264875176, 112.0795151769808 -30.014052264875176, 112.0795151769808 -30.32669864263429, 112.9505994918278 -30.32669864263429, 112.9505994918278 -30.639345020393407, 113.53132236839247 -30.639345020393407, 113.53132236839247 -30.951991398152526, 114.69276812152181 -30.951991398152526, 114.69276812152181 -31.26463777591164, 115.5638524363688 -31.26463777591164, 115.5638524363688 -31.577284153670757, 117.01565962778048 -31.577284153670757, 117.01565962778048 -31.889930531429876, 117.88674394262748 -31.889930531429876, 117.88674394262748 -32.20257690918899, 118.46746681919214 -32.20257690918899, 118.46746681919214 -32.51522328694811, 119.0481896957568 -32.51522328694811, 119.0481896957568 -32.82786966470722, 119.62891257232148 -32.82786966470722, 119.62891257232148 -33.14051604246634, 119.91927401060381 -33.14051604246634, 119.91927401060381 -33.45316242022545, 120.49999688716848 -33.45316242022545, 120.49999688716848 -33.765808797984576, 121.08071976373314 -33.765808797984576, 121.08071976373314 -34.07845517574369, 121.6614426402978 -34.07845517574369, 121.6614426402978 -34.39110155350281, 122.24216551686249 -34.39110155350281, 122.24216551686249 -34.70374793126192, 122.82288839342715 -34.70374793126192, 122.82288839342715 -35.01639430902104, 123.40361126999181 -35.01639430902104, 123.40361126999181 -35.329040686780154, 123.98433414655648 -35.329040686780154, 123.98433414655648 -35.64168706453927, 124.56505702312116 -35.64168706453927, 124.56505702312116 -35.954333442298385, 125.14577989968582 -35.954333442298385, 125.14577989968582 -36.2669798200575, 126.01686421453282 -36.2669798200575, 126.01686421453282 -36.57962619781662, 126.59758709109748 -36.57962619781662, 126.59758709109748 -36.89227257557574, 127.17830996766216 -36.89227257557574, 127.17830996766216 -37.204918953334854, 127.75903284422682 -37.204918953334854, 127.75903284422682 -37.51756533109397, 128.3397557207915 -37.51756533109397, 128.3397557207915 -37.830211708853085, 129.21084003563848 -37.830211708853085, 129.21084003563848 -38.1428580866122, 130.08192435048548 -38.1428580866122, 130.08192435048548 -38.455504464371316, 130.9530086653325 -38.455504464371316, 130.9530086653325 -38.76815084213044, 131.8240929801795 -38.76815084213044, 131.8240929801795 -39.080797219889554, 132.6951772950265 -39.080797219889554, 132.6951772950265 -39.39344359764867, 133.5662616098735 -39.39344359764867, 133.5662616098735 -39.706089975407785, 134.72770736300282 -39.706089975407785, 134.72770736300282 -40.0187363531669, 135.88915311613218 -40.0187363531669, 135.88915311613218 -40.331382730926016, 137.34096030754384 -40.331382730926016, 137.34096030754384 -40.64402910868513, 138.50240606067317 -40.64402910868513, 138.50240606067317 -40.95667548644425, 140.24457469036716 -40.95667548644425, 140.24457469036716 -41.26932186420336, 144.59999626460217 -41.26932186420336, 144.59999626460217 -41.581968241962485, 156.50481523417787 -41.581968241962485, 156.50481523417787 -41.8946146197216, 164.6349355060832 -41.8946146197216, 164.6349355060832 -41.581968241962485, 174.50722440768254 -41.581968241962485, 174.50722440768254 -41.26932186420336, 175.37830872252954 -41.26932186420336, 175.37830872252954 -40.95667548644425, 176.53975447565887 -40.95667548644425, 176.53975447565887 -40.64402910868513, 177.70120022878822 -40.64402910868513, 177.70120022878822 -40.331382730926016, 178.57228454363522 -40.331382730926016, 178.57228454363522 -40.0187363531669, 180.02409173504688 -40.0187363531669, 180.02409173504688 -39.706089975407785, 181.1855374881762 -39.706089975407785, 181.1855374881762 -39.39344359764867, 182.34698324130557 -39.39344359764867, 182.34698324130557 -39.080797219889554, 183.79879043271723 -39.080797219889554, 183.79879043271723 -38.76815084213044, 185.2505976241289 -38.76815084213044, 185.2505976241289 -38.455504464371316, 186.70240481554055 -38.455504464371316, 186.70240481554055 -38.1428580866122, 187.8638505686699 -38.1428580866122, 187.8638505686699 -37.830211708853085, 189.02529632179923 -37.830211708853085, 189.02529632179923 -37.51756533109397, 190.18674207492856 -37.51756533109397, 190.18674207492856 -37.204918953334854, 191.63854926634022 -37.204918953334854, 191.63854926634022 -36.89227257557574, 192.79999501946958 -36.89227257557574, 192.79999501946958 -36.57962619781662, 193.9614407725989 -36.57962619781662, 193.9614407725989 -36.2669798200575, 195.12288652572823 -36.2669798200575, 195.12288652572823 -35.954333442298385, 196.28433227885756 -35.954333442298385, 196.28433227885756 -35.64168706453927, 198.60722378511625 -35.64168706453927, 198.60722378511625 -35.954333442298385, 201.8011996062219 -35.954333442298385, 201.8011996062219 -36.2669798200575, 210.2216813164096 -36.2669798200575, 210.2216813164096 -36.57962619781662, 213.99638001407993 -36.57962619781662, 213.99638001407993 -36.89227257557574, 217.48071727346792 -36.89227257557574, 217.48071727346792 -37.204918953334854, 219.8036087797266 -37.204918953334854, 219.8036087797266 -37.51756533109397, 220.6746930945736 -37.51756533109397, 220.6746930945736 -37.830211708853085, 221.5457774094206 -37.830211708853085, 221.5457774094206 -38.1428580866122, 222.4168617242676 -38.1428580866122, 222.4168617242676 -38.455504464371316, 222.99758460083228 -38.455504464371316, 222.99758460083228 -38.76815084213044, 223.86866891567928 -38.76815084213044, 223.86866891567928 -39.080797219889554, 224.73975323052628 -39.080797219889554, 224.73975323052628 -39.39344359764867, 225.32047610709094 -39.39344359764867, 225.32047610709094 -39.706089975407785, 225.9011989836556 -39.706089975407785, 225.9011989836556 -40.0187363531669, 226.7722832985026 -40.0187363531669, 226.7722832985026 -40.331382730926016, 227.35300617506726 -40.331382730926016, 227.35300617506726 -40.64402910868513, 227.93372905163193 -40.64402910868513, 227.93372905163193 -40.95667548644425, 228.80481336647895 -40.95667548644425, 228.80481336647895 -41.26932186420336, 229.38553624304362 -41.26932186420336, 229.38553624304362 -41.581968241962485, 229.96625911960828 -41.581968241962485, 229.96625911960828 -41.8946146197216, 230.54698199617295 -41.8946146197216, 230.54698199617295 -42.20726099748072, 231.41806631101994 -42.20726099748072, 231.41806631101994 -42.51990737523983, 233.4505963789963 -42.51990737523983, 233.4505963789963 -42.83255375299895, 235.48312644697262 -42.83255375299895, 235.48312644697262 -43.14520013075806, 237.51565651494894 -43.14520013075806, 237.51565651494894 -43.45784650851718, 239.5481865829253 -43.45784650851718, 239.5481865829253 -43.7704928862763, 241.87107808918395 -43.7704928862763, 241.87107808918395 -44.08313926403542, 247.3879454165483 -44.08313926403542, 247.3879454165483 -44.39578564179453, 254.64698137360665 -44.39578564179453, 254.64698137360665 -44.70843201955365, 257.26023431814764 -44.70843201955365, 257.26023431814764 -45.02107839731276, 259.8734872626886 -45.02107839731276, 259.8734872626886 -45.33372477507188, 262.777101645512 -45.33372477507188, 262.777101645512 -45.646371152830994, 265.390354590053 -45.646371152830994, 265.390354590053 -45.95901753059011, 266.2614389049 -45.95901753059011, 266.2614389049 -46.271663908349225, 267.132523219747 -46.271663908349225, 267.132523219747 -46.58431028610835, 268.2939689728763 -46.58431028610835, 268.2939689728763 -46.89695666386746, 269.1650532877233 -46.89695666386746, 269.1650532877233 -47.20960304162658, 270.0361376025703 -47.20960304162658, 270.0361376025703 -47.522249419385695, 270.9072219174173 -47.522249419385695, 270.9072219174173 -47.83489579714481, 271.77830623226436 -47.83489579714481, 271.77830623226436 -48.147542174903926, 272.9397519853937 -48.147542174903926, 272.9397519853937 -48.46018855266304, 273.8108363002407 -48.46018855266304, 273.8108363002407 -48.772834930422164, 274.6819206150877 -48.772834930422164, 274.6819206150877 -49.08548130818128, 275.5530049299347 -49.08548130818128, 275.5530049299347 -49.398127685940395, 276.42408924478167 -49.398127685940395, 276.42408924478167 -49.71077406369951, 277.00481212134633 -49.71077406369951, 277.00481212134633 -49.398127685940395, 279.6180650658873 -49.398127685940395, 279.6180650658873 -49.71077406369951, 284.2638480784047 -49.71077406369951, 284.2638480784047 -50.023420441458626, 288.32890821435734 -50.023420441458626, 288.32890821435734 -49.71077406369951, 288.909631090922 -49.71077406369951, 288.909631090922 -49.398127685940395, 289.49035396748667 -49.398127685940395, 289.49035396748667 -49.08548130818128, 290.36143828233367 -49.08548130818128, 290.36143828233367 -48.772834930422164, 290.94216115889833 -48.772834930422164, 290.94216115889833 -48.46018855266304, 291.8132454737453 -48.46018855266304, 291.8132454737453 -48.147542174903926, 292.39396835031005 -48.147542174903926, 292.39396835031005 -47.83489579714481, 293.26505266515704 -47.83489579714481, 293.26505266515704 -47.522249419385695, 293.8457755417217 -47.522249419385695, 293.8457755417217 -47.20960304162658, 294.7168598565687 -47.20960304162658, 294.7168598565687 -46.89695666386746, 295.5879441714157 -46.89695666386746, 295.5879441714157 -46.58431028610835, 296.4590284862627 -46.58431028610835, 296.4590284862627 -46.271663908349225, 297.3301128011097 -46.271663908349225))
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/lang/artifactMessages.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,25 @@
+fis_marnet = Marnet
+fis_imis = IMIS
+fis_staun = STAUN
+fis_modeldata = Modeldata
+fis_delphin = Delphin
+fis_thermosalinograph = Thermosalinograph
+fis_chemusurvey = Chemusurvey
+
+timeSeries= Timeseries
+verticalProfile = Verticalprofile
+horizontalProfile = Horizontalprofile
+featureid = Object
+mesh_coordinate = Coordinate Value (x y)
+mesh_point = Meshpoint
+measurementid = Measurement depth
+parameterid = Parameter
+minvalue = Minvalue
+maxvalue = Maxvalue
+dateid = Measurement date
+vehicleid = Ship
+cruiseid = Cruise
+trackid = Track
+surveyid = Survey Info
+axisid = Axis
+depthid = Depth
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/lang/artifactMessages_de_DE.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,25 @@
+fis_marnet = Marnet
+fis_imis = IMIS
+fis_staun = STAUN
+fis_modeldata = Modelldaten
+fis_delphin = Delphin
+fis_thermosalinograph = Thermosalinograph
+fis_chemusurvey = Chemusurvey
+
+timeSeries= Zeitserie
+verticalProfile = Vertikalprofil
+horizontalProfile = Horizontalprofil
+featureid = ObjeKt
+mesh_coordinate = Koordinaten Wert (x y)
+mesh_point = Messpunkt
+measurementid = Messtiefe
+parameterid = Parameter
+minvalue = Minimalwert
+maxvalue = Maximalwert
+dateid = Messdatum
+vehicleid = Schiff
+cruiseid = Reise
+trackid = Track
+surveyid = Messinformation
+axisid = Achse
+depthid = Tiefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_describe.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="describe"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:include-ui>true</art:include-ui>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_01_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="advance"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:target name="timeSeriess"/>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_01_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="feed"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:data>
+        <art:input name="product" value="timeSeries"/>
+     </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_02_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="advance"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:target name="timeseries_without_geom"/>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_02_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="feed"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:data>
+        <art:input name="areaid" value="n/n" />
+     </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_03_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="advance"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:target name="timeseries_parameter"/>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_03_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="feed"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:data>
+        <art:input name="featureid" value="100006"/>
+     </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_04_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="advance"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:target name="timeseries_depth_height"/>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_04_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="feed"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:data>
+        <art:input name="parameterid" value="54"/>
+     </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_05_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="advance"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:target name="timeseries_interval"/>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_05_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="feed"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:data>
+        <art:input name="measurementid" value="500042"/>
+     </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="advance"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:target name="timeseries_calculate_results"/>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action
+     xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="feed"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:data>
+        <art:input name="minvalue" value="2001.03.16 16:29:00"/>
+        <art:input name="maxvalue" value="2008.12.31 23:29:00"/>
+     </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_chart.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="out"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:out name="chart">
+        <art:mime-type value="image/png" />
+        <art:params>
+            <!-- out params copied from describe -->
+        </art:params>
+     </art:out>
+</art:action>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_csv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="out"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:out name="csv">
+        <art:params>
+            <!-- out params copied from describe -->
+        </art:params>
+     </art:out>
+</art:action>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_odv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="out"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:out name="odv">
+        <art:params>
+            <!-- out params copied from describe -->
+        </art:params>
+     </art:out>
+</art:action>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_statistics.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+     <art:type name="out"/>
+     <art:uuid value="dd87ce50-9bbe-11de-8a39-0800200c9a66"/>
+     <art:hash value="8392d409b5518044465ac8e9b7daf5ef"/>
+     <art:out name="statistics">
+        <art:params>
+            <!-- out params copied from describe -->
+        </art:params>
+     </art:out>
+</art:action>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_describe.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="describe" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:include-ui>true</art:include-ui>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_01_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:target name="timeSeriesMesh" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_01_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:data>
+		<art:input name="product" value="timeSeries" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_02_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:target name="timeseries_mesh_without_geom" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_02_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:data>
+		<art:input name="areaid" value="n/n" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_03_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:target name="timeseries_mesh_coordinate" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_03_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:data>
+		<art:input name="meshid" value="3" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_04_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:target name="timeseries_meshpoint" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_04_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:data>
+		<art:input name="mesh_coordinate" value="56n30 6e20" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_05_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="advance" />
+    <art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+    <art:hash value="29913235" />
+    <art:target name="timeseries_meshpoint_depth" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_05_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:data>
+		<art:input name="mesh_point" value="2003771" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_06_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:target name="timeseries_meshpoint_parameter" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_06_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:data>
+		<art:input name="depthid" value="2003771" />
+		<art:input name="depthid" value="2012198" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_07_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:target name="timeseries_meshpoint_interval" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_07_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:data>
+		<art:input name="parameterid" value="2" />
+		<art:input name="parameterid" value="1" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:target name="timeseries_meshpoint_calculate_results" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:data>
+		<art:input name="maxvalue" value="2010.01.03 00:00:00" />
+		<art:input name="minvalue" value="2009.12.24 01:00:00" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_chart.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="31343478" />
+	<art:out name="chart">
+		<art:mime-type value="image/png" />
+		<art:params>
+			<art:input name="width" value="600" />
+			<art:input name="height" value="400" />
+		</art:params>
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_csv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="31343478" />
+	<art:out name="csv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_odv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:out name="odv">
+		<art:params>
+            <!-- out params copied from describe -->
+        </art:params>
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_statistics.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="1e9f6583-9073-4409-aac1-432ad06d7ce1" />
+	<art:hash value="29913235" />
+	<art:out name="statistics">
+		<art:out value="text/xml" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_describe.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="describe" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:include-ui>true</art:include-ui>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_01_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:target name="verticalcrosssection" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_01_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:data>
+		<art:input name="product" value="verticalcrosssection" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_02_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:target name="verticalcrosssection_mesh_without_geom" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_02_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:data>
+		<art:input name="areaid" value="n/n" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_03_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:target name="verticalcrosssection_mesh_linestring" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_03_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:data>
+		<art:input name="meshid" value="3" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_04_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:target name="verticalcrosssection_mesh_parameter" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_04_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:data>
+		<art:input name="mesh_linestring" value="LINESTRING (0.4911 56.2489, 10.4464 58.1608, 12.2321 56.4127, 13.1250 54.8832, 15.4018 54.5008, 19.6875 56.4127, 20.6250 59.0349, 28.1250 60.2640)" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_05_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:target name="verticalcrosssection_mesh_date" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_05_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="feed" />
+    <art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+    <art:hash value="2969645" />
+    <art:data>
+        <art:input name="parameterid" value="1" />
+    </art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+    <art:type name="advance" />
+    <art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+    <art:hash value="2969645" />
+    <art:target name="verticalcrosssection_mesh_calculate_results" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:data>
+		<art:input name="dateid" value="2010.01.03 00:00:00" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_out_chart.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:out name="chart">
+		<art:mime-type value="image/png" />
+		<art:params>
+			<art:input name="width" value="600" />
+			<art:input name="height" value="400" />
+		</art:params>
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_out_csv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:out name="csv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_out_odv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="07807bb4-572b-4a46-a71d-7c1c8c9ab50c" />
+	<art:hash value="2969645" />
+	<art:out name="odv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_describe.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="describe" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:include-ui>true</art:include-ui>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_01_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:target name="verticalProfile" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_01_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:data>
+		<art:input name="product" value="verticalProfile" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_02_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:target name="verticalprofile_without_geom" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_02_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:data>
+		<art:input name="areaid" value="n/n" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_03_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:target name="verticalprofile_parameter" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_03_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:data>
+		<art:input name="featureid" value="100011" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_04_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:target name="verticalprofile_year" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_04_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:data>
+		<art:input name="parameterid" value="2" />
+		<art:input name="parameterid" value="31" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_05_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="11096221" />
+	<art:target name="verticalprofile_date" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_05_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="11096221" />
+	<art:data>
+		<art:input name="yearid" value="2008" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_06_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="11096221" />
+	<art:target name="verticalprofile_minmaxdepth" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_06_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="11096221" />
+	<art:data>
+		<art:input name="dateid" value="2008.12.09 00:00:00" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="11096221" />
+	<art:target name="verticalprofile_calculate_results" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="11096221" />
+	<art:data>
+		<art:input name="maxvalue" value="-7.0" />
+		<art:input name="minvalue" value="-40.0" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_chart.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="11096221" />
+	<art:out name="chart">
+		<art:mime-type value="image/png" />
+		<art:params>
+			<art:input name="width" value="600" />
+			<art:input name="height" value="400" />
+		</art:params>
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_csv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+    <art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+    <art:hash value="11096221" />
+	<art:out name="csv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_odv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="11096221" />
+	<art:out name="odv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_statistics.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="11096221" />
+	<art:out name="statistics">
+		<art:out value="text/xml" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_describe.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="describe" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:include-ui>true</art:include-ui>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_01_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:target name="verticalProfile" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_01_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="4319eb60-5419-4ce9-80b2-3ffac5b50146" />
+	<art:hash value="18171662" />
+	<art:data>
+		<art:input name="product" value="verticalProfile" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_02_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:target name="verticalprofile_instantaneouspoint_point" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_02_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:data>
+		<art:input name="seriesid" value="184" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:target name="verticalprofile_instantaneouspoint_parameter" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:data>
+		<art:input name="instantaneouspoint_point" value="4371899" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:target name="verticalprofile_instantaneouspoint_minmaxdepth" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:data>
+		<art:input name="parameterid" value="2" />
+		<art:input name="parameterid" value="30" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:target name="verticalprofile_instantaneouspoint_calculate_results" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:data>
+		<art:input name="maxvalue" value="-2.972" />
+		<art:input name="minvalue" value="-11.887" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_chart.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:out name="chart">
+		<art:mime-type value="image/png" />
+		<art:params>
+			<art:input name="width" value="600" />
+			<art:input name="height" value="400" />
+		</art:params>
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_csv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts"><art:type name="out"/><art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3"/><art:hash value="9390720"/><art:out name="csv"><art:out value="text/plain"/><art:params/></art:out></art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_odv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:out name="odv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_statistics.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="793c935e-a3f3-44ce-a8f1-3d05459ca3d3" />
+	<art:hash value="9390720" />
+	<art:out name="statistics">
+		<art:out value="text/xml" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_describe.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="describe" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:include-ui>true</art:include-ui>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_01_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalProfile" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_01_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:data>
+		<art:input name="product" value="verticalProfile" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_02_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalprofile_mesh_subarea" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_02_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:data>
+		<art:input name="areaid" value="3" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_03_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalprofile_mesh" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_03_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:data>
+		<art:input name="subareaid" value="41"/>
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_04_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalprofile_mesh_coordinate" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_04_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:data>
+		<art:input name="meshid" value="3" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_05_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalprofile_mesh_point" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_05_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:data>
+		<art:input name="mesh_coordinate" value="56n30 6e20" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_06_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalprofile_mesh_mindepth" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_06_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:data>
+		<art:input name="mesh_point" value="2003771" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_07_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalprofile_mesh_maxdepth" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_07_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:data>
+		<art:input name="mindepthid" value="4" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_08_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalprofile_meshpoint_parameter" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_08_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:data>
+		<art:input name="maxdepthid" value="1" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_09_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalprofile_mesh_date" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_09_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:data>
+		<art:input name="parameterid" value="1" />
+		<art:input name="parameterid" value="2" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_advance.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="advance" />
+	<art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+	<art:hash value="3061481" />
+	<art:target name="verticalprofile_mesh_calculate_results" />
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_feed.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="feed" />
+    <art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+    <art:hash value="3061481" />
+	<art:data>
+		<art:input name="dateid" value="2010.01.03 00:00:00" />
+        <art:input name="dateid" value="2010.01.02 00:00:00" />
+	</art:data>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_out_chart.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+    <art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+    <art:hash value="3061481" />/>
+	<art:out name="chart">
+		<art:mime-type value="image/png" />
+		<art:params>
+			<art:input name="width" value="600" />
+			<art:input name="height" value="400" />
+		</art:params>
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_out_csv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+    <art:uuid value="73da18e1-16ef-4ef8-9388-df07a22d9099" />
+    <art:hash value="3061481" />
+	<art:out name="csv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_out_odv.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="041fd0b2-5d77-49a8-b19f-5f3f553bda5d" />
+	<art:hash value="31343478" />
+	<art:out name="odv">
+		<art:out value="text/plain" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_out_statistics.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<art:action xmlns:art="http://www.intevation.de/2009/artifacts">
+	<art:type name="out" />
+	<art:uuid value="041fd0b2-5d77-49a8-b19f-5f3f553bda5d" />
+	<art:hash value="31343478" />
+	<art:out name="statistics">
+		<art:out value="text/xml" />
+		<art:params />
+	</art:out>
+</art:action>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/ChangeLog	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,1184 @@
+2010-01-27  Hans Plum <hans@intevation.de>
+
+	RELEASE 0.3
+
+	* Changes, NEWS, ChangeLog: Summerized activities
+
+2010-01-27  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: Added a
+	  workarround to avoid input failures caused by multi select boxes with only
+	  one entry. They look like text input fields and don't force the user to 
+	  select a row. In this case, the single entry is selected automatically.
+
+2010-01-25  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/styles/default.css: Added a class for dynamic tables 
+	  - enabled input fields - to adjust font size of input fields.
+	  
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: Removed
+	  local-name() method, inserted a table for 'group' items (like input fields
+	  of dates) and resized the height of multi select boxes - max 5 items or
+	  less.
+
+	* src/main/webapp/WEB-INF/jsp/index.jsp: Removed a typo which made the html
+	  output invalid.
+
+2010-01-22  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Add width,
+	  height and the boolean value to adjust the visibility of points in charts 
+	  to the pdf and svg export links.
+
+2010-01-22  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/resources/applicationMessages.properties,
+	  src/main/resources/applicationMessages_en.properties: Added legend for
+	  summary box.
+
+	* src/main/webapp/styles/default.css: Adapted some css classes regarding the
+	  position of boxes and removed background image in fieldsets.
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Removed
+	  useless div container (div container is now outside the xsl sheet).
+
+	* src/main/webapp/WEB-INF/jsp/index.jsp: Moved former parameter into a
+	  fieldset and added a label to this fieldset.
+
+2010-01-22  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/ShowStatisticAction.java: This
+	  action 'calculates' the statistic and shows the result in the gui.
+	
+	* src/main/webapp/WEB-INF/config/struts-config.xml: Added controller and
+	  forwards.
+
+	* src/main/webapp/images/statistics.png: Statistic icon. FIXME: Give a Source here!
+
+	* src/main/webapp/WEB-INF/jsp/index.jsp,
+	  src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp,
+	  src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp,
+	  src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Added symbol
+	  in action box to show the statistic.
+
+	* src/main/webapp/styles/default.css: Adjusted some parameter for a proper
+	  placement of the statistic box.
+
+	* src/main/resources/applicationMessages.properties,
+	  src/main/resources/applicationMessages_en.properties: Added label for
+	  statistic icon. 
+
+2010-01-22  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/DescribeUIAction.java: New action.
+	  The only task of this action is to parse the describe document and create 
+	  static and dynamic user interface out of it.
+
+	* src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java,
+	  src/main/java/de/intevation/gnv/action/DoOutputAction.java,
+	  src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java,
+	  src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java,
+	  src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java,
+	  src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java:
+	  Removed xsl transformation. Classes which needs xsl transformation inherit
+	  from DescribeUIAction which does the transformation. Now, it is much
+	  easier to write new actions, because they do not need to parse the
+	  describe document and create static and dynamic user interfaces.
+
+	  Removed some useless imports.
+
+2010-01-22  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/index.jsp,
+	  src/main/webapp/WEB-INF/jsp/header.jsp,
+	  src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp,
+	  src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp,
+	  src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp,
+	  src/main/webapp/WEB-INF/jsp/includes/display_diagramm_adons_inc.jsp,
+	  src/main/webapp/WEB-INF/jsp/mainlayout.jsp:
+	  - Improved the design and the usibility concept ("Bedienkonzept").
+	    Removed the useless "draw" button after reaching the last state which 
+		has some output modes.
+	  - Render chart options - if chart creation is possible for this state - and show
+	    export actions.
+	  - Moved chart options and export actions to the left side beneath the 
+	    static and dynamic panals for parameterization.
+	  - Removed some warnings and errors regaring html conformance.
+
+	* src/main/webapp/styles/default.css: Made some necessary adjustments
+	  regarding the movement of chart option and action boxes.
+	
+	* src/main/resources/applicationMessages.properties,
+	  src/main/resources/applicationMessages_en.properties: Added label for
+	  action box.
+
+	* src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java:
+	  Removed pathes of xsl sheets from code and put them to a central place.
+
+	* src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java: Added
+	  urls to xsl transformer for step-back links and create a dynamic ui only
+	  if there is content for it - avoid creation of empty boxes.
+
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java: Write
+	  dynamic ui only if there is content. Some code formatting done.
+
+	* src/main/webapp/images/back_button.png: Button to step back to a previous
+	  state.
+	  
+	* src/main/webapp/WEB-INF/config/struts-config.xml: Added forwards to fis
+	  selection and previous states.
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Enabled
+	  link to step back to fis selection.
+
+2010-01-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	  Issue149
+
+	* src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java: Show
+	  chart if there are output modes existing for this state. Set internal 
+	  value of checkboxes to 'true' if they are selected.
+	  
+	  TODO: We should check if there is an output mode named 'chart' before 
+	  rendering a chart.
+
+2010-01-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/resources/applicationMessages.properties,
+	  src/main/resources/applicationMessages_en.properties: Added label for
+	  char option 'draw data points'.
+
+2010-01-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/styles/default.css,
+	  src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Adapted
+	  style of static ui to bsh style. Improved indentation.
+
+2010-01-19  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl,
+	  src/main/webapp/WEB-INF/jsp/index.jsp: Commented links to step back in
+	  history out and always render a fis select box (reason for this is the
+	  next release and a too buggy 'step-back-history').
+
+2010-01-19  Tim Englich  <tim.englich@intevation.de>
+
+	* src/test/ressources/externalinterfacecall.xml:
+	  Added an Request-Document which contains an Call which might be
+	  send from the MapViewer to the GNV. 
+	
+	* src/test/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserTestCase.java:
+	  Added TestCase for testing the functionality of the XMLExternalCallParser-Implementation.
+	
+2010-01-19  Tim Englich  <tim.englich@intevation.de>
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultMapService.java: 
+	  DefaultImplementation of the Interface MapService.
+	
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/map/MapService.java : 
+	  Added a new Interfacespecification for representing an MapService retrieved
+	  by an MapViewer-Call
+	
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultLayer.java: 
+	  DefaultImplementation of the Interface Layer.
+	
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/map/Layer.java: 
+	  Added a new Interfacespecification for representing an Layer retrieved
+	  by an MapViewer-Call
+	
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java 
+	(getArtifactFactoryMetaInformation), src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java 
+	(getArtifactFactoryMetaInformation): 
+	  Added new Method for retrieving Metainformation for the ArtifactFactories using
+	  the Data which is parsed using the ExternalCallParser.
+	
+	* src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserException.java (ExternalCallParserException): 
+	  New ExceptionClass which is used to specify Exception which occurs during parsing
+	  an ExternalCallParser.
+	
+	* src/main/java/de/intevation/gnv/action/mapviewer/parser/XMLExternalCallParser.java : 
+	  Added an Implementation of the Inteface ExternalCallParser which is able to parse
+	  an XML-Document.
+	
+	* src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParser.java : 
+	  Added a new Interface which provides the required Methods for parsing an 
+	  Request from the MapViewer an provide the parsed Data.
+	
+	* src/main/java/de/intevation/gnv/action/mapviewer/MapViewerCallAction.java: 
+	  Added new Action which provied the reauired logic for Implementing the 
+	  Interface to the MapViewer.
+
+2010-01-18  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/struts-config.xml: Added a new controller
+	  which causes a return to the point, where the user can choose a fis.
+
+	* src/main/java/de/intevation/gnv/action/SelectFisAction.java: Controller to
+	  reset the SessionModel and to jump back to fis selection.
+
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java,
+	  src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java: Made
+	  the link to return to the fis select box available in XSL.
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Check the
+	  'fis' attribute is contained in select1 nodes and create a link in this
+	  case.
+
+2010-01-18  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java:
+	  Render the static part of the gui as well - not just the dynamic part.
+
+	* src/main/webapp/WEB-INF/jsp/index.js: Do not include the fis combo box if
+	  the describe document contains a static part, which means that the user
+	  already selected a fis.
+
+	* src/main/webapp/styles/default.css: Added 20px space at the top of the
+	  static table. Otherwise the table hides the links to load and save
+	  projects.
+
+2010-01-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Simpler
+	  demo WKT polygon.
+
+2010-01-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp:
+	  Only render chart addons when we have a chart.
+
+	* src/main/java/de/intevation/gnv/action/DoExportAction.java:
+	  Set right file extensions if we have WMS or ZIP export.
+
+2010-01-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp:
+	  Add links to download zip files and WMS layers if they are
+	  available.
+
+	* src/main/resources/applicationMessages.properties,
+	  src/main/resources/applicationMessages_en.properties:
+	  Added i10n for new download link types.
+
+	* src/main/webapp/images/svg.png: New. Gimp rendered PNG
+	  of official SVG logo. Creative Commons license.
+
+	* src/main/webapp/images/pdf.png: New. Crystal pdf icon.
+	  LGPLv2 license.
+
+	* src/main/webapp/images/disk.png, src/main/webapp/images/map_go.png:
+	  famfamfam icons for disk and map. Creative Commons license.
+
+2010-01-15	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java,
+	  src/main/java/de/intevation/gnv/util/XSLTransformer.java:
+	  Cleanup imports.
+
+2010-01-14  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java:
+	  Fixed a bug which caused that the user was not able to draw charts
+	  anymore. Query the 'output' node of the describe document and render a
+	  'draw'-button if existing. If 'output' is not existing, render a 'select'
+	  button to step forward to the next step.
+
+2010-01-13  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java,
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java:
+	  Added 'doAdvance' method to be able to advance only - without feed or
+	  describe. We need this method to step back to previous states. Advance was 
+	  bundled with feed and describe, before.
+
+	* src/main/java/de/intevation/gnv/action/sessionmodel/SessionModelFactory.java:
+	  Some code refactoring.
+
+	* src/main/java/de/intevation/gnv/util/XSLTransformer.java,
+	  src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java: Set
+	  parameter of xsl transformer which contains the url to step back to a 
+	  previous state. This parameter is used in xsl sheet to render a
+	  link into the user interface.
+
+	* src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java:
+	  New controller to step back to a previous state.
+
+	* src/main/webapp/WEB-INF/config/struts-config.xml: Added a new action which
+	  calls PreviousArtifactStepAction to step back to previous states.
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl:
+	  Refactored gui rendering. The static part of the parameter list is
+	  rendered in a table with three columns (icon to step back, parameter name,
+	  selected value). The target state to step back to is contained as
+	  attribute 'art:state' in 'xform:select', 'xfom:select1' and 'xform:group'
+	  nodes.
+
+	* src/main/webapp/styles/default.css: Added a style class to adapt the first 
+	  column of the static part's table.
+
+2009-01-13	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Shortened
+	  fractions digits to four places to be displayable in static
+	  ui description.
+	
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl:
+	  Fixed target id of text input field.
+
+2009-01-13	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/mainlayout.jsp,
+	  src/main/webapp/WEB-INF/config/templates/describe-ui.xsl:
+	  Added demo wkt polygon to test the "Horizontalschitt".
+	  Remove this when we have the GIS interface.
+
+2010-01-09  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java:
+	  Use XMLUtils.ElementCreator to create new elements for xml documents.
+
+2010-01-08  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute),
+	  src/main/java/de/intevation/gnv/action/DoOutputAction.java (execute): 
+	  Removed Encodingerrors from listed Files. All Files are now UTF-8 compliant.
+
+2010-01-05  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/util/ArtifactNamespaceContext.java:
+	  NamespaceContext class used by gnv artifacts.
+
+	* src/main/java/de/intevation/gnv/util/XMLUtils.java: Added
+	  ArtifactNamespaceContext as default namespace context while creating
+	  XPath objects.
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Removed
+	  local-name() methods.
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java,
+	  src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java,
+	  src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java: Adjust
+	  xpathes regarding namespace changes.
+
+2010-01-05  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Removed
+	  for-each statements and replaced them with templates.
+
+2010-01-04  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/styles/default.css: Added new classes for displaying
+	  parameters and values in left panel.
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Static
+	  nodes will be rendered as text instead of disabled xforms.
+
+2009-12-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	RELEASE 0.3
+
+	* Changes, NEWS, ChangeLog: Summerized activities
+
+2009-12-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/resources/applicationMessages.properties:
+	s/Modeldaten/Modelldaten/
+
+2009-12-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl,
+	src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Added demo wkt linestrings
+	via xslt and javascript.
+
+2009-12-17  Hans Plum <hans@intevation.de>
+
+	Issue 129: Release 0.2: Verbesserung der �bersetzungen
+	
+	* src/main/resources/applicationMessages.properties:
+	Fixed i18n strings reported by experts
+
+2009-12-14  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp: 
+	Added switch between boolean and other Values to determin wether a checkbox 
+	is required or an text-field should be used.
+	* src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java (execute): 
+	Added parsing of boolean-Option-Values to provide this Feature.
+
+2009-12-14  Hans Plum <hans@intevation.de>
+
+	Issue109: Tomcat: Konfiguration des Kontexts enth�lt Redundanz
+
+	* src/main/webapp/META-INF/context.xml:
+	Removed obsolete configuration attributes.
+
+2009-12-09	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/resources/applicationMessages.properties: Fixed some
+	spelling problems.
+
+2009-12-01  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): 
+	  Removed feed Call before Chart- and Statisticsgeneration is called, because
+	  it is not longer required by the Artifactdatabase.
+
+
+2009-12-01  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/WEB-INF/web.xml: Reverted changes in config from last 
+	  revision, which have been committed by mistake.
+
+2009-12-30  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/DoExportAction.java: Add svg
+	  extension to file when exporting charts to svg.
+
+	* src/main/resources/applicationMessages.properties,
+	  src/main/resources/applicationMessages_en.properties: Added label for svg 
+	  export link.
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: Added link
+	  for svg export in html gui.
+
+2009-12-30  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: Added
+	  link for pdf export in html gui.
+
+	* src/main/resources/applicationMessages.properties,
+	  src/main/resources/applicationMessages_en.properties: Added label for pdf
+	  export link.
+
+	* src/main/java/de/intevation/gnv/action/DoExportAction.java: Added pdf 
+	  extension to file when exporting charts as pdf.
+
+	NOTE: Update gnv-artifacts to rev381 which supports pdf export.
+
+2009-11-23  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/resources/applicationMessages*.properties: 
+	  Added Properties which hold the Version-information of the
+	  GNV which will be set by te Maven package-process.
+	* src/main/webapp/WEB-INF/config/struts-config.xml: 
+	  Added an Action which make the Version-Information accessible.
+	  Now it is possible to get those Information using /version.do
+	* src/main/webapp/WEB-INF/jsp/version.jsp: 
+	  Added an Page where it is possible to get the Information about the current
+	  Version of the GNV and the ArtifactDatabase
+	* pom.xml: 
+	  Added Plugin for creating the BildTime and BildVersion of the gnv.
+	  Replace Tokens in the /src/main/ressources Files
+
+2009-11-20  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java:
+	  Removed mistake from xml structure of the artifact protocol. Mime-type
+	  node was 'out' instead of 'mime-type'.
+
+2009-11-13  Hans Plum <hans@intevation.de>
+
+	RELEASE-0.2
+
+	* Changes, NEWS:
+	Summerized activities.
+	
+2009-11-13  Hans Plum <hans@intevation.de>
+
+	* ChangeLog:
+	Unified entries with references to issues.
+
+2009-11-13  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/web.xml: 
+	  Added Documentation of Configuration-Entries.
+
+2009-11-12  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/webapp/styles/default.css: 
+	  Added CSS-Entry for the Exception Message Container and
+	  put the div at a proper place.
+	* src/main/resources/applicationMessages*.properties: 
+	  Added localized Exception Messages.
+	* src/main/webapp/WEB-INF/jsp/header.jsp:
+	  Added the localization of Exception Messages. 
+
+2009-11-12  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 71: Error while Serialisation of Sessions
+
+	* src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java,
+	  src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java,
+	  src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java,
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java:
+	  Imports organized.
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/*.java:
+	  Made all Interfaces Serailizable and add UID to all Objects issue71
+	
+2009-11-12  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp: 
+	  Implemented a better GUI-Structure for displaying the Statisticdata.
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticsSet.java, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticsSet.java: 
+	  Added new Beanstructur for a better Representation of the Statistics which 
+	  is generated by the ArtifactDatabase.
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (calculateStatistics): 
+	  Changed the parsing algorithm of the Document which is generated
+	  by the ArtifactDatabase.
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (calculateStatistics): 
+	  Changed Return-Value to ArtifacStatisticsSet according to the new Structur of 
+	  Statistics that will be generated by the ArtifactDatabase.
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): 
+	  Changed the Resultvalue from ArtifactStatisticValue to ArtifacStatisticsSet according
+	  to API-Changes of the ArtifactDatabaseClient
+
+2009-11-11  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 80: Error handling when session got expired
+
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): 
+	  Catch NPE and tell the user that the Session has expired. issue80
+	  
+2009-11-11  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 81: Input of coordinate values do not show up after update
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: 
+	  Remove <br/> Tag after Input-Elements
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: 
+	  Add an <br/>-Tag after the generation of Select-Boxes to get
+	  a better look and feel in the ui. issue81
+	* src/main/webapp/WEB-INF/jsp/index.jsp: 
+	  Replace NonBreakingSpace-Strings from UI issue81
+	  
+2009-11-11  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 81: Input of coordinate values do not show up after update
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: 
+	  BugFix: Text-Inputfields will now be diabaled in static-ui issue81
+
+2009-11-06  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/resources/applicationMessages.properties: Replaced german umlaut
+	  witch ascii character.
+
+2009-11-06  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+	
+	* pom.xml: Changed Restlet repository from M3 to Snapshot.
+
+2009-11-06  Ingo Weinzierl <ingo.weinzierl@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: Added link
+	  for exporting data in ODV format.
+
+	* src/main/resources/applicationMessages.properties,
+	  src/main/resources/applicationMessages_en.properties: Added label for
+	  odv export and changed label of CSV export.
+
+2009-11-05  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientFactory.java (ArtifactDatabaseClientFactory): 
+	  Removed some deprecatde TODO-Tasks.
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (getCurrentStepDescription): 
+	  Changed the Describe-Call of an Artifact from get to  post an add the Flag which 
+	  determines if the UI should be delivered to the client.
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (getCurrentStepDescription): 
+	  Added the possibility to put an Flag which determines if the UI should be delivered from
+	  the artifact-database to the Metodsignature.
+	
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute),
+	  src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute),
+	  src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java (execute),
+	  src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java (testArtifactDatabaseClient): 
+	  Added the Flag if the UI should be delivered by the artifact-database to the Method-Call.
+
+2009-10-28  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/resources/applicationMessages*.properties:
+	  Added Ressources for two new FIS. Current Meter and Ice Station Reports
+
+2009-10-27  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/resources/applicationMessages_en.properties: 
+	  Added Ressources for two new FIS. Seegangsarchiv and SEACAT
+
+2009-10-22  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 58: Behaviour by missing DB connection
+
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): 
+	   Bugfix NPE was thrown when an Exception occured in the Called ArtifactDatabase-Server issue58.
+
+2009-10-21  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 28: Client is not multi-instance enabled
+
+	* src/main/webapp/META-INF/context.xml: 
+	  Added context.xml to permitt cookies to provide 
+	  Multisession-Usability for a single Client issue28
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp:
+	  Added URL-Rewrite to add the SessionID to the requested URL to get 
+	  the System work without cookies. issue28 
+
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 55: Unified input of coordinate input
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl,
+	  src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl:
+	  Added uniform Visualization of Single Input-Elements in GUI. issue55
+	
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 51: Translations for diagram options to be improved
+	
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp, 
+	  src/main/resources/applicationMessages*.properties:
+	  Integrated Ressouces for OutputOptions issue51
+	  
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 35: Wrong data input forces GNV to start from beginning
+	
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): 
+	  Now the UI will compelte be shown if the User has done an Mistake entering 
+	  values to input-fields eg. Coordinates or formatted Date-Strings. issue 35
+	  
+2009-10-19  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 47: Improving translations in time series
+	
+	* src/main/resources/applicationMessages_en.properties:
+	  Changed Lablevalues according to issue47
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: 
+	  Add the possibility to render XForms-Group-Lables as Legend-Entries of 
+	  one Step in the GUI
+	  
+2009-10-16  Tim Englich  <tim.englich@intevaion.de>
+
+	Issue 48: Improving translation of statistics panel
+
+	* src/main/resources/applicationMessages_en.properties: 
+	  Conformation to the tanslation of the Statisticsdescriptors  issue48
+	  
+2009-10-16  Tim Englich  <tim.englich@intevation.de>
+
+	Issue 49: Integration of FIS to Mesh
+
+	* src/main/resources/applicationMessages_en.properties: 
+	  Adding the Names of the two new FIS to the  Propertiesfiles issue49
+
+2009-10-07	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	RELEASE 0.1
+
+	* Changes, NEWS: Summarized changes.
+
+2009-10-06  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/resources/applicationMessages.properties Edited:
+	  Removed obsolet Entries 
+	* src/main/resources/applicationMessages_en.properties Added:
+	  Added the Support for english-Language
+
+2009-10-06  Tim Englich  <tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (doGetRequestInternal) Edited: 
+	  Read the Status-Code from the Response and throw an Exception 
+	  which Message will be visualized in the GUI. gnv/issue18
+
+2009-10-08	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* Changelog -> ChangeLog: Moved to make eclipse happier.
+
+2009-10-08	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* Changelog: Unified changelog style.
+
+2009-10-08	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* pom.xml: Remove XMLBeans stuff, set filtered resources to UTF-8
+
+2009-10-06	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/index.jsp Added:
+	  Added Index-Page for Global-Forward to Start-URL of the Project gnv/issue14
+	* src/main/webapp/WEB-INF/config/struts-config.xml Edited:
+	  Added Global Forward to determine the Start-URL of the Project. gnv/issue14
+	  
+2009-10-06	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/header.jsp Edited:
+	  Deaktivate Links save Project and load Project gnv/issue12
+	  
+2009-10-05	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/resources/applicationMessages.properties Edited:
+	  Added some more FIS-Ressource. 
+	  
+2009-10-02	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientFactory.java (getArtifactDatabaseClient):
+	  Putting the ClientLanguage into the getArtifactDatabaseClient-Signature.
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (setLocale) Edited,  
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (setLocale) Edited:
+	  Added the Support of Setting the ClientLanguage to the ArtifactDatabaseClient
+	  
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute) Edited,
+	  src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited,
+	  src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java (execute) Edited,
+	  src/main/java/de/intevation/gnv/action/DoOutputAction.java (execute) Edited,
+	  src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java(execute) Edited:
+	  Put the Locale of the Calling Client to the Communication with the ArtifactDatabase.
+	  
+	* src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java (testArtifactDatabaseClient) Edited:
+	  Added DefaultLocale German to the ArtfactDataBaseClient call.
+	  
+2009-10-02	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Edited, 
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl Edited:
+	  Switched Value for legend from ref-Attribute to Label-Element 
+	* src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp Edited:
+	  Added translation for FIS (ArtifactFactorynames) 
+	* src/main/resources/applicationMessages.properties Edited:
+	  Added Germannameds for FIS. 
+	  
+2009-10-02	Tim Englich	<tim.englich@intevation.de>
+
+	* src/**/*.java Edited:
+	  Format Code to max 80 Chars per Row 
+	  
+2009-10-02	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/util/XSLTransformer.java CLEANUP , 
+	  src/main/java/de/intevation/gnv/util/XMLUtils.java CLEANUP ,
+	  src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java CLEANUP ,
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java CLEANUP , 
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java CLEANUP ,
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java CLEANUP ,
+	  src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java CLEANUP , 
+	  src/main/java/de/intevation/gnv/action/DoOutputAction.java CLEANUP: 
+	   Change non static accesses to static members using declaring type
+	   Change indirect accesses to static members to direct accesses (accesses through subtypes)
+	   Remove unused imports
+	   Add missing '@Override' annotations
+	   Add missing '@Deprecated' annotations
+	   Remove unnecessary casts
+	   
+2009-10-02	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute) Edited, 
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited, 
+	* src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java (execute) Edited,
+	* src/main/java/de/intevation/gnv/action/DoOutputAction.java (execute) Edited,  
+	* src/main/java/de/intevation/gnv/action/DoExportAction.java (execute) Edited,  
+	* src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java (execute) edited:
+	  Added ExceptionHandling to this Actions 
+	* src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java (getExceptionForward) Edited: 
+	  Added Method for Resolving the ExceptionForward from the Mapping.
+	* src/main/webapp/WEB-INF/jsp/header.jsp Edited: 
+	  Read ExceptionMessage from  RequestAttributes
+	  
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/resources/applicationMessages.properties Edited:
+	  Adding missing StatisticsDescription for Arithmetic Mean.
+	  
+2009-09-28	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticValue.java Added, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticValue.java Added: 
+	  Added the Interface and the Defaultimplementation for the Representation of Statistic-Values.
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited:
+	  Added the Busionesslogic for Calculation the Statistics to the Action. 
+	* src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java Edited, 
+	  src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java Edited:
+	  Added the Methods for setting and getting the statistics to the SessionModel 
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (calculateStatistics) Edited, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (calculateStatistics) Edited:
+	  Added the Method for retrieving the Statistics from the current Artifcat. 
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp Edited:
+	 Put the Values of the Statitics into the View. 
+	* src/main/webapp/styles/default.css Edited:
+	Changed CSS-for Statistics so that it would be displayed. 
+	
+2009-09-25	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp Edited:
+	  Bug fixed in CSV_Export Link
+	  
+2009-09-25	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java Edited, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactDescription.java Edietd:
+	  Integrated some Method for accessing and Setting OutputModes to an ArtifactDescription.
+	   
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputParameter.java Edited, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java Edited, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputParameter.java Edited, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java Edited: 
+	   Adding some Beans and their InterfaceDescription for the Representation of OutputModes
+	   supported by an Artifact
+	
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited:
+	  Fetsching the OutputMode-Informations from the Describedocument and put them into a Collection
+	  of OutputModes. 
+	
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java  Edited:
+	  Restet SessionModel integrated.
+	   
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java Edited:
+	  Cast for ArtifactDescription removed.
+	   
+	* src/main/java/de/intevation/gnv/action/DoOutputAction.java Edited, 
+	  src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java Edited:
+	  Dynamical read of OutputParameter for Outputgeneration 
+	
+	* src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java Edited:,
+	  src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java Edited:
+	  Added some Method for retrieving Diagrammoptions and reset the SessionModel
+	 
+	* src/main/java/de/intevation/gnv/action/sessionmodel/DiagrammOptions.java Edited:
+	  Dynamic Options Support Added
+	  
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp Edited:
+	  Dynamic Rendring of the Outputparameters of an ArtifactoutputType added.
+	  Ath this Moment only The Outputparameter for Chart ist provided.
+	   
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp Edited :
+	  Integrated dynamic Setting of Diagramm-Parameter to the Link.
+	  Also Read MimeType from the OPutputParameters of the Artifact. 
+	  
+2009-09-25	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/DoOutputAction.java Edited:
+	  Some Refactoring work done.
+	  Logging Integrated. Extract Method for setting Responseheader Informations.
+	  
+	* src/main/java/de/intevation/gnv/action/DoExportAction.java Added:
+	  Action for performing the Exports eg. CSV and Chart 
+	* src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java Added:
+	  Action for do the Bussinesslogic for storing the Diagrammoptions that were
+	  changed by the User. 
+	* src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java Edited, 
+	* src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java Edited:
+	  Added Accessmethod for the Diagrammoptions.
+	   
+	* src/main/java/de/intevation/gnv/action/sessionmodel/DiagrammOptions.java Added:
+	  Bean for the Representation of Diagrammoptions
+	   
+	* src/main/resources/applicationMessages.properties Edited:
+	  Added som GUI Lables.
+	   
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp Edited,  
+	  src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp Add,
+	  src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp Add,
+	  src/main/webapp/WEB-INF/jsp/includes/display_diagramm_adons_inc.jsp Add:
+	 Added the GUI for the Statistics and Diagramoptions and tge Export.
+	 
+	* src/main/webapp/WEB-INF/config/struts-config.xml Edited:
+	  Added Actions for Performing Exports and Changing Diagramoptions. 
+	  
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/scripts/gnviewer.js Edited:
+	  Removed unused Methods from File.
+
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/mainlayout.jsp Edited:
+	  Obsolet Javascript References Removed
+	  Added Javascript-Reference to the gnviewer.js File
+	* src/main/webapp/WEB-INF/jsp/index.jsp Edited: 
+	  Please Wait Dialog integrated if an Form will be submittend
+	  
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/scripts/gnviewer.js Added:
+	  Added Javascript-File from Old-Project Revision: 3101
+	  
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited:
+	  Codecleanup
+	  ExceptionReporthandling integrated
+	  
+2009-09-24	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/log4j.properties Added:
+	  Standard Log4J-properties-File which will log all Informations to the Console. 
+	* src/main/webapp/WEB-INF/web.xml Edited:
+	  Added init-Parameter to tell the Application where the Log4J-propertiesfile ist located. 
+	* src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java (init) Edited:
+	  Reading Logging-Properties from Propertiesfile. Path maust beconfigured in the web.xml File
+
+
+2009-09-23	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/web.xml Edited:
+	  Added Count of ArtifactDatabases and Database-URL to this File 
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (ARTIFACTDATABASE_URL_ID) Edited:
+	  Added Static Constants for identifing ArtifactDatabase URLS in PropertiesReader 
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (initialize) Edited:
+	  Read ArtifactDatabase URLS from PropertiesReader
+	  
+2009-09-23	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited:
+	  Removed Image-Element and put it into the jsp-Page 
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp Edited:
+	  Moved Image-Element from Classfile to this location.
+	  URL will now be encoded for usage without cookies. 
+	* src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp Edited, 
+	  src/main/webapp/WEB-INF/jsp/index.jsp Edited:
+	  URL will now be encoded for usage without cookies.
+	  
+2009-09-23	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Edited:
+	  Selection on Input-UI-Data will be fetched from the UI and visualized
+	  in the GUI. 
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl Edited:
+	  Single Text Input-Elements now will be surround with an div and an form Element
+	  2009-09-22	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/util/XSLTransformer.java Edited:
+	  Logging reduced for a better Performance. XML-Nodes should not be logged because their size could
+	  cause Problems in Log4J and the ConsoleAppender of Eclipse
+	  
+2009-09-21	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: 
+	  Remnoved logging of Resultdocuments becaus it slow down the Application.
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute): 
+	  Added support of ArtifactFactory Reload if Session was lost.
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): 
+	  Added Support of more than one Product.
+	  
+2009-09-17	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: 
+	  Some Refactoring work done.
+	* src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: 
+	  Added XSL-Template for Transforming the stazic UI
+	* src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp: 
+	  Refactored FIS Rendering to it's own Include-File
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: 
+	  Refactored Diagramm Rendering to it's own Include-File
+	* src/main/webapp/WEB-INF/jsp/index.jsp: 
+	  Some Refactoring Work done.
+	* src/main/webapp/styles/default.css: 
+	  Some Changes in DIV-Formatting to get a propper Layout.
+	  
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (NextArtifactStepAction): 
+	  Static UI integrated
+	  
+2009-09-17	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp: 
+	  Refactored FIS Rendering to it's own Include-File
+	* src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: 
+	  Refactored Diagramm Rendering to it's own Include-File
+	* src/main/webapp/WEB-INF/jsp/index.jsp: 
+	  Some Refactoring Work done.
+	* src/main/webapp/styles/default.css: 
+	  Some Changes in DIV-Formatting to get a propper Layout.
+	  
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (NextArtifactStepAction): 
+	  Static UI integrated
+	  
+2009-09-16	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited:
+	  UI also Rendered when Chart is already visualized. 
+	* src/main/webapp/WEB-INF/jsp/index.jsp: 
+	  Some Stylingfixes done.
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: 
+	  Legend-Element for SelectEntries Integrated
+	  
+2009-09-16	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/mainlayout.jsp Edited, 
+	  src/main/webapp/WEB-INF/jsp/index.jsp Edited: 
+	  Integrate the new Pageinfrastructur into the Mainlayout
+	
+	* src/main/webapp/WEB-INF/config/struts-config.xml Edited:
+	  Integrate message-resources into the Strutsconfiguration and change
+	  the mainpage from index.jsp to mainlayout.jsp 
+	  
+009-09-16	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/header.jsp Added, 
+	  src/main/webapp/WEB-INF/jsp/footer.jsp Added, 
+	  src/main/resources/applicationMessages.properties:Added, 
+	  src/main/webapp/WEB-INF/jsp/mainlayout.jsp Added, 
+	  src/main/webapp/styles/*,
+	  src/main/webapp/scipts/*,
+	  src/main/webapp/images/*:
+	  Import of MainLayout, Styles, images and Scripts from old System  Revision: 3101 Does not compile
+	  
+2009-09-16	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/struts-config.xml Edited,
+	  src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Edited, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited,
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (doOutput) (doFeed) Edited,
+	  src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited, 
+	  src/main/java/de/intevation/gnv/action/DoOutputAction.java Added:
+	  Chartoutput Added to the View
+	  
+2009-09-16	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java Edited:
+	 Added Transformerlogic to the Testcase
+	  
+	* src/main/webapp/WEB-INF/jsp/index.jsp Edited:
+	  Integrated the UI of the Artifact
+	  
+	* src/main/webapp/WEB-INF/config/struts-config.xml Edited:
+	  Added ActionHandling for managing the next Businesslogic to go to the next Step of an Artifact
+	   
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Edited:
+	  Added Transformation-Rules for Input-Elements 
+	  
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultInputParameter.java Added, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/InputParameter.java Added:
+	  Infrastructur for providing InputParametes as an Object
+	  
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java Edited, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactDescription.java (getInputParameter) (setInputParameter) Edited:
+	 Add Methods for providing the reuired Input-Parametes of the current ArtifactDescription
+	   
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (doNextStep) Edited:
+	  Added doNextStep Method for doing all ControllerWork to move the Artifact into the next Step 
+	  
+	* src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java Added:
+	  Action for switching to the next Step of an Artifact
+	  
+2009-09-15	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/util/XSLTransformerTestCase.java: 
+	  New Testcase for testing the usability of XSL-Transformations
+	* src/test/ressources/describe-ui-test.xml Added:
+	  An Sample-Document for testing XSL-Transformations 
+	* src/main/webapp/WEB-INF/jsp/index.jsp Edited:
+	  Added the html-Fragment of the transformated Describe-Methode-response to the document. 
+	* src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Added:
+	  XSL-Template for transforming an Xform-Element to a HTML-Select-Element 
+	* src/main/java/de/intevation/gnv/util/XSLTransformer.java Added:
+	  XSl-Transformer for doing XSL-Transformations of the ResultDocuments of 
+	  the ArtifactDatabase 
+	* src/main/java/de/intevation/gnv/util/XMLUtils.java Edited:
+	  Integrate a Method for writing an XML-Node to a String for debugging. 
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: 
+	  Some Unused imports removed an select the first Child of the ui Node.
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute) Edited:
+	  Integration of the Describe-Stuff for rendering an GUi 
+	  
+2009-09-15	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java (testArtifactDatabaseClient) Edited:
+	  Added "Create Artifact" and "Describe Artifact" to the Testszenario. 
+	  
+2009-09-14	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactDescription.java,
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java, 
+	  src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java:
+	  Support for Initial DescribeCall to ArtifactDatabase implemented
+	   
+2009-09-14	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/config/struts-config.xml: 
+	  Added two ActionMappings:
+	  One for showing all FIS (ArtifactFactories) in an View.
+	  The other for selceting one ArtifactFactory an visualizing the First Step of an Artifact. 
+	* src/main/webapp/WEB-INF/jsp/index.jsp Edited:
+	  Added an Combobox for selecting an FIS 
+	* src/main/webapp/WEB-INF/web.xml: 
+	  Added the Servletmapping for the Struts Framework
+	* src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java Added, 
+	  src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java Added, 
+	  src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java Edited: 
+	  Some ActionHandler added for Handling the different Requests of the GNV.
+	  FetchArtifactFactoriesAction: Will provides the Controllerlogic for Queriing all Reachable ArtifactFactories.
+	  SelectArtifactFactoryAction will select one Specific ArtifactFactory and will create
+	  an Instance in the ArtifactDatabase.
+	
+	* src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java Added, 
+	  src/main/java/de/intevation/gnv/action/sessionmodel/SessionModelFactory.java Added,   
+	  src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java Added:
+	  Interface and Defaultimplementation of an Model which can store the Session-Specific Informations.
+	  e.g. Reachable ArtifactFactories and the current Artifact which should be used. 
+
+2009-09-14	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited:
+	  All Methods for doing the create-Request and reading the Result-Document implemented.
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (createNewArtifact) Edited:
+	  Add Method for creating a new Artifact in the ArtifactDatabase
+	  
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java (Artifact): 
+	  Added new Class for the Representation of an Artifact
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactFactory.java (getHash) Edited,
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactObject.java (getHash) Edited
+	  getHash Method added. Now it will be possible to read the Hash of an Artifact send by the Artifactdatabase. 
+	* src/main/java/de/intevation/gnv/propertiesreader/PropertiesReaderFactory.java (getInstance) Edited:
+	  Bug Fixed. factory will now be instantiated.
+	* src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java Edited,
+	  Integration of temporal Basic Log4J Support.
+	  
+2009-09-11	Tim Englich	<tim.englich@intevation.de>
+
+	* pom.xml: Further Dependencies and Plugins added
+	Deleted some utdated Files
+	
+2009-09-11	Tim Englich	<tim.englich@intevation.de>
+
+	* src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java Added:
+	Testcase for querying Artifacfactorydescriptions from the ArtifactDatabase 
+	
+2009-09-11	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/webapp/WEB-INF/jsp/index.jsp Added , 
+	  src/main/webapp/WEB-INF/config/struts-config.xml Added,  
+	  src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java Added
+	  src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java Added:
+	  Basic Struts-Infrastructur Added 
+	  
+2009-09-11	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/propertiesreader/ServletPropertiesReader.java Added, 
+	  src/main/java/de/intevation/gnv/propertiesreader/PropertiesReaderFactory.java Added, 
+	  src/main/java/de/intevation/gnv/propertiesreader/PropertiesReader.java Added, 
+	  src/main/java/de/intevation/gnv/propertiesreader/MapPropertiesReader.java Added:
+	  Infrastructur for Reading Properties from a Map or SercletConfig an provide them
+	  to the whole Application.
+
+2009-09-11	Tim Englich	<tim.englich@intevation.de>
+
+	* src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactObject.java Added, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactFactory.java Added: 
+	  ObjectStructor for Representing delivered Objects from the ArtifactDatabase
+	  
+	* src/main/java/de/intevation/gnv/artifactdatabase/client/exception/ArtifactDatabaseClientException.java Added,
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Added, 
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientFactory.java Added,  
+	  src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java Added:
+	   Integrated Interface-Structure to handle the communication to the ArtifactDatabase
+
+2009-09-10	Tim Englich	<tim.englich@intevation.de>
+
+	* .svnignore Added:  Added Eclipse specific Files and Folders to the Ignorelist
+
+2009-09-10	Tim Englich	<tim.englich@intevation.de>
+
+	* pom.xml: Created with maven and put the Moduledependencies into it
+	* Changes | Changelog | NEWS | README | TODO: Added
+	* src/**: Added to the Project
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/Changes	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,80 @@
+2010-01-27  RELEASE 0.4
+
+    New:
+
+    * Improved internal handling of each selection state and 
+    moved calculation step before rendering (instead of one step)
+    
+    * Internal Preparation of 1-step-back history: Split up in 
+    static (Summary of parameters ) and dynamic section 
+    (Selectable parameters)
+
+    * Added support for Shapefile and WMS Handling if they are available
+    
+    * First implementation of MapViewer Interface
+
+    * Improved structure of div-containers
+
+    Fixed:
+
+    * Width and height of diagramm made changeable for user (#149)
+
+
+2009-12-17      RELEASE 0.3
+
+    New:
+
+    * Support for WKT line strings in GUI in form of text fields.
+    * Added control for boolean values.
+    * Litte demo WKT line string via Javascrip to demonstrate
+      new WKT option.
+    * Drawing of diagrams is to be triggeres explicitly now.
+    * Added options to export diagrams as PDF and SVG.
+    * Little info about running version.
+
+    Fixed:
+
+    * Various i18n messages (Issue 129)
+    * Removed some redundancy from the Tomcat configuration (Issue 109)
+    * Some communication problems with the artifact database server.
+
+2009-11-13      RELEASE 0.2
+
+    New:
+
+    * Enable client for multi-instances in the same browser by using
+    SessionIDs
+
+    * Added support for all FIS
+    * Added support for skipping transition steps
+    * Added support for CSV and ODV formats via a common mechanism
+    * Updated to a newer version of RESTlet API
+    * Added first documentation for configuration        
+
+
+2009-10-07    RELEASE 0.1
+
+    New:
+
+    * Initial Struts 1.x based Web-Client for the REST based
+      artifact database.
+
+    * UI mainly inspired by the prototype from conterra.
+
+    * It implements a runtime system for working with artifacts
+      by storing a client side proxy model in the session of
+      the servlet context. The workflow is completely controlled
+      by the artifact living in the artifact database.
+
+    * The input forms are generated by XSL transformation from
+      the 'describe' output of the artifact.
+
+    * Output is rendered as PNG, downloadable PNGs, CSV and
+      statistics all produced serverside in the artifact database.
+
+    * i18n/i10n is done by Struts and broadcasted via REST to
+      the REST beased artifact database. Supported languages:
+      German and English
+
+    * The connection to the REST server is configure in web.xml
+      default: http://localhost:8181
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/NEWS	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,62 @@
+2010-01-27  RELEASE 0.4
+
+    * Adapted GUI to new concept 
+      * handling selected parameters in a central summary to make GUI
+      more compact
+      * Splitting date selections into 2 steps: yearly and 
+      exact point of time
+      * Enabling Point-Rendering for rendering in diagrams
+      * arranging productspecific actions (Exports, Statistics) 
+      in a central field in order to have direct access to end products
+      at one place
+
+    * Added support for Shapefile Download
+
+    * Added first mechanism for publishing as Cross-sections as WMS
+    
+    * Reworked HTML to be HTML standard compatible
+
+    * Added some new icons
+
+    * Integrated basic styling of BSH
+
+    * Added WKT-Line and Polygon Input for (temporary testing only)
+
+
+2009-12-17  RELEASE 0.3
+
+    * PDF and SVG export of diagrams.
+    * support for WKT line strings
+    * Fixed some internal communication problems.
+    
+
+2009-11-13  RELEASE 0.2
+
+    * Added support for all required FIS:
+      Marnet, IMIS, STAUN, Modelldaten, Eisklimatologie, Eismeldungen, SST,
+      Delphin, Thermosalinograph, Chemusurvey, GTS, CTD, XBT, SeaCat,
+      Seegangsarchiv, Strommesser (Req. TG_0020.001)
+
+    * Added support for vertical profiles (Chapter 3.3.3.2.2)
+
+    * Added support for horizontal profiles (Chapter 3.3.3.2.3);
+      part independent of MapViewer
+
+    * Added a first support for ODV format (Req. TG_0040.005)
+
+    * Enabling client for multi-instances (Req. 00_0000.007)
+
+    * Adding of support of internal area filter (Req. TG_0020.012 b)
+
+    * Added more support for internationalization (TG_0050.004)
+
+    * Improved error handling with more user-friendly messages
+
+    * Added required statistical support (Chapter 3.3.3.3.1)
+
+
+2009-10-07  RELEASE 0.1
+
+    * Initial realease of the web client which is a lightweight
+      runtime system for artifacts.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/pom.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,158 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>de.intevation.bsh</groupId>
+  <artifactId>gnv</artifactId>
+  <packaging>war</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>gnv</name>
+  <url>http://maven.apache.org</url>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+  <repositories>
+    <repository>
+      <id>maven-restlet</id>
+      <name>Public online Restlet repository</name>
+      <url>http://maven.restlet.org</url>
+    </repository>
+  </repositories>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.restlet</groupId>
+      <artifactId>org.restlet</artifactId>
+      <version>2.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.restlet</groupId>
+      <artifactId>org.restlet.ext.xml</artifactId>
+      <version>2.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>tomcat</groupId>
+      <artifactId>servlet-api</artifactId>
+      <version>5.5.15</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>struts</groupId>
+      <artifactId>struts-el</artifactId>
+      <version>1.2.9</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>struts</groupId>
+      <artifactId>struts</artifactId>
+      <version>1.2.9</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>[1.2,)</version>
+    </dependency>
+  </dependencies>
+  <build>
+    <finalName>gnv</finalName>
+    <plugins>
+         <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <artifactId>maven-war-plugin</artifactId>
+        <configuration>
+          <webResources>
+            <resource>
+              <directory>${basedir}/src/main/webapp</directory>
+              <excludes>
+                <exclude>images/</exclude>
+                <exclude>WEB-INF/jsp/application/</exclude>
+              </excludes>
+            </resource>
+          </webResources>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.2</version>
+        <configuration>
+          <archive>
+            <manifest>
+              <mainClass>de.intevation.artifactdatabase.App</mainClass>
+            </manifest>
+          </archive>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>exec-maven-plugin</artifactId>
+        <version>1.1</version>
+        <configuration>
+          <executable>java</executable>
+          <arguments>
+            <argument>-classpath</argument>
+            <classpath/>
+            <argument>de.intevation.artifactdatabase.App</argument>
+          </arguments>
+        </configuration>
+      </plugin>
+      
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-eclipse-plugin</artifactId>
+             <configuration>
+                 <m2eclipse>true</m2eclipse>
+                 <downloadSources>true</downloadSources>
+                 <wtpversion>1.5</wtpversion>
+                 <additionalProjectFacets>
+                       <jst.web.xdoclet>1.2.3</jst.web.xdoclet>
+                 </additionalProjectFacets>
+             </configuration>
+      </plugin>
+      <plugin>
+      <groupId>org.codehaus.mojo</groupId>
+      <artifactId>buildnumber-maven-plugin</artifactId>
+      <version>1.0-beta-2</version>
+      <executions>
+        <execution>
+          <phase>initialize</phase>
+          <goals>
+            <goal>create</goal>
+          </goals>
+        </execution>
+      </executions>
+      <configuration>
+        <doCheck>false</doCheck>
+        <doUpdate>false</doUpdate>
+        <timestampFormat>{0, date, yyyy-MM-dd HH:mm:ss}</timestampFormat>
+         <format>{0,date,yyyy-MM-dd HH:mm:ss}</format>
+          <items>
+            <item>timestamp</item>
+          </items>
+        
+        <revisionOnScmFailure>no_revision</revisionOnScmFailure>
+      </configuration>
+    </plugin>
+      
+     
+
+    </plugins>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>
+      </resource>
+    </resources>  
+  </build>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,65 @@
+/**
+ *
+ */
+package de.intevation.gnv.action;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class ArtifactDatabaseActionBase extends Action {
+
+    protected final static String SUCCSESS_FORWARD_ID = "success";
+    protected final static String EXCEPTION_FORWARD_ID = "success";
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(ArtifactDatabaseActionBase.class);
+
+    /**
+     * Constructor
+     */
+    public ArtifactDatabaseActionBase() {
+        super();
+    }
+
+    /**
+     * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping,
+     *      org.apache.struts.action.ActionForm,
+     *      javax.servlet.http.HttpServletRequest,
+     *      javax.servlet.http.HttpServletResponse)
+     */
+    @Override
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response) throws Exception {
+        log.debug("ArtifactDatabaseActionBase.execute");
+
+        ActionForward forward = mapping.findForward(SUCCSESS_FORWARD_ID);
+        return forward;
+    }
+
+    /**
+     * Returns the ExceptionForward for the ArtifactDatabaseActions
+     * 
+     * @param mapping
+     * @return
+     */
+    protected ActionForward getExceptionForward(ActionMapping mapping) {
+        log.debug("ArtifactDatabaseActionBase.getExceptionForward");
+        ActionForward lForward = mapping.findForward(EXCEPTION_FORWARD_ID);
+        return lForward;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,99 @@
+/**
+ *
+ */
+package de.intevation.gnv.action;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import de.intevation.gnv.action.sessionmodel.DiagrammOptions;
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
+import de.intevation.gnv.artifactdatabase.objects.OutputMode;
+import de.intevation.gnv.artifactdatabase.objects.OutputParameter;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class ChangeOptionsAction extends DescribeUIAction {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(ChangeOptionsAction.class);
+
+    /**
+     * Constructor
+     */
+    public ChangeOptionsAction() {
+        super();
+    }
+
+    @Override
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response) throws Exception {
+        log.debug("NextArtifactStepAction.execute");
+        try {
+            SessionModel sm = SessionModelFactory.getInstance()
+                    .getSessionModel(request);
+
+            ArtifactDescription ad = sm.getArtifactDescription();
+
+            String target = request.getParameter("target");
+            OutputMode outputMode = sm.getOutputMode(target);
+            if (outputMode != null) {
+
+                Collection<OutputParameter> op = outputMode
+                        .getOutputParameters();
+                if (op != null) {
+                    Iterator<OutputParameter> it = op.iterator();
+                    DiagrammOptions diagrammOptions = new DiagrammOptions();
+                    while (it.hasNext()) {
+                        OutputParameter parameter = it.next();
+                        String value = request.getParameter(parameter.getName());
+                        if (parameter.getType().equalsIgnoreCase("boolean")){
+                            if (value == null){
+                                value = "false";
+                            }
+                            else {
+                                value = "true";
+                            }
+                        }
+                        diagrammOptions.setValue(parameter.getName(),value);
+
+                    }
+                    sm.setDiagrammOptions(diagrammOptions);
+                }
+            }
+
+            Map tmpOuts = ad.getOutputModes();
+            if (tmpOuts == null || tmpOuts.isEmpty()) {
+                request.setAttribute("furthertargets", true);
+            }
+            else {
+                request.setAttribute("diagramm", true);
+            }
+
+            return super.execute(mapping, form, request, response);
+        } catch (Exception e) {
+            log.error(e, e);
+            request.setAttribute(
+                    CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e
+                            .getMessage());
+            return super.getExceptionForward(mapping);
+        }
+    }
+
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/CommunicationKeys.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+package de.intevation.gnv.action;
+
+/**
+ * 
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class CommunicationKeys {
+    /**
+     * The Key which should be used for accessing ExceptionMessages
+     */
+    public final static String REQUEST_EXCEPTION_MESSAGE_ID = "request_exception_message";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/DescribeUIAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,131 @@
+package de.intevation.gnv.action;
+
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
+
+import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
+
+import de.intevation.gnv.util.ArtifactNamespaceContext;
+import de.intevation.gnv.util.XMLUtils;
+import de.intevation.gnv.util.XSLTransformer;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import javax.xml.xpath.XPathConstants;
+
+import org.apache.log4j.Logger;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import org.w3c.dom.Node;
+
+/**
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public class DescribeUIAction extends ArtifactDatabaseActionBase {
+
+    public static final String XPATH_DYNAMIC_UI = "art:dynamic";
+    public static final String XPATH_STATIC_UI  = "art:static";
+
+    public static final String XSL_SHEET_DYNAMIC =
+        "WEB-INF/config/templates/describe-ui.xsl";
+
+    public static final String XSL_SHEET_STATIC =
+        "WEB-INF/config/templates/describe-ui-static.xsl";
+
+    private static Logger logger = Logger.getLogger(DescribeUIAction.class);
+
+
+    public DescribeUIAction() {
+        super();
+    }
+
+
+    @Override
+    public ActionForward execute(
+        ActionMapping       mapping,
+        ActionForm          form,
+        HttpServletRequest  request,
+        HttpServletResponse response
+    ) throws Exception
+    {
+        logger.info("describe user interface");
+        try {
+            // render describe document and create user interface
+            SessionModel sm = SessionModelFactory.getInstance().getSessionModel(
+                request);
+
+            ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory
+                .getInstance().getArtifactDatabaseClient(getLocale(request));
+
+            ArtifactDescription artifactDescription =
+                adc.getCurrentStepDescription(
+                    sm.getSelectedArtifactFactory(),
+                    sm.getCurrentArtifact(),
+                    true);
+
+            Node currentUI = artifactDescription.getCurrentUI();
+            if (currentUI != null) {
+                XSLTransformer transformer = new XSLTransformer();
+
+                String url = response.encodeURL(
+                    mapping.findForward("back").getPath());
+                transformer.addParameter("back-url", url);
+
+                String fisUrl = response.encodeURL(
+                    mapping.findForward("selectfis").getPath());
+                transformer.addParameter("selectfis", fisUrl);
+
+                // fetch dynamic part from describe document and transform it
+                Node dynamicNode = (Node) XMLUtils.xpath(
+                    currentUI,
+                    XPATH_DYNAMIC_UI,
+                    XPathConstants.NODE,
+                    ArtifactNamespaceContext.INSTANCE
+                );
+
+                String ui = transformer.transform(
+                    dynamicNode,
+                    "UTF-8",
+                    request.getRealPath(XSL_SHEET_DYNAMIC
+                ));
+
+                if (ui != null && ui.length() > 1)
+                    request.setAttribute("ui", ui);
+
+                // fetch static part from describe document and transform it
+                Node staticNode = (Node) XMLUtils.xpath(
+                    currentUI,
+                    XPATH_STATIC_UI,
+                    XPathConstants.NODE,
+                    ArtifactNamespaceContext.INSTANCE
+                );
+
+                String staticUI = transformer.transform(
+                    staticNode,
+                    "UTF-8",
+                    request.getRealPath(XSL_SHEET_STATIC));
+
+                if (staticUI != null && staticUI.length() > 1)
+                    request.setAttribute("staticui", staticUI); 
+            }
+
+            return super.execute(mapping, form, request, response);
+        }
+        catch (Exception e) {
+            logger.error(e, e);
+            request.setAttribute(
+                CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID,
+                e.getMessage());
+
+            return super.getExceptionForward(mapping);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/DoExportAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,64 @@
+/**
+ *
+ */
+package de.intevation.gnv.action;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DoExportAction extends DoOutputAction {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(DoExportAction.class);
+
+    /**
+     * Constructor
+     */
+    public DoExportAction() {
+        super();
+    }
+
+    @Override
+    protected void setHeaders(String target, String mimeType,
+                              HttpServletResponse response,
+                              HttpServletRequest request) {
+        log.debug("DoExportAction.setHeaders");
+        try {
+            super.setHeaders(target, mimeType, response, request);
+            String fileName = "GNVEXPORT_" + System.currentTimeMillis() + ".";
+
+            target = target.toLowerCase();
+
+            if (target.equals("chart")) {
+                fileName = fileName
+                           + mimeType.substring(mimeType.indexOf("/") + 1);
+            } 
+            else if (target.equals("pdf")) {
+                fileName = fileName + "pdf";
+            } else if (target.equals("svg")) {
+                fileName = fileName + "svg";
+            } else if (target.equals("csv")) {
+                fileName = fileName + "csv";
+            } else if (target.equals("zip")) {
+                fileName = fileName + "zip";
+            } else if (target.equals("wms")) {
+                fileName = fileName + "xml";
+            } else {
+                fileName = fileName + "txt";
+            }
+            log.debug("FileName for Export: " + fileName);
+            response.setHeader("Content-Disposition", "attachment;filename="
+                                                      + fileName);
+        } catch (Exception e) {
+            log.error(e, e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/DoOutputAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,128 @@
+/**
+ *
+ */
+package de.intevation.gnv.action;
+
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
+
+import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter;
+import de.intevation.gnv.artifactdatabase.objects.InputParameter;
+import de.intevation.gnv.artifactdatabase.objects.OutputMode;
+import de.intevation.gnv.artifactdatabase.objects.OutputParameter;
+
+import java.io.OutputStream;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DoOutputAction extends ArtifactDatabaseActionBase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(DoOutputAction.class);
+
+    /**
+     * Constructor
+     */
+    public DoOutputAction() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping,
+     *      org.apache.struts.action.ActionForm,
+     *      javax.servlet.http.HttpServletRequest,
+     *      javax.servlet.http.HttpServletResponse)
+     */
+    @Override
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response) throws Exception {
+        log.debug("DoOutputAction.execute");
+        try {
+            String target = request.getParameter("target");
+            String mimeType = request.getParameter("mimetype");
+
+            log.debug("Target: " + target);
+            log.debug("MimeType: " + mimeType);
+
+            // TODO Check if is propper;
+
+            SessionModel sm = SessionModelFactory.getInstance()
+                    .getSessionModel(request);
+            OutputMode outputMode = sm.getOutputMode(target);
+            if (outputMode != null && outputMode.getMimeType().equals(mimeType)) {
+                Collection<OutputParameter> inputParameter = outputMode
+                        .getOutputParameters();
+                Collection<InputParameter> ips = null;
+                if (inputParameter != null) {
+                    ips = new ArrayList<InputParameter>(inputParameter.size());
+                    Iterator<OutputParameter> it = inputParameter.iterator();
+                    while (it.hasNext()) {
+                        String name = it.next().getName();
+                        String[] values = request.getParameterValues(name);
+                        InputParameter ip = new DefaultInputParameter(name,
+                                values);
+                        ips.add(ip);
+                    }
+                }
+
+                ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory
+                        .getInstance()
+                        .getArtifactDatabaseClient(getLocale(request));
+
+                this.setHeaders(target, mimeType, response, request);
+
+                OutputStream outputStream = response.getOutputStream();
+                adc.doOutput(sm.getSelectedArtifactFactory(), sm
+                        .getCurrentArtifact(), outputStream, target, mimeType,
+                        ips);
+
+                outputStream.flush();
+                outputStream.close();
+            } else {
+                if (outputMode == null) {
+                    log.error("Outputmode is not supported.");
+                } else if (!outputMode.getMimeType().equals(mimeType)) {
+                    log.error("MimeType " + mimeType
+                              + " wis not supported.");
+                }
+                // TODO FIXME: Fehlerbehandlung
+            }
+            return super.execute(mapping, form, request, response);
+        } catch (Exception e) {
+            log.error(e, e);
+            request.setAttribute(
+                    CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e
+                            .getMessage());
+            return super.getExceptionForward(mapping);
+        }
+    }
+
+    protected void setHeaders(String target, String mimeType,
+                              HttpServletResponse response,
+                              HttpServletRequest request) {
+        response.setHeader("Content-Type", mimeType);
+    }
+
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,74 @@
+/**
+ *
+ */
+package de.intevation.gnv.action;
+
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
+
+import de.intevation.gnv.artifactdatabase.objects.ArtifactObject;
+
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ * 
+ */
+public class FetchArtifactFactoriesAction extends ArtifactDatabaseActionBase {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(FetchArtifactFactoriesAction.class);
+
+    public FetchArtifactFactoriesAction() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping,
+     *      org.apache.struts.action.ActionForm,
+     *      javax.servlet.http.HttpServletRequest,
+     *      javax.servlet.http.HttpServletResponse)
+     */
+    @Override
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response) throws Exception {
+        log.debug("ArtifactDatabaseActionBase.execute");
+        try {
+            Collection<ArtifactObject> artifactFactories =
+                ArtifactDatabaseClientFactory.getInstance()
+                    .getArtifactDatabaseClient(getLocale(request))
+                    .getArtifactFactories();
+
+            SessionModel sm = SessionModelFactory.getInstance().getSessionModel(
+                request);
+
+            sm.setArtifacteFactories(artifactFactories);
+
+            return super.execute(mapping, form, request, response);
+        }
+        catch (Exception e) {
+            log.error(e, e);
+            request.setAttribute(
+                CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID,
+                e.getMessage());
+
+            return super.getExceptionForward(mapping);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,143 @@
+/**
+ *
+ */
+package de.intevation.gnv.action;
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
+
+import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
+import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter;
+import de.intevation.gnv.artifactdatabase.objects.InputParameter;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ * 
+ */
+public class NextArtifactStepAction extends DescribeUIAction {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(SelectArtifactFactoryAction.class);
+
+    /**
+     * Constructor
+     */
+    public NextArtifactStepAction() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping,
+     *      org.apache.struts.action.ActionForm,
+     *      javax.servlet.http.HttpServletRequest,
+     *      javax.servlet.http.HttpServletResponse)
+     */
+    @Override
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response) throws Exception {
+            log.debug("NextArtifactStepAction.execute");
+            SessionModel sm = SessionModelFactory.getInstance()
+                    .getSessionModel(request);
+            ArtifactDescription ad = sm.getArtifactDescription();
+            if (ad != null){
+                Collection<String> inputParameter = ad.getInputParameter();
+                Collection<InputParameter> ips = null;
+                if (inputParameter != null) {
+                    ips = new ArrayList<InputParameter>(inputParameter.size());
+                    Iterator<String> it = inputParameter.iterator();
+                    while (it.hasNext()) {
+                        String name = it.next();
+                        String[] values = request.getParameterValues(name);
+                        InputParameter ip = new DefaultInputParameter(name, values);
+                        ips.add(ip);
+                    }
+                }
+                ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory
+                                                    .getInstance()
+                                                    .getArtifactDatabaseClient(getLocale(request));
+                Map outs = ad.getOutputModes();
+                if (outs == null || outs.isEmpty()) {
+                    // TODO: Woher kommt der zu erreichende Status;
+                    String target = null;
+                    if (ad.getReachableStates().size() > 1) {
+                        target = request.getParameter("product"); // TODO HACK for
+                        // Propducts every
+                        // other Step has
+                        // currently only
+                        // one reachable
+                        // state.
+                    } else {
+                        target = ad.getReachableStates().iterator().next();
+                    }
+    
+                    try {
+                        adc.doNextStep(
+                            sm.getSelectedArtifactFactory(), 
+                            sm.getCurrentArtifact(),
+                            target,
+                            ips
+                        );
+                    } catch (Exception e) {
+                        log.error(e, e);
+                        request.setAttribute(
+                                CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e
+                                        .getMessage());
+                    }
+    
+                    Map tmpOuts = ad.getOutputModes();
+                    request.setAttribute(
+                        "furthertargets",
+                        tmpOuts == null || tmpOuts.isEmpty()
+                    );
+                } else {
+                    try{
+                        adc.getCurrentStepDescription(
+                            sm.getSelectedArtifactFactory(),
+                            sm.getCurrentArtifact(),
+                            true
+                        );
+                        
+                        request.setAttribute("diagramm", true);
+                        
+                    } catch (Exception e) {
+                        log.error(e, e);
+                        request.setAttribute(
+                            CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID,
+                            e.getMessage());
+                    }
+    
+                    request.setAttribute("furthertargets", false);
+                }
+            }else{
+                log.warn("SessionTimeout has occured");
+                request.setAttribute(CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, 
+                                     "SessionTimeout has occured");
+                new FetchArtifactFactoriesAction().execute(mapping, form, request, response);
+            }
+            return super.execute(mapping, form, request, response);
+    }
+
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,74 @@
+package de.intevation.gnv.action;
+
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
+
+import de.intevation.gnv.artifactdatabase.objects.ArtifactObject;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ *
+ */
+public class PreviousArtifactStepAction extends DescribeUIAction {
+
+
+    public static final String URL_STATE_KEY = "target";
+
+    private static Logger logger =
+        Logger.getLogger(PreviousArtifactStepAction.class);
+
+
+    public PreviousArtifactStepAction() {
+        super();
+    }
+
+
+    @Override
+    public ActionForward execute(
+        ActionMapping       mapping,
+        ActionForm          form,
+        HttpServletRequest  request,
+        HttpServletResponse response
+    ) throws Exception {
+
+        String id = request.getSession().getId();
+
+        SessionModel session = SessionModelFactory.getInstance().getSessionModel(
+            request);
+
+        // TODO check if target is reachable
+
+        ArtifactDatabaseClientFactory f =
+            ArtifactDatabaseClientFactory.getInstance();
+        ArtifactDatabaseClient client   =
+            f.getArtifactDatabaseClient(getLocale(request));
+
+        ArtifactObject artifactFactory = session.getSelectedArtifactFactory();
+        ArtifactObject currentArtifact = session.getCurrentArtifact();
+
+        String target = (String) request.getParameter(URL_STATE_KEY);
+        logger.debug("Step back to previous state: " + target);
+
+        client.doAdvance(
+            artifactFactory,
+            currentArtifact,
+            target
+        );
+
+        return super.execute(mapping, form, request, response);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,126 @@
+/**
+ *
+ */
+package de.intevation.gnv.action;
+
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import org.w3c.dom.Node;
+
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactObject;
+import de.intevation.gnv.util.XMLUtils;
+import de.intevation.gnv.util.XSLTransformer;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class SelectArtifactFactoryAction extends ArtifactDatabaseActionBase {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(SelectArtifactFactoryAction.class);
+
+    /**
+     * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping,
+     *      org.apache.struts.action.ActionForm,
+     *      javax.servlet.http.HttpServletRequest,
+     *      javax.servlet.http.HttpServletResponse)
+     */
+    @Override
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response) throws Exception {
+        log.debug("SelectArtifactFactoryAction.execute");
+        String selectedArtifactFactoryID = request
+                .getParameter("artifactFactory");
+        log.debug("Selected ArtifactFactory ==> " + selectedArtifactFactoryID);
+
+        try {
+            SessionModel sm = SessionModelFactory.getInstance()
+                    .getSessionModel(request);
+            Collection<ArtifactObject> artifactFactories = sm
+                    .getArtifactFactories();
+            // Removes the Artifactspecific Attributes from the SessionModel-
+            sm.resetModel();
+            if (artifactFactories == null || artifactFactories.isEmpty()) {
+                new FetchArtifactFactoriesAction().execute(mapping, form,
+                        request, response);
+
+            }
+
+            sm.selectArtifactFactory(selectedArtifactFactoryID);
+            ArtifactObject af = sm.getSelectedArtifactFactory();
+            ;
+            ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory
+                                                .getInstance()
+                                                .getArtifactDatabaseClient(getLocale(request));
+            ArtifactObject artifact = adc.createNewArtifact(af);
+            sm.setCurrentArtifact(artifact);
+
+            ArtifactDescription artifactdescription = adc
+                    .getCurrentStepDescription(af, artifact,true);
+
+            String fisUrl = response.encodeURL(
+                mapping.findForward("selectfis").getPath());
+
+            XSLTransformer transformer = new XSLTransformer();
+            transformer.addParameter("selectfis", fisUrl);
+
+            Node dynamicUINode =  new XMLUtils().getNodeXPath(
+                artifactdescription.getCurrentUI(), "art:dynamic"
+            );
+
+            if (dynamicUINode != null){
+                String ui = transformer.transform(
+                    dynamicUINode,
+                    "UTF-8",
+                    request.getRealPath("WEB-INF/config/templates/describe-ui.xsl"));
+            
+                request.setAttribute("ui", ui);
+            }
+
+            Node staticUINode = new XMLUtils().getNodeXPath(
+                artifactdescription.getCurrentUI(), "art:static"
+            );
+
+            if (staticUINode != null) {
+                String staticUI = transformer.transform(
+                    staticUINode,
+                    "UTF-8",
+                    request.getRealPath("WEB-INF/config/templates/describe-ui-static.xsl"));
+                request.setAttribute("staticui", staticUI);
+            }
+
+            // return succsess
+            return super.execute(mapping, form, request, response);
+        } catch (Exception e) {
+            log.error(e, e);
+            request.setAttribute(
+                    CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e
+                            .getMessage());
+            return super.getExceptionForward(mapping);
+        }
+    }
+
+    /**
+     * Constructor
+     */
+    public SelectArtifactFactoryAction() {
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/SelectFisAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,53 @@
+package de.intevation.gnv.action;
+
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+
+/**
+ * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
+ */
+public class SelectFisAction extends ArtifactDatabaseActionBase {
+
+    private static Logger logger = Logger.getLogger(SelectFisAction.class);
+
+    @Override
+    public ActionForward execute(
+        ActionMapping       mapping,
+        ActionForm          form,
+        HttpServletRequest  request,
+        HttpServletResponse response
+    ) {
+        logger.info("Goto fis selection.");
+
+        try {
+
+            SessionModelFactory fac = SessionModelFactory.getInstance();
+            SessionModel sm         = fac.getSessionModel(request);
+
+            sm.resetModel();
+
+            return new FetchArtifactFactoriesAction().execute(
+                mapping, form, request, response);
+        }
+        catch (Exception e) {
+            logger.error(e, e);
+
+            request.setAttribute(
+                CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID,
+                e.getMessage());
+
+            return super.getExceptionForward(mapping);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/ShowStatisticAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,62 @@
+package de.intevation.gnv.action;
+
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet;
+
+/**
+ * @author Ingo Weinzierl (ingo.weinzierl@intevation.de)
+ */
+public class ShowStatisticAction extends DescribeUIAction {
+
+    private static Logger logger = Logger.getLogger(ShowStatisticAction.class);
+
+
+    public ShowStatisticAction() {
+        super();
+    }
+
+
+    @Override
+    public ActionForward execute(
+        ActionMapping       mapping,
+        ActionForm          form,
+        HttpServletRequest  request,
+        HttpServletResponse response
+    ) throws Exception
+    {
+        logger.info("show statistic");
+        SessionModel sm = SessionModelFactory.getInstance().getSessionModel(
+            request);
+
+        ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory.getInstance()
+            .getArtifactDatabaseClient(getLocale(request));
+
+        try{
+            Collection<ArtifactStatisticsSet> statistics =
+                adc.calculateStatistics(sm.getSelectedArtifactFactory(),
+                sm.getCurrentArtifact());
+
+            sm.setStatistics(statistics);
+
+            request.setAttribute("statistic", true);
+        }
+        catch (Exception e) {
+            logger.error(e, e);
+        }
+
+        return super.execute(mapping, form, request, response);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/mapviewer/MapViewerCallAction.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,75 @@
+package de.intevation.gnv.action.mapviewer;
+
+import java.io.InputStream;
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import de.intevation.gnv.action.ArtifactDatabaseActionBase;
+import de.intevation.gnv.action.mapviewer.parser.ExternalCallParser;
+import de.intevation.gnv.action.mapviewer.parser.XMLExternalCallParser;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
+import de.intevation.gnv.artifactdatabase.objects.map.MapService;
+
+/**
+ * 
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class MapViewerCallAction extends ArtifactDatabaseActionBase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(MapViewerCallAction.class);
+
+    /**
+     * Constructor
+     */
+    public MapViewerCallAction() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+     */
+    @Override
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response) throws Exception {
+        log.debug("MapViewerCallAction.execute");
+        InputStream inputStream = request.getInputStream();
+        if (inputStream != null){
+            try {
+                ExternalCallParser ecp = new XMLExternalCallParser(inputStream);
+                ecp.parse();
+                String geometry = ecp.getGeometry();
+                String srs = ecp.getSRS();
+                Collection<MapService> mapServices = ecp.getMapServices();
+                 
+                ArtifactDatabaseClientFactory
+                          .getInstance()
+                          .getArtifactDatabaseClient(getLocale(request))
+                          .getArtifactFactoryMetaInformation(mapServices,
+                                                             geometry,
+                                                             srs);
+                
+                // 2. Call Artifactfactories.
+                // 3. Sort out which ArtifactFactories should not be used.
+                // 4. Store the retrieved Parameter to each ArtifactFactory
+            } catch (Exception e) {
+                log.error(e,e);
+            }
+        }else{
+            log.error("Kein Anfragedokument übergeben.");
+        }
+        return super.execute(mapping, form, request, response);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParser.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,24 @@
+/**
+ *
+ */
+package de.intevation.gnv.action.mapviewer.parser;
+
+import java.util.Collection;
+
+import de.intevation.gnv.artifactdatabase.objects.map.MapService;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public interface ExternalCallParser {
+
+    
+    String getGeometry();
+    
+    String getSRS();
+    
+    Collection<MapService> getMapServices();
+    
+    void parse() throws ExternalCallParserException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserException.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,47 @@
+/**
+ *
+ */
+package de.intevation.gnv.action.mapviewer.parser;
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class ExternalCallParserException extends Exception {
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = -4917914097058485262L;
+
+    /**
+     * Constructor
+     */
+    public ExternalCallParserException() {
+    }
+
+    /**
+     * Constructor
+     * @param arg0
+     */
+    public ExternalCallParserException(String arg0) {
+        super(arg0);
+    }
+
+    /**
+     * Constructor
+     * @param arg0
+     */
+    public ExternalCallParserException(Throwable arg0) {
+        super(arg0);
+    }
+
+    /**
+     * Constructor
+     * @param arg0
+     * @param arg1
+     */
+    public ExternalCallParserException(String arg0, Throwable arg1) {
+        super(arg0, arg1);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/XMLExternalCallParser.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,155 @@
+/**
+ *
+ */
+package de.intevation.gnv.action.mapviewer.parser;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import de.intevation.gnv.artifactdatabase.objects.map.DefaultLayer;
+import de.intevation.gnv.artifactdatabase.objects.map.DefaultMapService;
+import de.intevation.gnv.artifactdatabase.objects.map.Layer;
+import de.intevation.gnv.artifactdatabase.objects.map.MapService;
+import de.intevation.gnv.util.XMLUtils;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class XMLExternalCallParser implements ExternalCallParser {
+    
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(XMLExternalCallParser.class);
+    
+    private static String XPATH_GEOMETRY = "/gnviewer/location/data";
+    private static String XPATH_SRS = "/gnviewer/location/srs";
+    private static String XPATH_MAPSERVICES_NODESET = "/gnviewer/mapservices/mapservice";
+    private static String XPATH_LAYER = "layer";
+    private static String ATTRIBUTE_ID = "id";
+    private static String ATTRIBUTE_NAME = "name";
+    private static String ATTRIBUTE_TYPE = "type";
+    private static String ATTRIBUTE_URL = "url";
+    
+    private String geometry = null;
+    private String srs = null;
+    
+    private Collection<MapService> mapServices = null;
+    
+    private InputStream inputStream = null;
+
+    /**
+     * Constructor
+     */
+    public XMLExternalCallParser(InputStream inputStream) {
+        this.inputStream = inputStream;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#getGeometry()
+     */
+    public String getGeometry() {
+        return this.geometry;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#getMapServices()
+     */
+    public Collection<MapService> getMapServices() {
+        return this.mapServices;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#parse()
+     */
+    public void parse() throws ExternalCallParserException {
+        if (inputStream != null){
+            XMLUtils xmlUtils = new XMLUtils();
+            Document document = xmlUtils.readDocument(this.inputStream);
+            if (document != null){
+                
+                this.geometry = xmlUtils.getStringXPath(document, XPATH_GEOMETRY);
+                this.srs = xmlUtils.getStringXPath(document, XPATH_SRS);
+                NodeList mapservicesNodes = 
+                      xmlUtils.getNodeSetXPath(document, XPATH_MAPSERVICES_NODESET);
+                if (mapservicesNodes != null){
+                    this.mapServices = new ArrayList<MapService>(mapservicesNodes.getLength());
+                    for (int i = 0; i < mapservicesNodes.getLength(); i++){
+                        Element mapserviceNode = (Element)mapservicesNodes.item(i);
+                        String mapserviceID = mapserviceNode.getAttribute(ATTRIBUTE_ID);
+                        String mapserviceType = mapserviceNode.getAttribute(ATTRIBUTE_TYPE);
+                        String mapserviceUrl = mapserviceNode.getAttribute(ATTRIBUTE_URL);
+                        NodeList layerNodes = xmlUtils.getNodeSetXPath(mapserviceNode, XPATH_LAYER);
+                        Collection<Layer> layer = null;
+                        if (layerNodes != null && layerNodes.getLength() > 0){
+                            layer = new  ArrayList<Layer>(layerNodes.getLength());
+                            layer = this.extractLayer(layer, null, layerNodes);
+                        }else{
+                            log.debug("No Layer given for this Mapservice");
+                        }
+                        MapService mapService = 
+                             new DefaultMapService(mapserviceID, layer,
+                                                   mapserviceType, mapserviceUrl);
+                        this.mapServices.add(mapService);
+                    }
+                    
+                }else{
+                    String errMsg = "XML-Document does not contain any Mapservices which are required.";
+                    log.error(errMsg);
+                    throw new ExternalCallParserException(errMsg);
+                }
+                
+            }else{
+                String errMsg = "XML-Document could not be read from InputStream.";
+                log.error(errMsg);
+                throw new ExternalCallParserException(errMsg);
+            }
+        }else{
+            String errMsg = "No InputStream given for parsing the Call.";
+            log.error(errMsg);
+            throw new ExternalCallParserException(errMsg);
+        }
+    }
+    
+    /**
+     * This Method extracts all Layers and put them into the Collection.
+     * @param layer
+     * @param groupId
+     * @param layerNodes
+     * @return
+     */
+    private Collection<Layer> extractLayer(Collection<Layer> layer, String groupId, NodeList layerNodes){
+        XMLUtils xmlUtils = new XMLUtils();
+        for (int i = 0; i < layerNodes.getLength(); i++){
+            Element layerNode = (Element)layerNodes.item(i);
+            String id = layerNode.getAttribute(ATTRIBUTE_ID);
+            String name = layerNode.getAttribute(ATTRIBUTE_NAME);
+            NodeList localLayerNodes = xmlUtils.getNodeSetXPath(layerNode, XPATH_LAYER);
+            Layer tmpLayer = new DefaultLayer(id, name, 
+                                              (localLayerNodes != null && 
+                                               localLayerNodes.getLength() > 0), 
+                                              groupId);
+            layer.add(tmpLayer);
+            if (localLayerNodes != null && localLayerNodes.getLength() > 0){
+                layer = this.extractLayer(layer, id, localLayerNodes);
+            }
+        }
+        return layer;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#getSRS()
+     */
+    public String getSRS() {
+        return this.srs;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,168 @@
+/**
+ *
+ */
+package de.intevation.gnv.action.sessionmodel;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactObject;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet;
+import de.intevation.gnv.artifactdatabase.objects.OutputMode;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultSessionModel implements SessionModel {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(DefaultSessionModel.class);
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = 3431484439985158311L;
+
+    private Collection<ArtifactObject> artifactFactories = null;
+
+    private ArtifactObject selectedArtifactFactory = null;
+
+    private ArtifactObject currentArtifact = null;
+
+    private DiagrammOptions diagrammOptions = null;
+
+    private Collection<ArtifactStatisticsSet> statistics = null;
+
+    /**
+     * Constructor
+     */
+    public DefaultSessionModel() {
+        super();
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#selectArtifactFactory(java.lang.String)
+     */
+    public void selectArtifactFactory(String artiFactFactoryId) {
+        Collection<ArtifactObject> artifactObjects = this
+                .getArtifactFactories();
+        if (artifactObjects != null) {
+            Iterator<ArtifactObject> unselect = artifactObjects.iterator();
+            this.selectedArtifactFactory = null;
+            while (unselect.hasNext()) {
+                unselect.next().setSelected(false);
+            }
+            Iterator<ArtifactObject> it = artifactObjects.iterator();
+            while (it.hasNext()) {
+                ArtifactObject obj = it.next();
+                if (obj.getId().equals(artiFactFactoryId)) {
+                    obj.setSelected(true);
+                    this.selectedArtifactFactory = obj;
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#setArtifacteFactories(java.util.Collection)
+     */
+    public void setArtifacteFactories(
+                                      Collection<ArtifactObject> artifactFactories) {
+        this.artifactFactories = artifactFactories;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#getAttributeFactories()
+     */
+    public Collection<ArtifactObject> getArtifactFactories() {
+        return this.artifactFactories;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#getSelectedArtifactFactory()
+     */
+    public ArtifactObject getSelectedArtifactFactory() {
+        return this.selectedArtifactFactory;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#getCurrentArtifact()
+     */
+    public ArtifactObject getCurrentArtifact() {
+        return this.currentArtifact;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#setCurrentArtifact(de.intevation.gnv.artifactdatabase.objects.ArtifactObject)
+     */
+    public void setCurrentArtifact(ArtifactObject artifact) {
+        this.currentArtifact = artifact;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#getDiagrammOptions()
+     */
+    public DiagrammOptions getDiagrammOptions() {
+        return this.diagrammOptions;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#setDiagrammOptions(de.intevation.gnv.action.sessionmodel.DiagrammOptions)
+     */
+    public void setDiagrammOptions(DiagrammOptions diagrammOptions) {
+        this.diagrammOptions = diagrammOptions;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#getArtifactDescription()
+     */
+    public ArtifactDescription getArtifactDescription() {
+        if (this.currentArtifact != null) {
+            return (ArtifactDescription) this.currentArtifact;
+        }
+        return null;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#getOutputMode(java.lang.String)
+     */
+    public OutputMode getOutputMode(String name) {
+        ArtifactDescription ad = this.getArtifactDescription();
+        if (ad != null) {
+            if (ad.getOutputModes() != null) {
+                return ad.getOutputModes().get(name);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#resetModel()
+     */
+    public void resetModel() {
+        log.debug("DefaultSessionModel.resetModel");
+        this.selectedArtifactFactory = null;
+        this.currentArtifact = null;
+        this.diagrammOptions = null;
+        this.statistics = null;
+
+    }
+
+    /**b
+     * @see de.intevation.gnv.action.sessionmodel.SessionModel#getStatistics()
+     */
+    public Collection<ArtifactStatisticsSet> getStatistics() {
+        return this.statistics;
+    }
+
+    public void setStatistics(Collection<ArtifactStatisticsSet> statistics) {
+        this.statistics = statistics;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/sessionmodel/DiagrammOptions.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,38 @@
+/**
+ *
+ */
+package de.intevation.gnv.action.sessionmodel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DiagrammOptions {
+
+    private Map<String, String> values = new HashMap<String, String>();
+
+    /**
+     * Constructor
+     */
+    public DiagrammOptions() {
+        super();
+    }
+
+    /**
+     * @return
+     */
+    public String getValue(String key) {
+        return this.values.get(key);
+    }
+
+    /**
+     * @param width
+     */
+    public void setValue(String key, String value) {
+        this.values.put(key, value);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,46 @@
+/**
+ *
+ */
+package de.intevation.gnv.action.sessionmodel;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactObject;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet;
+import de.intevation.gnv.artifactdatabase.objects.OutputMode;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface SessionModel extends Serializable {
+
+    Collection<ArtifactObject> getArtifactFactories();
+
+    void setArtifacteFactories(Collection<ArtifactObject> artifactFactories);
+
+    void selectArtifactFactory(String artiFactFactoryId);
+
+    ArtifactObject getSelectedArtifactFactory();
+
+    ArtifactObject getCurrentArtifact();
+
+    void setCurrentArtifact(ArtifactObject artifact);
+
+    void setDiagrammOptions(DiagrammOptions diagrammOptions);
+
+    DiagrammOptions getDiagrammOptions();
+
+    OutputMode getOutputMode(String name);
+
+    ArtifactDescription getArtifactDescription();
+
+    void resetModel();
+
+    void setStatistics(Collection<ArtifactStatisticsSet> statistics);
+
+    Collection<ArtifactStatisticsSet> getStatistics();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/sessionmodel/SessionModelFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,66 @@
+/**
+ *
+ */
+package de.intevation.gnv.action.sessionmodel;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class SessionModelFactory {
+
+    public final static String SESSION_MODEL_ID = "de.intevation.gnv.action.sessionmodel.SessionModel.ID";
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(SessionModelFactory.class);
+
+    /**
+     * The singleton Instance of this Factory.
+     */
+    private static SessionModelFactory instance = null;
+
+    /**
+     * Constructor
+     */
+    private SessionModelFactory() {
+        super();
+    }
+
+    /**
+     * This Method provides an singleton Instance of this Class.
+     * 
+     * @return an singleton Instance of this Class
+     */
+    public synchronized static SessionModelFactory getInstance() {
+        if (instance == null) {
+            instance = new SessionModelFactory();
+        }
+        return instance;
+    }
+
+    /**
+     * Getting the ArtifactDatabaseClient
+     * 
+     * @return the ArtifactDatabaseClient
+     */
+    public SessionModel getSessionModel(HttpServletRequest request) {
+        synchronized (request) {
+            SessionModel sm = null;
+            Object obj = request.getSession().getAttribute(SESSION_MODEL_ID);
+            if (obj instanceof SessionModel) {
+                sm = (SessionModel) obj;
+            } else {
+                sm = new DefaultSessionModel();
+                request.getSession().setAttribute(SESSION_MODEL_ID, sm);
+            }
+
+            return sm;
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,126 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.client;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collection;
+import java.util.Locale;
+
+import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactObject;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet;
+import de.intevation.gnv.artifactdatabase.objects.InputParameter;
+import de.intevation.gnv.artifactdatabase.objects.map.MapService;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface ArtifactDatabaseClient {
+
+    public final static String ARTIFACTDATABASE_COUNT_ID = "de.intevation.gnv.artifactdatabase.client.ArtifactDatabase.count";
+
+    public final static String ARTIFACTDATABASE_URL_ID = "de.intevation.gnv.artifactdatabase.client.ArtifactDatabase.url";
+
+    /**
+     * Return the Artifactfactories which can be resolved.
+     * 
+     * @return the Artifactfactories which can be resolved.
+     * @throws ArtifactDatabaseClientException
+     */
+    public Collection<ArtifactObject> getArtifactFactories()
+                                                            throws ArtifactDatabaseClientException;
+
+    /**
+     * 
+     * @param artifactFactory
+     * @return the new Artifact
+     * @throws ArtifactDatabaseClientException
+     */
+    public ArtifactObject createNewArtifact(ArtifactObject artifactFactory)
+                                            throws ArtifactDatabaseClientException;
+
+    /**
+     * 
+     * @param currentArtifact
+     * @return the Current Artifact
+     * @throws ArtifactDatabaseClientException
+     */
+    public ArtifactDescription getCurrentStepDescription(
+                                                         ArtifactObject artifactFactory,
+                                                         ArtifactObject currentArtifact,
+                                                         boolean includeUI)
+                                                         throws ArtifactDatabaseClientException;
+
+    /**
+     * 
+     * @param artifactFactory
+     * @param currentArtifact
+     * @param target
+     * @param inputParameter
+     * @return
+     * @throws ArtifactDatabaseClientException
+     */
+    public ArtifactDescription doNextStep(
+                                          ArtifactObject artifactFactory,
+                                          ArtifactObject currentArtifact,
+                                          String target,
+                                          Collection<InputParameter> inputParameter)
+                                                                                    throws ArtifactDatabaseClientException;
+
+    public void doAdvance(
+        ArtifactObject factory,
+        ArtifactObject artifact,
+        String         target
+    ) throws IOException, ArtifactDatabaseClientException;
+
+    /**
+     * @param artifactFactory
+     * @param currentArtifact
+     * @param inputParameter
+     * @return
+     * @throws ArtifactDatabaseClientException
+     */
+    public void doFeed(ArtifactObject artifactFactory,
+                       ArtifactObject currentArtifact,
+                       Collection<InputParameter> inputParameter)
+                                                                 throws ArtifactDatabaseClientException;
+
+    /**
+     * 
+     * @param artifactFactory
+     * @param currentArtifact
+     * @param stream
+     * @param targetName
+     * @param mimeType
+     * @throws ArtifactDatabaseClientException
+     */
+    public void doOutput(ArtifactObject artifactFactory,
+                         ArtifactObject currentArtifact, OutputStream stream,
+                         String targetName, String mimeType,
+                         Collection<InputParameter> inputParameter)
+                                                                   throws ArtifactDatabaseClientException;
+
+    /**
+     * @param artifactFactory
+     * @param currentArtifact
+     * @return
+     * @throws ArtifactDatabaseClientException
+     */
+    public Collection<ArtifactStatisticsSet> calculateStatistics(
+                                                                  ArtifactObject artifactFactory,
+                                                                  ArtifactObject currentArtifact)
+                                                                                                 throws ArtifactDatabaseClientException;
+    
+    public void setLocale(Locale locale);
+    
+    public Collection<ArtifactFactory> getArtifactFactoryMetaInformation(Collection<MapService> mapServices, 
+                                                  String geometry, 
+                                                  String srs)
+                                                  throws ArtifactDatabaseClientException;
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,58 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.client;
+
+import org.apache.log4j.Logger;
+
+import java.util.Locale;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class ArtifactDatabaseClientFactory {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(ArtifactDatabaseClientFactory.class);
+
+    /**
+     * The singleton Instance of this Factory.
+     */
+    private static ArtifactDatabaseClientFactory instance = null;
+
+    /**
+     * Constructor
+     */
+    private ArtifactDatabaseClientFactory() {
+        super();
+    }
+
+    /**
+     * This Method provides an singleton Instance of this Class.
+     * 
+     * @return an singleton Instance of this Class
+     */
+    public static synchronized ArtifactDatabaseClientFactory getInstance() {
+        if (instance == null) {
+            instance = new ArtifactDatabaseClientFactory();
+        }
+        return instance;
+    }
+
+    /**
+     * Getting the ArtifactDatabaseClient
+     * @param locale teh Local that should be used for the Communication
+     * @return the ArtifactDatabaseClient
+     */
+    public ArtifactDatabaseClient getArtifactDatabaseClient(Locale locale) {
+        DefaultArtifactDatabaseClient adc = new DefaultArtifactDatabaseClient();
+        adc.setLocale(locale);
+        return adc;
+        
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,774 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.log4j.Logger;
+
+import org.restlet.Client;
+
+import org.restlet.data.Method;
+import org.restlet.data.Protocol;
+import org.restlet.data.Request;
+import org.restlet.data.Response;
+import org.restlet.data.Preference;
+import org.restlet.data.Language;
+import org.restlet.data.ClientInfo;
+
+import org.restlet.representation.Representation;
+import org.restlet.representation.StringRepresentation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException;
+import de.intevation.gnv.artifactdatabase.objects.Artifact;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactObject;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet;
+import de.intevation.gnv.artifactdatabase.objects.DefaultArtifactStatisticValue;
+import de.intevation.gnv.artifactdatabase.objects.DefaultArtifactStatisticsSet;
+import de.intevation.gnv.artifactdatabase.objects.DefaultOutputMode;
+import de.intevation.gnv.artifactdatabase.objects.DefaultOutputParameter;
+import de.intevation.gnv.artifactdatabase.objects.InputParameter;
+import de.intevation.gnv.artifactdatabase.objects.OutputMode;
+import de.intevation.gnv.artifactdatabase.objects.OutputParameter;
+import de.intevation.gnv.artifactdatabase.objects.map.MapService;
+import de.intevation.gnv.propertiesreader.PropertiesReader;
+import de.intevation.gnv.propertiesreader.PropertiesReaderFactory;
+import de.intevation.gnv.util.XMLUtils;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultArtifactDatabaseClient implements ArtifactDatabaseClient {
+    /**
+     * The URI of the namespace of the artifacts.
+     */
+    public final static String NAMESPACE_URI = "http://www.intevation.de/2009/artifacts";
+
+    /**
+     * The XML prefix for the artifacts namespace.
+     */
+    public final static String NAMESPACE_PREFIX = "art";
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger
+            .getLogger(DefaultArtifactDatabaseClient.class);
+
+    /**
+     * The Databases which could be used
+     */
+    private static Collection<String> artifactDatabases = null;
+
+    /**
+     * Is the Class initialized?
+     */
+    private static boolean initialized = false;
+
+    /**
+     * Request locale
+     */
+    private Locale locale;
+
+
+    /**
+     * Constructor
+     */
+    public DefaultArtifactDatabaseClient() {
+        
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getArtifactFactories()
+     */
+    public Collection<ArtifactObject> getArtifactFactories()
+                                                            throws ArtifactDatabaseClientException {
+        Collection<ArtifactObject> resultValues = null;
+        if (!initialized) {
+            this.initialize();
+        }
+        try {
+            log.debug("DefaultArtifactDatabaseClient.getArtifactFactories");
+            Iterator<String> it = artifactDatabases.iterator();
+            while (it.hasNext()) {
+                String server = it.next();
+                String url = server + "/factories";
+                Document document = this.doGetRequest(url);
+                if (resultValues == null) {
+                    resultValues = this.getArtifactFactories(document, server);
+                } else {
+                    resultValues.addAll(this.getArtifactFactories(document,
+                            server));
+                }
+            }
+        } catch (IOException e) {
+            log.error(e, e);
+            throw new ArtifactDatabaseClientException(e);
+        }
+        return resultValues;
+    }
+
+    private Collection<ArtifactObject> getArtifactFactories(Document document,
+                                                            String server) {
+        XMLUtils xmlUtils = new XMLUtils();
+        NodeList artifactFactories = xmlUtils.getNodeSetXPath(document,
+                "/art:result/art:factories/art:factory");
+        Collection<ArtifactObject> resultValues = new ArrayList<ArtifactObject>(
+                artifactFactories.getLength());
+        if (artifactFactories != null) {
+            for (int i = 0; i < artifactFactories.getLength(); i++) {
+                Node artifactFactoryNode = artifactFactories.item(i);
+                String name = xmlUtils.getStringXPath(artifactFactoryNode,
+                        "@art:name");
+                String description = xmlUtils.getStringXPath(
+                        artifactFactoryNode, "@art:description");
+                ArtifactFactory artifactFactory = new ArtifactFactory(name,
+                        description, server);
+                resultValues.add(artifactFactory);
+            }
+        }
+        log.debug("Artifact Factories: " + resultValues.size());
+        return resultValues;
+    }
+
+    /**
+     * @throws IOException
+     */
+    private Document doGetRequest(String requestUrl) throws IOException,
+                                                    ArtifactDatabaseClientException {
+        return this.doGetRequest(requestUrl, null);
+    }
+
+    /**
+     * @throws IOException
+     */
+    private Document doGetRequest(String requestUrl, Document requestBody)
+                                                                          throws IOException,
+                                                                          ArtifactDatabaseClientException {
+        XMLUtils xmlUtils = new XMLUtils();
+        Representation output = doGetRequestInternal(requestUrl, requestBody);
+        Document document = xmlUtils.readDocument(output.getStream());
+        this.check4ExceptionReport(document);
+        return document;
+    }
+
+    protected Request initialize(Request request) {
+        return initialize(request, locale);
+    }
+
+    protected Request initialize(Request request, Locale locale) {
+        if (locale != null) {
+            ClientInfo clientInfo = request.getClientInfo();
+            String lang = locale.getLanguage();
+            Language language = new Language(lang);
+            List<Preference<Language>> acceptedLanguages =
+                new ArrayList<Preference<Language>>(2);
+            acceptedLanguages.add(new Preference(language,     1.0f));
+            acceptedLanguages.add(new Preference(Language.ALL, 0.5f));
+            clientInfo.setAcceptedLanguages(acceptedLanguages);
+        }
+        return request;
+    }
+
+    /**
+     * @param requestUrl
+     * @param requestBody
+     * @return
+     */
+    private Representation doGetRequestInternal(String requestUrl,
+                                                Document requestBody) throws IOException {
+        Client client = new Client(Protocol.HTTP);
+        Request request = initialize(new Request(Method.GET, requestUrl));
+        if (requestBody != null) {
+            String documentBody = new XMLUtils()
+                    .writeDocument2String(requestBody);
+            Representation representation = new StringRepresentation(
+                    documentBody);
+            request.setEntity(representation);
+        }
+        Response response = client.handle(request);
+        if (response.getStatus().getCode() != 200){
+            throw new IOException(response.getStatus().getDescription());
+        }
+        Representation output = response.getEntity();
+        return output;
+    }
+
+    /**
+     * @throws IOException
+     */
+    private InputStream doPostRequest(String requestUrl, Document requestBody)
+                                                                              throws IOException {
+        log.debug("##################################################");
+        log.debug(new XMLUtils().writeDocument2String(requestBody));
+        log.debug("##################################################");
+        Client client = new Client(Protocol.HTTP);
+        Request request = initialize(new Request(Method.POST, requestUrl));
+        String documentBody = new XMLUtils().writeDocument2String(requestBody);
+        Representation representation = new StringRepresentation(documentBody);
+        request.setEntity(representation);
+        Response response = client.handle(request);
+        if (response.getStatus().getCode() != 200){
+            throw new IOException(response.getStatus().getDescription());
+        }
+        Representation output = response.getEntity();
+        return output.getStream();
+    }
+
+    private synchronized void initialize() {
+        if (!initialized) {
+            PropertiesReader pr = PropertiesReaderFactory.getInstance()
+                    .getPropertiesReader();
+            int count = Integer.parseInt(pr.getPropertieValue(
+                    ARTIFACTDATABASE_COUNT_ID, "0"));
+            artifactDatabases = new ArrayList<String>(count);
+            for (int i = 0; i < count; i++) {
+                artifactDatabases.add(pr.getPropertieValue(
+                        ARTIFACTDATABASE_URL_ID + "." + (i + 1), "N/N"));
+            }
+            initialized = true;
+        }
+
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#createNewArtifact(de.intevation.gnv.artifactdatabase.objects.ArtifactObject)
+     */
+    public ArtifactObject createNewArtifact(ArtifactObject artifactFactory)
+                                                                           throws ArtifactDatabaseClientException {
+
+        try {
+            Document request = this.createCreateRequestBody(artifactFactory
+                    .getId());
+            Document result = doPostRequest(artifactFactory, request, "create");
+            return this.getArtifact(result);
+        } catch (IOException e) {
+            log.error(e, e);
+            throw new ArtifactDatabaseClientException(e);
+        }
+    }
+
+    private ArtifactObject getArtifact(Document document) {
+        XMLUtils xmlUtils = new XMLUtils();
+        String uuid = xmlUtils.getStringXPath(document, "/art:result/art:uuid/@value");
+        String hash = xmlUtils.getStringXPath(document, "/art:result/art:hash/@value");
+        log.info("NEW Artifact: " + uuid + " / " + hash);
+        return new Artifact(uuid, hash);
+    }
+
+    private Document createCreateRequestBody(String artifactFactoryName) {
+        Document document = new XMLUtils().newDocument();
+        Node rootNode = this.createRootNode(document);
+        Element typeNode = this.createArtifactElement(document, "type");
+        typeNode.setAttribute("name", "create");
+        rootNode.appendChild(typeNode);
+
+        Element factoyNode = this.createArtifactElement(document, "factory");
+        factoyNode.setAttribute("name", artifactFactoryName);
+        rootNode.appendChild(factoyNode);
+
+        return document;
+    }
+
+    private Element createRootNode(Document document) {
+        Element rootNode = this.createArtifactElement(document, "action");
+        document.appendChild(rootNode);
+        return rootNode;
+    }
+
+    /**
+     * @param document
+     * @return
+     */
+    private Element createArtifactElement(Document document, String name) {
+        XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+            document,
+            NAMESPACE_URI,
+            NAMESPACE_PREFIX
+        );
+
+        return creator.create(name);
+    }
+
+    /**
+     * @param artifactFactory
+     * @param xmlUtils
+     * @param request
+     * @throws IOException
+     */
+    private Document doPostRequest(ArtifactObject artifactFactory,
+                                   Document request, String suburl)
+                                                                   throws IOException,
+                                                                   ArtifactDatabaseClientException {
+        XMLUtils xmlUtils = new XMLUtils();
+        String url = ((ArtifactFactory) artifactFactory).getDataBaseUrl();
+        InputStream is = this.doPostRequest(url + "/" + suburl, request);
+        Document result = xmlUtils.readDocument(is);
+        this.check4ExceptionReport(result);
+        return result;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getCurrentStepDescription(de.intevation.gnv.artifactdatabase.objects.ArtifactFactory,
+     *      de.intevation.gnv.artifactdatabase.objects.ArtifactObject)
+     */
+    public ArtifactDescription getCurrentStepDescription(
+                                                         ArtifactObject artifactFactory,
+                                                         ArtifactObject currentArtifact,
+                                                         boolean includeUI)
+                                                         throws ArtifactDatabaseClientException {
+        try {
+            String url = this.getArtifactUrl(artifactFactory, currentArtifact);
+            Document request = this.createDescribeRequestBody(currentArtifact,
+                                                              includeUI);
+            InputStream describeResult = this.doPostRequest(url, request);
+    
+            return this.readDescription(new XMLUtils().readDocument(describeResult), 
+                                        currentArtifact);
+        } catch (IOException e) {
+            log.error(e, e);
+            throw new ArtifactDatabaseClientException(e);
+        }
+    }
+    
+    
+    private Document createDescribeRequestBody(ArtifactObject currentArtifact,
+                                                         boolean includeUI){
+        
+        Document document = new XMLUtils().newDocument();
+        Node rootNode = this.createRootNode(document);
+
+        Element typeNode = this.createArtifactElement(document, "type");
+        typeNode.setAttribute("name", "describe");
+        rootNode.appendChild(typeNode);
+
+        Element uuidNode = this.createArtifactElement(document, "uuid");
+        uuidNode.setAttribute("value", currentArtifact.getId());
+        rootNode.appendChild(uuidNode);
+
+        Element hashNode = this.createArtifactElement(document, "hash");
+        hashNode.setAttribute("value", currentArtifact.getHash());
+        rootNode.appendChild(hashNode);
+        Element includeUINode = this.createArtifactElement(document, "include-ui");
+        includeUINode.appendChild(document.createTextNode(""+includeUI));
+        rootNode.appendChild(includeUINode);
+        return document;
+    }
+
+    /**
+     * @param artifactFactory
+     * @param currentArtifact
+     * @return
+     */
+    private String getArtifactUrl(ArtifactObject artifactFactory,
+                                  ArtifactObject currentArtifact) {
+        String url = ((ArtifactFactory) artifactFactory).getDataBaseUrl()
+                     + "/artifact/" + currentArtifact.getId();
+        return url;
+    }
+
+    private ArtifactDescription readDescription(Document document,
+                                                ArtifactObject artifact)
+                                                                        throws ArtifactDatabaseClientException {
+        // Check if there was an Error or Exception reported from the
+        // ArtifactDatabase
+        this.check4ExceptionReport(document);
+        XMLUtils xmlUtils = new XMLUtils();
+        if (artifact instanceof ArtifactDescription) {
+            ArtifactDescription ad = (ArtifactDescription) artifact;
+            Node uiNode = xmlUtils.getNodeXPath(document, "/art:result/art:ui");
+            Node outputNode = xmlUtils
+                    .getNodeXPath(document, "/art:result/art:outputs");
+
+            Map<String, OutputMode> outputModes = null;
+            if (outputNode != null) {
+                NodeList outputModesNodes = xmlUtils.getNodeSetXPath(
+                        outputNode, "art:output");
+                if (outputModesNodes != null) {
+                    outputModes = new HashMap<String, OutputMode>(
+                            outputModesNodes.getLength());
+                    for (int i = 0; i < outputModesNodes.getLength(); i++) {
+                        Node outputModeNode = outputModesNodes.item(i);
+                        String name = xmlUtils.getStringXPath(outputModeNode,
+                                "@name");
+                        String mimeType = xmlUtils.getStringXPath(
+                                outputModeNode, "@mime-type");
+
+                        NodeList parameterNodes = xmlUtils.getNodeSetXPath(
+                                outputModeNode, "art:parameter/art:parameter");
+                        Collection<OutputParameter> parameter = null;
+                        if (parameterNodes != null) {
+                            parameter = new ArrayList<OutputParameter>(
+                                    parameterNodes.getLength());
+                            for (int j = 0; j < parameterNodes.getLength(); j++) {
+                                Node outputParameterNode = parameterNodes
+                                        .item(j);
+                                parameter.add(new DefaultOutputParameter(
+                                        xmlUtils.getStringXPath(
+                                                outputParameterNode, "@name"),
+                                        xmlUtils.getStringXPath(
+                                                outputParameterNode, "@value"),
+                                        xmlUtils.getStringXPath(
+                                                outputParameterNode, "@name"),
+                                        xmlUtils.getStringXPath(
+                                                outputParameterNode, "@type")));
+                            }
+                        }
+                        outputModes.put(name, new DefaultOutputMode(name,
+                                mimeType, parameter));
+                    }
+
+                }
+            }
+
+            String currentState = xmlUtils.getStringXPath(document,
+                    "/art:result/art:state/@name");
+            NodeList statesList = xmlUtils.getNodeSetXPath(document,
+                    "/art:result/art:reachable-states/art:state/@name");
+            Collection<String> reachableStates = new ArrayList<String>(
+                    statesList.getLength());
+            for (int i = 0; i < statesList.getLength(); i++) {
+                reachableStates.add(statesList.item(i).getNodeValue());
+            }
+
+            NodeList inputNodes = xmlUtils.getNodeSetXPath(document,
+                    "/art:result/art:model/art:input");
+            if (inputNodes != null) {
+                Collection<String> inputParameter = new ArrayList<String>(
+                        inputNodes.getLength());
+                for (int i = 0; i < inputNodes.getLength(); i++) {
+                    Node inputNode = inputNodes.item(i);
+                    String name = xmlUtils.getStringXPath(inputNode, "@name");
+                    inputParameter.add(name);
+                }
+                ad.setInputParameter(inputParameter);
+            }
+
+            ad.setOutputModes(outputModes);
+            ad.setCurrentOut(outputNode);
+            ad.setCurrentUI(uiNode);
+            ad.setCurrentState(currentState);
+            ad.setReachableStates(reachableStates);
+            return ad;
+        } else {
+            log.error("Artifact must be Instance of ArtifactDescription");
+            throw new ArtifactDatabaseClientException(
+                    "Artifact must be Instance of ArtifactDescription");
+        }
+
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doNextStep(de.intevation.gnv.artifactdatabase.objects.ArtifactObject,
+     *      de.intevation.gnv.artifactdatabase.objects.ArtifactObject,
+     *      java.lang.String, java.util.Collection)
+     */
+    public ArtifactDescription doNextStep(
+                                          ArtifactObject artifactFactory,
+                                          ArtifactObject currentArtifact,
+                                          String target,
+                                          Collection<InputParameter> inputParameter)
+                                                                                    throws ArtifactDatabaseClientException {
+
+        try {
+            // 1 Feed
+            this.doFeed(artifactFactory, currentArtifact, inputParameter);
+            
+            // 2. Noch einmal Describe um das jetzt zu erreichende Ziel zu ermitteln
+            ArtifactDescription ad = getCurrentStepDescription(
+                artifactFactory,
+                new Artifact(currentArtifact.getId(),
+                currentArtifact.getHash()),
+                false
+            );
+
+            target = ad.getReachableStates().iterator().next();
+            
+            // 3 Advance
+            doAdvance(artifactFactory, currentArtifact, target);
+            
+            // 3 Describe
+            return this.getCurrentStepDescription(artifactFactory,
+                    currentArtifact,true);
+        } catch (IOException e) {
+            log.error(e, e);
+            throw new ArtifactDatabaseClientException(e);
+        }
+    }
+
+
+    public void doAdvance(
+        ArtifactObject factory,
+        ArtifactObject artifact,
+        String         target
+    ) throws IOException, ArtifactDatabaseClientException {
+        String url                = getArtifactUrl(factory, artifact);
+        Document advanceDocument  = createAdvanceRequestBody(artifact, target);
+        InputStream advanceResult = doPostRequest(url, advanceDocument);
+        check4ExceptionReport(new XMLUtils().readDocument(advanceResult));
+    }
+
+    private Document createFeedRequestBody(
+                                           ArtifactObject currentArtifact,
+                                           Collection<InputParameter> inputParameter) {
+        Document document = new XMLUtils().newDocument();
+        Node rootNode = this.createRootNode(document);
+
+        Element typeNode = this.createArtifactElement(document, "type");
+        typeNode.setAttribute("name", "feed");
+        rootNode.appendChild(typeNode);
+
+        Element uuidNode = this.createArtifactElement(document, "uuid");
+        uuidNode.setAttribute("value", currentArtifact.getId());
+        rootNode.appendChild(uuidNode);
+
+        Element hashNode = this.createArtifactElement(document, "hash");
+        hashNode.setAttribute("value", currentArtifact.getHash());
+        rootNode.appendChild(hashNode);
+
+        Node dataNode = this.createParameterNodes(inputParameter, document,
+                "data");
+        rootNode.appendChild(dataNode);
+
+        return document;
+    }
+
+    /**
+     * @param inputParameter
+     * @param document
+     * @param rootNode
+     */
+    private Node createParameterNodes(
+                                      Collection<InputParameter> inputParameter,
+                                      Document document, String nodeName) {
+        Element dataNode = this.createArtifactElement(document, nodeName);
+
+        if (inputParameter != null) {
+            Iterator<InputParameter> it = inputParameter.iterator();
+            while (it.hasNext()) {
+                InputParameter ip = it.next();
+                String name = ip.getName();
+                String[] values = ip.getValues();
+                if (values != null) {
+                    for (int i = 0; i < values.length; i++) {
+                        String value = values[i];
+                        Element inputNode = this.createArtifactElement(
+                                document, "input");
+                        inputNode.setAttribute("name", name);
+                        inputNode.setAttribute("value", value);
+                        dataNode.appendChild(inputNode);
+                    }
+                }
+            }
+        }
+        return dataNode;
+    }
+
+    private Document createAdvanceRequestBody(ArtifactObject currentArtifact,
+                                              String target) {
+        Document document = new XMLUtils().newDocument();
+        Node rootNode = this.createRootNode(document);
+
+        Element typeNode = this.createArtifactElement(document, "type");
+        typeNode.setAttribute("name", "advance");
+        rootNode.appendChild(typeNode);
+
+        Element uuidNode = this.createArtifactElement(document, "uuid");
+        uuidNode.setAttribute("value", currentArtifact.getId());
+        rootNode.appendChild(uuidNode);
+
+        Element hashNode = this.createArtifactElement(document, "hash");
+        hashNode.setAttribute("value", currentArtifact.getHash());
+        rootNode.appendChild(hashNode);
+        Element targetNode = this.createArtifactElement(document, "target");
+        targetNode.setAttribute("name", target);
+        rootNode.appendChild(targetNode);
+        return document;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doOutput(de.intevation.gnv.artifactdatabase.objects.ArtifactObject,
+     *      de.intevation.gnv.artifactdatabase.objects.ArtifactObject,
+     *      java.io.OutputStream, java.lang.String, java.lang.String,
+     *      java.util.Collection)
+     */
+    public void doOutput(ArtifactObject artifactFactory,
+                         ArtifactObject currentArtifact, OutputStream stream,
+                         String targetName, String mimeType,
+                         Collection<InputParameter> inputParameter)
+                                                                   throws ArtifactDatabaseClientException {
+        try {
+            Document requestBody = this.createOutRequestBody(currentArtifact,
+                    targetName, mimeType, inputParameter);
+
+            String requestUrl = this.getArtifactUrl(artifactFactory,
+                    currentArtifact)
+                                + "/" + targetName;
+            InputStream is = this.doPostRequest(requestUrl, requestBody);
+
+            byte[] b = new byte[4096];
+            int i = -1;
+            while ((i = is.read(b)) > 0) {
+                stream.write(b, 0, i);
+            }
+        } catch (IOException e) {
+            log.error(e, e);
+            throw new ArtifactDatabaseClientException(e);
+        }
+    }
+
+    private Document createOutRequestBody(
+                                          ArtifactObject currentArtifact,
+                                          String target,
+                                          String mimeType,
+                                          Collection<InputParameter> inputParameter) {
+        Document document = new XMLUtils().newDocument();
+        Node rootNode = this.createRootNode(document);
+
+        Element typeNode = this.createArtifactElement(document, "type");
+        typeNode.setAttribute("name", "out");
+        rootNode.appendChild(typeNode);
+
+        Element uuidNode = this.createArtifactElement(document, "uuid");
+        uuidNode.setAttribute("value", currentArtifact.getId());
+        rootNode.appendChild(uuidNode);
+
+        Element hashNode = this.createArtifactElement(document, "hash");
+        hashNode.setAttribute("value", currentArtifact.getHash());
+        rootNode.appendChild(hashNode);
+
+        Element outNode = this.createArtifactElement(document, "out");
+        outNode.setAttribute("name", target);
+        rootNode.appendChild(outNode);
+
+        Element mimeTypeNode = this.createArtifactElement(document, "mime-type");
+        mimeTypeNode.setAttribute("value", mimeType);
+        outNode.appendChild(mimeTypeNode);
+
+        Node parameterNode = this.createParameterNodes(inputParameter,
+                document, "params");
+        outNode.appendChild(parameterNode);
+
+        return document;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doFeed(de.intevation.gnv.artifactdatabase.objects.ArtifactObject,
+     *      de.intevation.gnv.artifactdatabase.objects.ArtifactObject,
+     *      java.util.Collection)
+     */
+    public void doFeed(ArtifactObject artifactFactory,
+                       ArtifactObject currentArtifact,
+                       Collection<InputParameter> inputParameter)
+                                                                 throws ArtifactDatabaseClientException {
+
+        try {
+            Document feedDocument = this.createFeedRequestBody(currentArtifact,
+                    inputParameter);
+            String url = this.getArtifactUrl(artifactFactory, currentArtifact);
+            InputStream feedResult = this.doPostRequest(url, feedDocument);
+            Document feedResultDocument = new XMLUtils()
+                    .readDocument(feedResult);
+            this.check4ExceptionReport(feedResultDocument);
+        } catch (IOException e) {
+            log.error(e, e);
+            throw new ArtifactDatabaseClientException(e);
+        }
+    }
+
+    private void check4ExceptionReport(Document document)
+                                                         throws ArtifactDatabaseClientException {
+
+        String message = new XMLUtils().getStringXPath(document,
+                "/exceptionreport/exception");
+        if (message != null) {
+            throw new ArtifactDatabaseClientException(message);
+        }
+
+    }
+
+    public Collection<ArtifactStatisticsSet> calculateStatistics(
+                                                                  ArtifactObject artifactFactory,
+                                                                  ArtifactObject currentArtifact)
+                                                                                                 throws ArtifactDatabaseClientException {
+        log.debug("DefaultArtifactDatabaseClient.calculateStatistics");
+        Collection<ArtifactStatisticsSet> resultValues = null;
+        
+        try {
+            String targetName = "statistics";
+            String requestUrl = this.getArtifactUrl(artifactFactory,
+                    currentArtifact) + "/" + targetName;
+            Document requestBody = this.createOutRequestBody(currentArtifact,
+                    targetName, "text/xml", null);
+            XMLUtils xmlUtils = new XMLUtils();
+            InputStream is = this.doPostRequest(requestUrl, requestBody);
+            Document resultDocument = xmlUtils.readDocument(is);
+            if (resultDocument != null) {
+                
+                NodeList statisticSetNodes = xmlUtils.getNodeSetXPath(resultDocument,
+                                                  "/art:statistics/art:statistic");
+                resultValues = new ArrayList<ArtifactStatisticsSet>
+                                          (statisticSetNodes.getLength());
+                for (int i = 0; i < statisticSetNodes.getLength(); i++) {
+                    Element statisticSetNode = (Element)statisticSetNodes.item(i);
+                    String name = statisticSetNode.getAttribute("name");
+                    ArtifactStatisticsSet set = 
+                               new DefaultArtifactStatisticsSet(name);
+                    NodeList resultNodes = xmlUtils.getNodeSetXPath(statisticSetNode,
+                            "art:statistic-value");
+                    if (resultNodes != null) {
+                        for (int j = 0; j < resultNodes.getLength(); j++) {
+                            Element statisticNode = (Element)resultNodes.item(j);
+                            String statisticName = statisticNode.
+                                                        getAttribute("name");
+                            String statisticValue = statisticNode.
+                                                        getAttribute("value");
+                            set.addStatisticValues(
+                                   new DefaultArtifactStatisticValue
+                                               (statisticName,statisticValue));
+                        }
+                    }
+                    resultValues.add(set);
+                }
+            }
+        } catch (IOException e) {
+            log.error(e, e);
+            throw new ArtifactDatabaseClientException(e);
+        }
+
+        return resultValues;
+    }
+
+    public void setLocale(Locale locale) {
+        this.locale = locale;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getArtifactFactoryMetaInformation(java.util.Collection, java.lang.String, java.lang.String)
+     */
+    public Collection<ArtifactFactory> getArtifactFactoryMetaInformation(
+                                                                Collection<MapService> mapServices,
+                                                                String geometry,
+                                                                String srs)
+                                                                           throws ArtifactDatabaseClientException {
+         // TODO: Implement me
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/exception/ArtifactDatabaseClientException.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,52 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.client.exception;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class ArtifactDatabaseClientException extends Exception {
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = -8979622024425251952L;
+
+    /**
+     * Constructor
+     */
+    public ArtifactDatabaseClientException() {
+        super();
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param arg0
+     */
+    public ArtifactDatabaseClientException(String arg0) {
+        super(arg0);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param arg0
+     */
+    public ArtifactDatabaseClientException(Throwable arg0) {
+        super(arg0);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param arg0
+     * @param arg1
+     */
+    public ArtifactDatabaseClientException(String arg0, Throwable arg1) {
+        super(arg0, arg1);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,179 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.w3c.dom.Node;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class Artifact implements ArtifactObject, ArtifactDescription {
+
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 8606869493141810364L;
+    
+    private String id = null;
+    private String hash = null;
+    private boolean selected = false;
+
+    private Node currentUI = null;
+    private Node currentOut = null;
+
+    private Collection<String> reachableStates;
+    private Collection<String> inputParameter;
+    private Map<String, OutputMode> outputModes;
+    private String currentState = null;
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getCurrentUI()
+     */
+    public Node getCurrentUI() {
+        return currentUI;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setCurrentUI(org.w3c.dom.Node)
+     */
+    public void setCurrentUI(Node currentUI) {
+        this.currentUI = currentUI;
+    }
+
+    /**
+     * @return the currentOut
+     */
+    public Node getCurrentOut() {
+        return currentOut;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setCurrentOut(org.w3c.dom.Node)
+     */
+    public void setCurrentOut(Node currentOut) {
+        this.currentOut = currentOut;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getReachableStates()
+     */
+    public Collection<String> getReachableStates() {
+        return reachableStates;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setReachableStates(java.util.Collection)
+     */
+    public void setReachableStates(Collection<String> reachableStates) {
+        this.reachableStates = reachableStates;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getCurrentState()
+     */
+    public String getCurrentState() {
+        return currentState;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setCurrentState(java.lang.String)
+     */
+    public void setCurrentState(String currentState) {
+        this.currentState = currentState;
+    }
+
+    /**
+     * Constructor
+     */
+    public Artifact(String uuid, String hash) {
+
+        this.id = uuid;
+        this.hash = hash;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getHash()
+     */
+    public String getHash() {
+        return this.hash;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getDescription()
+     */
+    public String getDescription() {
+        return this.id;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getId()
+     */
+    public String getId() {
+        return this.id;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getName()
+     */
+    public String getName() {
+        return this.id;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#isSelected()
+     */
+    public boolean isSelected() {
+        return this.selected;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#setSelected(boolean)
+     */
+    public void setSelected(boolean selected) {
+        this.selected = selected;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getInputParameter()
+     */
+    public Collection<String> getInputParameter() {
+        return this.inputParameter;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setInputParameter(java.util.Collection)
+     */
+    public void setInputParameter(Collection<String> inputParameter) {
+        this.inputParameter = inputParameter;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getOutputModes()
+     */
+    public Map<String, OutputMode> getOutputModes() {
+        return this.outputModes;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getOutputModesAsCollection()
+     */
+    public Collection<OutputMode> getOutputModesAsCollection() {
+        if (this.outputModes != null) {
+            return this.outputModes.values();
+        }
+        return null;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setOutputModes(java.util.Map)
+     */
+    public void setOutputModes(Map<String, OutputMode> outputModes) {
+        this.outputModes = outputModes;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactDescription.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,82 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Map;
+
+import org.w3c.dom.Node;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface ArtifactDescription extends Serializable {
+
+    /**
+     * @return the currentUI
+     */
+    public Node getCurrentUI();
+
+    /**
+     * @param currentUI
+     *            the currentUI to set
+     */
+    public void setCurrentUI(Node currentUI);
+
+    /**
+     * @param currentOut
+     *            the currentOut to set
+     */
+    public void setCurrentOut(Node currentOut);
+
+    /**
+     * @return the reachableStates
+     */
+    public Collection<String> getReachableStates();
+
+    /**
+     * @param reachableStates
+     *            the reachableStates to set
+     */
+    public void setReachableStates(Collection<String> reachableStates);
+
+    /**
+     * @return the currentState
+     */
+    public String getCurrentState();
+
+    /**
+     * @param currentState
+     *            the currentState to set
+     */
+    public void setCurrentState(String currentState);
+
+    /**
+     * @return the reachableStates
+     */
+    public Collection<String> getInputParameter();
+
+    /**
+     * @param inputParameter
+     */
+    public void setInputParameter(Collection<String> inputParameter);
+
+    /**
+     * @return the reachableStates
+     */
+    public Map<String, OutputMode> getOutputModes();
+
+    /**
+     * @return the reachableStates
+     */
+    public Collection<OutputMode> getOutputModesAsCollection();
+
+    /**
+     * @param outputParameter
+     */
+    public void setOutputModes(Map<String, OutputMode> outputModes);
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,89 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class ArtifactFactory implements ArtifactObject {
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = 5453748230625831527L;
+
+    private String name = null;
+
+    private String description = null;
+
+    private boolean selected = false;
+
+    private String dataBaseUrl = null;
+
+    /**
+     * @return the dataBaseUrl
+     */
+    public String getDataBaseUrl() {
+        return dataBaseUrl;
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param name
+     * @param description
+     * @param dataBaseUrl
+     */
+    public ArtifactFactory(String name, String description, String dataBaseUrl) {
+        super();
+        this.name = name;
+        this.description = description;
+        this.dataBaseUrl = dataBaseUrl;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getId()
+     */
+    public String getId() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#isSelected()
+     */
+    public boolean isSelected() {
+
+        return this.selected;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#setSelected(boolean)
+     */
+    public void setSelected(boolean selected) {
+        this.selected = selected;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getName()
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getDescription()
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getHash()
+     */
+    public String getHash() {
+        return null;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactObject.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,26 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.io.Serializable;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface ArtifactObject extends Serializable {
+
+    public String getId();
+
+    public boolean isSelected();
+
+    public void setSelected(boolean selected);
+
+    public String getName();
+
+    public String getDescription();
+
+    public String getHash();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticValue.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,18 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.io.Serializable;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface ArtifactStatisticValue extends Serializable {
+
+    String getKey();
+
+    String getValue();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticsSet.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,22 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public interface ArtifactStatisticsSet extends Serializable {
+    
+    
+    String getName();
+    
+    Collection<ArtifactStatisticValue> getStatisticValues();
+    
+    void addStatisticValues(ArtifactStatisticValue value);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticValue.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,35 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultArtifactStatisticValue implements ArtifactStatisticValue {
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = -8409111023127835398L;
+
+    private String key = null;
+
+    private String value = null;
+
+    public DefaultArtifactStatisticValue(String key, String value) {
+        super();
+        this.key = key;
+        this.value = value;
+    }
+
+    public String getKey() {
+        return this.key;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticsSet.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,52 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class DefaultArtifactStatisticsSet implements ArtifactStatisticsSet{
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = 6738878381515708602L;
+
+    private String name = null;
+    
+    private Collection<ArtifactStatisticValue> statisticValues = 
+                                       new ArrayList<ArtifactStatisticValue>();
+    /**
+     * Constructor
+     */
+    public DefaultArtifactStatisticsSet(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet#addStatisticValues(de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticValue)
+     */
+    public void addStatisticValues(ArtifactStatisticValue value) {
+        this.statisticValues.add(value);
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet#getStatisticValues()
+     */
+    public Collection<ArtifactStatisticValue> getStatisticValues() {
+        return this.statisticValues;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultInputParameter.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,47 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultInputParameter implements InputParameter {
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = 6597439837482244211L;
+
+    private String name = null;
+
+    private String[] values = null;
+
+    /**
+     * Constructor
+     * 
+     * @param name
+     * @param values
+     */
+    public DefaultInputParameter(String name, String[] values) {
+        super();
+        this.name = name;
+        this.values = values;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.InputParameter#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.InputParameter#getValues()
+     */
+    public String[] getValues() {
+        return this.values;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,54 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultOutputMode implements OutputMode {
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = 7487880486604174521L;
+
+    private String name = null;
+
+    private String mimeType = null;
+
+    private Collection<OutputParameter> outputParameter = null;
+
+    public DefaultOutputMode(String name, String mimeType,
+                             Collection<OutputParameter> outputParameter) {
+        super();
+        this.name = name;
+        this.mimeType = mimeType;
+        this.outputParameter = outputParameter;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.OutputMode#getMimeType()
+     */
+    public String getMimeType() {
+        return this.mimeType;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.OutputMode#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.OutputMode#getOutputParameters()
+     */
+    public Collection<OutputParameter> getOutputParameters() {
+        return this.outputParameter;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputParameter.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,63 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class DefaultOutputParameter implements OutputParameter {
+
+    /**
+     * The UID of this Class.
+     */
+    private static final long serialVersionUID = -8416057640116638152L;
+
+    private String name = null;
+
+    private String value = null;
+
+    private String description = null;
+
+    private String type = null;
+
+    /**
+     * Constructor
+     * 
+     * @param name
+     * @param value
+     * @param description
+     */
+    public DefaultOutputParameter(String name, String value,
+                                  String description, String type) {
+        super();
+        this.name = name;
+        this.value = value;
+        this.description = description;
+        this.type = type;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.OutputParameter#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.OutputParameter#getValue()
+     */
+    public String getValue() {
+        return this.value;
+    }
+
+    public String getDescription() {
+        return this.description;
+    }
+
+    public String getType() {
+        return this.type;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/InputParameter.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,18 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.io.Serializable;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface InputParameter extends Serializable {
+
+    public String getName();
+
+    public String[] getValues();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,21 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface OutputMode extends Serializable{
+
+    public String getName();
+
+    public String getMimeType();
+
+    public Collection<OutputParameter> getOutputParameters();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputParameter.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,22 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects;
+
+import java.io.Serializable;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface OutputParameter extends Serializable{
+
+    String getName();
+
+    String getValue();
+
+    String getDescription();
+
+    String getType();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultLayer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,67 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects.map;
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class DefaultLayer implements Layer {
+
+    
+    private String id = null;
+    
+    private String name = null;
+    
+    private boolean groupLayer = false;
+    
+    private String parentId = null;
+    /**
+     * Constructor
+     */
+    public DefaultLayer(String id,String name,
+                        boolean groupLayer,String parentId) {
+        this.id = id;
+        this.name = name;
+        this.groupLayer = groupLayer;
+        this.parentId = parentId;
+    }
+
+
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#getID()
+     */
+    public String getID() {
+        return this.id;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#isGroupLayer()
+     */
+    public boolean isGroupLayer() {
+        return this.groupLayer;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#parentID()
+     */
+    public String parentID() {
+        return this.parentId;
+    }
+    
+    @Override
+    public String toString() {
+        return "ID: "+ this.id + " Name: "+this.name+
+               " IsGroupLayer: "+this.groupLayer+
+               " ParentID: "+this.parentId;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultMapService.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,63 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects.map;
+
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public class DefaultMapService implements MapService {
+
+    private String id = null;
+    
+
+
+    private Collection<Layer> layer = null;
+    
+    private String type = null;
+    
+    private String url = null;
+    /**
+     * Constructor
+     */
+    public DefaultMapService(String id, Collection<Layer> layer, 
+                             String type, String url) {
+        super();
+        this.id = id;
+        this.layer = layer;
+        this.type = type;
+        this.url = url;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getID()
+     */
+    public String getID() {
+        return this.id;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getLayer()
+     */
+    public Collection<Layer> getLayer() {
+        return this.layer;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getType()
+     */
+    public String getType() {
+        return this.type;
+    }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getURL()
+     */
+    public String getURL() {
+        return this.url;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/Layer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,16 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects.map;
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public interface Layer {
+    
+    String getName();
+    String getID();
+    boolean isGroupLayer();
+    String parentID();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/MapService.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,23 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.objects.map;
+
+import java.util.Collection;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ *
+ */
+public interface MapService {
+    
+    
+    String getID();
+    
+    String getURL();
+    
+    String getType();
+    
+    Collection<Layer> getLayer();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/propertiesreader/MapPropertiesReader.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,42 @@
+/**
+ *
+ */
+package de.intevation.gnv.propertiesreader;
+
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class MapPropertiesReader implements PropertiesReader {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(MapPropertiesReader.class);
+
+    private Map<String, String> properties = null;
+
+    /**
+     * Constructor
+     */
+    public MapPropertiesReader(Map<String, String> properties) {
+        super();
+        this.properties = properties;
+    }
+
+    /**
+     * @see de.intevation.gnv.propertiesreader.PropertiesReader#getPropertieValue(java.lang.String,
+     *      java.lang.String)
+     */
+    public String getPropertieValue(String key, String defaultValue) {
+        String value = this.properties.get(key);
+        if (value == null) {
+            value = defaultValue;
+        }
+        return value;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/propertiesreader/PropertiesReader.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,14 @@
+/**
+ *
+ */
+package de.intevation.gnv.propertiesreader;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public interface PropertiesReader {
+
+    public String getPropertieValue(String key, String defaultValue);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/propertiesreader/PropertiesReaderFactory.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,81 @@
+/**
+ *
+ */
+package de.intevation.gnv.propertiesreader;
+
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class PropertiesReaderFactory {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(PropertiesReaderFactory.class);
+
+    /**
+     * The singleton Instance of this Factory.
+     */
+    private static PropertiesReaderFactory instance = null;
+
+    /**
+     * The ConnectionPool providing the Connections to the DatabaseBackends
+     */
+    private PropertiesReader propertiesReader = null;
+
+    /**
+     * Constructor
+     */
+    private PropertiesReaderFactory() {
+        super();
+    }
+
+    /**
+     * This Method provides an singleton Instance of this Class.
+     * 
+     * @return an singleton Instance of this Class
+     */
+    public static PropertiesReaderFactory getInstance() {
+        if (instance == null) {
+            instance = new PropertiesReaderFactory();
+        }
+        return instance;
+    }
+
+    /**
+     * Getting the ConnectionPool
+     * 
+     * @return the ConnectionPool
+     */
+    public PropertiesReader getPropertiesReader() {
+        return this.propertiesReader;
+    }
+
+    /**
+     * Getting the ConnectionPool
+     * 
+     * @param config
+     *            The Config that should be read
+     */
+    public void initPropertiesReader(Object config) {
+        if (config instanceof ServletConfig) {
+            this.propertiesReader = new ServletPropertiesReader(
+                    (ServletConfig) config);
+        } else if (config instanceof Map) {
+            this.propertiesReader = new MapPropertiesReader(
+                    (Map<String, String>) config);
+        } else {
+            log.error("No PropertiesReader for Instance "
+                      + config.getClass().getName());
+        }
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/propertiesreader/ServletPropertiesReader.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,58 @@
+/**
+ *
+ */
+package de.intevation.gnv.propertiesreader;
+
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class ServletPropertiesReader implements PropertiesReader {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(ServletPropertiesReader.class);
+
+    private Map<String, String> properties = null;
+
+    /**
+     * Constructor
+     */
+    public ServletPropertiesReader(ServletConfig config) {
+        super();
+        log.info("ServletPropertiesReader will be initialized");
+        if (config != null) {
+
+            Enumeration<String> keys = config.getInitParameterNames();
+            properties = new HashMap<String, String>();
+            while (keys.hasMoreElements()) {
+                String key = keys.nextElement();
+                String value = config.getInitParameter(key);
+                log.info("New ConbfigurationValue; " + key + " ==> " + value);
+                this.properties.put(key, value);
+            }
+        }
+    }
+
+    /**
+     * @see de.intevation.gnv.propertiesreader.PropertiesReader#getPropertieValue(java.lang.String,
+     *      java.lang.String)
+     */
+    public String getPropertieValue(String key, String defaultValue) {
+        String value = this.properties.get(key);
+        if (value == null) {
+            value = defaultValue;
+        }
+        return value;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,55 @@
+/*
+ * 
+ */
+package de.intevation.gnv.servlet;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+import org.apache.struts.action.ActionServlet;
+
+import de.intevation.gnv.propertiesreader.PropertiesReaderFactory;
+
+/**
+ * 
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class GNVActionServlet extends ActionServlet {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = null;
+
+    static {
+        // BasicConfigurator.configure();
+
+    }
+
+    static String LOGGINIG_CONFIG_FILE_ID = "de.intevation.gnv.servlet.log4j.configuration";
+
+    /**
+     * The UID of this Class
+     */
+    private static final long serialVersionUID = 3597396283436383943L;
+
+    /**
+     * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
+     */
+    @Override
+    public void init(ServletConfig config) throws ServletException {
+        super.init(config);
+        try {
+            String path = config.getServletContext().getRealPath("/")
+                          + config.getInitParameter(LOGGINIG_CONFIG_FILE_ID);
+            PropertyConfigurator.configure(path);
+            log = Logger.getLogger(GNVActionServlet.class);
+        } catch (Exception e) {
+            log.error(e, e);
+        }
+        log.info("PropertiesReader will be configured.");
+        PropertiesReaderFactory.getInstance().initPropertiesReader(config);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/util/ArtifactNamespaceContext.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,56 @@
+package de.intevation.gnv.util;
+
+import javax.xml.XMLConstants;
+
+import javax.xml.namespace.NamespaceContext;
+
+import java.util.Iterator;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation)
+ */
+public class ArtifactNamespaceContext
+implements   NamespaceContext
+{
+    /**
+     * The URI of the namespace of the artifacts.
+     */
+    public final static String NAMESPACE_URI = "http://www.intevation.de/2009/artifacts";
+
+    /**
+     * The XML prefix for the artifacts namespace.
+     */
+    public final static String NAMESPACE_PREFIX = "art";
+
+    public static final ArtifactNamespaceContext INSTANCE =
+        new ArtifactNamespaceContext();
+
+    public ArtifactNamespaceContext() {
+    }
+
+    public String getNamespaceURI(String prefix) {
+
+        if (prefix == null) {
+            throw new NullPointerException("Null prefix");
+        }
+
+        if (NAMESPACE_PREFIX.equals(prefix)) {
+            return NAMESPACE_URI;
+        }
+
+        if ("xml".equals(prefix)) {
+            return XMLConstants.XML_NS_URI;
+        }
+
+        return XMLConstants.NULL_NS_URI;
+    }
+
+    public String getPrefix(String uri) {
+        throw new UnsupportedOperationException();
+    }
+
+    public Iterator getPrefixes(String uri) {
+        throw new UnsupportedOperationException();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/util/XMLUtils.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,223 @@
+package de.intevation.gnv.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringBufferInputStream;
+import java.io.StringWriter;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Sascha L. Teichmann
+ */
+public class XMLUtils {
+    private static Logger logger = Logger.getLogger(XMLUtils.class);
+
+    public XMLUtils() {
+    }
+
+    public static class ElementCreator {
+        protected Document document;
+        protected String ns;
+        protected String prefix;
+
+        public ElementCreator(Document document, String ns, String prefix) {
+            this.document = document;
+            this.ns = ns;
+            this.prefix = prefix;
+        }
+
+        public Element create(String name) {
+            Element element = document.createElementNS(ns, name);
+            element.setPrefix(prefix);
+            return element;
+        }
+
+        public void addAttr(Element element, String name, String value) {
+            Attr attr = document.createAttributeNS(ns, name);
+            attr.setValue(value);
+            attr.setPrefix(prefix);
+            element.setAttributeNode(attr);
+        }
+    } // class ElementCreator
+
+    public Document newDocument() {
+        try {
+            return DocumentBuilderFactory.newInstance().newDocumentBuilder()
+                    .newDocument();
+        } catch (ParserConfigurationException pce) {
+            logger.error(pce.getLocalizedMessage(), pce);
+        }
+        return null;
+    }
+
+    public XPath newXPath() {
+        return newXPath(null);
+    }
+
+    public XPath newXPath(NamespaceContext namespaceContext) {
+        XPathFactory factory = XPathFactory.newInstance();
+        XPath xpath = factory.newXPath();
+        if (namespaceContext != null) {
+            xpath.setNamespaceContext(namespaceContext);
+        }
+        return xpath;
+    }
+
+    public Object xpath(Object root, String query, QName returnTyp) {
+        return xpath(root, query, returnTyp, null);
+    }
+
+    public final String xpathString(Object root, String query,
+                                    NamespaceContext namespaceContext) {
+        return (String) xpath(root, query, XPathConstants.STRING,
+                namespaceContext);
+    }
+
+    public static final Object xpath(Object root, String query,
+                                     QName returnType,
+                                     NamespaceContext namespaceContext) {
+        if (root == null) {
+            return null;
+        }
+
+        try {
+            XPath xpath = new XMLUtils().newXPath(namespaceContext);
+            if (xpath != null) {
+                return xpath.evaluate(query, root, returnType);
+            }
+        } catch (XPathExpressionException xpee) {
+            logger.error(xpee.getLocalizedMessage(), xpee);
+        }
+
+        return null;
+    }
+
+    public Object getXPath(Object root, String query, QName returnType) {
+        return getXPath(root,query,returnType,ArtifactNamespaceContext.INSTANCE);
+    }
+
+    public Object getXPath(
+        Object root, String query, QName returnType, NamespaceContext context
+    ) {
+        return xpath(root, query, returnType, context);
+    }
+
+    public String getStringXPath(String xpath) {
+        return getStringXPath(xpath, null);
+    }
+
+    public NodeList getNodeSetXPath(Object root, String query) {
+        return (NodeList) getXPath(root, query, XPathConstants.NODESET);
+    }
+
+    public Node getNodeXPath(Object root, String query) {
+        return (Node) getXPath(root, query, XPathConstants.NODE);
+    }
+
+    public String getStringXPath(Object root, String xpath) {
+        return getStringXPath(root, xpath, null);
+    }
+
+    public String getStringXPath(Object root, String query, String def) {
+        String s = (String) getXPath(root, query, XPathConstants.STRING);
+        return s == null || s.length() == 0 ? def : s;
+    }
+
+    public Document readDocument(InputStream inputStream) {
+        Document returnValue = null;
+        try {
+            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
+                    .newInstance();
+            docBuilderFactory.setNamespaceAware(true);
+            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
+            returnValue = docBuilder.parse(inputStream);
+        } catch (ParserConfigurationException e) {
+            logger.error(e, e);
+        } catch (SAXException e) {
+            logger.error(e, e);
+        } catch (IOException e) {
+            logger.error(e, e);
+        }
+        return returnValue;
+    }
+
+    public String writeNode2String(Node node) {
+        try {
+            DOMSource source = new DOMSource(node);
+            return writeDOMSource2String(source);
+        } catch (TransformerConfigurationException e) {
+            logger.error(e, e);
+        } catch (TransformerFactoryConfigurationError e) {
+            logger.error(e, e);
+        } catch (TransformerException e) {
+            logger.error(e, e);
+        }
+        return null;
+    }
+
+    public Document reInitDocument(Document document) {
+
+        StringBufferInputStream inputStream = new StringBufferInputStream(this
+                .writeDocument2String(document));
+        return this.readDocument(inputStream);
+    }
+
+    public String writeDocument2String(Document document) {
+        try {
+            DOMSource source = new DOMSource(document);
+            return writeDOMSource2String(source);
+        } catch (TransformerConfigurationException e) {
+            logger.error(e, e);
+        } catch (TransformerFactoryConfigurationError e) {
+            logger.error(e, e);
+        } catch (TransformerException e) {
+            logger.error(e, e);
+        }
+        return null;
+    }
+
+    /**
+     * @param source
+     * @return
+     * @throws TransformerFactoryConfigurationError
+     * @throws TransformerConfigurationException
+     * @throws TransformerException
+     */
+    private String writeDOMSource2String(DOMSource source)
+                                                          throws TransformerFactoryConfigurationError,
+                                                          TransformerConfigurationException,
+                                                          TransformerException {
+        TransformerFactory transformerFactory = TransformerFactory
+                .newInstance();
+        Transformer transformer = transformerFactory.newTransformer();
+        StringWriter sw = new StringWriter();
+        StreamResult result = new StreamResult(sw);
+        transformer.transform(source, result);
+        return sw.getBuffer().toString();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/util/XSLTransformer.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,92 @@
+/**
+ *
+ */
+package de.intevation.gnv.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+
+import javax.xml.transform.dom.DOMSource;
+
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Node;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class XSLTransformer {
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(XSLTransformer.class);
+
+
+    private Map<String, String> params;
+
+    /**
+     * Constructor
+     */
+    public XSLTransformer() {
+        super();
+    }
+
+    public String transform(Node toTransform, String encoding,
+                            String templateFileName) {
+        String resultValue = null;
+        try {
+            //XMLUtils xmlUtils = new XMLUtils();
+            Source templateSource = new StreamSource(new File(templateFileName));
+            TransformerFactory xformFactory = TransformerFactory.newInstance();
+            Transformer transformer = xformFactory
+                    .newTransformer(templateSource);
+
+            if (params != null) {
+                for(Map.Entry<String, String> entry: params.entrySet()) {
+                    transformer.setParameter(entry.getKey(), entry.getValue());
+                }
+            }
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            StreamResult scrResult = new StreamResult(baos);
+            // log.debug(xmlUtils.writeNode2String(toTransform));
+            DOMSource source = new DOMSource(toTransform);
+            transformer.transform(source, scrResult);
+            resultValue = new String(baos.toByteArray(), encoding);
+        } catch (TransformerConfigurationException e) {
+            log.error(e, e);
+        } catch (UnsupportedEncodingException e) {
+            log.error(e, e);
+        } catch (TransformerFactoryConfigurationError e) {
+            log.error(e, e);
+        } catch (TransformerException e) {
+            log.error(e, e);
+        }
+
+        return resultValue;
+    }
+
+
+    public void addParameter(String name, String value) {
+        if (params == null) {
+            params = new HashMap<String, String>(3);
+        }
+
+        params.put(name, value);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/resources/applicationMessages.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,88 @@
+# application.properties
+application.name=${pom.name}
+application.version=${pom.version}
+application.releasedate=${timestamp}
+
+gnviewer.app.title = BSH-GDI genericViewer
+
+gnviewer.project.save = Projekt speichern
+gnviewer.project.load = Projekt laden
+gnviewer.project.load.button = Laden
+
+gnviewer.history.title=\u00dcberblick
+
+gnviewer.fis.fis_marnet = Marnet
+gnviewer.fis.fis_imis = IMIS
+gnviewer.fis.fis_staun = STAUN
+gnviewer.fis.fis_modeldata = Modelldaten
+gnviewer.fis.fis_delphin = Delphin
+gnviewer.fis.fis_thermosalinograph = Thermosalinograph
+gnviewer.fis.fis_chemusurvey = Chemusurvey
+gnviewer.fis.fis_gts = GTS
+gnviewer.fis.fis_bsh_ctd = CTD
+gnviewer.fis.fis_bsh_xbt = XBT
+gnviewer.fis.fis_eisklimatologie = Eisklimatologie
+gnviewer.fis.fis_sst = SST
+gnviewer.fis.fis_seastate = Seegangsarchiv
+gnviewer.fis.fis_seacat = SeaCat
+gnviewer.fis.fis_currentmeter = Strommesser
+gnviewer.fis.fis_icestations = Eismeldungen
+
+gnviewer.select.button = Ausw\u00e4hlen
+gnviewer.draw.button = Zeichnen
+
+gnviewer.productselection.overlay.title = Die Anfrage wird bearbeitet, bitte gedulden Sie sich einen Moment.
+gnviewer.productselection.fisselection.title = Fachinformationssystem
+
+# Statistik
+gnviewer.statistics.header.title=Datenstatistik
+gnviewer.statistics.table.header.param=Parameter
+gnviewer.statistics.table.header.value=Wert
+gnviewer.statistics.series=Series
+gnviewer.statistics.descriptive.arithmeticMean=Arithmetisches Mittel
+gnviewer.statistics.descriptive.geometricMean=Geometrisches Mittel
+gnviewer.statistics.descriptive.kurtosis=Kurtosis
+gnviewer.statistics.descriptive.kurtosisClass=kurtosisClass
+gnviewer.statistics.descriptive.max=Maximum
+gnviewer.statistics.descriptive.min=Minimum
+gnviewer.statistics.descriptive.n=Anzahl Werte
+gnviewer.statistics.descriptive.percentile.90=Perzentil (90/10)
+gnviewer.statistics.descriptive.percentile.75=Perzentil (75/25)
+gnviewer.statistics.descriptive.percentile.50=Perzentil (50/50)
+gnviewer.statistics.descriptive.percentile.10=Perzentil (10/90)
+gnviewer.statistics.descriptive.deviation=Standardabweichung
+gnviewer.statistics.descriptive.variance=Varianz
+gnviewer.statistics.descriptive.intercept=Intercept
+gnviewer.statistics.descriptive.slope=Steigung
+gnviewer.statistic.button = Statistik
+
+# diagram options dialog
+gnviewer.diagram.options.header.title=Diagrammoptionen
+
+
+# attachedOutputOptions
+gnviewer.output.options.diagramm.alt=Diagramm
+gnviewer.output.options.save.title=Diagramm speichern
+gnviewer.output.options.export.csv.title=Daten als CSV exportieren
+gnviewer.output.options.export.odv.title=Daten als ODV exportieren
+gnviewer.output.options.export.pdf.title=Diagramm als PDF exportieren
+gnviewer.output.options.export.svg.title=Diagramm als SVG exportieren
+gnviewer.output.options.export.zip.title=ZIP-Archiv exportieren
+gnviewer.output.options.export.wms.title=WMS-Layer bereitstellen
+
+# export options
+gnviewer.export.fieldset.title=Aktionen
+
+height=H\u00f6he
+width=Breite
+points=Zeichne Datenpunkte
+
+# Fehlermeldungen:
+
+java.io.ioexception..connection.refused=Die Verbindung zur Artifaktdatenbank ist unterbrochen. Bitte probieren Sie es zu einem sp\u00e4teren Zeitpunkt erneut.
+java.io.ioexception..unable.to.parse.the.response.http.version..end.of.stream.reached.too.early=Die Verbindung zur Artifaktdatenbank wurde unerwartet unterbrochen.
+no.inputdata.given..please.select.at.least.one.entry=Es wurde kein Eintrag ausgew\u00e4hlt. Bitte w\u00e4hlen sie mindestens einen Eintrag aus.
+de.intevation.gnv.geobackend.base.query.exception.queryexception..java.sql.sqlexception =Es ist ein interner Serverfehler aufgetreten. Bitte benachrichtigen Sie den Support.
+java.io.ioexception..the.server.encountered.an.unexpected.condition.which.prevented.it.from.fulfilling.the.request=Es ist ein interner Serverfehler aufgetreten. Bitte benachrichtigen Sie den Support.
+java.lang.illegalargumentexception..inputstream.cannot.be.null=Es ist ein interner Serverfehler aufgetreten. Bitte benachrichtigen Sie den Support.
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/resources/applicationMessages_en.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,85 @@
+# application.properties
+application.name=${pom.name}
+application.version=${pom.version}
+application.releasedate=${timestamp}
+
+gnviewer.app.title = BSH-GDI genericViewer
+
+gnviewer.history.title=Summary
+
+gnviewer.project.save = Save Project
+gnviewer.project.load = Load Project
+gnviewer.project.load.button = Load
+
+gnviewer.fis.fis_marnet = Marnet
+gnviewer.fis.fis_imis = IMIS
+gnviewer.fis.fis_staun = STAUN
+gnviewer.fis.fis_modeldata = Modeldata
+gnviewer.fis.fis_delphin = Delphin
+gnviewer.fis.fis_thermosalinograph = Thermosalinograph
+gnviewer.fis.fis_chemusurvey = Chemusurvey
+gnviewer.fis.fis_gts = GTS
+gnviewer.fis.fis_bsh_ctd = CTD
+gnviewer.fis.fis_bsh_xbt = XBT
+gnviewer.fis.fis_eisklimatologie = Iceclimatology
+gnviewer.fis.fis_sst = SST
+gnviewer.fis.fis_seastate = Sea State
+gnviewer.fis.fis_seacat = SeaCat
+gnviewer.fis.fis_currentmeter = Current Meter
+gnviewer.fis.fis_icestations = Ice Station Report
+
+gnviewer.select.button = Choose
+gnviewer.draw.button = Draw
+
+gnviewer.productselection.overlay.title = Your request will be processed. Please wait...
+gnviewer.productselection.fisselection.title = Data set
+
+# Statistik
+gnviewer.statistics.header.title=Statistics
+gnviewer.statistics.table.header.param=Parameter
+gnviewer.statistics.table.header.value=Value
+gnviewer.statistics.series=Series
+gnviewer.statistics.descriptive.arithmeticMean=Arithmetic mean
+gnviewer.statistics.descriptive.geometricMean=Geometric Mean
+gnviewer.statistics.descriptive.kurtosis=Kurtosis
+gnviewer.statistics.descriptive.kurtosisClass=kurtosisClass
+gnviewer.statistics.descriptive.max=Maximum
+gnviewer.statistics.descriptive.min=Minimum
+gnviewer.statistics.descriptive.n=Number of Values
+gnviewer.statistics.descriptive.percentile.90=Percentile (90/10)
+gnviewer.statistics.descriptive.percentile.75=Percentile (75/25)
+gnviewer.statistics.descriptive.percentile.50=Percentile (50/50)
+gnviewer.statistics.descriptive.percentile.10=Percentile (90/10)
+gnviewer.statistics.descriptive.deviation=Standard deviation
+gnviewer.statistics.descriptive.variance=Variance
+gnviewer.statistics.descriptive.intercept=Intercept
+gnviewer.statistics.descriptive.slope=Increase
+gnviewer.statistic.button = Statistic
+
+# diagram options dialog
+gnviewer.diagram.options.header.title=Diagram options
+
+
+# attachedOutputOptions
+gnviewer.output.options.diagramm.alt=Diagram
+gnviewer.output.options.save.title=Save Diagram
+gnviewer.output.options.export.csv.title=Export Data as CSV
+gnviewer.output.options.export.odv.title=Export Data as ODV
+gnviewer.output.options.export.pdf.title=Export chart as PDF
+gnviewer.output.options.export.svg.title=Export chart as SVG
+gnviewer.output.options.export.zip.title=Export as ZIP archive
+gnviewer.output.options.export.wms.title=Serve as WMS layer
+
+# export options
+gnviewer.export.fieldset.title=Actions
+
+height=Height
+width=Width
+points=Draw data points
+
+java.io.ioexception..connection.refused = The Connection to the ArtifactDatabase is interrupted. Please try again later.
+java.io.ioexception..unable.to.parse.the.response.http.version..end.of.stream.reached.too.early= The Connection to the ArtifactDatabase was interrupted unexpected.
+no.inputdata.given..please.select.at.least.one.entry = No Entry was chosen. Please select at least one entry.
+de.intevation.gnv.geobackend.base.query.exception.queryexception..java.sql.sqlexception: A internal Server error has occurred. Please contact the Support.
+java.io.ioexception..the.server.encountered.an.unexpected.condition.which.prevented.it.from.fulfilling.the.request = A internal Server error has occurred. Please contact the Support.
+java.lang.illegalargumentexception..inputstream.cannot.be.null = A internal Server error has occurred. Please contact the Support.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/META-INF/context.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Context cookies="false" reloadable="true"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/config/log4j.properties	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,13 @@
+# Set root logger level to DEBUG and its only appender to A1.
+log4j.rootLogger=DEBUG, A1
+
+# A1 is set to be a ConsoleAppender.
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# A1 uses PatternLayout.
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
+
+# Abschalten des geschwätzigen Loggings in dre Klasse JspServlet
+log4j.category.org.apache.jasper.servlet.JspServlet=WARN
+log4j.category.org.apache.catalina.core.ContainerBase=WARN
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/config/struts-config.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE struts-config PUBLIC
+        "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
+        "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
+<struts-config>
+    <global-exceptions/>
+     <global-forwards>
+        <forward name="entrance" path="/start.do"/>
+    </global-forwards>
+    
+    <action-mappings>
+        <action path="/version"
+                type="de.intevation.gnv.action.ArtifactDatabaseActionBase"
+                scope="request"
+                validate="false">
+           <forward
+                name="success"
+                path="/WEB-INF/jsp/version.jsp"/>
+        </action>
+        <action path="/start" 
+                type="de.intevation.gnv.action.FetchArtifactFactoriesAction"
+                scope="request"
+                validate="false">
+           <forward
+                name="success"
+                path="/WEB-INF/jsp/mainlayout.jsp"/>
+        </action>
+        <action path="/selectArtifactFactory" 
+                type="de.intevation.gnv.action.SelectArtifactFactoryAction"
+                scope="request"
+                validate="false">
+           <forward
+                name="success"
+                path="/WEB-INF/jsp/mainlayout.jsp"/>
+            <forward
+                name="selectfis"
+                path="/gnv/selectFis.do"/>
+        </action>
+        <action path="/back"
+                 type="de.intevation.gnv.action.PreviousArtifactStepAction"
+                 scope="request"
+                 validate="false">
+            <forward
+                name="success"
+                path="/WEB-INF/jsp/mainlayout.jsp"/>
+        </action>
+        <action path="/selectFis"
+                type="de.intevation.gnv.action.SelectFisAction"
+                scope="request"
+                validate="false">
+           <forward
+                name="success"
+                path="/WEB-INF/jsp/mainlayout.jsp"/>
+        </action>
+        <action path="/next"
+                type="de.intevation.gnv.action.NextArtifactStepAction"
+                scope="request"
+                validate="false">
+           <forward
+                name="success"
+                path="/WEB-INF/jsp/mainlayout.jsp"/>
+            <forward
+                name="back"
+                path="/gnv/back.do"/>
+            <forward
+                name="selectfis"
+                path="/gnv/selectFis.do"/>
+        </action>
+        <action path="/out" 
+                type="de.intevation.gnv.action.DoOutputAction"
+                scope="request"
+                validate="false">
+        </action>
+        <action path="/export" 
+                type="de.intevation.gnv.action.DoExportAction"
+                scope="request"
+                validate="false">
+        </action>
+        <action path="/changeOptions" 
+                type="de.intevation.gnv.action.ChangeOptionsAction"
+                scope="request"
+                validate="false">
+            <forward
+                name="success"
+                path="/WEB-INF/jsp/mainlayout.jsp"/>
+            <forward
+                name="back"
+                path="/gnv/back.do"/>
+            <forward
+                name="selectfis"
+                path="/gnv/selectFis.do"/>
+        </action>
+        <action path="/statistic"
+                type="de.intevation.gnv.action.ShowStatisticAction"
+                scope="request"
+                validate="false">
+            <forward
+                name="back"
+                path="/gnv/back.do"/>
+            <forward
+                name="selectfis"
+                path="/gnv/selectFis.do"/>
+            <forward
+                name="success"
+                path="/WEB-INF/jsp/mainlayout.jsp"/>
+        </action>
+       </action-mappings>
+       
+       <message-resources parameter="applicationMessages" null="false"/>
+</struts-config>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" 
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+                xmlns="http://www.w3.org/2002/xforms" 
+                xmlns:xform="http://www.w3.org/2002/xforms" 
+                xmlns:art="http://www.intevation.de/2009/artifacts"
+                exclude-result-prefixes="xform art">
+
+    <xsl:output
+        method="html" version="1.0" encoding="UTF-8" omit-xml-declaration="no" />
+
+    <xsl:param name="back-url"/>
+    <xsl:param name="selectfis"/>
+    <xsl:param name="edit">bearbeiten</xsl:param>
+
+    <!-- start parsing document -->
+    <xsl:template match="*">
+        <table class="static">
+            <xsl:apply-templates />
+        </table>
+    </xsl:template>
+
+    
+    <!-- match multi select boxes -->
+    <xsl:template match="xform:select">
+        <xsl:variable name="state" select="@art:state" />
+        <tr>
+            <th class="parameter"><xsl:value-of select="xform:label" /></th>
+            <td><xsl:apply-templates select="xform:choices" /></td>
+            <td class="historyback">
+            <!--
+                <xsl:if test="$state != ''">
+                    <a href="{$back-url}?target={$state}">
+                        <img title="{$edit}" alt="{$edit}" src="images/back_button.png"/>
+                    </a>
+                </xsl:if>
+            -->
+            </td>
+        </tr>
+    </xsl:template>
+
+
+    <!-- match select boxes -->
+    <xsl:template match="xform:select1">
+        <xsl:variable name="state" select="@art:state" />
+        <xsl:variable name="fis" select="@art:fis" />
+        <tr>
+            <th class="parameter"><xsl:value-of select="xform:label" /></th>
+            <td><xsl:apply-templates select="xform:choices" /></td>
+            <td class="historyback">
+                <!--
+                <xsl:if test="$state != ''">
+                    <a href="{$back-url}?target={$state}">
+                        <img title="{$edit}" alt="{$edit}" src="images/back_button.png"/>
+                    </a>
+                </xsl:if>
+                -->
+                <xsl:if test="$fis">
+                    <a href="{$selectfis}"><img title="{$edit}" alt="{$edit}" src="images/back_button.png"/></a>
+                </xsl:if>
+            </td>
+        </tr>
+    </xsl:template>
+
+    
+    <!-- match item list of select boxes or multi select boxes -->
+    <xsl:template match="xform:choices">
+        <table class="choices"><xsl:apply-templates select="xform:item" /></table>
+    </xsl:template>
+
+
+    <!-- match item of select boxes or multi select boxes -->
+    <xsl:template match="xform:item">
+        <tr>
+            <td class="value"><xsl:value-of select="xform:label" /></td>
+        </tr>
+    </xsl:template>
+
+
+    <!-- match group items -->
+    <xsl:template match="xform:group">
+        <xsl:variable name="state" select="@art:state" />
+        <tr>
+            <th class="parameter"><xsl:value-of select="xform:label" /></th>
+            <td>
+                <table><xsl:apply-templates select="xform:input" /></table>
+            </td>
+            <td class="historyback">
+                <!--
+                <xsl:if test="$state != ''">
+                    <a href="{$back-url}?target={$state}"><img title="{$edit}" alt="{$edit}" src="images/back_button.png"/></a>
+                </xsl:if>
+                -->
+            </td>
+        </tr>
+    </xsl:template>
+
+
+    <!-- match single group item -->
+    <xsl:template match="xform:input">
+        <tr>
+            <td class="value"><xsl:value-of select="xform:label" />&#160;<xsl:value-of select="xform:value" /></td>
+        </tr>
+    </xsl:template>
+
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/config/templates/describe-ui.xsl	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" 
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+                xmlns="http://www.w3.org/2002/xforms" 
+                xmlns:xform="http://www.w3.org/2002/xforms" 
+                xmlns:art="http://www.intevation.de/2009/artifacts"
+                exclude-result-prefixes="xform art">
+
+    <xsl:output
+        method="html" version="1.0" encoding="UTF-8" omit-xml-declaration="no" />
+
+    <!-- single select -->
+    <xsl:template match="xform:select1">
+        <xsl:variable name="selectName" select="@ref"/>
+        <legend><xsl:value-of select="xform:label"/></legend>
+        <select name="{$selectName}">
+            <xsl:apply-templates />
+        </select>
+    </xsl:template>
+
+
+    <!-- multi select -->
+    <xsl:template match="xform:select">
+        <xsl:variable name="selectName" select="@ref"/>
+        <xsl:variable name="items" select="count(//xform:item)"/>
+
+        <legend><xsl:value-of select="xform:label"/></legend>
+        <xsl:choose>
+            <xsl:when test="$items = 1">
+                <select name="{$selectName}" multiple="multiple" size="{$items}">
+                    <xsl:apply-templates mode="selected"/>
+                </select>
+            </xsl:when>
+            <xsl:when test="$items &lt; 5">
+                <select name="{$selectName}" multiple="multiple" size="{$items}">
+                    <xsl:apply-templates/>
+                </select>
+            </xsl:when>
+            <xsl:otherwise>
+                <select name="{$selectName}" multiple="multiple" size="5">
+                    <xsl:apply-templates />
+                </select>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- options for select -->
+    <xsl:template match="xform:item">
+        <xsl:variable name="optionValue" select="xform:value"/>
+        <xsl:choose>
+            <xsl:when test="@selected = 'true'">
+                <option value="{$optionValue}" selected="selected">
+                    <xsl:value-of select="xform:label"/>
+                </option>
+            </xsl:when>
+            <xsl:otherwise>
+                <option value="{$optionValue}">
+                    <xsl:value-of select="xform:label"/>
+                </option>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <xsl:template match="xform:item" mode="selected">
+        <xsl:variable name="optionValue" select="xform:value"/>
+            <option value="{$optionValue}" selected="selected">
+                <xsl:value-of select="xform:label"/>
+            </option>
+    </xsl:template>
+
+
+
+    <xsl:template match="xform:group">
+        <legend>
+            <xsl:value-of select="xform:label"/>
+        </legend>
+        <table class="dynamic">
+            <xsl:apply-templates/>
+        </table>
+    </xsl:template>
+
+
+    <xsl:template match="xform:input">
+        <xsl:variable name="inputValue" select="xform:value"/>
+        <xsl:variable name="inputName" select="@ref"/>
+        <xsl:variable name="label" select="xform:label"/>
+        
+        <!-- TODO: Remove this when we have the GIS interface. (slt) --> 
+        <xsl:choose>
+            <xsl:when test="$inputName = 'mesh_linestring'">
+                <a href="javascript:copy_demo_wkt_line();"><xsl:text>Beispiel WKT-Linestring einf&#252;gen:</xsl:text></a><br/>
+            </xsl:when>
+            <xsl:when test="$inputName = 'mesh_polygon'">
+                <a href="javascript:copy_demo_wkt_polygon();"><xsl:text>Beispiel WKT-Polygon einf&#252;gen:</xsl:text></a><br/>
+            </xsl:when>
+        </xsl:choose>
+
+        <tr>
+            <xsl:choose>
+                <xsl:when test="$label != ''">
+                    <td><xsl:value-of select="$label"/>:</td>
+               </xsl:when>
+            </xsl:choose>
+
+            <td>
+                <input type="text" id="{$inputName}" name="{$inputName}" value="{$inputValue}" /><br/>
+            </td>
+        </tr>
+    </xsl:template>
+
+
+    <xsl:template match="xform:label">
+        <!-- do nothing here -->
+    </xsl:template>
+
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/footer.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,6 @@
+<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
+<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
+<html:xhtml/>
+<%--div style="clear: left; margin-top: 40px;"/--%>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/header.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,43 @@
+<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java"%>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %>
+<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles"%>
+<% Object exceptionMessage = request.getAttribute(CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID);
+    exceptionMessage = (exceptionMessage != null ? exceptionMessage.toString().replaceAll(" ", ".").replaceAll(":",".").toLowerCase() : null);
+    exceptionMessage = (exceptionMessage != null && exceptionMessage.toString().endsWith(".") ? exceptionMessage.toString().substring(0,exceptionMessage.toString().length()-1) : exceptionMessage);
+    
+%>
+<%@page import="de.intevation.gnv.action.CommunicationKeys"%><html:xhtml />
+<!-- Kopfleiste-->
+<div id="head" title="GDI BSH genericViewer"> 
+	<div id="logo">
+	
+	
+	</div>
+    <h1>
+        <a href="<html:rewrite action="/start"/>">
+            <bean:message key="gnviewer.app.title" />
+        </a>
+    </h1>
+	
+	<div id="project">
+		<label style="font-weight:bold;">
+		         <bean:message key="gnviewer.project.load"/>
+			| 
+			     <bean:message	key="gnviewer.project.save" />
+	 	</label>
+		<div id="project_load">
+			
+		</div>
+		<br/>
+		
+	</div>
+	<div class="errormsg" id="load_error">
+         <%if (exceptionMessage != null){ %>
+            <bean-el:message key="<%=exceptionMessage.toString()%>"/>
+         <%}%>
+     </div>
+</div>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_adons_inc.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,5 @@
+<div id="diagramoptions">
+    <%--
+    <jsp:include page="/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp"></jsp:include>
+    --%>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,46 @@
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.DiagrammOptions"%>
+<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%>
+<%@page import="java.util.Collection"%>
+<%@page import="java.util.Iterator"%>
+<%@page import="java.net.URLEncoder"%>
+<%
+    // fetch diagramm parameter from request if the user clicked 'draw'
+    Object diagramm = request.getAttribute("diagramm");
+    SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request);
+
+    String target          = "chart"; 
+    String mimeType        = null;
+    String parameterString = "";
+
+    boolean supportChart = sm.getOutputMode(target) != null;
+
+    if (supportChart){
+       mimeType                        = sm.getOutputMode(target).getMimeType();
+       DiagrammOptions diagrammOptions = sm.getDiagrammOptions();
+       Collection<OutputParameter> op  = sm.getOutputMode(target).getOutputParameters();
+
+       if (op != null){
+           Iterator<OutputParameter> it = op.iterator();
+           while (it.hasNext()){
+               OutputParameter parameter = it.next(); 
+               parameterString = parameterString +"&amp;"+parameter.getName()+"="+(diagrammOptions != null ? diagrammOptions.getValue(parameter.getName()): parameter.getValue());
+           }
+       }
+    }
+%> 
+
+<%-- show chart options if output mode 'chart' is supported --%>
+<% if (supportChart) { %>
+    <jsp:include page="/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp"></jsp:include>
+<%}%>
+
+<%-- diagramm is not null if the user clicked the 'draw' button --%>
+<%if (diagramm != null) { %>
+    <div id="diagram">
+        <img src='<%=response.encodeURL("out.do?mimetype="+mimeType+"&amp;target="+target+parameterString+"&amp;uid="+System.currentTimeMillis())%>' alt='<bean:message key="gnviewer.output.options.diagramm.alt"/>'/>
+        <br/>
+    </div>
+<%}%>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,51 @@
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %>
+<%@page import="de.intevation.gnv.action.sessionmodel.DiagrammOptions"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%>
+<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputMode"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%>
+<%@page import="java.util.Collection"%>
+<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%>
+<%@page import="java.util.Iterator"%>
+<%
+  SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request);
+  DiagrammOptions diagrammOptions = sm.getDiagrammOptions();
+  boolean useDiagrammOptions = diagrammOptions != null;
+  String target = "chart";
+  OutputMode outputMode = sm.getOutputMode(target);
+%>
+<div id="diagramOptionsContent">
+    <fieldset>
+        <legend onmousedown="displayDiv('diagramOptionsContent');" class="expandableFieldset">
+           <bean:message key="gnviewer.diagram.options.header.title"/>
+        </legend>
+        <form id="outputOptionsForm" method="post" action="<%=response.encodeURL("changeOptions.do")%>">
+           <table>
+           <%if (outputMode != null && outputMode.getOutputParameters() != null && !outputMode.getOutputParameters().isEmpty()){
+               Iterator<OutputParameter> it = outputMode.getOutputParameters().iterator();
+               while (it.hasNext()){
+                   OutputParameter om = it.next(); %>
+               <tr>
+                  <td>
+                      <bean-el:message key="<%=om.getName()%>"/>
+                  </td>
+                  <td>
+                      <%if (om.getType().equalsIgnoreCase("boolean")){
+                          boolean checked = useDiagrammOptions ? "true".equalsIgnoreCase(diagrammOptions.getValue(om.getName())) : om.getValue().equalsIgnoreCase("true");
+                      %>
+                            <input type="checkbox" 
+                                   name="<%=om.getName() %>" 
+                                   <%=checked ? " value=\"true\" checked=\"checked\"": "" %>/>
+                      <%}else{%>
+                            <input type="text" name="<%=om.getName() %>" value="<%=useDiagrammOptions ? diagrammOptions.getValue(om.getName()): om.getValue()%>"/>
+                      <%}%>
+                  </td>
+              </tr>
+           <%}%>
+           </table>
+           <input type="hidden" name="target" value="<%=target%>"/>
+           <input type="submit" value="<bean:message key="gnviewer.draw.button"/>"/>
+           <%}%>
+        </form>
+    </fieldset>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,43 @@
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%>
+<%@page import="java.util.Collection"%>
+<%@page import="de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticValue"%>
+<%@page import="java.util.Iterator"%>
+<%@page import="de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet"%>
+<div class="statistics">
+<%
+    SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request);
+    Collection<ArtifactStatisticsSet> statistics = sm.getStatistics();
+%>
+  <fieldset>
+      <legend class="expandableFieldset">
+            <bean:message key="gnviewer.statistics.header.title"/>
+        </legend>
+        <%if (statistics != null){
+            Iterator<ArtifactStatisticsSet> it = statistics.iterator();
+            while (it.hasNext()){
+                ArtifactStatisticsSet set = it.next(); 
+        %>
+            <h1><%=set.getName()%></h1>
+            <table class="statistics">
+              <tr>
+                  <th><bean:message key="gnviewer.statistics.table.header.param"/></th>
+                  <th><bean:message key="gnviewer.statistics.table.header.value"/></th>
+              </tr>
+              <% 
+                Iterator<ArtifactStatisticValue> sit = set.getStatisticValues().iterator();
+                while (sit.hasNext()){
+                    ArtifactStatisticValue asv = sit.next(); 
+              %>
+                  <tr>
+                      <td><bean-el:message key="<%=asv.getKey()%>"/></td>
+                      <td><%=asv.getValue()%></td>
+                  </tr>
+                <%}%>
+            </table>
+            <%} %>
+        <%}%>
+    </fieldset>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,124 @@
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.DiagrammOptions"%>
+<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%>
+<%@page import="java.util.Collection"%>
+<%@page import="java.util.Iterator"%>
+<%@page import="java.net.URLEncoder"%>
+<%
+    SessionModel sm        = SessionModelFactory.getInstance().getSessionModel(request);
+    String mimeType        = null;
+    String parameterString = "";
+
+    String target    = "chart";
+    String targetCSV = "csv";
+    String targetODV = "odv";
+    String targetPDF = "pdf";
+    String targetSVG = "svg";
+    String targetZIP = "zip";
+    String targetWMS = "wms";
+    String targetSta = "statistics";
+
+    boolean supportChart = sm.getOutputMode(target)    != null;
+    boolean supportCSV   = sm.getOutputMode(targetCSV) != null;
+    boolean supportODV   = sm.getOutputMode(targetODV) != null;
+    boolean supportPDF   = sm.getOutputMode(targetPDF) != null;
+    boolean supportSVG   = sm.getOutputMode(targetSVG) != null;
+    boolean supportZIP   = sm.getOutputMode(targetZIP) != null;
+    boolean supportWMS   = sm.getOutputMode(targetWMS) != null;
+    boolean supportSta   = sm.getOutputMode(targetSta) != null;
+
+    if (supportChart){
+        mimeType = sm.getOutputMode(target).getMimeType();
+        DiagrammOptions diagrammOptions = sm.getDiagrammOptions();
+        Collection<OutputParameter> op  = sm.getOutputMode(target).getOutputParameters();
+
+       if (op != null){
+           Iterator<OutputParameter> it = op.iterator();
+           while (it.hasNext()){
+               OutputParameter parameter = it.next(); 
+               parameterString = parameterString +"&amp;"+parameter.getName()+"="+(diagrammOptions != null ? diagrammOptions.getValue(parameter.getName()): parameter.getValue());
+           }
+       }
+    }
+
+    String mimeTypePDF = null;
+    if (supportPDF) {
+       mimeTypePDF = sm.getOutputMode(targetPDF).getMimeType();
+    }
+    String mimeTypeSVG = null;
+    if (supportSVG) {
+        mimeTypeSVG = sm.getOutputMode(targetSVG).getMimeType();
+        mimeTypeSVG = URLEncoder.encode(mimeTypeSVG, "UTF-8");
+    }
+    String mimeTypeCSV = null;
+    if (supportCSV){
+        mimeTypeCSV = sm.getOutputMode(targetCSV).getMimeType();
+    }
+
+    String mimeTypeODV = null;
+    if (supportODV){
+        mimeTypeODV = sm.getOutputMode(targetODV).getMimeType();
+    }
+
+    String mimeTypeZIP = null;
+    if (supportZIP) {
+        mimeTypeZIP = sm.getOutputMode(targetZIP).getMimeType();
+    }
+
+    String mimeTypeWMS = null;
+    if (supportWMS) {
+        mimeTypeWMS = sm.getOutputMode(targetWMS).getMimeType();
+    }
+%>
+
+<%-- display export options if one is supported in this state --%>
+<% if (supportPDF || supportSVG || supportCSV || supportODV || supportWMS || supportZIP) { %>
+    <div id="export">
+        <fieldset>
+            <legend><bean:message key="gnviewer.export.fieldset.title"/></legend>
+            <%if (supportChart) { %>
+            <a href="<%=response.encodeURL("export.do?mimetype="+mimeType+"&amp;target="+target+parameterString+"&amp;uid="+System.currentTimeMillis())%>" title="<bean:message key="gnviewer.output.options.save.title"/>">
+                <img src="images/diagram_export.png" border="0"/>
+            </a>
+            <%}%>
+            <%if (supportPDF) { %>
+            <a href="<%=response.encodeURL("export.do?mimetype="+mimeTypePDF+"&amp;target="+targetPDF+parameterString+"&amp;uid="+System.currentTimeMillis())%>" title="<bean:message key="gnviewer.output.options.export.pdf.title"/>">
+                <img src="images/pdf.png" border="0"/>
+            </a>
+            <%}%>
+            <%if (supportSVG) { %>
+            <a href="<%=response.encodeURL("export.do?mimetype="+mimeTypeSVG+"&amp;target="+targetSVG+parameterString+"&amp;uid="+System.currentTimeMillis())%>" title="<bean:message key="gnviewer.output.options.export.svg.title"/>">
+                <img src="images/svg.png" border="0"/>
+            </a>
+            <%}%>
+            <%if (supportCSV) { %>
+            <a href="<%=response.encodeURL("export.do?mimetype="+mimeTypeCSV+"&amp;target="+targetCSV+"&amp;uid="+System.currentTimeMillis())%>" title="<bean:message key="gnviewer.output.options.export.csv.title"/>">
+                <img src="images/data_export.png" border="0"/>
+            </a>
+            <%}%>
+            <%if (supportODV) { %>
+            <a href="<%=response.encodeURL("export.do?mimetype="+mimeTypeODV+"&amp;target="+targetODV+"&amp;uid="+System.currentTimeMillis())%>" title="<bean:message key="gnviewer.output.options.export.odv.title"/>">
+                <img src="images/data_export.png" border="0"/>
+            </a>
+            <%}%>
+            <%if (supportWMS) { %>
+            <a href="<%=response.encodeURL("export.do?mimetype="+mimeTypeWMS+"&amp;target="+targetWMS+"&amp;uid="+System.currentTimeMillis())%>" title="<bean:message key="gnviewer.output.options.export.wms.title"/>">
+                <img src="images/map_go.png" border="0"/>
+            </a>
+            <%}%>
+            <%if (supportZIP) { %>
+            <a href="<%=response.encodeURL("export.do?mimetype="+mimeTypeZIP+"&amp;target="+targetZIP+"&amp;uid="+System.currentTimeMillis())%>" title="<bean:message key="gnviewer.output.options.export.zip.title"/>">
+                <img src="images/disk.png" border="0"/>
+            </a>
+            <%}%>
+
+            <%if (supportSta) { %>
+                <a href="<%=response.encodeURL("statistic.do")%>" title="<bean:message key="gnviewer.statistic.button"/>">
+                    <img src="images/statistics.png" border="0"/>
+                </a>
+            <%}%>
+        </fieldset>
+    </div>
+<%}%>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,31 @@
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%>
+<%@page import="java.util.Collection"%>
+<%@page import="de.intevation.gnv.artifactdatabase.objects.ArtifactObject"%>
+<%@page import="java.util.Iterator"%>
+<%
+  SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request);
+  Collection<ArtifactObject> artifactFactories = sm.getArtifactFactories();
+  String prefix = "gnviewer.fis.";
+%>
+<div id="basefilter">
+    <form id="fisSelectionForm" action="<%=response.encodeURL("selectArtifactFactory.do")%>" method="post">
+       <fieldset>
+            <legend><bean:message key="gnviewer.productselection.fisselection.title"/></legend>
+      <%if (artifactFactories != null){%>
+           
+           <select name="artifactFactory">
+           <%Iterator<ArtifactObject> it = artifactFactories.iterator();
+           while (it.hasNext()){
+                ArtifactObject ao = it.next();%>
+                <option value="<%=ao.getId()%>" <%=(ao.isSelected() ? "selected=\"selected\"" : "")%> ><bean-el:message key="<%=(prefix+ao.getName())%>"/></option>
+           <%}%>
+           </select>
+    <%}%>
+           <br/>
+           <input type="submit" value="<bean:message key="gnviewer.select.button"/>" />
+        </fieldset>
+    </form>
+</div>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/index.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,54 @@
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
+<%@page import="java.util.Collection"%>
+<%@page import="de.intevation.gnv.artifactdatabase.objects.ArtifactObject"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%>
+<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%>
+<%@page import="java.util.Iterator"%>
+<%  Object ui              = request.getAttribute("ui");
+    Object staticui        = request.getAttribute("staticui");
+    Object statistic       = request.getAttribute("statistic");
+    boolean furthertargets = true;
+      
+    Object furthertargetsObject = request.getAttribute("furthertargets");
+    if (furthertargetsObject != null){
+        furthertargets = ((Boolean)furthertargetsObject).booleanValue();
+    }
+%>
+    <div>
+    <%if (staticui == null){ %>
+        <jsp:include page="includes/display_fis_inc.jsp"></jsp:include>
+    <%} else {%>
+        <div class="down">
+            <fieldset>
+                <legend><bean:message key="gnviewer.history.title"/></legend>
+                <%=staticui.toString()%>
+            </fieldset>
+        </div>
+    <%}%>
+    
+    <%-- render the dynamic part to feed the state and advance to the next state --%>
+    <%if (ui != null){%>
+        <div id="timeseriesfilter">
+            <form id="fisSelectionForm" onsubmit="displayOverlay()" action="<%=response.encodeURL("next.do")%>" method="post">
+               <fieldset>
+                <%=ui != null ? ui.toString().replaceAll("&nbsp;", "") : "" %>
+               
+                <%if(furthertargets){%>
+                <input type="submit" value="<bean:message key="gnviewer.select.button"/>"/>
+                <%}%>
+                </fieldset>
+            </form>
+        </div>
+    <%}%>
+    </div>
+
+    <%-- render chart options if existing for this state --%>
+    <jsp:include page="includes/display_diagramm_inc.jsp"></jsp:include>
+
+    <%-- render export options if existing for this state --%>
+    <jsp:include page="includes/display_export_inc.jsp"></jsp:include>
+
+    <%-- render statistic --%>
+    <%if (statistic != null) {%>
+        <jsp:include page="includes/display_diagramm_statistics_inc.jsp"></jsp:include>
+    <%}%>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/mainlayout.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>
+            <bean:message key="gnviewer.app.title"/>
+        </title>
+        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
+        <meta http-equiv="Content-Script-Type" content="text/javascript"/>
+        <meta http-equiv="Content-Style-Type" content="text/css"/>
+        <meta http-equiv="Expires" content="Mon, 01 Jan 1990 00:00:01 GMT"/>
+        <meta http-equiv="pragma" content="no-cache"/>
+        <meta http-equiv="cache-control" content="no-cache"/>
+        <meta name="robots" content="noindex"/>
+        <link href="styles/default.css" rel="stylesheet" type="text/css"/>
+        <script type="text/javascript" src="scripts/gnviewer.js"></script>
+        <script type="text/javascript">
+            function copy_demo_wkt_line() {
+              document.getElementById('mesh_linestring').value =
+              "LINESTRING (" +
+              "0.4911 56.2489, " +
+              "10.4464 58.1608, " +
+              "12.2321 56.4127, " +
+              "13.1250 54.8832, " +
+              "15.4018 54.5008, " +
+              "19.6875 56.4127, " +
+              "20.6250 59.0349, " +
+              "28.1250 60.2640)";
+            }
+            function copy_demo_wkt_polygon() {
+              document.getElementById('mesh_polygon').value =
+"POLYGON ((" +
+"-1.5763 58.3616, " +
+" 0.7526 53.8428, " +
+" 4.2686 53.1972, " +
+" 7.9217 54.1441, " +
+" 7.6020 56.2959, " +
+"11.5747 57.2857, " +
+"10.4788 58.4908, " +
+" 4.2686 58.8996, " +
+" 0.0219 58.5768, " +
+"-1.5763 58.3616))";
+            }
+        </script>
+    </head>
+
+    <body id="gnviewerbody">
+    <div id="overlay"></div>
+    <div style="width:100%;left:0;top:0;width:100%;height:100%;position:absolute">
+        <div id="overlayContent">
+            <p>
+                <bean:message key="gnviewer.productselection.overlay.title"/>
+            </p>
+        </div>
+    </div>
+    <div id="page">
+        <jsp:include page="header.jsp" />
+         <jsp:include page="index.jsp" />
+        <jsp:include page="footer.jsp" />
+    </div>
+    </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/jsp/version.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
+<html xhtml="true" locale="true">
+    <head>
+        <title>
+            <bean:message key="gnviewer.app.title"/>
+        </title>
+        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
+        <meta http-equiv="Content-Script-Type" content="text/javascript"/>
+        <meta http-equiv="Content-Style-Type" content="text/css"/>
+        <meta http-equiv="Expires" content="Mon, 01 Jan 1990 00:00:01 GMT"/>
+        <meta http-equiv="pragma" content="no-cache"/>
+        <meta http-equiv="cache-control" content="no-cache"/>
+        <meta name="robots" content="noindex"/>
+        <link href="styles/default.css" rel="stylesheet" type="text/css"/>
+        <script type="text/javascript" src="scripts/gnviewer.js"></script>
+    </head>
+
+    <body id="gnviewerbody">
+    <div id="overlay"></div>
+    <div style="width:100%;left:0;top:0;width:100%;height:100%;position:absolute">
+        <div id="overlayContent">
+            <p>
+                <bean:message key="gnviewer.productselection.overlay.title"/>
+            </p>
+        </div>
+    </div>
+    <div id="page">
+        <jsp:include page="header.jsp" />
+         <div id="basefilter">
+           <br/>
+           <h1> Generischer Viewer </h1>
+           <b>Name:</b>    <bean:message key="application.name"/><br/>
+           <b>Version:</b> <bean:message key="application.version"/><br/>
+           <b>Date:</b>    <bean:message key="application.releasedate"/><br/>
+           <h1> Artifaktdatenbank </h1>
+           <b>Name:</b>    N/N<br/>
+           <b>Version:</b> N/N<br/>
+           <b>Date:</b>    N/N<br/>
+         </div>
+        <jsp:include page="footer.jsp" />
+    </div>
+    </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/WEB-INF/web.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,52 @@
+<!DOCTYPE web-app PUBLIC
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd" >
+
+<web-app>
+  <display-name>Archetype Created Web Application</display-name>
+  <servlet>
+        <servlet-name>action</servlet-name>
+        <servlet-class>de.intevation.gnv.servlet.GNVActionServlet</servlet-class>
+        
+        <!--  The Struts Configuration, relative to the Project-Folder,
+              which should be used to configure this Project.  -->
+        <init-param>
+            <param-name>config</param-name>
+            <param-value>/WEB-INF/config/struts-config.xml</param-value>
+        </init-param>
+        
+        <!--  The Log4J Configuration, relative to the Project-Folder,
+              which should be used in this Project.  -->
+        <init-param>
+            <param-name>de.intevation.gnv.servlet.log4j.configuration</param-name>
+            <param-value>WEB-INF/config/log4j.properties</param-value>
+        </init-param>
+        
+        <!--  The Number of ArtifacDatabases which are configured in this Document. -->
+        <init-param>
+            <param-name>de.intevation.gnv.artifactdatabase.client.ArtifactDatabase.count</param-name>
+            <param-value>1</param-value>
+        </init-param>
+        
+        <!--  One URL to an ArtifactDatabase which should be used in this Project.
+              It is possible to define several Artifactdatabases according to the
+              Number which is configured above. It is necessary to change the Count
+              - Number in param-name - for each Artifactdatabase.
+              The first one must be 1 -->
+         <init-param>
+            <param-name>de.intevation.gnv.artifactdatabase.client.ArtifactDatabase.url.1</param-name>
+            <param-value>http://localhost:8181</param-value>
+        </init-param>
+        
+        <!--  Load the Servlet once on Systemstartup. 
+              This should be done to configure the GNV at startup
+              and not if the first user will call a Page. -->
+        <load-on-startup>1</load-on-startup>
+        
+    </servlet>
+    <!-- Standard Action Servlet Mapping -->
+    <servlet-mapping>
+        <servlet-name>action</servlet-name>
+        <url-pattern>*.do</url-pattern>
+    </servlet-mapping>
+</web-app>
Binary file gnv/src/main/webapp/images/back_button.png has changed
Binary file gnv/src/main/webapp/images/bg_fieldset.gif has changed
Binary file gnv/src/main/webapp/images/bg_fieldset_ie6.gif has changed
Binary file gnv/src/main/webapp/images/bsh_logo.gif has changed
Binary file gnv/src/main/webapp/images/data_export.png has changed
Binary file gnv/src/main/webapp/images/diagram_export.png has changed
Binary file gnv/src/main/webapp/images/disk.png has changed
Binary file gnv/src/main/webapp/images/img.gif has changed
Binary file gnv/src/main/webapp/images/list-item.gif has changed
Binary file gnv/src/main/webapp/images/map_go.png has changed
Binary file gnv/src/main/webapp/images/pdf.png has changed
Binary file gnv/src/main/webapp/images/statistics.png has changed
Binary file gnv/src/main/webapp/images/stock_data-save.png has changed
Binary file gnv/src/main/webapp/images/svg.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/index.jsp	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,2 @@
+<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
+<logic:redirect forward="entrance"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/scripts/calendar-de.js	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,129 @@
+// ** I18N
+
+// Calendar DE language
+// Author: Jack (tR), <jack@jtr.de>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sonntag",
+ "Montag",
+ "Dienstag",
+ "Mittwoch",
+ "Donnerstag",
+ "Freitag",
+ "Samstag",
+ "Sonntag");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("So",
+ "Mo",
+ "Di",
+ "Mi",
+ "Do",
+ "Fr",
+ "Sa",
+ "So");
+ 
+ // First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+ 
+
+// full month names
+Calendar._MN = new Array
+("Januar",
+ "Februar",
+ "M\u00e4rz",
+ "April",
+ "Mai",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "Dezember");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "M\u00e4r",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dez");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "\u00DCber dieses Kalendarmodul";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Datum ausw\u00e4hlen:\n" +
+"- Benutzen Sie die \xab, \xbb Buttons um das Jahr zu w\u00e4hlen\n" +
+"- Benutzen Sie die " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " Buttons um den Monat zu w\u00e4hlen\n" +
+"- F\u00fcr eine Schnellauswahl halten Sie die Maustaste \u00fcber diesen Buttons fest.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Zeit ausw\u00e4hlen:\n" +
+"- Klicken Sie auf die Teile der Uhrzeit, um diese zu erh\u00F6hen\n" +
+"- oder klicken Sie mit festgehaltener Shift-Taste um diese zu verringern\n" +
+"- oder klicken und festhalten f\u00fcr Schnellauswahl.";
+
+Calendar._TT["TOGGLE"] = "Ersten Tag der Woche w\u00e4hlen";
+Calendar._TT["PREV_YEAR"] = "Voriges Jahr (Festhalten f\u00fcr Schnellauswahl)";
+Calendar._TT["PREV_MONTH"] = "Voriger Monat (Festhalten f\u00fcr Schnellauswahl)";
+Calendar._TT["GO_TODAY"] = "Heute ausw\u00e4hlen";
+Calendar._TT["NEXT_MONTH"] = "N\u00e4chst. Monat (Festhalten f\u00fcr Schnellauswahl)";
+Calendar._TT["NEXT_YEAR"] = "N\u00e4chst. Jahr (Festhalten f\u00fcr Schnellauswahl)";
+Calendar._TT["SEL_DATE"] = "Datum ausw\u00e4hlen";
+Calendar._TT["DRAG_TO_MOVE"] = "Zum Bewegen festhalten";
+Calendar._TT["PART_TODAY"] = " (Heute)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Woche beginnt mit %s ";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Schlie\u00dfen";
+Calendar._TT["TODAY"] = "Heute";
+Calendar._TT["TIME_PART"] = "(Shift-)Klick oder Festhalten und Ziehen um den Wert zu \u00e4ndern";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Zeit:";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/scripts/calendar-en.js	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+ "Sunday");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat",
+ "Sun");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "About the calendar";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
+Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
+Calendar._TT["GO_TODAY"] = "Go Today";
+Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
+Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
+Calendar._TT["SEL_DATE"] = "Select date";
+Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
+Calendar._TT["PART_TODAY"] = " (today)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Close";
+Calendar._TT["TODAY"] = "Today";
+Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Time:";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/scripts/calendar-setup.js	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,200 @@
+/*  Copyright Mihai Bazon, 2002, 2003  |  http://dynarch.com/mishoo/
+ * ---------------------------------------------------------------------------
+ *
+ * The DHTML Calendar
+ *
+ * Details and latest version at:
+ * http://dynarch.com/mishoo/calendar.epl
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ *
+ * This file defines helper functions for setting up the calendar.  They are
+ * intended to help non-programmers get a working calendar on their site
+ * quickly.  This script should not be seen as part of the calendar.  It just
+ * shows you what one can do with the calendar, while in the same time
+ * providing a quick and simple method for setting it up.  If you need
+ * exhaustive customization of the calendar creation process feel free to
+ * modify this code to suit your needs (this is recommended and much better
+ * than modifying calendar.js itself).
+ */
+
+// $Id: calendar-setup.js,v 1.1 2007/12/06 13:55:16 drewnak Exp $
+
+/**
+ *  This function "patches" an input field (or other element) to use a calendar
+ *  widget for date selection.
+ *
+ *  The "params" is a single object that can have the following properties:
+ *
+ *    prop. name   | description
+ *  -------------------------------------------------------------------------------------------------
+ *   inputField    | the ID of an input field to store the date
+ *   displayArea   | the ID of a DIV or other element to show the date
+ *   button        | ID of a button or other element that will trigger the calendar
+ *   eventName     | event that will trigger the calendar, without the "on" prefix (default: "click")
+ *   ifFormat      | date format that will be stored in the input field
+ *   daFormat      | the date format that will be used to display the date in displayArea
+ *   singleClick   | (true/false) wether the calendar is in single click mode or not (default: true)
+ *   firstDay      | numeric: 0 to 6.  "0" means display Sunday first, "1" means display Monday first, etc.
+ *   align         | alignment (default: "Br"); if you don't know what's this see the calendar documentation
+ *   range         | array with 2 elements.  Default: [1900, 2999] -- the range of years available
+ *   weekNumbers   | (true/false) if it's true (default) the calendar will display week numbers
+ *   flat          | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID
+ *   flatCallback  | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar)
+ *   disableFunc   | function that receives a JS Date object and should return true if that date has to be disabled in the calendar
+ *   onSelect      | function that gets called when a date is selected.  You don't _have_ to supply this (the default is generally okay)
+ *   onClose       | function that gets called when the calendar is closed.  [default]
+ *   onUpdate      | function that gets called after the date is updated in the input field.  Receives a reference to the calendar.
+ *   date          | the date that the calendar will be initially displayed to
+ *   showsTime     | default: false; if true the calendar will include a time selector
+ *   timeFormat    | the time format; can be "12" or "24", default is "12"
+ *   electric      | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close
+ *   step          | configures the step of the years in drop-down boxes; default: 2
+ *   position      | configures the calendar absolute position; default: null
+ *   cache         | if "true" (but default: "false") it will reuse the same calendar object, where possible
+ *   showOthers    | if "true" (but default: "false") it will show days from other months too
+ *
+ *  None of them is required, they all have default values.  However, if you
+ *  pass none of "inputField", "displayArea" or "button" you'll get a warning
+ *  saying "nothing to setup".
+ */
+Calendar.setup = function (params) {
+	function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };
+
+	param_default("inputField",     null);
+	param_default("displayArea",    null);
+	param_default("button",         null);
+	param_default("eventName",      "click");
+	param_default("ifFormat",       "%Y/%m/%d");
+	param_default("daFormat",       "%Y/%m/%d");
+	param_default("singleClick",    true);
+	param_default("disableFunc",    null);
+	param_default("dateStatusFunc", params["disableFunc"]);	// takes precedence if both are defined
+	param_default("dateText",       null);
+	param_default("firstDay",       null);
+	param_default("align",          "Br");
+	param_default("range",          [1900, 2999]);
+	param_default("weekNumbers",    true);
+	param_default("flat",           null);
+	param_default("flatCallback",   null);
+	param_default("onSelect",       null);
+	param_default("onClose",        null);
+	param_default("onUpdate",       null);
+	param_default("date",           null);
+	param_default("showsTime",      false);
+	param_default("timeFormat",     "24");
+	param_default("electric",       true);
+	param_default("step",           2);
+	param_default("position",       null);
+	param_default("cache",          false);
+	param_default("showOthers",     false);
+	param_default("multiple",       null);
+
+	var tmp = ["inputField", "displayArea", "button"];
+	for (var i in tmp) {
+		if (typeof params[tmp[i]] == "string") {
+			params[tmp[i]] = document.getElementById(params[tmp[i]]);
+		}
+	}
+	if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) {
+		alert("Calendar.setup:\n  Nothing to setup (no fields found).  Please check your code");
+		return false;
+	}
+
+	function onSelect(cal) {
+		var p = cal.params;
+		var update = (cal.dateClicked || p.electric);
+		if (update && p.inputField) {
+			p.inputField.value = cal.date.print(p.ifFormat);
+			if (typeof p.inputField.onchange == "function")
+				p.inputField.onchange();
+		}
+		if (update && p.displayArea)
+			p.displayArea.innerHTML = cal.date.print(p.daFormat);
+		if (update && typeof p.onUpdate == "function")
+			p.onUpdate(cal);
+		if (update && p.flat) {
+			if (typeof p.flatCallback == "function")
+				p.flatCallback(cal);
+		}
+		if (update && p.singleClick && cal.dateClicked)
+			cal.callCloseHandler();
+	};
+
+	if (params.flat != null) {
+		if (typeof params.flat == "string")
+			params.flat = document.getElementById(params.flat);
+		if (!params.flat) {
+			alert("Calendar.setup:\n  Flat specified but can't find parent.");
+			return false;
+		}
+		var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect);
+		cal.showsOtherMonths = params.showOthers;
+		cal.showsTime = params.showsTime;
+		cal.time24 = (params.timeFormat == "24");
+		cal.params = params;
+		cal.weekNumbers = params.weekNumbers;
+		cal.setRange(params.range[0], params.range[1]);
+		cal.setDateStatusHandler(params.dateStatusFunc);
+		cal.getDateText = params.dateText;
+		if (params.ifFormat) {
+			cal.setDateFormat(params.ifFormat);
+		}
+		if (params.inputField && typeof params.inputField.value == "string") {
+			cal.parseDate(params.inputField.value);
+		}
+		cal.create(params.flat);
+		cal.show();
+		return false;
+	}
+
+	var triggerEl = params.button || params.displayArea || params.inputField;
+	triggerEl["on" + params.eventName] = function() {
+		var dateEl = params.inputField || params.displayArea;
+		var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
+		var mustCreate = false;
+		var cal = window.calendar;
+		if (dateEl)
+			params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
+		if (!(cal && params.cache)) {
+			window.calendar = cal = new Calendar(params.firstDay,
+							     params.date,
+							     params.onSelect || onSelect,
+							     params.onClose || function(cal) { cal.hide(); });
+			cal.showsTime = params.showsTime;
+			cal.time24 = (params.timeFormat == "24");
+			cal.weekNumbers = params.weekNumbers;
+			mustCreate = true;
+		} else {
+			if (params.date)
+				cal.setDate(params.date);
+			cal.hide();
+		}
+		if (params.multiple) {
+			cal.multiple = {};
+			for (var i = params.multiple.length; --i >= 0;) {
+				var d = params.multiple[i];
+				var ds = d.print("%Y%m%d");
+				cal.multiple[ds] = d;
+			}
+		}
+		cal.showsOtherMonths = params.showOthers;
+		cal.yearStep = params.step;
+		cal.setRange(params.range[0], params.range[1]);
+		cal.params = params;
+		cal.setDateStatusHandler(params.dateStatusFunc);
+		cal.getDateText = params.dateText;
+		cal.setDateFormat(dateFmt);
+		if (mustCreate)
+			cal.create();
+		cal.refresh();
+		if (!params.position)
+			cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
+		else
+			cal.showAt(params.position[0], params.position[1]);
+		return false;
+	};
+
+	return cal;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/scripts/calendar-setup_stripped.js	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,21 @@
+/*  Copyright Mihai Bazon, 2002, 2003  |  http://dynarch.com/mishoo/
+ * ---------------------------------------------------------------------------
+ *
+ * The DHTML Calendar
+ *
+ * Details and latest version at:
+ * http://dynarch.com/mishoo/calendar.epl
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ *
+ * This file defines helper functions for setting up the calendar.  They are
+ * intended to help non-programmers get a working calendar on their site
+ * quickly.  This script should not be seen as part of the calendar.  It just
+ * shows you what one can do with the calendar, while in the same time
+ * providing a quick and simple method for setting it up.  If you need
+ * exhaustive customization of the calendar creation process feel free to
+ * modify this code to suit your needs (this is recommended and much better
+ * than modifying calendar.js itself).
+ */
+ Calendar.setup=function(params){function param_default(pname,def){if(typeof params[pname]=="undefined"){params[pname]=def;}};param_default("inputField",null);param_default("displayArea",null);param_default("button",null);param_default("eventName","click");param_default("ifFormat","%Y/%m/%d");param_default("daFormat","%Y/%m/%d");param_default("singleClick",true);param_default("disableFunc",null);param_default("dateStatusFunc",params["disableFunc"]);param_default("dateText",null);param_default("firstDay",null);param_default("align","Br");param_default("range",[1900,2999]);param_default("weekNumbers",true);param_default("flat",null);param_default("flatCallback",null);param_default("onSelect",null);param_default("onClose",null);param_default("onUpdate",null);param_default("date",null);param_default("showsTime",false);param_default("timeFormat","24");param_default("electric",true);param_default("step",2);param_default("position",null);param_default("cache",false);param_default("showOthers",false);param_default("multiple",null);var tmp=["inputField","displayArea","button"];for(var i in tmp){if(typeof params[tmp[i]]=="string"){params[tmp[i]]=document.getElementById(params[tmp[i]]);}}if(!(params.flat||params.multiple||params.inputField||params.displayArea||params.button)){alert("Calendar.setup:\n  Nothing to setup (no fields found).  Please check your code");return false;}function onSelect(cal){var p=cal.params;var update=(cal.dateClicked||p.electric);if(update&&p.inputField){p.inputField.value=cal.date.print(p.ifFormat);if(typeof p.inputField.onchange=="function")p.inputField.onchange();}if(update&&p.displayArea)p.displayArea.innerHTML=cal.date.print(p.daFormat);if(update&&typeof p.onUpdate=="function")p.onUpdate(cal);if(update&&p.flat){if(typeof p.flatCallback=="function")p.flatCallback(cal);}if(update&&p.singleClick&&cal.dateClicked)cal.callCloseHandler();};if(params.flat!=null){if(typeof params.flat=="string")params.flat=document.getElementById(params.flat);if(!params.flat){alert("Calendar.setup:\n  Flat specified but can't find parent.");return false;}var cal=new Calendar(params.firstDay,params.date,params.onSelect||onSelect);cal.showsOtherMonths=params.showOthers;cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.params=params;cal.weekNumbers=params.weekNumbers;cal.setRange(params.range[0],params.range[1]);cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;if(params.ifFormat){cal.setDateFormat(params.ifFormat);}if(params.inputField&&typeof params.inputField.value=="string"){cal.parseDate(params.inputField.value);}cal.create(params.flat);cal.show();return false;}var triggerEl=params.button||params.displayArea||params.inputField;triggerEl["on"+params.eventName]=function(){var dateEl=params.inputField||params.displayArea;var dateFmt=params.inputField?params.ifFormat:params.daFormat;var mustCreate=false;var cal=window.calendar;if(dateEl)params.date=Date.parseDate(dateEl.value||dateEl.innerHTML,dateFmt);if(!(cal&&params.cache)){window.calendar=cal=new Calendar(params.firstDay,params.date,params.onSelect||onSelect,params.onClose||function(cal){cal.hide();});cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.weekNumbers=params.weekNumbers;mustCreate=true;}else{if(params.date)cal.setDate(params.date);cal.hide();}if(params.multiple){cal.multiple={};for(var i=params.multiple.length;--i>=0;){var d=params.multiple[i];var ds=d.print("%Y%m%d");cal.multiple[ds]=d;}}cal.showsOtherMonths=params.showOthers;cal.yearStep=params.step;cal.setRange(params.range[0],params.range[1]);cal.params=params;cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;cal.setDateFormat(dateFmt);if(mustCreate)cal.create();cal.refresh();if(!params.position)cal.showAtElement(params.button||params.displayArea||params.inputField,params.align);else cal.showAt(params.position[0],params.position[1]);return false;};return cal;};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/scripts/calendar.js	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,1806 @@
+/*  Copyright Mihai Bazon, 2002-2005  |  www.bazon.net/mishoo
+ * -----------------------------------------------------------
+ *
+ * The DHTML Calendar, version 1.0 "It is happening again"
+ *
+ * Details and latest version at:
+ * www.dynarch.com/projects/calendar
+ *
+ * This script is developed by Dynarch.com.  Visit us at www.dynarch.com.
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ */
+
+// $Id: calendar.js,v 1.1 2007/12/06 13:55:16 drewnak Exp $
+
+/** The Calendar object constructor. */
+Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
+	// member variables
+	this.activeDiv = null;
+	this.currentDateEl = null;
+	this.getDateStatus = null;
+	this.getDateToolTip = null;
+	this.getDateText = null;
+	this.timeout = null;
+	this.onSelected = onSelected || null;
+	this.onClose = onClose || null;
+	this.dragging = false;
+	this.hidden = false;
+	this.minYear = 1970;
+	this.maxYear = 2050;
+	this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
+	this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
+	this.isPopup = true;
+	this.weekNumbers = true;
+	this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc.
+	this.showsOtherMonths = false;
+	this.dateStr = dateStr;
+	this.ar_days = null;
+	this.showsTime = false;
+	this.time24 = true;
+	this.yearStep = 2;
+	this.hiliteToday = true;
+	this.multiple = null;
+	// HTML elements
+	this.table = null;
+	this.element = null;
+	this.tbody = null;
+	this.firstdayname = null;
+	// Combo boxes
+	this.monthsCombo = null;
+	this.yearsCombo = null;
+	this.hilitedMonth = null;
+	this.activeMonth = null;
+	this.hilitedYear = null;
+	this.activeYear = null;
+	// Information
+	this.dateClicked = false;
+
+	// one-time initializations
+	if (typeof Calendar._SDN == "undefined") {
+		// table of short day names
+		if (typeof Calendar._SDN_len == "undefined")
+			Calendar._SDN_len = 3;
+		var ar = new Array();
+		for (var i = 8; i > 0;) {
+			ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len);
+		}
+		Calendar._SDN = ar;
+		// table of short month names
+		if (typeof Calendar._SMN_len == "undefined")
+			Calendar._SMN_len = 3;
+		ar = new Array();
+		for (var i = 12; i > 0;) {
+			ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len);
+		}
+		Calendar._SMN = ar;
+	}
+};
+
+// ** constants
+
+/// "static", needed for event handlers.
+Calendar._C = null;
+
+/// detect a special case of "web browser"
+Calendar.is_ie = ( /msie/i.test(navigator.userAgent) &&
+		   !/opera/i.test(navigator.userAgent) );
+
+Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) );
+
+/// detect Opera browser
+Calendar.is_opera = /opera/i.test(navigator.userAgent);
+
+/// detect KHTML-based browsers
+Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
+
+// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate
+//        library, at some point.
+
+Calendar.getAbsolutePos = function(el) {
+	var SL = 0, ST = 0;
+	var is_div = /^div$/i.test(el.tagName);
+	if (is_div && el.scrollLeft)
+		SL = el.scrollLeft;
+	if (is_div && el.scrollTop)
+		ST = el.scrollTop;
+	var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
+	if (el.offsetParent) {
+		var tmp = this.getAbsolutePos(el.offsetParent);
+		r.x += tmp.x;
+		r.y += tmp.y;
+	}
+	return r;
+};
+
+Calendar.isRelated = function (el, evt) {
+	var related = evt.relatedTarget;
+	if (!related) {
+		var type = evt.type;
+		if (type == "mouseover") {
+			related = evt.fromElement;
+		} else if (type == "mouseout") {
+			related = evt.toElement;
+		}
+	}
+	while (related) {
+		if (related == el) {
+			return true;
+		}
+		related = related.parentNode;
+	}
+	return false;
+};
+
+Calendar.removeClass = function(el, className) {
+	if (!(el && el.className)) {
+		return;
+	}
+	var cls = el.className.split(" ");
+	var ar = new Array();
+	for (var i = cls.length; i > 0;) {
+		if (cls[--i] != className) {
+			ar[ar.length] = cls[i];
+		}
+	}
+	el.className = ar.join(" ");
+};
+
+Calendar.addClass = function(el, className) {
+	Calendar.removeClass(el, className);
+	el.className += " " + className;
+};
+
+// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately.
+Calendar.getElement = function(ev) {
+	var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget;
+	while (f.nodeType != 1 || /^div$/i.test(f.tagName))
+		f = f.parentNode;
+	return f;
+};
+
+Calendar.getTargetElement = function(ev) {
+	var f = Calendar.is_ie ? window.event.srcElement : ev.target;
+	while (f.nodeType != 1)
+		f = f.parentNode;
+	return f;
+};
+
+Calendar.stopEvent = function(ev) {
+	ev || (ev = window.event);
+	if (Calendar.is_ie) {
+		ev.cancelBubble = true;
+		ev.returnValue = false;
+	} else {
+		ev.preventDefault();
+		ev.stopPropagation();
+	}
+	return false;
+};
+
+Calendar.addEvent = function(el, evname, func) {
+	if (el.attachEvent) { // IE
+		el.attachEvent("on" + evname, func);
+	} else if (el.addEventListener) { // Gecko / W3C
+		el.addEventListener(evname, func, true);
+	} else {
+		el["on" + evname] = func;
+	}
+};
+
+Calendar.removeEvent = function(el, evname, func) {
+	if (el.detachEvent) { // IE
+		el.detachEvent("on" + evname, func);
+	} else if (el.removeEventListener) { // Gecko / W3C
+		el.removeEventListener(evname, func, true);
+	} else {
+		el["on" + evname] = null;
+	}
+};
+
+Calendar.createElement = function(type, parent) {
+	var el = null;
+	if (document.createElementNS) {
+		// use the XHTML namespace; IE won't normally get here unless
+		// _they_ "fix" the DOM2 implementation.
+		el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
+	} else {
+		el = document.createElement(type);
+	}
+	if (typeof parent != "undefined") {
+		parent.appendChild(el);
+	}
+	return el;
+};
+
+// END: UTILITY FUNCTIONS
+
+// BEGIN: CALENDAR STATIC FUNCTIONS
+
+/** Internal -- adds a set of events to make some element behave like a button. */
+Calendar._add_evs = function(el) {
+	with (Calendar) {
+		addEvent(el, "mouseover", dayMouseOver);
+		addEvent(el, "mousedown", dayMouseDown);
+		addEvent(el, "mouseout", dayMouseOut);
+		if (is_ie) {
+			addEvent(el, "dblclick", dayMouseDblClick);
+			el.setAttribute("unselectable", true);
+		}
+	}
+};
+
+Calendar.findMonth = function(el) {
+	if (typeof el.month != "undefined") {
+		return el;
+	} else if (typeof el.parentNode.month != "undefined") {
+		return el.parentNode;
+	}
+	return null;
+};
+
+Calendar.findYear = function(el) {
+	if (typeof el.year != "undefined") {
+		return el;
+	} else if (typeof el.parentNode.year != "undefined") {
+		return el.parentNode;
+	}
+	return null;
+};
+
+Calendar.showMonthsCombo = function () {
+	var cal = Calendar._C;
+	if (!cal) {
+		return false;
+	}
+	var cal = cal;
+	var cd = cal.activeDiv;
+	var mc = cal.monthsCombo;
+	if (cal.hilitedMonth) {
+		Calendar.removeClass(cal.hilitedMonth, "hilite");
+	}
+	if (cal.activeMonth) {
+		Calendar.removeClass(cal.activeMonth, "active");
+	}
+	var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
+	Calendar.addClass(mon, "active");
+	cal.activeMonth = mon;
+	var s = mc.style;
+	s.display = "block";
+	if (cd.navtype < 0)
+		s.left = cd.offsetLeft + "px";
+	else {
+		var mcw = mc.offsetWidth;
+		if (typeof mcw == "undefined")
+			// Konqueror brain-dead techniques
+			mcw = 50;
+		s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px";
+	}
+	s.top = (cd.offsetTop + cd.offsetHeight) + "px";
+};
+
+Calendar.showYearsCombo = function (fwd) {
+	var cal = Calendar._C;
+	if (!cal) {
+		return false;
+	}
+	var cal = cal;
+	var cd = cal.activeDiv;
+	var yc = cal.yearsCombo;
+	if (cal.hilitedYear) {
+		Calendar.removeClass(cal.hilitedYear, "hilite");
+	}
+	if (cal.activeYear) {
+		Calendar.removeClass(cal.activeYear, "active");
+	}
+	cal.activeYear = null;
+	var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
+	var yr = yc.firstChild;
+	var show = false;
+	for (var i = 12; i > 0; --i) {
+		if (Y >= cal.minYear && Y <= cal.maxYear) {
+			yr.innerHTML = Y;
+			yr.year = Y;
+			yr.style.display = "block";
+			show = true;
+		} else {
+			yr.style.display = "none";
+		}
+		yr = yr.nextSibling;
+		Y += fwd ? cal.yearStep : -cal.yearStep;
+	}
+	if (show) {
+		var s = yc.style;
+		s.display = "block";
+		if (cd.navtype < 0)
+			s.left = cd.offsetLeft + "px";
+		else {
+			var ycw = yc.offsetWidth;
+			if (typeof ycw == "undefined")
+				// Konqueror brain-dead techniques
+				ycw = 50;
+			s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px";
+		}
+		s.top = (cd.offsetTop + cd.offsetHeight) + "px";
+	}
+};
+
+// event handlers
+
+Calendar.tableMouseUp = function(ev) {
+	var cal = Calendar._C;
+	if (!cal) {
+		return false;
+	}
+	if (cal.timeout) {
+		clearTimeout(cal.timeout);
+	}
+	var el = cal.activeDiv;
+	if (!el) {
+		return false;
+	}
+	var target = Calendar.getTargetElement(ev);
+	ev || (ev = window.event);
+	Calendar.removeClass(el, "active");
+	if (target == el || target.parentNode == el) {
+		Calendar.cellClick(el, ev);
+	}
+	var mon = Calendar.findMonth(target);
+	var date = null;
+	if (mon) {
+		date = new Date(cal.date);
+		if (mon.month != date.getMonth()) {
+			date.setMonth(mon.month);
+			cal.setDate(date);
+			cal.dateClicked = false;
+			cal.callHandler();
+		}
+	} else {
+		var year = Calendar.findYear(target);
+		if (year) {
+			date = new Date(cal.date);
+			if (year.year != date.getFullYear()) {
+				date.setFullYear(year.year);
+				cal.setDate(date);
+				cal.dateClicked = false;
+				cal.callHandler();
+			}
+		}
+	}
+	with (Calendar) {
+		removeEvent(document, "mouseup", tableMouseUp);
+		removeEvent(document, "mouseover", tableMouseOver);
+		removeEvent(document, "mousemove", tableMouseOver);
+		cal._hideCombos();
+		_C = null;
+		return stopEvent(ev);
+	}
+};
+
+Calendar.tableMouseOver = function (ev) {
+	var cal = Calendar._C;
+	if (!cal) {
+		return;
+	}
+	var el = cal.activeDiv;
+	var target = Calendar.getTargetElement(ev);
+	if (target == el || target.parentNode == el) {
+		Calendar.addClass(el, "hilite active");
+		Calendar.addClass(el.parentNode, "rowhilite");
+	} else {
+		if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2)))
+			Calendar.removeClass(el, "active");
+		Calendar.removeClass(el, "hilite");
+		Calendar.removeClass(el.parentNode, "rowhilite");
+	}
+	ev || (ev = window.event);
+	if (el.navtype == 50 && target != el) {
+		var pos = Calendar.getAbsolutePos(el);
+		var w = el.offsetWidth;
+		var x = ev.clientX;
+		var dx;
+		var decrease = true;
+		if (x > pos.x + w) {
+			dx = x - pos.x - w;
+			decrease = false;
+		} else
+			dx = pos.x - x;
+
+		if (dx < 0) dx = 0;
+		var range = el._range;
+		var current = el._current;
+		var count = Math.floor(dx / 10) % range.length;
+		for (var i = range.length; --i >= 0;)
+			if (range[i] == current)
+				break;
+		while (count-- > 0)
+			if (decrease) {
+				if (--i < 0)
+					i = range.length - 1;
+			} else if ( ++i >= range.length )
+				i = 0;
+		var newval = range[i];
+		el.innerHTML = newval;
+
+		cal.onUpdateTime();
+	}
+	var mon = Calendar.findMonth(target);
+	if (mon) {
+		if (mon.month != cal.date.getMonth()) {
+			if (cal.hilitedMonth) {
+				Calendar.removeClass(cal.hilitedMonth, "hilite");
+			}
+			Calendar.addClass(mon, "hilite");
+			cal.hilitedMonth = mon;
+		} else if (cal.hilitedMonth) {
+			Calendar.removeClass(cal.hilitedMonth, "hilite");
+		}
+	} else {
+		if (cal.hilitedMonth) {
+			Calendar.removeClass(cal.hilitedMonth, "hilite");
+		}
+		var year = Calendar.findYear(target);
+		if (year) {
+			if (year.year != cal.date.getFullYear()) {
+				if (cal.hilitedYear) {
+					Calendar.removeClass(cal.hilitedYear, "hilite");
+				}
+				Calendar.addClass(year, "hilite");
+				cal.hilitedYear = year;
+			} else if (cal.hilitedYear) {
+				Calendar.removeClass(cal.hilitedYear, "hilite");
+			}
+		} else if (cal.hilitedYear) {
+			Calendar.removeClass(cal.hilitedYear, "hilite");
+		}
+	}
+	return Calendar.stopEvent(ev);
+};
+
+Calendar.tableMouseDown = function (ev) {
+	if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
+		return Calendar.stopEvent(ev);
+	}
+};
+
+Calendar.calDragIt = function (ev) {
+	var cal = Calendar._C;
+	if (!(cal && cal.dragging)) {
+		return false;
+	}
+	var posX;
+	var posY;
+	if (Calendar.is_ie) {
+		posY = window.event.clientY + document.body.scrollTop;
+		posX = window.event.clientX + document.body.scrollLeft;
+	} else {
+		posX = ev.pageX;
+		posY = ev.pageY;
+	}
+	cal.hideShowCovered();
+	var st = cal.element.style;
+	st.left = (posX - cal.xOffs) + "px";
+	st.top = (posY - cal.yOffs) + "px";
+	return Calendar.stopEvent(ev);
+};
+
+Calendar.calDragEnd = function (ev) {
+	var cal = Calendar._C;
+	if (!cal) {
+		return false;
+	}
+	cal.dragging = false;
+	with (Calendar) {
+		removeEvent(document, "mousemove", calDragIt);
+		removeEvent(document, "mouseup", calDragEnd);
+		tableMouseUp(ev);
+	}
+	cal.hideShowCovered();
+};
+
+Calendar.dayMouseDown = function(ev) {
+	var el = Calendar.getElement(ev);
+	if (el.disabled) {
+		return false;
+	}
+	var cal = el.calendar;
+	cal.activeDiv = el;
+	Calendar._C = cal;
+	if (el.navtype != 300) with (Calendar) {
+		if (el.navtype == 50) {
+			el._current = el.innerHTML;
+			addEvent(document, "mousemove", tableMouseOver);
+		} else
+			addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver);
+		addClass(el, "hilite active");
+		addEvent(document, "mouseup", tableMouseUp);
+	} else if (cal.isPopup) {
+		cal._dragStart(ev);
+	}
+	if (el.navtype == -1 || el.navtype == 1) {
+		if (cal.timeout) clearTimeout(cal.timeout);
+		cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
+	} else if (el.navtype == -2 || el.navtype == 2) {
+		if (cal.timeout) clearTimeout(cal.timeout);
+		cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250);
+	} else {
+		cal.timeout = null;
+	}
+	return Calendar.stopEvent(ev);
+};
+
+Calendar.dayMouseDblClick = function(ev) {
+	Calendar.cellClick(Calendar.getElement(ev), ev || window.event);
+	if (Calendar.is_ie) {
+		document.selection.empty();
+	}
+};
+
+Calendar.dayMouseOver = function(ev) {
+	var el = Calendar.getElement(ev);
+	if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) {
+		return false;
+	}
+	if (el.ttip) {
+		if (el.ttip.substr(0, 1) == "_") {
+			el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1);
+		}
+		el.calendar.tooltips.innerHTML = el.ttip;
+	}
+	if (el.navtype != 300) {
+		Calendar.addClass(el, "hilite");
+		if (el.caldate) {
+			Calendar.addClass(el.parentNode, "rowhilite");
+		}
+	}
+	return Calendar.stopEvent(ev);
+};
+
+Calendar.dayMouseOut = function(ev) {
+	with (Calendar) {
+		var el = getElement(ev);
+		if (isRelated(el, ev) || _C || el.disabled)
+			return false;
+		removeClass(el, "hilite");
+		if (el.caldate)
+			removeClass(el.parentNode, "rowhilite");
+		if (el.calendar)
+			el.calendar.tooltips.innerHTML = _TT["SEL_DATE"];
+		return stopEvent(ev);
+	}
+};
+
+/**
+ *  A generic "click" handler :) handles all types of buttons defined in this
+ *  calendar.
+ */
+Calendar.cellClick = function(el, ev) {
+	var cal = el.calendar;
+	var closing = false;
+	var newdate = false;
+	var date = null;
+	if (typeof el.navtype == "undefined") {
+		if (cal.currentDateEl) {
+			Calendar.removeClass(cal.currentDateEl, "selected");
+			Calendar.addClass(el, "selected");
+			closing = (cal.currentDateEl == el);
+			if (!closing) {
+				cal.currentDateEl = el;
+			}
+		}
+		cal.date.setDateOnly(el.caldate);
+		date = cal.date;
+		var other_month = !(cal.dateClicked = !el.otherMonth);
+		if (!other_month && !cal.currentDateEl)
+			cal._toggleMultipleDate(new Date(date));
+		else
+			newdate = !el.disabled;
+		// a date was clicked
+		if (other_month)
+			cal._init(cal.firstDayOfWeek, date);
+	} else {
+		if (el.navtype == 200) {
+			Calendar.removeClass(el, "hilite");
+			cal.callCloseHandler();
+			return;
+		}
+		date = new Date(cal.date);
+		if (el.navtype == 0)
+			date.setDateOnly(new Date()); // TODAY
+		// unless "today" was clicked, we assume no date was clicked so
+		// the selected handler will know not to close the calenar when
+		// in single-click mode.
+		// cal.dateClicked = (el.navtype == 0);
+		cal.dateClicked = false;
+		var year = date.getFullYear();
+		var mon = date.getMonth();
+		function setMonth(m) {
+			var day = date.getDate();
+			var max = date.getMonthDays(m);
+			if (day > max) {
+				date.setDate(max);
+			}
+			date.setMonth(m);
+		};
+		switch (el.navtype) {
+		    case 400:
+			Calendar.removeClass(el, "hilite");
+			var text = Calendar._TT["ABOUT"];
+			if (typeof text != "undefined") {
+				text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : "";
+			} else {
+				// FIXME: this should be removed as soon as lang files get updated!
+				text = "Help and about box text is not translated into this language.\n" +
+					"If you know this language and you feel generous please update\n" +
+					"the corresponding file in \"lang\" subdir to match calendar-en.js\n" +
+					"and send it back to <mihai_bazon@yahoo.com> to get it into the distribution  ;-)\n\n" +
+					"Thank you!\n" +
+					"http://dynarch.com/mishoo/calendar.epl\n";
+			}
+			alert(text);
+			return;
+		    case -2:
+			if (year > cal.minYear) {
+				date.setFullYear(year - 1);
+			}
+			break;
+		    case -1:
+			if (mon > 0) {
+				setMonth(mon - 1);
+			} else if (year-- > cal.minYear) {
+				date.setFullYear(year);
+				setMonth(11);
+			}
+			break;
+		    case 1:
+			if (mon < 11) {
+				setMonth(mon + 1);
+			} else if (year < cal.maxYear) {
+				date.setFullYear(year + 1);
+				setMonth(0);
+			}
+			break;
+		    case 2:
+			if (year < cal.maxYear) {
+				date.setFullYear(year + 1);
+			}
+			break;
+		    case 100:
+			cal.setFirstDayOfWeek(el.fdow);
+			return;
+		    case 50:
+			var range = el._range;
+			var current = el.innerHTML;
+			for (var i = range.length; --i >= 0;)
+				if (range[i] == current)
+					break;
+			if (ev && ev.shiftKey) {
+				if (--i < 0)
+					i = range.length - 1;
+			} else if ( ++i >= range.length )
+				i = 0;
+			var newval = range[i];
+			el.innerHTML = newval;
+			cal.onUpdateTime();
+			return;
+		    case 0:
+			// TODAY will bring us here
+			if ((typeof cal.getDateStatus == "function") &&
+			    cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) {
+				return false;
+			}
+			break;
+		}
+		if (!date.equalsTo(cal.date)) {
+			cal.setDate(date);
+			newdate = true;
+		} else if (el.navtype == 0)
+			newdate = closing = true;
+	}
+	if (newdate) {
+		ev && cal.callHandler();
+	}
+	if (closing) {
+		Calendar.removeClass(el, "hilite");
+		ev && cal.callCloseHandler();
+	}
+};
+
+// END: CALENDAR STATIC FUNCTIONS
+
+// BEGIN: CALENDAR OBJECT FUNCTIONS
+
+/**
+ *  This function creates the calendar inside the given parent.  If _par is
+ *  null than it creates a popup calendar inside the BODY element.  If _par is
+ *  an element, be it BODY, then it creates a non-popup calendar (still
+ *  hidden).  Some properties need to be set before calling this function.
+ */
+Calendar.prototype.create = function (_par) {
+	var parent = null;
+	if (! _par) {
+		// default parent is the document body, in which case we create
+		// a popup calendar.
+		parent = document.getElementsByTagName("body")[0];
+		this.isPopup = true;
+	} else {
+		parent = _par;
+		this.isPopup = false;
+	}
+	this.date = this.dateStr ? new Date(this.dateStr) : new Date();
+
+	var table = Calendar.createElement("table");
+	this.table = table;
+	table.cellSpacing = 0;
+	table.cellPadding = 0;
+	table.calendar = this;
+	Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);
+
+	var div = Calendar.createElement("div");
+	this.element = div;
+	div.className = "calendar";
+	if (this.isPopup) {
+		div.style.position = "absolute";
+		div.style.display = "none";
+	}
+	div.appendChild(table);
+
+	var thead = Calendar.createElement("thead", table);
+	var cell = null;
+	var row = null;
+
+	var cal = this;
+	var hh = function (text, cs, navtype) {
+		cell = Calendar.createElement("td", row);
+		cell.colSpan = cs;
+		cell.className = "button";
+		if (navtype != 0 && Math.abs(navtype) <= 2)
+			cell.className += " nav";
+		Calendar._add_evs(cell);
+		cell.calendar = cal;
+		cell.navtype = navtype;
+		cell.innerHTML = "<div unselectable='on'>" + text + "</div>";
+		return cell;
+	};
+
+	row = Calendar.createElement("tr", thead);
+	var title_length = 6;
+	(this.isPopup) && --title_length;
+	(this.weekNumbers) && ++title_length;
+
+	hh("?", 1, 400).ttip = Calendar._TT["INFO"];
+	this.title = hh("", title_length, 300);
+	this.title.className = "title";
+	if (this.isPopup) {
+		this.title.ttip = Calendar._TT["DRAG_TO_MOVE"];
+		this.title.style.cursor = "move";
+		hh("&#x00d7;", 1, 200).ttip = Calendar._TT["CLOSE"];
+	}
+
+	row = Calendar.createElement("tr", thead);
+	row.className = "headrow";
+
+	this._nav_py = hh("&#x00ab;", 1, -2);
+	this._nav_py.ttip = Calendar._TT["PREV_YEAR"];
+
+	this._nav_pm = hh("&#x2039;", 1, -1);
+	this._nav_pm.ttip = Calendar._TT["PREV_MONTH"];
+
+	this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0);
+	this._nav_now.ttip = Calendar._TT["GO_TODAY"];
+
+	this._nav_nm = hh("&#x203a;", 1, 1);
+	this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];
+
+	this._nav_ny = hh("&#x00bb;", 1, 2);
+	this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"];
+
+	// day names
+	row = Calendar.createElement("tr", thead);
+	row.className = "daynames";
+	if (this.weekNumbers) {
+		cell = Calendar.createElement("td", row);
+		cell.className = "name wn";
+		cell.innerHTML = Calendar._TT["WK"];
+	}
+	for (var i = 7; i > 0; --i) {
+		cell = Calendar.createElement("td", row);
+		if (!i) {
+			cell.navtype = 100;
+			cell.calendar = this;
+			Calendar._add_evs(cell);
+		}
+	}
+	this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild;
+	this._displayWeekdays();
+
+	var tbody = Calendar.createElement("tbody", table);
+	this.tbody = tbody;
+
+	for (i = 6; i > 0; --i) {
+		row = Calendar.createElement("tr", tbody);
+		if (this.weekNumbers) {
+			cell = Calendar.createElement("td", row);
+		}
+		for (var j = 7; j > 0; --j) {
+			cell = Calendar.createElement("td", row);
+			cell.calendar = this;
+			Calendar._add_evs(cell);
+		}
+	}
+
+	if (this.showsTime) {
+		row = Calendar.createElement("tr", tbody);
+		row.className = "time";
+
+		cell = Calendar.createElement("td", row);
+		cell.className = "time";
+		cell.colSpan = 2;
+		cell.innerHTML = Calendar._TT["TIME"] || "&nbsp;";
+
+		cell = Calendar.createElement("td", row);
+		cell.className = "time";
+		cell.colSpan = this.weekNumbers ? 4 : 3;
+
+		(function(){
+			function makeTimePart(className, init, range_start, range_end) {
+				var part = Calendar.createElement("span", cell);
+				part.className = className;
+				part.innerHTML = init;
+				part.calendar = cal;
+				part.ttip = Calendar._TT["TIME_PART"];
+				part.navtype = 50;
+				part._range = [];
+				if (typeof range_start != "number")
+					part._range = range_start;
+				else {
+					for (var i = range_start; i <= range_end; ++i) {
+						var txt;
+						if (i < 10 && range_end >= 10) txt = '0' + i;
+						else txt = '' + i;
+						part._range[part._range.length] = txt;
+					}
+				}
+				Calendar._add_evs(part);
+				return part;
+			};
+			var hrs = cal.date.getHours();
+			var mins = cal.date.getMinutes();
+			var t12 = !cal.time24;
+			var pm = (hrs > 12);
+			if (t12 && pm) hrs -= 12;
+			var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
+			var span = Calendar.createElement("span", cell);
+			span.innerHTML = ":";
+			span.className = "colon";
+			var M = makeTimePart("minute", mins, 0, 59);
+			var AP = null;
+			cell = Calendar.createElement("td", row);
+			cell.className = "time";
+			cell.colSpan = 2;
+			if (t12)
+				AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]);
+			else
+				cell.innerHTML = "&nbsp;";
+
+			cal.onSetTime = function() {
+				var pm, hrs = this.date.getHours(),
+					mins = this.date.getMinutes();
+				if (t12) {
+					pm = (hrs >= 12);
+					if (pm) hrs -= 12;
+					if (hrs == 0) hrs = 12;
+					AP.innerHTML = pm ? "pm" : "am";
+				}
+				H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs;
+				M.innerHTML = (mins < 10) ? ("0" + mins) : mins;
+			};
+
+			cal.onUpdateTime = function() {
+				var date = this.date;
+				var h = parseInt(H.innerHTML, 10);
+				if (t12) {
+					if (/pm/i.test(AP.innerHTML) && h < 12)
+						h += 12;
+					else if (/am/i.test(AP.innerHTML) && h == 12)
+						h = 0;
+				}
+				var d = date.getDate();
+				var m = date.getMonth();
+				var y = date.getFullYear();
+				date.setHours(h);
+				date.setMinutes(parseInt(M.innerHTML, 10));
+				date.setFullYear(y);
+				date.setMonth(m);
+				date.setDate(d);
+				this.dateClicked = false;
+				this.callHandler();
+			};
+		})();
+	} else {
+		this.onSetTime = this.onUpdateTime = function() {};
+	}
+
+	var tfoot = Calendar.createElement("tfoot", table);
+
+	row = Calendar.createElement("tr", tfoot);
+	row.className = "footrow";
+
+	cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300);
+	cell.className = "ttip";
+	if (this.isPopup) {
+		cell.ttip = Calendar._TT["DRAG_TO_MOVE"];
+		cell.style.cursor = "move";
+	}
+	this.tooltips = cell;
+
+	div = Calendar.createElement("div", this.element);
+	this.monthsCombo = div;
+	div.className = "combo";
+	for (i = 0; i < Calendar._MN.length; ++i) {
+		var mn = Calendar.createElement("div");
+		mn.className = Calendar.is_ie ? "label-IEfix" : "label";
+		mn.month = i;
+		mn.innerHTML = Calendar._SMN[i];
+		div.appendChild(mn);
+	}
+
+	div = Calendar.createElement("div", this.element);
+	this.yearsCombo = div;
+	div.className = "combo";
+	for (i = 12; i > 0; --i) {
+		var yr = Calendar.createElement("div");
+		yr.className = Calendar.is_ie ? "label-IEfix" : "label";
+		div.appendChild(yr);
+	}
+
+	this._init(this.firstDayOfWeek, this.date);
+	parent.appendChild(this.element);
+};
+
+/** keyboard navigation, only for popup calendars */
+Calendar._keyEvent = function(ev) {
+	var cal = window._dynarch_popupCalendar;
+	if (!cal || cal.multiple)
+		return false;
+	(Calendar.is_ie) && (ev = window.event);
+	var act = (Calendar.is_ie || ev.type == "keypress"),
+		K = ev.keyCode;
+	if (ev.ctrlKey) {
+		switch (K) {
+		    case 37: // KEY left
+			act && Calendar.cellClick(cal._nav_pm);
+			break;
+		    case 38: // KEY up
+			act && Calendar.cellClick(cal._nav_py);
+			break;
+		    case 39: // KEY right
+			act && Calendar.cellClick(cal._nav_nm);
+			break;
+		    case 40: // KEY down
+			act && Calendar.cellClick(cal._nav_ny);
+			break;
+		    default:
+			return false;
+		}
+	} else switch (K) {
+	    case 32: // KEY space (now)
+		Calendar.cellClick(cal._nav_now);
+		break;
+	    case 27: // KEY esc
+		act && cal.callCloseHandler();
+		break;
+	    case 37: // KEY left
+	    case 38: // KEY up
+	    case 39: // KEY right
+	    case 40: // KEY down
+		if (act) {
+			var prev, x, y, ne, el, step;
+			prev = K == 37 || K == 38;
+			step = (K == 37 || K == 39) ? 1 : 7;
+			function setVars() {
+				el = cal.currentDateEl;
+				var p = el.pos;
+				x = p & 15;
+				y = p >> 4;
+				ne = cal.ar_days[y][x];
+			};setVars();
+			function prevMonth() {
+				var date = new Date(cal.date);
+				date.setDate(date.getDate() - step);
+				cal.setDate(date);
+			};
+			function nextMonth() {
+				var date = new Date(cal.date);
+				date.setDate(date.getDate() + step);
+				cal.setDate(date);
+			};
+			while (1) {
+				switch (K) {
+				    case 37: // KEY left
+					if (--x >= 0)
+						ne = cal.ar_days[y][x];
+					else {
+						x = 6;
+						K = 38;
+						continue;
+					}
+					break;
+				    case 38: // KEY up
+					if (--y >= 0)
+						ne = cal.ar_days[y][x];
+					else {
+						prevMonth();
+						setVars();
+					}
+					break;
+				    case 39: // KEY right
+					if (++x < 7)
+						ne = cal.ar_days[y][x];
+					else {
+						x = 0;
+						K = 40;
+						continue;
+					}
+					break;
+				    case 40: // KEY down
+					if (++y < cal.ar_days.length)
+						ne = cal.ar_days[y][x];
+					else {
+						nextMonth();
+						setVars();
+					}
+					break;
+				}
+				break;
+			}
+			if (ne) {
+				if (!ne.disabled)
+					Calendar.cellClick(ne);
+				else if (prev)
+					prevMonth();
+				else
+					nextMonth();
+			}
+		}
+		break;
+	    case 13: // KEY enter
+		if (act)
+			Calendar.cellClick(cal.currentDateEl, ev);
+		break;
+	    default:
+		return false;
+	}
+	return Calendar.stopEvent(ev);
+};
+
+/**
+ *  (RE)Initializes the calendar to the given date and firstDayOfWeek
+ */
+Calendar.prototype._init = function (firstDayOfWeek, date) {
+	var today = new Date(),
+		TY = today.getFullYear(),
+		TM = today.getMonth(),
+		TD = today.getDate();
+	this.table.style.visibility = "hidden";
+	var year = date.getFullYear();
+	if (year < this.minYear) {
+		year = this.minYear;
+		date.setFullYear(year);
+	} else if (year > this.maxYear) {
+		year = this.maxYear;
+		date.setFullYear(year);
+	}
+	this.firstDayOfWeek = firstDayOfWeek;
+	this.date = new Date(date);
+	var month = date.getMonth();
+	var mday = date.getDate();
+	var no_days = date.getMonthDays();
+
+	// calendar voodoo for computing the first day that would actually be
+	// displayed in the calendar, even if it's from the previous month.
+	// WARNING: this is magic. ;-)
+	date.setDate(1);
+	var day1 = (date.getDay() - this.firstDayOfWeek) % 7;
+	if (day1 < 0)
+		day1 += 7;
+	date.setDate(-day1);
+	date.setDate(date.getDate() + 1);
+
+	var row = this.tbody.firstChild;
+	var MN = Calendar._SMN[month];
+	var ar_days = this.ar_days = new Array();
+	var weekend = Calendar._TT["WEEKEND"];
+	var dates = this.multiple ? (this.datesCells = {}) : null;
+	for (var i = 0; i < 6; ++i, row = row.nextSibling) {
+		var cell = row.firstChild;
+		if (this.weekNumbers) {
+			cell.className = "day wn";
+			cell.innerHTML = date.getWeekNumber();
+			cell = cell.nextSibling;
+		}
+		row.className = "daysrow";
+		var hasdays = false, iday, dpos = ar_days[i] = [];
+		for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) {
+			iday = date.getDate();
+			var wday = date.getDay();
+			cell.className = "day";
+			cell.pos = i << 4 | j;
+			dpos[j] = cell;
+			var current_month = (date.getMonth() == month);
+			if (!current_month) {
+				if (this.showsOtherMonths) {
+					cell.className += " othermonth";
+					cell.otherMonth = true;
+				} else {
+					cell.className = "emptycell";
+					cell.innerHTML = "&nbsp;";
+					cell.disabled = true;
+					continue;
+				}
+			} else {
+				cell.otherMonth = false;
+				hasdays = true;
+			}
+			cell.disabled = false;
+			cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday;
+			if (dates)
+				dates[date.print("%Y%m%d")] = cell;
+			if (this.getDateStatus) {
+				var status = this.getDateStatus(date, year, month, iday);
+				if (this.getDateToolTip) {
+					var toolTip = this.getDateToolTip(date, year, month, iday);
+					if (toolTip)
+						cell.title = toolTip;
+				}
+				if (status === true) {
+					cell.className += " disabled";
+					cell.disabled = true;
+				} else {
+					if (/disabled/i.test(status))
+						cell.disabled = true;
+					cell.className += " " + status;
+				}
+			}
+			if (!cell.disabled) {
+				cell.caldate = new Date(date);
+				cell.ttip = "_";
+				if (!this.multiple && current_month
+				    && iday == mday && this.hiliteToday) {
+					cell.className += " selected";
+					this.currentDateEl = cell;
+				}
+				if (date.getFullYear() == TY &&
+				    date.getMonth() == TM &&
+				    iday == TD) {
+					cell.className += " today";
+					cell.ttip += Calendar._TT["PART_TODAY"];
+				}
+				if (weekend.indexOf(wday.toString()) != -1)
+					cell.className += cell.otherMonth ? " oweekend" : " weekend";
+			}
+		}
+		if (!(hasdays || this.showsOtherMonths))
+			row.className = "emptyrow";
+	}
+	this.title.innerHTML = Calendar._MN[month] + ", " + year;
+	this.onSetTime();
+	this.table.style.visibility = "visible";
+	this._initMultipleDates();
+	// PROFILE
+	// this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms";
+};
+
+Calendar.prototype._initMultipleDates = function() {
+	if (this.multiple) {
+		for (var i in this.multiple) {
+			var cell = this.datesCells[i];
+			var d = this.multiple[i];
+			if (!d)
+				continue;
+			if (cell)
+				cell.className += " selected";
+		}
+	}
+};
+
+Calendar.prototype._toggleMultipleDate = function(date) {
+	if (this.multiple) {
+		var ds = date.print("%Y%m%d");
+		var cell = this.datesCells[ds];
+		if (cell) {
+			var d = this.multiple[ds];
+			if (!d) {
+				Calendar.addClass(cell, "selected");
+				this.multiple[ds] = date;
+			} else {
+				Calendar.removeClass(cell, "selected");
+				delete this.multiple[ds];
+			}
+		}
+	}
+};
+
+Calendar.prototype.setDateToolTipHandler = function (unaryFunction) {
+	this.getDateToolTip = unaryFunction;
+};
+
+/**
+ *  Calls _init function above for going to a certain date (but only if the
+ *  date is different than the currently selected one).
+ */
+Calendar.prototype.setDate = function (date) {
+	if (!date.equalsTo(this.date)) {
+		this._init(this.firstDayOfWeek, date);
+	}
+};
+
+/**
+ *  Refreshes the calendar.  Useful if the "disabledHandler" function is
+ *  dynamic, meaning that the list of disabled date can change at runtime.
+ *  Just * call this function if you think that the list of disabled dates
+ *  should * change.
+ */
+Calendar.prototype.refresh = function () {
+	this._init(this.firstDayOfWeek, this.date);
+};
+
+/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */
+Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) {
+	this._init(firstDayOfWeek, this.date);
+	this._displayWeekdays();
+};
+
+/**
+ *  Allows customization of what dates are enabled.  The "unaryFunction"
+ *  parameter must be a function object that receives the date (as a JS Date
+ *  object) and returns a boolean value.  If the returned value is true then
+ *  the passed date will be marked as disabled.
+ */
+Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) {
+	this.getDateStatus = unaryFunction;
+};
+
+/** Customization of allowed year range for the calendar. */
+Calendar.prototype.setRange = function (a, z) {
+	this.minYear = a;
+	this.maxYear = z;
+};
+
+/** Calls the first user handler (selectedHandler). */
+Calendar.prototype.callHandler = function () {
+	if (this.onSelected) {
+		this.onSelected(this, this.date.print(this.dateFormat));
+	}
+};
+
+/** Calls the second user handler (closeHandler). */
+Calendar.prototype.callCloseHandler = function () {
+	if (this.onClose) {
+		this.onClose(this);
+	}
+	this.hideShowCovered();
+};
+
+/** Removes the calendar object from the DOM tree and destroys it. */
+Calendar.prototype.destroy = function () {
+	var el = this.element.parentNode;
+	el.removeChild(this.element);
+	Calendar._C = null;
+	window._dynarch_popupCalendar = null;
+};
+
+/**
+ *  Moves the calendar element to a different section in the DOM tree (changes
+ *  its parent).
+ */
+Calendar.prototype.reparent = function (new_parent) {
+	var el = this.element;
+	el.parentNode.removeChild(el);
+	new_parent.appendChild(el);
+};
+
+// This gets called when the user presses a mouse button anywhere in the
+// document, if the calendar is shown.  If the click was outside the open
+// calendar this function closes it.
+Calendar._checkCalendar = function(ev) {
+	var calendar = window._dynarch_popupCalendar;
+	if (!calendar) {
+		return false;
+	}
+	var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
+	for (; el != null && el != calendar.element; el = el.parentNode);
+	if (el == null) {
+		// calls closeHandler which should hide the calendar.
+		window._dynarch_popupCalendar.callCloseHandler();
+		return Calendar.stopEvent(ev);
+	}
+};
+
+/** Shows the calendar. */
+Calendar.prototype.show = function () {
+	var rows = this.table.getElementsByTagName("tr");
+	for (var i = rows.length; i > 0;) {
+		var row = rows[--i];
+		Calendar.removeClass(row, "rowhilite");
+		var cells = row.getElementsByTagName("td");
+		for (var j = cells.length; j > 0;) {
+			var cell = cells[--j];
+			Calendar.removeClass(cell, "hilite");
+			Calendar.removeClass(cell, "active");
+		}
+	}
+	this.element.style.display = "block";
+	this.hidden = false;
+	if (this.isPopup) {
+		window._dynarch_popupCalendar = this;
+		Calendar.addEvent(document, "keydown", Calendar._keyEvent);
+		Calendar.addEvent(document, "keypress", Calendar._keyEvent);
+		Calendar.addEvent(document, "mousedown", Calendar._checkCalendar);
+	}
+	this.hideShowCovered();
+};
+
+/**
+ *  Hides the calendar.  Also removes any "hilite" from the class of any TD
+ *  element.
+ */
+Calendar.prototype.hide = function () {
+	if (this.isPopup) {
+		Calendar.removeEvent(document, "keydown", Calendar._keyEvent);
+		Calendar.removeEvent(document, "keypress", Calendar._keyEvent);
+		Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar);
+	}
+	this.element.style.display = "none";
+	this.hidden = true;
+	this.hideShowCovered();
+};
+
+/**
+ *  Shows the calendar at a given absolute position (beware that, depending on
+ *  the calendar element style -- position property -- this might be relative
+ *  to the parent's containing rectangle).
+ */
+Calendar.prototype.showAt = function (x, y) {
+	var s = this.element.style;
+	s.left = x + "px";
+	s.top = y + "px";
+	this.show();
+};
+
+/** Shows the calendar near a given element. */
+Calendar.prototype.showAtElement = function (el, opts) {
+	var self = this;
+	var p = Calendar.getAbsolutePos(el);
+	if (!opts || typeof opts != "string") {
+		this.showAt(p.x, p.y + el.offsetHeight);
+		return true;
+	}
+	function fixPosition(box) {
+		if (box.x < 0)
+			box.x = 0;
+		if (box.y < 0)
+			box.y = 0;
+		var cp = document.createElement("div");
+		var s = cp.style;
+		s.position = "absolute";
+		s.right = s.bottom = s.width = s.height = "0px";
+		document.body.appendChild(cp);
+		var br = Calendar.getAbsolutePos(cp);
+		document.body.removeChild(cp);
+		if (Calendar.is_ie) {
+			br.y += document.body.scrollTop;
+			br.x += document.body.scrollLeft;
+		} else {
+			br.y += window.scrollY;
+			br.x += window.scrollX;
+		}
+		var tmp = box.x + box.width - br.x;
+		if (tmp > 0) box.x -= tmp;
+		tmp = box.y + box.height - br.y;
+		if (tmp > 0) box.y -= tmp;
+	};
+	this.element.style.display = "block";
+	Calendar.continuation_for_the_fucking_khtml_browser = function() {
+		var w = self.element.offsetWidth;
+		var h = self.element.offsetHeight;
+		self.element.style.display = "none";
+		var valign = opts.substr(0, 1);
+		var halign = "l";
+		if (opts.length > 1) {
+			halign = opts.substr(1, 1);
+		}
+		// vertical alignment
+		switch (valign) {
+		    case "T": p.y -= h; break;
+		    case "B": p.y += el.offsetHeight; break;
+		    case "C": p.y += (el.offsetHeight - h) / 2; break;
+		    case "t": p.y += el.offsetHeight - h; break;
+		    case "b": break; // already there
+		}
+		// horizontal alignment
+		switch (halign) {
+		    case "L": p.x -= w; break;
+		    case "R": p.x += el.offsetWidth; break;
+		    case "C": p.x += (el.offsetWidth - w) / 2; break;
+		    case "l": p.x += el.offsetWidth - w; break;
+		    case "r": break; // already there
+		}
+		p.width = w;
+		p.height = h + 40;
+		self.monthsCombo.style.display = "none";
+		fixPosition(p);
+		self.showAt(p.x, p.y);
+	};
+	if (Calendar.is_khtml)
+		setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10);
+	else
+		Calendar.continuation_for_the_fucking_khtml_browser();
+};
+
+/** Customizes the date format. */
+Calendar.prototype.setDateFormat = function (str) {
+	this.dateFormat = str;
+};
+
+/** Customizes the tooltip date format. */
+Calendar.prototype.setTtDateFormat = function (str) {
+	this.ttDateFormat = str;
+};
+
+/**
+ *  Tries to identify the date represented in a string.  If successful it also
+ *  calls this.setDate which moves the calendar to the given date.
+ */
+Calendar.prototype.parseDate = function(str, fmt) {
+	if (!fmt)
+		fmt = this.dateFormat;
+	this.setDate(Date.parseDate(str, fmt));
+};
+
+Calendar.prototype.hideShowCovered = function () {
+	if (!Calendar.is_ie && !Calendar.is_opera)
+		return;
+	function getVisib(obj){
+		var value = obj.style.visibility;
+		if (!value) {
+			if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C
+				if (!Calendar.is_khtml)
+					value = document.defaultView.
+						getComputedStyle(obj, "").getPropertyValue("visibility");
+				else
+					value = '';
+			} else if (obj.currentStyle) { // IE
+				value = obj.currentStyle.visibility;
+			} else
+				value = '';
+		}
+		return value;
+	};
+
+	var tags = new Array("applet", "iframe", "select");
+	var el = this.element;
+
+	var p = Calendar.getAbsolutePos(el);
+	var EX1 = p.x;
+	var EX2 = el.offsetWidth + EX1;
+	var EY1 = p.y;
+	var EY2 = el.offsetHeight + EY1;
+
+	for (var k = tags.length; k > 0; ) {
+		var ar = document.getElementsByTagName(tags[--k]);
+		var cc = null;
+
+		for (var i = ar.length; i > 0;) {
+			cc = ar[--i];
+
+			p = Calendar.getAbsolutePos(cc);
+			var CX1 = p.x;
+			var CX2 = cc.offsetWidth + CX1;
+			var CY1 = p.y;
+			var CY2 = cc.offsetHeight + CY1;
+
+			if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
+				if (!cc.__msh_save_visibility) {
+					cc.__msh_save_visibility = getVisib(cc);
+				}
+				cc.style.visibility = cc.__msh_save_visibility;
+			} else {
+				if (!cc.__msh_save_visibility) {
+					cc.__msh_save_visibility = getVisib(cc);
+				}
+				cc.style.visibility = "hidden";
+			}
+		}
+	}
+};
+
+/** Internal function; it displays the bar with the names of the weekday. */
+Calendar.prototype._displayWeekdays = function () {
+	var fdow = this.firstDayOfWeek;
+	var cell = this.firstdayname;
+	var weekend = Calendar._TT["WEEKEND"];
+	for (var i = 0; i < 7; ++i) {
+		cell.className = "day name";
+		var realday = (i + fdow) % 7;
+		if (i) {
+			cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]);
+			cell.navtype = 100;
+			cell.calendar = this;
+			cell.fdow = realday;
+			Calendar._add_evs(cell);
+		}
+		if (weekend.indexOf(realday.toString()) != -1) {
+			Calendar.addClass(cell, "weekend");
+		}
+		cell.innerHTML = Calendar._SDN[(i + fdow) % 7];
+		cell = cell.nextSibling;
+	}
+};
+
+/** Internal function.  Hides all combo boxes that might be displayed. */
+Calendar.prototype._hideCombos = function () {
+	this.monthsCombo.style.display = "none";
+	this.yearsCombo.style.display = "none";
+};
+
+/** Internal function.  Starts dragging the element. */
+Calendar.prototype._dragStart = function (ev) {
+	if (this.dragging) {
+		return;
+	}
+	this.dragging = true;
+	var posX;
+	var posY;
+	if (Calendar.is_ie) {
+		posY = window.event.clientY + document.body.scrollTop;
+		posX = window.event.clientX + document.body.scrollLeft;
+	} else {
+		posY = ev.clientY + window.scrollY;
+		posX = ev.clientX + window.scrollX;
+	}
+	var st = this.element.style;
+	this.xOffs = posX - parseInt(st.left);
+	this.yOffs = posY - parseInt(st.top);
+	with (Calendar) {
+		addEvent(document, "mousemove", calDragIt);
+		addEvent(document, "mouseup", calDragEnd);
+	}
+};
+
+// BEGIN: DATE OBJECT PATCHES
+
+/** Adds the number of days array to the Date object. */
+Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
+
+/** Constants used for time computations */
+Date.SECOND = 1000 /* milliseconds */;
+Date.MINUTE = 60 * Date.SECOND;
+Date.HOUR   = 60 * Date.MINUTE;
+Date.DAY    = 24 * Date.HOUR;
+Date.WEEK   =  7 * Date.DAY;
+
+Date.parseDate = function(str, fmt) {
+	var today = new Date();
+	var y = 0;
+	var m = -1;
+	var d = 0;
+	var a = str.split(/\W+/);
+	var b = fmt.match(/%./g);
+	var i = 0, j = 0;
+	var hr = 0;
+	var min = 0;
+	for (i = 0; i < a.length; ++i) {
+		if (!a[i])
+			continue;
+		switch (b[i]) {
+		    case "%d":
+		    case "%e":
+			d = parseInt(a[i], 10);
+			break;
+
+		    case "%m":
+			m = parseInt(a[i], 10) - 1;
+			break;
+
+		    case "%Y":
+		    case "%y":
+			y = parseInt(a[i], 10);
+			(y < 100) && (y += (y > 29) ? 1900 : 2000);
+			break;
+
+		    case "%b":
+		    case "%B":
+			for (j = 0; j < 12; ++j) {
+				if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
+			}
+			break;
+
+		    case "%H":
+		    case "%I":
+		    case "%k":
+		    case "%l":
+			hr = parseInt(a[i], 10);
+			break;
+
+		    case "%P":
+		    case "%p":
+			if (/pm/i.test(a[i]) && hr < 12)
+				hr += 12;
+			else if (/am/i.test(a[i]) && hr >= 12)
+				hr -= 12;
+			break;
+
+		    case "%M":
+			min = parseInt(a[i], 10);
+			break;
+		}
+	}
+	if (isNaN(y)) y = today.getFullYear();
+	if (isNaN(m)) m = today.getMonth();
+	if (isNaN(d)) d = today.getDate();
+	if (isNaN(hr)) hr = today.getHours();
+	if (isNaN(min)) min = today.getMinutes();
+	if (y != 0 && m != -1 && d != 0)
+		return new Date(y, m, d, hr, min, 0);
+	y = 0; m = -1; d = 0;
+	for (i = 0; i < a.length; ++i) {
+		if (a[i].search(/[a-zA-Z]+/) != -1) {
+			var t = -1;
+			for (j = 0; j < 12; ++j) {
+				if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
+			}
+			if (t != -1) {
+				if (m != -1) {
+					d = m+1;
+				}
+				m = t;
+			}
+		} else if (parseInt(a[i], 10) <= 12 && m == -1) {
+			m = a[i]-1;
+		} else if (parseInt(a[i], 10) > 31 && y == 0) {
+			y = parseInt(a[i], 10);
+			(y < 100) && (y += (y > 29) ? 1900 : 2000);
+		} else if (d == 0) {
+			d = a[i];
+		}
+	}
+	if (y == 0)
+		y = today.getFullYear();
+	if (m != -1 && d != 0)
+		return new Date(y, m, d, hr, min, 0);
+	return today;
+};
+
+/** Returns the number of days in the current month */
+Date.prototype.getMonthDays = function(month) {
+	var year = this.getFullYear();
+	if (typeof month == "undefined") {
+		month = this.getMonth();
+	}
+	if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) {
+		return 29;
+	} else {
+		return Date._MD[month];
+	}
+};
+
+/** Returns the number of day in the year. */
+Date.prototype.getDayOfYear = function() {
+	var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
+	var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
+	var time = now - then;
+	return Math.floor(time / Date.DAY);
+};
+
+/** Returns the number of the week in year, as defined in ISO 8601. */
+Date.prototype.getWeekNumber = function() {
+	var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
+	var DoW = d.getDay();
+	d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
+	var ms = d.valueOf(); // GMT
+	d.setMonth(0);
+	d.setDate(4); // Thu in Week 1
+	return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
+};
+
+/** Checks date and time equality */
+Date.prototype.equalsTo = function(date) {
+	return ((this.getFullYear() == date.getFullYear()) &&
+		(this.getMonth() == date.getMonth()) &&
+		(this.getDate() == date.getDate()) &&
+		(this.getHours() == date.getHours()) &&
+		(this.getMinutes() == date.getMinutes()));
+};
+
+/** Set only the year, month, date parts (keep existing time) */
+Date.prototype.setDateOnly = function(date) {
+	var tmp = new Date(date);
+	this.setDate(1);
+	this.setFullYear(tmp.getFullYear());
+	this.setMonth(tmp.getMonth());
+	this.setDate(tmp.getDate());
+};
+
+/** Prints the date in a string according to the given format. */
+Date.prototype.print = function (str) {
+	var m = this.getMonth();
+	var d = this.getDate();
+	var y = this.getFullYear();
+	var wn = this.getWeekNumber();
+	var w = this.getDay();
+	var s = {};
+	var hr = this.getHours();
+	var pm = (hr >= 12);
+	var ir = (pm) ? (hr - 12) : hr;
+	var dy = this.getDayOfYear();
+	if (ir == 0)
+		ir = 12;
+	var min = this.getMinutes();
+	var sec = this.getSeconds();
+	s["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME: I18N]
+	s["%A"] = Calendar._DN[w]; // full weekday name
+	s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME: I18N]
+	s["%B"] = Calendar._MN[m]; // full month name
+	// FIXME: %c : preferred date and time representation for the current locale
+	s["%C"] = 1 + Math.floor(y / 100); // the century number
+	s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
+	s["%e"] = d; // the day of the month (range 1 to 31)
+	// FIXME: %D : american date style: %m/%d/%y
+	// FIXME: %E, %F, %G, %g, %h (man strftime)
+	s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
+	s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
+	s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
+	s["%k"] = hr;		// hour, range 0 to 23 (24h format)
+	s["%l"] = ir;		// hour, range 1 to 12 (12h format)
+	s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12
+	s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
+	s["%n"] = "\n";		// a newline character
+	s["%p"] = pm ? "PM" : "AM";
+	s["%P"] = pm ? "pm" : "am";
+	// FIXME: %r : the time in am/pm notation %I:%M:%S %p
+	// FIXME: %R : the time in 24-hour notation %H:%M
+	s["%s"] = Math.floor(this.getTime() / 1000);
+	s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
+	s["%t"] = "\t";		// a tab character
+	// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
+	s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
+	s["%u"] = w + 1;	// the day of the week (range 1 to 7, 1 = MON)
+	s["%w"] = w;		// the day of the week (range 0 to 6, 0 = SUN)
+	// FIXME: %x : preferred date representation for the current locale without the time
+	// FIXME: %X : preferred time representation for the current locale without the date
+	s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99)
+	s["%Y"] = y;		// year with the century
+	s["%%"] = "%";		// a literal '%' character
+
+	var re = /%./g;
+	if (!Calendar.is_ie5 && !Calendar.is_khtml)
+		return str.replace(re, function (par) { return s[par] || par; });
+
+	var a = str.match(re);
+	for (var i = 0; i < a.length; i++) {
+		var tmp = s[a[i]];
+		if (tmp) {
+			re = new RegExp(a[i], 'g');
+			str = str.replace(re, tmp);
+		}
+	}
+
+	return str;
+};
+
+Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
+Date.prototype.setFullYear = function(y) {
+	var d = new Date(this);
+	d.__msh_oldSetFullYear(y);
+	if (d.getMonth() != this.getMonth())
+		this.setDate(28);
+	this.__msh_oldSetFullYear(y);
+};
+
+// END: DATE OBJECT PATCHES
+
+
+// global object that remembers the calendar
+window._dynarch_popupCalendar = null;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/scripts/calendar_stripped.js	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,14 @@
+/*  Copyright Mihai Bazon, 2002-2005  |  www.bazon.net/mishoo
+ * -----------------------------------------------------------
+ *
+ * The DHTML Calendar, version 1.0 "It is happening again"
+ *
+ * Details and latest version at:
+ * www.dynarch.com/projects/calendar
+ *
+ * This script is developed by Dynarch.com.  Visit us at www.dynarch.com.
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ */
+ Calendar=function(firstDayOfWeek,dateStr,onSelected,onClose){this.activeDiv=null;this.currentDateEl=null;this.getDateStatus=null;this.getDateToolTip=null;this.getDateText=null;this.timeout=null;this.onSelected=onSelected||null;this.onClose=onClose||null;this.dragging=false;this.hidden=false;this.minYear=1970;this.maxYear=2050;this.dateFormat=Calendar._TT["DEF_DATE_FORMAT"];this.ttDateFormat=Calendar._TT["TT_DATE_FORMAT"];this.isPopup=true;this.weekNumbers=true;this.firstDayOfWeek=typeof firstDayOfWeek=="number"?firstDayOfWeek:Calendar._FD;this.showsOtherMonths=false;this.dateStr=dateStr;this.ar_days=null;this.showsTime=false;this.time24=true;this.yearStep=2;this.hiliteToday=true;this.multiple=null;this.table=null;this.element=null;this.tbody=null;this.firstdayname=null;this.monthsCombo=null;this.yearsCombo=null;this.hilitedMonth=null;this.activeMonth=null;this.hilitedYear=null;this.activeYear=null;this.dateClicked=false;if(typeof Calendar._SDN=="undefined"){if(typeof Calendar._SDN_len=="undefined")Calendar._SDN_len=3;var ar=new Array();for(var i=8;i>0;){ar[--i]=Calendar._DN[i].substr(0,Calendar._SDN_len);}Calendar._SDN=ar;if(typeof Calendar._SMN_len=="undefined")Calendar._SMN_len=3;ar=new Array();for(var i=12;i>0;){ar[--i]=Calendar._MN[i].substr(0,Calendar._SMN_len);}Calendar._SMN=ar;}};Calendar._C=null;Calendar.is_ie=(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent));Calendar.is_ie5=(Calendar.is_ie&&/msie 5\.0/i.test(navigator.userAgent));Calendar.is_opera=/opera/i.test(navigator.userAgent);Calendar.is_khtml=/Konqueror|Safari|KHTML/i.test(navigator.userAgent);Calendar.getAbsolutePos=function(el){var SL=0,ST=0;var is_div=/^div$/i.test(el.tagName);if(is_div&&el.scrollLeft)SL=el.scrollLeft;if(is_div&&el.scrollTop)ST=el.scrollTop;var r={x:el.offsetLeft-SL,y:el.offsetTop-ST};if(el.offsetParent){var tmp=this.getAbsolutePos(el.offsetParent);r.x+=tmp.x;r.y+=tmp.y;}return r;};Calendar.isRelated=function(el,evt){var related=evt.relatedTarget;if(!related){var type=evt.type;if(type=="mouseover"){related=evt.fromElement;}else if(type=="mouseout"){related=evt.toElement;}}while(related){if(related==el){return true;}related=related.parentNode;}return false;};Calendar.removeClass=function(el,className){if(!(el&&el.className)){return;}var cls=el.className.split(" ");var ar=new Array();for(var i=cls.length;i>0;){if(cls[--i]!=className){ar[ar.length]=cls[i];}}el.className=ar.join(" ");};Calendar.addClass=function(el,className){Calendar.removeClass(el,className);el.className+=" "+className;};Calendar.getElement=function(ev){var f=Calendar.is_ie?window.event.srcElement:ev.currentTarget;while(f.nodeType!=1||/^div$/i.test(f.tagName))f=f.parentNode;return f;};Calendar.getTargetElement=function(ev){var f=Calendar.is_ie?window.event.srcElement:ev.target;while(f.nodeType!=1)f=f.parentNode;return f;};Calendar.stopEvent=function(ev){ev||(ev=window.event);if(Calendar.is_ie){ev.cancelBubble=true;ev.returnValue=false;}else{ev.preventDefault();ev.stopPropagation();}return false;};Calendar.addEvent=function(el,evname,func){if(el.attachEvent){el.attachEvent("on"+evname,func);}else if(el.addEventListener){el.addEventListener(evname,func,true);}else{el["on"+evname]=func;}};Calendar.removeEvent=function(el,evname,func){if(el.detachEvent){el.detachEvent("on"+evname,func);}else if(el.removeEventListener){el.removeEventListener(evname,func,true);}else{el["on"+evname]=null;}};Calendar.createElement=function(type,parent){var el=null;if(document.createElementNS){el=document.createElementNS("http://www.w3.org/1999/xhtml",type);}else{el=document.createElement(type);}if(typeof parent!="undefined"){parent.appendChild(el);}return el;};Calendar._add_evs=function(el){with(Calendar){addEvent(el,"mouseover",dayMouseOver);addEvent(el,"mousedown",dayMouseDown);addEvent(el,"mouseout",dayMouseOut);if(is_ie){addEvent(el,"dblclick",dayMouseDblClick);el.setAttribute("unselectable",true);}}};Calendar.findMonth=function(el){if(typeof el.month!="undefined"){return el;}else if(typeof el.parentNode.month!="undefined"){return el.parentNode;}return null;};Calendar.findYear=function(el){if(typeof el.year!="undefined"){return el;}else if(typeof el.parentNode.year!="undefined"){return el.parentNode;}return null;};Calendar.showMonthsCombo=function(){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var mc=cal.monthsCombo;if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}if(cal.activeMonth){Calendar.removeClass(cal.activeMonth,"active");}var mon=cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];Calendar.addClass(mon,"active");cal.activeMonth=mon;var s=mc.style;s.display="block";if(cd.navtype<0)s.left=cd.offsetLeft+"px";else{var mcw=mc.offsetWidth;if(typeof mcw=="undefined")mcw=50;s.left=(cd.offsetLeft+cd.offsetWidth-mcw)+"px";}s.top=(cd.offsetTop+cd.offsetHeight)+"px";};Calendar.showYearsCombo=function(fwd){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var yc=cal.yearsCombo;if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}if(cal.activeYear){Calendar.removeClass(cal.activeYear,"active");}cal.activeYear=null;var Y=cal.date.getFullYear()+(fwd?1:-1);var yr=yc.firstChild;var show=false;for(var i=12;i>0;--i){if(Y>=cal.minYear&&Y<=cal.maxYear){yr.innerHTML=Y;yr.year=Y;yr.style.display="block";show=true;}else{yr.style.display="none";}yr=yr.nextSibling;Y+=fwd?cal.yearStep:-cal.yearStep;}if(show){var s=yc.style;s.display="block";if(cd.navtype<0)s.left=cd.offsetLeft+"px";else{var ycw=yc.offsetWidth;if(typeof ycw=="undefined")ycw=50;s.left=(cd.offsetLeft+cd.offsetWidth-ycw)+"px";}s.top=(cd.offsetTop+cd.offsetHeight)+"px";}};Calendar.tableMouseUp=function(ev){var cal=Calendar._C;if(!cal){return false;}if(cal.timeout){clearTimeout(cal.timeout);}var el=cal.activeDiv;if(!el){return false;}var target=Calendar.getTargetElement(ev);ev||(ev=window.event);Calendar.removeClass(el,"active");if(target==el||target.parentNode==el){Calendar.cellClick(el,ev);}var mon=Calendar.findMonth(target);var date=null;if(mon){date=new Date(cal.date);if(mon.month!=date.getMonth()){date.setMonth(mon.month);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}else{var year=Calendar.findYear(target);if(year){date=new Date(cal.date);if(year.year!=date.getFullYear()){date.setFullYear(year.year);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}}with(Calendar){removeEvent(document,"mouseup",tableMouseUp);removeEvent(document,"mouseover",tableMouseOver);removeEvent(document,"mousemove",tableMouseOver);cal._hideCombos();_C=null;return stopEvent(ev);}};Calendar.tableMouseOver=function(ev){var cal=Calendar._C;if(!cal){return;}var el=cal.activeDiv;var target=Calendar.getTargetElement(ev);if(target==el||target.parentNode==el){Calendar.addClass(el,"hilite active");Calendar.addClass(el.parentNode,"rowhilite");}else{if(typeof el.navtype=="undefined"||(el.navtype!=50&&(el.navtype==0||Math.abs(el.navtype)>2)))Calendar.removeClass(el,"active");Calendar.removeClass(el,"hilite");Calendar.removeClass(el.parentNode,"rowhilite");}ev||(ev=window.event);if(el.navtype==50&&target!=el){var pos=Calendar.getAbsolutePos(el);var w=el.offsetWidth;var x=ev.clientX;var dx;var decrease=true;if(x>pos.x+w){dx=x-pos.x-w;decrease=false;}else dx=pos.x-x;if(dx<0)dx=0;var range=el._range;var current=el._current;var count=Math.floor(dx/10)%range.length;for(var i=range.length;--i>=0;)if(range[i]==current)break;while(count-->0)if(decrease){if(--i<0)i=range.length-1;}else if(++i>=range.length)i=0;var newval=range[i];el.innerHTML=newval;cal.onUpdateTime();}var mon=Calendar.findMonth(target);if(mon){if(mon.month!=cal.date.getMonth()){if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}Calendar.addClass(mon,"hilite");cal.hilitedMonth=mon;}else if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}}else{if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}var year=Calendar.findYear(target);if(year){if(year.year!=cal.date.getFullYear()){if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}Calendar.addClass(year,"hilite");cal.hilitedYear=year;}else if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}}else if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}}return Calendar.stopEvent(ev);};Calendar.tableMouseDown=function(ev){if(Calendar.getTargetElement(ev)==Calendar.getElement(ev)){return Calendar.stopEvent(ev);}};Calendar.calDragIt=function(ev){var cal=Calendar._C;if(!(cal&&cal.dragging)){return false;}var posX;var posY;if(Calendar.is_ie){posY=window.event.clientY+document.body.scrollTop;posX=window.event.clientX+document.body.scrollLeft;}else{posX=ev.pageX;posY=ev.pageY;}cal.hideShowCovered();var st=cal.element.style;st.left=(posX-cal.xOffs)+"px";st.top=(posY-cal.yOffs)+"px";return Calendar.stopEvent(ev);};Calendar.calDragEnd=function(ev){var cal=Calendar._C;if(!cal){return false;}cal.dragging=false;with(Calendar){removeEvent(document,"mousemove",calDragIt);removeEvent(document,"mouseup",calDragEnd);tableMouseUp(ev);}cal.hideShowCovered();};Calendar.dayMouseDown=function(ev){var el=Calendar.getElement(ev);if(el.disabled){return false;}var cal=el.calendar;cal.activeDiv=el;Calendar._C=cal;if(el.navtype!=300)with(Calendar){if(el.navtype==50){el._current=el.innerHTML;addEvent(document,"mousemove",tableMouseOver);}else addEvent(document,Calendar.is_ie5?"mousemove":"mouseover",tableMouseOver);addClass(el,"hilite active");addEvent(document,"mouseup",tableMouseUp);}else if(cal.isPopup){cal._dragStart(ev);}if(el.navtype==-1||el.navtype==1){if(cal.timeout)clearTimeout(cal.timeout);cal.timeout=setTimeout("Calendar.showMonthsCombo()",250);}else if(el.navtype==-2||el.navtype==2){if(cal.timeout)clearTimeout(cal.timeout);cal.timeout=setTimeout((el.navtype>0)?"Calendar.showYearsCombo(true)":"Calendar.showYearsCombo(false)",250);}else{cal.timeout=null;}return Calendar.stopEvent(ev);};Calendar.dayMouseDblClick=function(ev){Calendar.cellClick(Calendar.getElement(ev),ev||window.event);if(Calendar.is_ie){document.selection.empty();}};Calendar.dayMouseOver=function(ev){var el=Calendar.getElement(ev);if(Calendar.isRelated(el,ev)||Calendar._C||el.disabled){return false;}if(el.ttip){if(el.ttip.substr(0,1)=="_"){el.ttip=el.caldate.print(el.calendar.ttDateFormat)+el.ttip.substr(1);}el.calendar.tooltips.innerHTML=el.ttip;}if(el.navtype!=300){Calendar.addClass(el,"hilite");if(el.caldate){Calendar.addClass(el.parentNode,"rowhilite");}}return Calendar.stopEvent(ev);};Calendar.dayMouseOut=function(ev){with(Calendar){var el=getElement(ev);if(isRelated(el,ev)||_C||el.disabled)return false;removeClass(el,"hilite");if(el.caldate)removeClass(el.parentNode,"rowhilite");if(el.calendar)el.calendar.tooltips.innerHTML=_TT["SEL_DATE"];return stopEvent(ev);}};Calendar.cellClick=function(el,ev){var cal=el.calendar;var closing=false;var newdate=false;var date=null;if(typeof el.navtype=="undefined"){if(cal.currentDateEl){Calendar.removeClass(cal.currentDateEl,"selected");Calendar.addClass(el,"selected");closing=(cal.currentDateEl==el);if(!closing){cal.currentDateEl=el;}}cal.date.setDateOnly(el.caldate);date=cal.date;var other_month=!(cal.dateClicked=!el.otherMonth);if(!other_month&&!cal.currentDateEl)cal._toggleMultipleDate(new Date(date));else newdate=!el.disabled;if(other_month)cal._init(cal.firstDayOfWeek,date);}else{if(el.navtype==200){Calendar.removeClass(el,"hilite");cal.callCloseHandler();return;}date=new Date(cal.date);if(el.navtype==0)date.setDateOnly(new Date());cal.dateClicked=false;var year=date.getFullYear();var mon=date.getMonth();function setMonth(m){var day=date.getDate();var max=date.getMonthDays(m);if(day>max){date.setDate(max);}date.setMonth(m);};switch(el.navtype){case 400:Calendar.removeClass(el,"hilite");var text=Calendar._TT["ABOUT"];if(typeof text!="undefined"){text+=cal.showsTime?Calendar._TT["ABOUT_TIME"]:"";}else{text="Help and about box text is not translated into this language.\n"+"If you know this language and you feel generous please update\n"+"the corresponding file in \"lang\" subdir to match calendar-en.js\n"+"and send it back to <mihai_bazon@yahoo.com> to get it into the distribution  ;-)\n\n"+"Thank you!\n"+"http://dynarch.com/mishoo/calendar.epl\n";}alert(text);return;case-2:if(year>cal.minYear){date.setFullYear(year-1);}break;case-1:if(mon>0){setMonth(mon-1);}else if(year-->cal.minYear){date.setFullYear(year);setMonth(11);}break;case 1:if(mon<11){setMonth(mon+1);}else if(year<cal.maxYear){date.setFullYear(year+1);setMonth(0);}break;case 2:if(year<cal.maxYear){date.setFullYear(year+1);}break;case 100:cal.setFirstDayOfWeek(el.fdow);return;case 50:var range=el._range;var current=el.innerHTML;for(var i=range.length;--i>=0;)if(range[i]==current)break;if(ev&&ev.shiftKey){if(--i<0)i=range.length-1;}else if(++i>=range.length)i=0;var newval=range[i];el.innerHTML=newval;cal.onUpdateTime();return;case 0:if((typeof cal.getDateStatus=="function")&&cal.getDateStatus(date,date.getFullYear(),date.getMonth(),date.getDate())){return false;}break;}if(!date.equalsTo(cal.date)){cal.setDate(date);newdate=true;}else if(el.navtype==0)newdate=closing=true;}if(newdate){ev&&cal.callHandler();}if(closing){Calendar.removeClass(el,"hilite");ev&&cal.callCloseHandler();}};Calendar.prototype.create=function(_par){var parent=null;if(!_par){parent=document.getElementsByTagName("body")[0];this.isPopup=true;}else{parent=_par;this.isPopup=false;}this.date=this.dateStr?new Date(this.dateStr):new Date();var table=Calendar.createElement("table");this.table=table;table.cellSpacing=0;table.cellPadding=0;table.calendar=this;Calendar.addEvent(table,"mousedown",Calendar.tableMouseDown);var div=Calendar.createElement("div");this.element=div;div.className="calendar";if(this.isPopup){div.style.position="absolute";div.style.display="none";}div.appendChild(table);var thead=Calendar.createElement("thead",table);var cell=null;var row=null;var cal=this;var hh=function(text,cs,navtype){cell=Calendar.createElement("td",row);cell.colSpan=cs;cell.className="button";if(navtype!=0&&Math.abs(navtype)<=2)cell.className+=" nav";Calendar._add_evs(cell);cell.calendar=cal;cell.navtype=navtype;cell.innerHTML="<div unselectable='on'>"+text+"</div>";return cell;};row=Calendar.createElement("tr",thead);var title_length=6;(this.isPopup)&&--title_length;(this.weekNumbers)&&++title_length;hh("?",1,400).ttip=Calendar._TT["INFO"];this.title=hh("",title_length,300);this.title.className="title";if(this.isPopup){this.title.ttip=Calendar._TT["DRAG_TO_MOVE"];this.title.style.cursor="move";hh("&#x00d7;",1,200).ttip=Calendar._TT["CLOSE"];}row=Calendar.createElement("tr",thead);row.className="headrow";this._nav_py=hh("&#x00ab;",1,-2);this._nav_py.ttip=Calendar._TT["PREV_YEAR"];this._nav_pm=hh("&#x2039;",1,-1);this._nav_pm.ttip=Calendar._TT["PREV_MONTH"];this._nav_now=hh(Calendar._TT["TODAY"],this.weekNumbers?4:3,0);this._nav_now.ttip=Calendar._TT["GO_TODAY"];this._nav_nm=hh("&#x203a;",1,1);this._nav_nm.ttip=Calendar._TT["NEXT_MONTH"];this._nav_ny=hh("&#x00bb;",1,2);this._nav_ny.ttip=Calendar._TT["NEXT_YEAR"];row=Calendar.createElement("tr",thead);row.className="daynames";if(this.weekNumbers){cell=Calendar.createElement("td",row);cell.className="name wn";cell.innerHTML=Calendar._TT["WK"];}for(var i=7;i>0;--i){cell=Calendar.createElement("td",row);if(!i){cell.navtype=100;cell.calendar=this;Calendar._add_evs(cell);}}this.firstdayname=(this.weekNumbers)?row.firstChild.nextSibling:row.firstChild;this._displayWeekdays();var tbody=Calendar.createElement("tbody",table);this.tbody=tbody;for(i=6;i>0;--i){row=Calendar.createElement("tr",tbody);if(this.weekNumbers){cell=Calendar.createElement("td",row);}for(var j=7;j>0;--j){cell=Calendar.createElement("td",row);cell.calendar=this;Calendar._add_evs(cell);}}if(this.showsTime){row=Calendar.createElement("tr",tbody);row.className="time";cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=2;cell.innerHTML=Calendar._TT["TIME"]||"&nbsp;";cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=this.weekNumbers?4:3;(function(){function makeTimePart(className,init,range_start,range_end){var part=Calendar.createElement("span",cell);part.className=className;part.innerHTML=init;part.calendar=cal;part.ttip=Calendar._TT["TIME_PART"];part.navtype=50;part._range=[];if(typeof range_start!="number")part._range=range_start;else{for(var i=range_start;i<=range_end;++i){var txt;if(i<10&&range_end>=10)txt='0'+i;else txt=''+i;part._range[part._range.length]=txt;}}Calendar._add_evs(part);return part;};var hrs=cal.date.getHours();var mins=cal.date.getMinutes();var t12=!cal.time24;var pm=(hrs>12);if(t12&&pm)hrs-=12;var H=makeTimePart("hour",hrs,t12?1:0,t12?12:23);var span=Calendar.createElement("span",cell);span.innerHTML=":";span.className="colon";var M=makeTimePart("minute",mins,0,59);var AP=null;cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=2;if(t12)AP=makeTimePart("ampm",pm?"pm":"am",["am","pm"]);else cell.innerHTML="&nbsp;";cal.onSetTime=function(){var pm,hrs=this.date.getHours(),mins=this.date.getMinutes();if(t12){pm=(hrs>=12);if(pm)hrs-=12;if(hrs==0)hrs=12;AP.innerHTML=pm?"pm":"am";}H.innerHTML=(hrs<10)?("0"+hrs):hrs;M.innerHTML=(mins<10)?("0"+mins):mins;};cal.onUpdateTime=function(){var date=this.date;var h=parseInt(H.innerHTML,10);if(t12){if(/pm/i.test(AP.innerHTML)&&h<12)h+=12;else if(/am/i.test(AP.innerHTML)&&h==12)h=0;}var d=date.getDate();var m=date.getMonth();var y=date.getFullYear();date.setHours(h);date.setMinutes(parseInt(M.innerHTML,10));date.setFullYear(y);date.setMonth(m);date.setDate(d);this.dateClicked=false;this.callHandler();};})();}else{this.onSetTime=this.onUpdateTime=function(){};}var tfoot=Calendar.createElement("tfoot",table);row=Calendar.createElement("tr",tfoot);row.className="footrow";cell=hh(Calendar._TT["SEL_DATE"],this.weekNumbers?8:7,300);cell.className="ttip";if(this.isPopup){cell.ttip=Calendar._TT["DRAG_TO_MOVE"];cell.style.cursor="move";}this.tooltips=cell;div=Calendar.createElement("div",this.element);this.monthsCombo=div;div.className="combo";for(i=0;i<Calendar._MN.length;++i){var mn=Calendar.createElement("div");mn.className=Calendar.is_ie?"label-IEfix":"label";mn.month=i;mn.innerHTML=Calendar._SMN[i];div.appendChild(mn);}div=Calendar.createElement("div",this.element);this.yearsCombo=div;div.className="combo";for(i=12;i>0;--i){var yr=Calendar.createElement("div");yr.className=Calendar.is_ie?"label-IEfix":"label";div.appendChild(yr);}this._init(this.firstDayOfWeek,this.date);parent.appendChild(this.element);};Calendar._keyEvent=function(ev){var cal=window._dynarch_popupCalendar;if(!cal||cal.multiple)return false;(Calendar.is_ie)&&(ev=window.event);var act=(Calendar.is_ie||ev.type=="keypress"),K=ev.keyCode;if(ev.ctrlKey){switch(K){case 37:act&&Calendar.cellClick(cal._nav_pm);break;case 38:act&&Calendar.cellClick(cal._nav_py);break;case 39:act&&Calendar.cellClick(cal._nav_nm);break;case 40:act&&Calendar.cellClick(cal._nav_ny);break;default:return false;}}else switch(K){case 32:Calendar.cellClick(cal._nav_now);break;case 27:act&&cal.callCloseHandler();break;case 37:case 38:case 39:case 40:if(act){var prev,x,y,ne,el,step;prev=K==37||K==38;step=(K==37||K==39)?1:7;function setVars(){el=cal.currentDateEl;var p=el.pos;x=p&15;y=p>>4;ne=cal.ar_days[y][x];};setVars();function prevMonth(){var date=new Date(cal.date);date.setDate(date.getDate()-step);cal.setDate(date);};function nextMonth(){var date=new Date(cal.date);date.setDate(date.getDate()+step);cal.setDate(date);};while(1){switch(K){case 37:if(--x>=0)ne=cal.ar_days[y][x];else{x=6;K=38;continue;}break;case 38:if(--y>=0)ne=cal.ar_days[y][x];else{prevMonth();setVars();}break;case 39:if(++x<7)ne=cal.ar_days[y][x];else{x=0;K=40;continue;}break;case 40:if(++y<cal.ar_days.length)ne=cal.ar_days[y][x];else{nextMonth();setVars();}break;}break;}if(ne){if(!ne.disabled)Calendar.cellClick(ne);else if(prev)prevMonth();else nextMonth();}}break;case 13:if(act)Calendar.cellClick(cal.currentDateEl,ev);break;default:return false;}return Calendar.stopEvent(ev);};Calendar.prototype._init=function(firstDayOfWeek,date){var today=new Date(),TY=today.getFullYear(),TM=today.getMonth(),TD=today.getDate();this.table.style.visibility="hidden";var year=date.getFullYear();if(year<this.minYear){year=this.minYear;date.setFullYear(year);}else if(year>this.maxYear){year=this.maxYear;date.setFullYear(year);}this.firstDayOfWeek=firstDayOfWeek;this.date=new Date(date);var month=date.getMonth();var mday=date.getDate();var no_days=date.getMonthDays();date.setDate(1);var day1=(date.getDay()-this.firstDayOfWeek)%7;if(day1<0)day1+=7;date.setDate(-day1);date.setDate(date.getDate()+1);var row=this.tbody.firstChild;var MN=Calendar._SMN[month];var ar_days=this.ar_days=new Array();var weekend=Calendar._TT["WEEKEND"];var dates=this.multiple?(this.datesCells={}):null;for(var i=0;i<6;++i,row=row.nextSibling){var cell=row.firstChild;if(this.weekNumbers){cell.className="day wn";cell.innerHTML=date.getWeekNumber();cell=cell.nextSibling;}row.className="daysrow";var hasdays=false,iday,dpos=ar_days[i]=[];for(var j=0;j<7;++j,cell=cell.nextSibling,date.setDate(iday+1)){iday=date.getDate();var wday=date.getDay();cell.className="day";cell.pos=i<<4|j;dpos[j]=cell;var current_month=(date.getMonth()==month);if(!current_month){if(this.showsOtherMonths){cell.className+=" othermonth";cell.otherMonth=true;}else{cell.className="emptycell";cell.innerHTML="&nbsp;";cell.disabled=true;continue;}}else{cell.otherMonth=false;hasdays=true;}cell.disabled=false;cell.innerHTML=this.getDateText?this.getDateText(date,iday):iday;if(dates)dates[date.print("%Y%m%d")]=cell;if(this.getDateStatus){var status=this.getDateStatus(date,year,month,iday);if(this.getDateToolTip){var toolTip=this.getDateToolTip(date,year,month,iday);if(toolTip)cell.title=toolTip;}if(status===true){cell.className+=" disabled";cell.disabled=true;}else{if(/disabled/i.test(status))cell.disabled=true;cell.className+=" "+status;}}if(!cell.disabled){cell.caldate=new Date(date);cell.ttip="_";if(!this.multiple&&current_month&&iday==mday&&this.hiliteToday){cell.className+=" selected";this.currentDateEl=cell;}if(date.getFullYear()==TY&&date.getMonth()==TM&&iday==TD){cell.className+=" today";cell.ttip+=Calendar._TT["PART_TODAY"];}if(weekend.indexOf(wday.toString())!=-1)cell.className+=cell.otherMonth?" oweekend":" weekend";}}if(!(hasdays||this.showsOtherMonths))row.className="emptyrow";}this.title.innerHTML=Calendar._MN[month]+", "+year;this.onSetTime();this.table.style.visibility="visible";this._initMultipleDates();};Calendar.prototype._initMultipleDates=function(){if(this.multiple){for(var i in this.multiple){var cell=this.datesCells[i];var d=this.multiple[i];if(!d)continue;if(cell)cell.className+=" selected";}}};Calendar.prototype._toggleMultipleDate=function(date){if(this.multiple){var ds=date.print("%Y%m%d");var cell=this.datesCells[ds];if(cell){var d=this.multiple[ds];if(!d){Calendar.addClass(cell,"selected");this.multiple[ds]=date;}else{Calendar.removeClass(cell,"selected");delete this.multiple[ds];}}}};Calendar.prototype.setDateToolTipHandler=function(unaryFunction){this.getDateToolTip=unaryFunction;};Calendar.prototype.setDate=function(date){if(!date.equalsTo(this.date)){this._init(this.firstDayOfWeek,date);}};Calendar.prototype.refresh=function(){this._init(this.firstDayOfWeek,this.date);};Calendar.prototype.setFirstDayOfWeek=function(firstDayOfWeek){this._init(firstDayOfWeek,this.date);this._displayWeekdays();};Calendar.prototype.setDateStatusHandler=Calendar.prototype.setDisabledHandler=function(unaryFunction){this.getDateStatus=unaryFunction;};Calendar.prototype.setRange=function(a,z){this.minYear=a;this.maxYear=z;};Calendar.prototype.callHandler=function(){if(this.onSelected){this.onSelected(this,this.date.print(this.dateFormat));}};Calendar.prototype.callCloseHandler=function(){if(this.onClose){this.onClose(this);}this.hideShowCovered();};Calendar.prototype.destroy=function(){var el=this.element.parentNode;el.removeChild(this.element);Calendar._C=null;window._dynarch_popupCalendar=null;};Calendar.prototype.reparent=function(new_parent){var el=this.element;el.parentNode.removeChild(el);new_parent.appendChild(el);};Calendar._checkCalendar=function(ev){var calendar=window._dynarch_popupCalendar;if(!calendar){return false;}var el=Calendar.is_ie?Calendar.getElement(ev):Calendar.getTargetElement(ev);for(;el!=null&&el!=calendar.element;el=el.parentNode);if(el==null){window._dynarch_popupCalendar.callCloseHandler();return Calendar.stopEvent(ev);}};Calendar.prototype.show=function(){var rows=this.table.getElementsByTagName("tr");for(var i=rows.length;i>0;){var row=rows[--i];Calendar.removeClass(row,"rowhilite");var cells=row.getElementsByTagName("td");for(var j=cells.length;j>0;){var cell=cells[--j];Calendar.removeClass(cell,"hilite");Calendar.removeClass(cell,"active");}}this.element.style.display="block";this.hidden=false;if(this.isPopup){window._dynarch_popupCalendar=this;Calendar.addEvent(document,"keydown",Calendar._keyEvent);Calendar.addEvent(document,"keypress",Calendar._keyEvent);Calendar.addEvent(document,"mousedown",Calendar._checkCalendar);}this.hideShowCovered();};Calendar.prototype.hide=function(){if(this.isPopup){Calendar.removeEvent(document,"keydown",Calendar._keyEvent);Calendar.removeEvent(document,"keypress",Calendar._keyEvent);Calendar.removeEvent(document,"mousedown",Calendar._checkCalendar);}this.element.style.display="none";this.hidden=true;this.hideShowCovered();};Calendar.prototype.showAt=function(x,y){var s=this.element.style;s.left=x+"px";s.top=y+"px";this.show();};Calendar.prototype.showAtElement=function(el,opts){var self=this;var p=Calendar.getAbsolutePos(el);if(!opts||typeof opts!="string"){this.showAt(p.x,p.y+el.offsetHeight);return true;}function fixPosition(box){if(box.x<0)box.x=0;if(box.y<0)box.y=0;var cp=document.createElement("div");var s=cp.style;s.position="absolute";s.right=s.bottom=s.width=s.height="0px";document.body.appendChild(cp);var br=Calendar.getAbsolutePos(cp);document.body.removeChild(cp);if(Calendar.is_ie){br.y+=document.body.scrollTop;br.x+=document.body.scrollLeft;}else{br.y+=window.scrollY;br.x+=window.scrollX;}var tmp=box.x+box.width-br.x;if(tmp>0)box.x-=tmp;tmp=box.y+box.height-br.y;if(tmp>0)box.y-=tmp;};this.element.style.display="block";Calendar.continuation_for_the_fucking_khtml_browser=function(){var w=self.element.offsetWidth;var h=self.element.offsetHeight;self.element.style.display="none";var valign=opts.substr(0,1);var halign="l";if(opts.length>1){halign=opts.substr(1,1);}switch(valign){case "T":p.y-=h;break;case "B":p.y+=el.offsetHeight;break;case "C":p.y+=(el.offsetHeight-h)/2;break;case "t":p.y+=el.offsetHeight-h;break;case "b":break;}switch(halign){case "L":p.x-=w;break;case "R":p.x+=el.offsetWidth;break;case "C":p.x+=(el.offsetWidth-w)/2;break;case "l":p.x+=el.offsetWidth-w;break;case "r":break;}p.width=w;p.height=h+40;self.monthsCombo.style.display="none";fixPosition(p);self.showAt(p.x,p.y);};if(Calendar.is_khtml)setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()",10);else Calendar.continuation_for_the_fucking_khtml_browser();};Calendar.prototype.setDateFormat=function(str){this.dateFormat=str;};Calendar.prototype.setTtDateFormat=function(str){this.ttDateFormat=str;};Calendar.prototype.parseDate=function(str,fmt){if(!fmt)fmt=this.dateFormat;this.setDate(Date.parseDate(str,fmt));};Calendar.prototype.hideShowCovered=function(){if(!Calendar.is_ie&&!Calendar.is_opera)return;function getVisib(obj){var value=obj.style.visibility;if(!value){if(document.defaultView&&typeof(document.defaultView.getComputedStyle)=="function"){if(!Calendar.is_khtml)value=document.defaultView. getComputedStyle(obj,"").getPropertyValue("visibility");else value='';}else if(obj.currentStyle){value=obj.currentStyle.visibility;}else value='';}return value;};var tags=new Array("applet","iframe","select");var el=this.element;var p=Calendar.getAbsolutePos(el);var EX1=p.x;var EX2=el.offsetWidth+EX1;var EY1=p.y;var EY2=el.offsetHeight+EY1;for(var k=tags.length;k>0;){var ar=document.getElementsByTagName(tags[--k]);var cc=null;for(var i=ar.length;i>0;){cc=ar[--i];p=Calendar.getAbsolutePos(cc);var CX1=p.x;var CX2=cc.offsetWidth+CX1;var CY1=p.y;var CY2=cc.offsetHeight+CY1;if(this.hidden||(CX1>EX2)||(CX2<EX1)||(CY1>EY2)||(CY2<EY1)){if(!cc.__msh_save_visibility){cc.__msh_save_visibility=getVisib(cc);}cc.style.visibility=cc.__msh_save_visibility;}else{if(!cc.__msh_save_visibility){cc.__msh_save_visibility=getVisib(cc);}cc.style.visibility="hidden";}}}};Calendar.prototype._displayWeekdays=function(){var fdow=this.firstDayOfWeek;var cell=this.firstdayname;var weekend=Calendar._TT["WEEKEND"];for(var i=0;i<7;++i){cell.className="day name";var realday=(i+fdow)%7;if(i){cell.ttip=Calendar._TT["DAY_FIRST"].replace("%s",Calendar._DN[realday]);cell.navtype=100;cell.calendar=this;cell.fdow=realday;Calendar._add_evs(cell);}if(weekend.indexOf(realday.toString())!=-1){Calendar.addClass(cell,"weekend");}cell.innerHTML=Calendar._SDN[(i+fdow)%7];cell=cell.nextSibling;}};Calendar.prototype._hideCombos=function(){this.monthsCombo.style.display="none";this.yearsCombo.style.display="none";};Calendar.prototype._dragStart=function(ev){if(this.dragging){return;}this.dragging=true;var posX;var posY;if(Calendar.is_ie){posY=window.event.clientY+document.body.scrollTop;posX=window.event.clientX+document.body.scrollLeft;}else{posY=ev.clientY+window.scrollY;posX=ev.clientX+window.scrollX;}var st=this.element.style;this.xOffs=posX-parseInt(st.left);this.yOffs=posY-parseInt(st.top);with(Calendar){addEvent(document,"mousemove",calDragIt);addEvent(document,"mouseup",calDragEnd);}};Date._MD=new Array(31,28,31,30,31,30,31,31,30,31,30,31);Date.SECOND=1000;Date.MINUTE=60*Date.SECOND;Date.HOUR=60*Date.MINUTE;Date.DAY=24*Date.HOUR;Date.WEEK=7*Date.DAY;Date.parseDate=function(str,fmt){var today=new Date();var y=0;var m=-1;var d=0;var a=str.split(/\W+/);var b=fmt.match(/%./g);var i=0,j=0;var hr=0;var min=0;for(i=0;i<a.length;++i){if(!a[i])continue;switch(b[i]){case "%d":case "%e":d=parseInt(a[i],10);break;case "%m":m=parseInt(a[i],10)-1;break;case "%Y":case "%y":y=parseInt(a[i],10);(y<100)&&(y+=(y>29)?1900:2000);break;case "%b":case "%B":for(j=0;j<12;++j){if(Calendar._MN[j].substr(0,a[i].length).toLowerCase()==a[i].toLowerCase()){m=j;break;}}break;case "%H":case "%I":case "%k":case "%l":hr=parseInt(a[i],10);break;case "%P":case "%p":if(/pm/i.test(a[i])&&hr<12)hr+=12;else if(/am/i.test(a[i])&&hr>=12)hr-=12;break;case "%M":min=parseInt(a[i],10);break;}}if(isNaN(y))y=today.getFullYear();if(isNaN(m))m=today.getMonth();if(isNaN(d))d=today.getDate();if(isNaN(hr))hr=today.getHours();if(isNaN(min))min=today.getMinutes();if(y!=0&&m!=-1&&d!=0)return new Date(y,m,d,hr,min,0);y=0;m=-1;d=0;for(i=0;i<a.length;++i){if(a[i].search(/[a-zA-Z]+/)!=-1){var t=-1;for(j=0;j<12;++j){if(Calendar._MN[j].substr(0,a[i].length).toLowerCase()==a[i].toLowerCase()){t=j;break;}}if(t!=-1){if(m!=-1){d=m+1;}m=t;}}else if(parseInt(a[i],10)<=12&&m==-1){m=a[i]-1;}else if(parseInt(a[i],10)>31&&y==0){y=parseInt(a[i],10);(y<100)&&(y+=(y>29)?1900:2000);}else if(d==0){d=a[i];}}if(y==0)y=today.getFullYear();if(m!=-1&&d!=0)return new Date(y,m,d,hr,min,0);return today;};Date.prototype.getMonthDays=function(month){var year=this.getFullYear();if(typeof month=="undefined"){month=this.getMonth();}if(((0==(year%4))&&((0!=(year%100))||(0==(year%400))))&&month==1){return 29;}else{return Date._MD[month];}};Date.prototype.getDayOfYear=function(){var now=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var then=new Date(this.getFullYear(),0,0,0,0,0);var time=now-then;return Math.floor(time/Date.DAY);};Date.prototype.getWeekNumber=function(){var d=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var DoW=d.getDay();d.setDate(d.getDate()-(DoW+6)%7+3);var ms=d.valueOf();d.setMonth(0);d.setDate(4);return Math.round((ms-d.valueOf())/(7*864e5))+1;};Date.prototype.equalsTo=function(date){return((this.getFullYear()==date.getFullYear())&&(this.getMonth()==date.getMonth())&&(this.getDate()==date.getDate())&&(this.getHours()==date.getHours())&&(this.getMinutes()==date.getMinutes()));};Date.prototype.setDateOnly=function(date){var tmp=new Date(date);this.setDate(1);this.setFullYear(tmp.getFullYear());this.setMonth(tmp.getMonth());this.setDate(tmp.getDate());};Date.prototype.print=function(str){var m=this.getMonth();var d=this.getDate();var y=this.getFullYear();var wn=this.getWeekNumber();var w=this.getDay();var s={};var hr=this.getHours();var pm=(hr>=12);var ir=(pm)?(hr-12):hr;var dy=this.getDayOfYear();if(ir==0)ir=12;var min=this.getMinutes();var sec=this.getSeconds();s["%a"]=Calendar._SDN[w];s["%A"]=Calendar._DN[w];s["%b"]=Calendar._SMN[m];s["%B"]=Calendar._MN[m];s["%C"]=1+Math.floor(y/100);s["%d"]=(d<10)?("0"+d):d;s["%e"]=d;s["%H"]=(hr<10)?("0"+hr):hr;s["%I"]=(ir<10)?("0"+ir):ir;s["%j"]=(dy<100)?((dy<10)?("00"+dy):("0"+dy)):dy;s["%k"]=hr;s["%l"]=ir;s["%m"]=(m<9)?("0"+(1+m)):(1+m);s["%M"]=(min<10)?("0"+min):min;s["%n"]="\n";s["%p"]=pm?"PM":"AM";s["%P"]=pm?"pm":"am";s["%s"]=Math.floor(this.getTime()/1000);s["%S"]=(sec<10)?("0"+sec):sec;s["%t"]="\t";s["%U"]=s["%W"]=s["%V"]=(wn<10)?("0"+wn):wn;s["%u"]=w+1;s["%w"]=w;s["%y"]=(''+y).substr(2,2);s["%Y"]=y;s["%%"]="%";var re=/%./g;if(!Calendar.is_ie5&&!Calendar.is_khtml)return str.replace(re,function(par){return s[par]||par;});var a=str.match(re);for(var i=0;i<a.length;i++){var tmp=s[a[i]];if(tmp){re=new RegExp(a[i],'g');str=str.replace(re,tmp);}}return str;};Date.prototype.__msh_oldSetFullYear=Date.prototype.setFullYear;Date.prototype.setFullYear=function(y){var d=new Date(this);d.__msh_oldSetFullYear(y);if(d.getMonth()!=this.getMonth())this.setDate(28);this.__msh_oldSetFullYear(y);};window._dynarch_popupCalendar=null;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/scripts/gnviewer.js	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,17 @@
+function displayOverlay() {
+    adjustOverlaySize();
+    showDiv("overlay");
+    showDiv("overlayContent");
+}
+
+function adjustOverlaySize() {
+    var lHeight = document.getElementById("page").scrollHeight;
+    //alert(lHeight);
+    var lOverlay = document.getElementById("overlay");
+    lOverlay.style.height = lHeight + 'px';
+}
+
+function showDiv(pName) {
+    var el = document.getElementById(pName);
+    el.style.visibility = (el.style.visibility == "visible") ? "hidden" : "visible";
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/styles/calendar-blue.css	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,232 @@
+/* The main calendar widget.  DIV containing a table. */
+
+div.calendar { position: relative; }
+
+.calendar, .calendar table {
+  border: 1px solid #556;
+  font-size: 11px;
+  color: #000;
+  cursor: default;
+  background: #eef;
+  font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+  text-align: center;    /* They are the navigation buttons */
+  padding: 2px;          /* Make the buttons seem like they're pressing */
+}
+
+.calendar .nav {
+  background: #778 url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+  font-weight: bold;      /* Pressing it will take you to the current date */
+  text-align: center;
+  background: #fff;
+  color: #000;
+  padding: 2px;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+  background: #778;
+  color: #fff;
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+  background: #bdf;
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+  border-bottom: 1px solid #556;
+  padding: 2px;
+  text-align: center;
+  color: #000;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+  color: #a66;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+  background-color: #aaf;
+  color: #000;
+  border: 1px solid #04f;
+  padding: 1px;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+  background-color: #77c;
+  padding: 2px 0px 0px 2px;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+  width: 2em;
+  color: #456;
+  text-align: right;
+  padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+  font-size: 80%;
+  color: #bbb;
+}
+.calendar tbody .day.othermonth.oweekend {
+  color: #fbb;
+}
+
+.calendar table .wn {
+  padding: 2px 3px 2px 2px;
+  border-right: 1px solid #000;
+  background: #bdf;
+}
+
+.calendar tbody .rowhilite td {
+  background: #def;
+}
+
+.calendar tbody .rowhilite td.wn {
+  background: #eef;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+  background: #def;
+  padding: 1px 3px 1px 1px;
+  border: 1px solid #bbb;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+  background: #cde;
+  padding: 2px 2px 0px 2px;
+}
+
+.calendar tbody td.selected { /* Cell showing today date */
+  font-weight: bold;
+  border: 1px solid #000;
+  padding: 1px 3px 1px 1px;
+  background: #fff;
+  color: #000;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+  color: #a66;
+}
+
+.calendar tbody td.today { /* Cell showing selected date */
+  font-weight: bold;
+  color: #00f;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+  visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+  display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+  text-align: center;
+  background: #556;
+  color: #fff;
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+  background: #fff;
+  color: #445;
+  border-top: 1px solid #556;
+  padding: 1px;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+  background: #aaf;
+  border: 1px solid #04f;
+  color: #000;
+  padding: 1px;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+  background: #77c;
+  padding: 2px 0px 0px 2px;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+  position: absolute;
+  display: none;
+  top: 0px;
+  left: 0px;
+  width: 4em;
+  cursor: default;
+  border: 1px solid #655;
+  background: #def;
+  color: #000;
+  font-size: 90%;
+  z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+  text-align: center;
+  padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+  width: 4em;
+}
+
+.calendar .combo .hilite {
+  background: #acf;
+}
+
+.calendar .combo .active {
+  border-top: 1px solid #46a;
+  border-bottom: 1px solid #46a;
+  background: #eef;
+  font-weight: bold;
+}
+
+.calendar td.time {
+  border-top: 1px solid #000;
+  padding: 1px 0px;
+  text-align: center;
+  background-color: #f4f0e8;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+  padding: 0px 3px 0px 4px;
+  border: 1px solid #889;
+  font-weight: bold;
+  background-color: #fff;
+}
+
+.calendar td.time .ampm {
+  text-align: center;
+}
+
+.calendar td.time .colon {
+  padding: 0px 2px 0px 3px;
+  font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+  border-color: #000;
+  background-color: #667;
+  color: #fff;
+}
+
+.calendar td.time span.active {
+  border-color: #f00;
+  background-color: #000;
+  color: #0f0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/main/webapp/styles/default.css	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,385 @@
+@charset
+"ISO-8859-1"
+;
+
+body {
+    background-color: #FFFFFF;
+    font-family: verdana, arial, Helvetica, sans-serif;
+
+    height: 100%;
+    margin: 0;
+    padding: 0;
+}
+
+br {
+    padding: 0;
+    margin: 0;
+    font-size: 0;
+    clear: both;
+}
+
+form {
+    margin: 0;
+    padding: 0;
+}
+
+h1 {
+    font-weight: bold;
+    font-size: 0.9em;
+    color: #00416B;
+}
+
+h2 {
+    font-weight: bold;
+    font-size: 0.8em;
+    color: #00416B;
+}
+
+a {
+    color: #00416B;
+    text-decoration: none;
+}
+
+legend {
+    border: 1px solid #CCD5DE;
+    padding: 4px 5px;
+    margin: 0 0 0 0;
+    background-color: white;
+    font-weight: bolder;
+    color: #00416B;
+    clear: both;
+}
+
+fieldset {
+    margin: 5px 0 0 10px;
+    padding-left: 10px;
+    padding-right: 10px;
+    border: 1px solid #CCD5DE;
+    background-repeat: repeat-x;
+    background-position: top left;
+    display: block;
+}
+
+div {
+    margin: 0;
+    padding: 0;
+}
+
+p, li, dl, input, select, address, legend, label, fieldset span {
+    font-size: 0.7em;
+}
+
+legend.expandableFieldset {
+    cursor: pointer;
+}
+
+select, textarea {
+    width: 250px;
+}
+
+input.textinput {
+    width: 250px;
+}
+
+
+textarea {
+    font-family: verdana, arial, Helvetica, sans-serif;
+    font-size: 0.7em;
+}
+
+table.dynamic {
+    font-size: 1.2em;
+}
+
+table.static {
+    margin:        0 0 0 0;
+    width:         293px;
+}
+
+table, th, td {
+    margin: 0;
+    padding: 0;
+    font-size: 0.8em;
+}
+
+img {
+    border: 0px;
+}
+
+.down {
+    padding-top: 20px;
+    width: 315px;
+}
+
+.historyback {
+    padding-left:   10px;
+    vertical-align: top;
+    text-align: right;
+}
+
+.parameter {
+    color:          #00416B;
+    font-size:      0.8em;
+    font-weight:    bold;
+    padding-left:   5px;
+    text-align:     left;
+    vertical-align: top;
+    width:          100px;
+}
+
+.value {
+    font-size: 1.2em;
+}
+
+.submitbutton{
+	cursor:pointer;
+	border:outset 1px #ccc;
+	background:#ffffff;
+	color:#666;
+	font-weight:bold;
+	padding: 1px 2px;
+	
+}
+
+.error {
+    color: #CD3426;
+    font-size: 10px;
+    font-weight: bold;
+    margin: 2px 2px;
+}
+
+.errormsg {
+
+	color: red;
+	font-weight: bold;
+}
+
+/*  ====================== Header ============================= */
+#head {
+	
+    height: 25px;
+    margin: 0;
+    padding: 0;
+    background-color: #103D64;
+}
+
+#logo {	
+	float:right;
+    background-image: url( ../images/bsh_logo.gif );
+    background-repeat: no-repeat;
+    
+	top:0px;	
+    height: 170px;
+    width: 75px;
+    
+}
+#head a {
+	clear:left;
+	
+}
+#project {
+	position:absolute;
+	top:27px;	
+	left:10px;
+	width: 400px;
+	text-align: left;
+	
+}
+
+#load_error {
+    position:absolute;
+    top:27px;   
+    left:425px;
+    width: 400px;
+    text-align: left;
+    
+}
+
+#project_load {
+	position:absolute;
+	top: 0px;
+	left: 250px;
+	width: 277px;
+	border: 1px solid lightgray;
+	visibility: hidden;
+	padding: 5px;
+}
+	
+
+#head h1, #head h2 {
+    display: block;
+    color: white;
+    font-size: large;
+    padding-left: 300px;
+ 	margin: 0;
+    
+    
+}
+
+div#header {
+    background-color: #143B62;
+    margin: 0;
+    padding: 0;
+    height: 50px;
+}
+
+div#header img {
+    padding: 0;
+    margin: 0;
+    border-width: 0;
+}
+
+div#page {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+
+}
+
+.showContent {
+    display: block;
+}
+
+.hideContent {
+    display: none;
+}
+
+div#selection {
+    float: left;
+    width: 300px;
+    margin-top: 30px;
+}
+
+div#diagram {
+    position: absolute;
+    top: 33px;
+    left: 350px;
+}
+
+div#export {
+    width:        325px;
+}
+
+/* this is a wrapper for diagramoptions and statistics*/
+div#diagrammAddOns {
+    position: absolute;
+    top: 600px;
+    left: 300px;
+}
+
+div#diagramoptions {
+    position: relative;
+    width:    325px;
+}
+
+div#diagramOptionsContent {
+    width : 325px;
+}
+
+div.statistics {
+    position: absolute;
+    top     : 33px;
+    left    : 350px;
+    width   : 325px;
+}
+
+div#statisticValues {
+    width: 100%;
+}
+
+table#statistik_tab_0{
+ position:relative;
+ top:0px;
+ left:0px;	
+}
+table#statistik_tab_1{
+ position:absolute;
+ top:30px;
+ left:230px;	
+}
+table#statistik_tab_2{
+	position:relative;
+	top:-210px;
+ 	left:410px;	
+}
+table#statistik_tab_3{
+ position:relative;
+ top:-195px;
+ left:0px;	
+}
+table#statistik_tab_4{
+ position:absolute;
+ top:260px;
+ left:230px;	
+}
+table#statistik_tab_5{
+	position:absolute;
+	top:260px;
+ 	left:410px;	
+}
+table#statistik_tab_6{
+ position:relative;
+ top:-180px;
+ left:0px;	
+}
+table#statistik_tab_7{
+ position:absolute;
+ top:485px;
+ left:230px;	
+}
+table#statistik_tab_8{
+	position:absolute;
+	top:485px;
+ 	left:410px;	
+}
+
+div#basefilter {
+    margin-top: 30px;
+    width: 325px;
+}
+
+div#timeseriesfilter {
+    margin-top: 1px;
+    padding: 0px;
+    width: 325px;
+}
+
+#timeRangeForm label {
+    float: left;
+    margin-right: 5px;
+    text-align: left;
+    width: 20px;
+}
+
+/* ---------- OVERLAY ------------------------- */
+#overlay {
+    visibility: hidden;
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    text-align: center;
+    z-index: 100;
+    background-color: white;
+    -moz-opacity: 0.5;
+    opacity: 0.5;
+}
+
+#overlayContent {
+    visibility: hidden;
+    position: relative;
+    z-index: 101;
+    width: 300px;
+    margin: 150px auto;
+    background-color: #fff;
+    border: 1px solid #000;
+    padding: 75px;
+    text-align: right;
+    background-image: url( ../images/bsh_logo.gif );
+    background-repeat: no-repeat;
+
+}
+
+/* ----------------------------------- */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/test/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,89 @@
+package de.intevation.gnv.action.mapviewer.parser;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Iterator;
+
+import junit.framework.TestCase;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Logger;
+
+import de.intevation.gnv.artifactdatabase.objects.map.Layer;
+import de.intevation.gnv.artifactdatabase.objects.map.MapService;
+
+public class ExternalCallParserTestCase extends TestCase {
+    
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = null;
+
+    static {
+        BasicConfigurator.configure();
+        log = Logger.getLogger(ExternalCallParserTestCase.class);
+    }
+    
+    public ExternalCallParserTestCase() {
+        super();
+    }
+
+    public ExternalCallParserTestCase(String name) {
+        super(name);
+    }
+    
+    public void testParseExternalCall() {
+        log.debug("Execute testParseExternalCall");
+        try {
+            InputStream inputStream = new FileInputStream(
+                    new File("src/test/ressources/externalinterfacecall.xml"));
+           ExternalCallParser ecp = new XMLExternalCallParser(inputStream);
+           ecp.parse();
+           String geometry = ecp.getGeometry();
+           assertNotNull(geometry);
+           log.debug("Parsed Geometry: "+geometry);
+           String srs = ecp.getSRS();
+           assertNotNull(srs);
+           log.debug("Parsed SRS: "+srs);
+           Collection<MapService> mapServices = ecp.getMapServices();
+           assertNotNull(mapServices);
+           log.debug(mapServices.size()+"Mapservices parsed");
+           assertEquals(2, mapServices.size());
+           Iterator<MapService> it = mapServices.iterator();
+           MapService mapService1 = it.next();
+           MapService mapService2 = it.next();
+           
+           log.debug("MapService 1");
+           log.debug("ID: "+mapService1.getID());
+           log.debug("URL: "+mapService1.getURL());
+           log.debug("TYPE: "+mapService1.getType());
+           Collection<Layer> layer1 = mapService1.getLayer();
+           log.debug("Layer parsed: "+layer1.size());
+           assertEquals(5, layer1.size());
+           Iterator<Layer> layerIt1 = layer1.iterator();
+           while(layerIt1.hasNext()){
+               log.debug(layerIt1.next().toString());
+           }
+           
+           log.debug("MapService 2");
+           log.debug("ID: "+mapService2.getID());
+           log.debug("URL: "+mapService2.getURL());
+           log.debug("TYPE: "+mapService2.getType());
+           Collection<Layer> layer2 = mapService2.getLayer();
+           log.debug("Layer parsed: "+layer2.size());
+           assertEquals(2, layer2.size());
+           Iterator<Layer> layerIt2 = layer2.iterator();
+           while(layerIt2.hasNext()){
+               log.debug(layerIt2.next().toString());
+           }
+           
+        } catch (Exception e) {
+            log.error(e,e);
+            fail();
+        }
+        
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,102 @@
+/**
+ *
+ */
+package de.intevation.gnv.artifactdatabase.client;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Locale;
+
+import junit.framework.TestCase;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Logger;
+
+import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactObject;
+import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter;
+import de.intevation.gnv.artifactdatabase.objects.InputParameter;
+import de.intevation.gnv.util.XSLTransformer;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class ArtifactDatabaseClientTestCase extends TestCase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = null;
+
+    static {
+        BasicConfigurator.configure();
+        log = Logger.getLogger(DefaultArtifactDatabaseClient.class);
+    }
+
+    /**
+     * Constructor
+     * 
+     * @param namemessage
+     */
+    public ArtifactDatabaseClientTestCase(String name) {
+        super(name);
+    }
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testArtifactDatabaseClient() {
+
+        try {
+            ArtifactDatabaseClient artifactDatabaseClient = ArtifactDatabaseClientFactory
+                    .getInstance().getArtifactDatabaseClient(Locale.GERMAN);
+            Collection<ArtifactObject> factories = artifactDatabaseClient
+                    .getArtifactFactories();
+            if (factories != null && !factories.isEmpty()) {
+                Iterator<ArtifactObject> it = factories.iterator();
+                while (it.hasNext()) {
+                    ArtifactObject aof = it.next();
+                    ArtifactObject artifact = artifactDatabaseClient
+                            .createNewArtifact(aof);
+                    ArtifactDescription ad = artifactDatabaseClient
+                            .getCurrentStepDescription(aof, artifact,true);
+                    log.debug("Artifact aktualisert.");
+                    XSLTransformer transformer = new XSLTransformer();
+                    String transformedUI = transformer
+                            .transform(
+                                    ad.getCurrentUI(),
+                                    "UTF-8",
+                                    ("src/main/webapp/WEB-INF/config/templates/describe-ui.xsl"));
+                    log.debug(transformedUI);
+
+                    Collection<InputParameter> inputParameter = new ArrayList<InputParameter>(
+                            1);
+                    inputParameter.add(new DefaultInputParameter("product",
+                            new String[] { "timeSeries" }));
+                    ad = artifactDatabaseClient.doNextStep(aof, artifact,
+                            "timeSeries", inputParameter);
+
+                    transformedUI = transformer
+                            .transform(
+                                    ad.getCurrentUI(),
+                                    "UTF-8",
+                                    ("src/main/webapp/WEB-INF/config/templates/describe-ui.xsl"));
+                    log.debug(transformedUI);
+                }
+            }
+
+        } catch (ArtifactDatabaseClientException e) {
+            log.error(e, e);
+            fail();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/test/java/de/intevation/gnv/util/XSLTransformerTestCase.java	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,57 @@
+/**
+ *
+ */
+package de.intevation.gnv.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+import junit.framework.TestCase;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.gnv.artifactdatabase.client.DefaultArtifactDatabaseClient;
+
+/**
+ * @author Tim Englich <tim.englich@intevation.de>
+ * 
+ */
+public class XSLTransformerTestCase extends TestCase {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = null;
+
+    static {
+        BasicConfigurator.configure();
+        log = Logger.getLogger(DefaultArtifactDatabaseClient.class);
+    }
+
+    public XSLTransformerTestCase() {
+        super();
+    }
+
+    public XSLTransformerTestCase(String name) {
+        super(name);
+    }
+
+    public void testDescribeUI() {
+
+        try {
+            // System.setProperty("javax.xml.transform.TransformerFactory","com.icl.saxon.TransformerFactoryImpl");
+            Document document = new XMLUtils()
+                    .readDocument(new FileInputStream(new File(
+                            "src/test/ressources/describe-ui-test.xml")));
+            XSLTransformer transformer = new XSLTransformer();
+            String value = transformer.transform(document, "UTF-8",
+                    "src/main/webapp/WEB-INF/config/templates/describe-ui.xsl");
+            log.debug(value);
+        } catch (FileNotFoundException e) {
+            log.error(e, e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/test/ressources/describe-ui-test.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xform:select xmlns:xform="http://www.w3.org/2002/xforms" ref="product">
+	<xform:label>product</xform:label>
+	<xform:choices>
+		<xform:item>
+			<xform:label>timeSeries</xform:label>
+			<xform:value>timeSeries</xform:value>
+		</xform:item>
+	</xform:choices>
+</xform:select>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv/src/test/ressources/externalinterfacecall.xml	Fri Sep 28 12:13:50 2012 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gnviewer>
+    <mapservices>
+        <mapservice id="foo" type="arcims" url="http://foo.bar.de">
+            <layer id="layer0" name="Layer 0"/>
+            <layer id="layer1" name="Layer 1">
+                 <layer id="layer2" name="Layer 2"/>
+                 <layer id="layer3" name="Layer 3"/>
+             </layer>
+            <layer id="layern" name="Layer N"/>
+        </mapservice>
+        <mapservice id="foo1" type="wms" url="http://foo1.bar.de">
+             <layer id="layer0" name="Layer 0"/>
+             <layer id="layer1" name="Layer 1"/>
+        </mapservice>
+    </mapservices> 
+    <location>
+        <srs>EPSG:4324</srs>
+        <data>POINT(8.6 56.0)</data>
+    </location>
+</gnviewer>
\ No newline at end of file

http://dive4elements.wald.intevation.org