[Dive4elements-commits] [PATCH 05 of 14] Moved directories to org.dive4elements.river

Wald Commits scm-commit at wald.intevation.org
Thu Apr 25 15:06:51 CEST 2013


# HG changeset patch
# User Sascha L. Teichmann <teichmann at intevation.de>
# Date 1366883591 -7200
# Node ID dfb26b03b179dd3cb1d19473fd8cd50561c15392
# Parent  e308d4ecd35aaf3700a3a844f6af0123a5ded36c
Moved directories to org.dive4elements.river

diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/App.java
--- a/flys-backend/src/main/java/de/intevation/flys/App.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-package de.intevation.flys;
-
-import de.intevation.flys.backend.SessionFactoryProvider;
-import de.intevation.flys.backend.FLYSCredentials;
-
-import org.hibernate.cfg.Configuration;
-
-import org.hibernate.dialect.resolver.DialectFactory;
-
-public class App
-{
-    public static void dumpSchema(Configuration cfg) {
-        System.out.println("BEGIN;");
-
-        String [] setupScript = cfg.generateSchemaCreationScript(
-            DialectFactory.constructDialect(
-                FLYSCredentials.getDefault().getDialect()));
-
-        for (String line: setupScript) {
-            System.out.println(line + ";");
-        }
-
-        System.out.println("COMMIT;");
-    }
-
-    public static void main(String [] args) {
-        dumpSchema(SessionFactoryProvider.createConfiguration());
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/backend/Credentials.java
--- a/flys-backend/src/main/java/de/intevation/flys/backend/Credentials.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-package de.intevation.flys.backend;
-
-public abstract class Credentials
-{
-    protected String   user;
-    protected String   password;
-    protected String   dialect;
-    protected String   driver;
-    protected String   url;
-    protected String   connectionInitSqls;
-    protected Class [] classes;
-
-    public Credentials() {
-    }
-
-    public Credentials(
-        String   user,
-        String   password,
-        String   dialect,
-        String   driver,
-        String   url,
-        String   connectionInitSqls,
-        Class [] classes
-    ) {
-        this.user               = user;
-        this.password           = password;
-        this.dialect            = dialect;
-        this.driver             = driver;
-        this.url                = url;
-        this.connectionInitSqls = connectionInitSqls;
-        this.classes            = classes;
-    }
-
-    public String getUser() {
-        return user;
-    }
-
-    public void setUser(String user) {
-        this.user = user;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public String getDialect() {
-        return dialect;
-    }
-
-    public void setDialect(String dialect) {
-        this.dialect = dialect;
-    }
-
-    public String getDriver() {
-        return driver;
-    }
-
-    public void setDriver(String driver) {
-        this.driver = driver;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getConnectionInitSqls() {
-        return connectionInitSqls;
-    }
-
-    public void setConnectionInitSqls(String connectionInitSqls) {
-        this.connectionInitSqls = connectionInitSqls;
-    }
-
-    public Class [] getClasses() {
-        return classes;
-    }
-
-    public void setClasses(Class [] classes) {
-        this.classes = classes;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/backend/FLYSCredentials.java
--- a/flys-backend/src/main/java/de/intevation/flys/backend/FLYSCredentials.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,253 +0,0 @@
-package de.intevation.flys.backend;
-
-import de.intevation.artifacts.common.utils.Config;
-
-import de.intevation.flys.model.Annotation;
-import de.intevation.flys.model.AnnotationType;
-import de.intevation.flys.model.Attribute;
-import de.intevation.flys.model.AxisKind;
-import de.intevation.flys.model.BedHeightEpoch;
-import de.intevation.flys.model.BedHeightEpochValue;
-import de.intevation.flys.model.BedHeightSingle;
-import de.intevation.flys.model.BedHeightSingleValue;
-import de.intevation.flys.model.BedHeightType;
-import de.intevation.flys.model.Building;
-import de.intevation.flys.model.BoundaryKind;
-import de.intevation.flys.model.CrossSection;
-import de.intevation.flys.model.CrossSectionLine;
-import de.intevation.flys.model.CrossSectionPoint;
-import de.intevation.flys.model.CrossSectionTrack;
-import de.intevation.flys.model.CrossSectionTrackKind;
-import de.intevation.flys.model.DGM;
-import de.intevation.flys.model.Depth;
-import de.intevation.flys.model.DischargeTable;
-import de.intevation.flys.model.DischargeTableValue;
-import de.intevation.flys.model.DischargeZone;
-import de.intevation.flys.model.Edge;
-import de.intevation.flys.model.ElevationModel;
-import de.intevation.flys.model.FedState;
-import de.intevation.flys.model.Fixpoint;
-import de.intevation.flys.model.Floodmaps;
-import de.intevation.flys.model.Floodmark;
-import de.intevation.flys.model.Floodplain;
-import de.intevation.flys.model.FloodplainKind;
-import de.intevation.flys.model.FlowVelocityMeasurement;
-import de.intevation.flys.model.FlowVelocityMeasurementValue;
-import de.intevation.flys.model.FlowVelocityModel;
-import de.intevation.flys.model.FlowVelocityModelValue;
-import de.intevation.flys.model.Gauge;
-import de.intevation.flys.model.GaugeLocation;
-import de.intevation.flys.model.GrainFraction;
-import de.intevation.flys.model.HWSKind;
-import de.intevation.flys.model.HWSLine;
-import de.intevation.flys.model.HWSPoint;
-import de.intevation.flys.model.HYK;
-import de.intevation.flys.model.HYKEntry;
-import de.intevation.flys.model.HYKFlowZone;
-import de.intevation.flys.model.HYKFlowZoneType;
-import de.intevation.flys.model.HYKFormation;
-import de.intevation.flys.model.HydrBoundary;
-import de.intevation.flys.model.HydrBoundaryPoly;
-import de.intevation.flys.model.Jetty;
-import de.intevation.flys.model.LocationSystem;
-import de.intevation.flys.model.MainValue;
-import de.intevation.flys.model.MainValueType;
-import de.intevation.flys.model.MeasurementStation;
-import de.intevation.flys.model.MorphologicalWidth;
-import de.intevation.flys.model.MorphologicalWidthValue;
-import de.intevation.flys.model.NamedMainValue;
-import de.intevation.flys.model.Position;
-import de.intevation.flys.model.Range;
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.RiverAxis;
-import de.intevation.flys.model.RiverAxisKm;
-import de.intevation.flys.model.SQRelation;
-import de.intevation.flys.model.SQRelationValue;
-import de.intevation.flys.model.SectieKind;
-import de.intevation.flys.model.SobekKind;
-import de.intevation.flys.model.SedimentDensity;
-import de.intevation.flys.model.SedimentDensityValue;
-import de.intevation.flys.model.SedimentYield;
-import de.intevation.flys.model.SedimentYieldValue;
-import de.intevation.flys.model.TimeInterval;
-import de.intevation.flys.model.Unit;
-import de.intevation.flys.model.Wst;
-import de.intevation.flys.model.WstColumn;
-import de.intevation.flys.model.WstColumnQRange;
-import de.intevation.flys.model.WstColumnValue;
-import de.intevation.flys.model.WstQRange;
-
-public class FLYSCredentials
-extends      Credentials
-{
-    public static final String XPATH_USER =
-        "/artifact-database/backend-database/user/text()";
-
-    public static final String XPATH_PASSWORD =
-        "/artifact-database/backend-database/password/text()";
-
-    public static final String XPATH_DIALECT =
-        "/artifact-database/backend-database/dialect/text()";
-
-    public static final String XPATH_DRIVER =
-        "/artifact-database/backend-database/driver/text()";
-
-    public static final String XPATH_URL =
-        "/artifact-database/backend-database/url/text()";
-
-    public static final String XPATH_CONNECTION_INIT_SQLS =
-        "/artifact-database/backend-database/connection-init-sqls/text()";
-
-    public static final String DEFAULT_USER =
-        System.getProperty("flys.backend.user", "flys");
-
-    public static final String DEFAULT_PASSWORD =
-        System.getProperty("flys.backend.password", "flys");
-
-    public static final String DEFAULT_DIALECT =
-        System.getProperty(
-            "flys.backend.dialect",
-            "org.hibernate.dialect.PostgreSQLDialect");
-
-    public static final String DEFAULT_DRIVER =
-        System.getProperty(
-            "flys.backend.driver",
-            "org.postgresql.Driver");
-
-    public static final String DEFAULT_URL =
-        System.getProperty(
-            "flys.backend.url",
-            "jdbc:postgresql://localhost:5432/flys");
-
-    public static final String DEFAULT_CONNECTION_INIT_SQLS =
-        System.getProperty(
-            "flys.backend.connection.init.sqls");
-
-    public static final Class [] CLASSES = {
-        Annotation.class,
-        AnnotationType.class,
-        Attribute.class,
-        AxisKind.class,
-        BedHeightEpoch.class,
-        BedHeightEpochValue.class,
-        BedHeightSingle.class,
-        BedHeightSingleValue.class,
-        BedHeightType.class,
-        Building.class,
-        BoundaryKind.class,
-        CrossSection.class,
-        CrossSectionLine.class,
-        CrossSectionPoint.class,
-        CrossSectionTrack.class,
-        CrossSectionTrackKind.class,
-        Depth.class,
-        DGM.class,
-        DischargeTable.class,
-        DischargeTableValue.class,
-        DischargeZone.class,
-        Edge.class,
-        ElevationModel.class,
-        FedState.class,
-        Fixpoint.class,
-        Floodmark.class,
-        Floodplain.class,
-        FloodplainKind.class,
-        Floodmaps.class,
-        FlowVelocityMeasurement.class,
-        FlowVelocityMeasurementValue.class,
-        FlowVelocityModel.class,
-        FlowVelocityModelValue.class,
-        Gauge.class,
-        GaugeLocation.class,
-        GrainFraction.class,
-        HWSKind.class,
-        HWSLine.class,
-        HWSPoint.class,
-        HydrBoundary.class,
-        HydrBoundaryPoly.class,
-        HYK.class,
-        HYKEntry.class,
-        HYKFormation.class,
-        HYKFlowZoneType.class,
-        HYKFlowZone.class,
-        Jetty.class,
-        LocationSystem.class,
-        MainValueType.class,
-        MeasurementStation.class,
-        MorphologicalWidth.class,
-        MorphologicalWidthValue.class,
-        NamedMainValue.class,
-        MainValue.class,
-        Position.class,
-        Range.class,
-        River.class,
-        RiverAxis.class,
-        RiverAxisKm.class,
-        SectieKind.class,
-        SobekKind.class,
-        SedimentDensity.class,
-        SedimentDensityValue.class,
-        SedimentYield.class,
-        SedimentYieldValue.class,
-        SQRelation.class,
-        SQRelationValue.class,
-        TimeInterval.class,
-        Unit.class,
-        WstColumn.class,
-        WstColumnQRange.class,
-        WstColumnValue.class,
-        Wst.class,
-        WstQRange.class
-    };
-
-    public FLYSCredentials() {
-    }
-
-    public FLYSCredentials(
-        String user,
-        String password,
-        String dialect,
-        String driver,
-        String url,
-        String connectionInitSqls
-    ) {
-        super(
-            user, password, dialect, driver, url, connectionInitSqls, CLASSES);
-    }
-
-    private static Credentials instance;
-
-    public static synchronized Credentials getInstance() {
-        if (instance == null) {
-            String user =
-                Config.getStringXPath(XPATH_USER, DEFAULT_USER);
-            String password =
-                Config.getStringXPath(XPATH_PASSWORD, DEFAULT_PASSWORD);
-            String dialect =
-                Config.getStringXPath(XPATH_DIALECT, DEFAULT_DIALECT);
-            String driver =
-                Config.getStringXPath(XPATH_DRIVER, DEFAULT_DRIVER);
-            String url =
-                Config.getStringXPath(XPATH_URL, DEFAULT_URL);
-            String connectionInitSqls =
-                Config.getStringXPath(
-                    XPATH_CONNECTION_INIT_SQLS,
-                    DEFAULT_CONNECTION_INIT_SQLS);
-
-            instance = new FLYSCredentials(
-                user, password, dialect, driver, url, connectionInitSqls);
-        }
-        return instance;
-    }
-
-    public static Credentials getDefault() {
-        return new FLYSCredentials(
-            DEFAULT_USER,
-            DEFAULT_PASSWORD,
-            DEFAULT_DIALECT,
-            DEFAULT_DRIVER,
-            DEFAULT_URL,
-            DEFAULT_CONNECTION_INIT_SQLS);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/backend/SedDBCredentials.java
--- a/flys-backend/src/main/java/de/intevation/flys/backend/SedDBCredentials.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +0,0 @@
-package de.intevation.flys.backend;
-
-import de.intevation.artifacts.common.utils.Config;
-
-import de.intevation.seddb.model.Bezugspegel;
-import de.intevation.seddb.model.Bezugspegelgew;
-import de.intevation.seddb.model.BezugspegelgewId;
-import de.intevation.seddb.model.Bild;
-import de.intevation.seddb.model.Gewaesser;
-import de.intevation.seddb.model.Gfaenger;
-import de.intevation.seddb.model.Glotlinks;
-import de.intevation.seddb.model.GlotlinksId;
-import de.intevation.seddb.model.Glotrechte;
-import de.intevation.seddb.model.Gprobe;
-import de.intevation.seddb.model.GprobeId;
-import de.intevation.seddb.model.Gsiebsatz;
-import de.intevation.seddb.model.Gsiebung;
-import de.intevation.seddb.model.Gsiebungsieb;
-import de.intevation.seddb.model.GsiebungsiebId;
-import de.intevation.seddb.model.Hpeilpunkt;
-import de.intevation.seddb.model.HpeilpunktId;
-import de.intevation.seddb.model.Hpeilung;
-import de.intevation.seddb.model.Messung;
-import de.intevation.seddb.model.Messunglotcount;
-import de.intevation.seddb.model.MessunglotcountId;
-import de.intevation.seddb.model.Messungsta;
-import de.intevation.seddb.model.MessungstaId;
-import de.intevation.seddb.model.Messunguferbezug;
-import de.intevation.seddb.model.MessunguferbezugId;
-import de.intevation.seddb.model.Mpeilpunkt;
-import de.intevation.seddb.model.MpeilpunktId;
-import de.intevation.seddb.model.Mpeilung;
-import de.intevation.seddb.model.Probebild;
-import de.intevation.seddb.model.Siebanalyse;
-import de.intevation.seddb.model.Slotlinks;
-import de.intevation.seddb.model.SlotlinksId;
-import de.intevation.seddb.model.Slotrechte;
-import de.intevation.seddb.model.Sohlprobe;
-import de.intevation.seddb.model.Sohltest;
-import de.intevation.seddb.model.Sprobe;
-import de.intevation.seddb.model.SprobeId;
-import de.intevation.seddb.model.Ssiebung;
-import de.intevation.seddb.model.Ssiebungsieb;
-import de.intevation.seddb.model.SsiebungsiebId;
-import de.intevation.seddb.model.Station;
-import de.intevation.seddb.model.Stationgew;
-import de.intevation.seddb.model.StationgewId;
-import de.intevation.seddb.model.TmpGloChanged;
-import de.intevation.seddb.model.TmpMesAchanged;
-import de.intevation.seddb.model.TmpMesGchanged;
-import de.intevation.seddb.model.TmpMesQchanged;
-import de.intevation.seddb.model.TmpMesSchanged;
-import de.intevation.seddb.model.Zzarchiv;
-import de.intevation.seddb.model.Zzprobenahmeart;
-import de.intevation.seddb.model.Zzsondierungart;
-import de.intevation.seddb.model.Zzthema;
-
-public class SedDBCredentials
-extends      Credentials
-{
-    public static final String XPATH_USER =
-        "/artifact-database/seddb-database/user/text()";
-
-    public static final String XPATH_PASSWORD =
-        "/artifact-database/seddb-database/password/text()";
-
-    public static final String XPATH_DIALECT =
-        "/artifact-database/seddb-database/dialect/text()";
-
-    public static final String XPATH_DRIVER =
-        "/artifact-database/seddb-database/driver/text()";
-
-    public static final String XPATH_URL =
-        "/artifact-database/seddb-database/url/text()";
-
-    public static final String XPATH_CONNECTION_INIT_SQLS =
-        "/artifact-database/seddb-database/connection-init-sqls/text()";
-
-    public static final String DEFAULT_USER =
-        System.getProperty("flys.seddb.user", "seddb");
-
-    public static final String DEFAULT_PASSWORD =
-        System.getProperty("flys.seddb.password", "seddb");
-
-    public static final String DEFAULT_DIALECT =
-        System.getProperty(
-            "flys.seddb.dialect",
-            "org.hibernate.dialect.PostgreSQLDialect");
-
-    public static final String DEFAULT_DRIVER =
-        System.getProperty(
-            "flys.seddb.driver",
-            "org.postgresql.Driver");
-
-    public static final String DEFAULT_URL =
-        System.getProperty(
-            "flys.seddb.url",
-            "jdbc:postgresql://localhost:5432/seddb");
-
-    public static final String DEFAULT_CONNECTION_INIT_SQLS =
-        System.getProperty(
-            "flys.seddb.connection.init.sqls");
-
-    public static final Class [] CLASSES = {
-        BezugspegelgewId.class,
-        Bezugspegelgew.class,
-        Bezugspegel.class,
-        Bild.class,
-        Gewaesser.class,
-        Gfaenger.class,
-        GlotlinksId.class,
-        Glotlinks.class,
-        Glotrechte.class,
-        GprobeId.class,
-        Gprobe.class,
-        Gsiebsatz.class,
-        Gsiebung.class,
-        GsiebungsiebId.class,
-        Gsiebungsieb.class,
-        HpeilpunktId.class,
-        Hpeilpunkt.class,
-        Hpeilung.class,
-        Messung.class,
-        MessunglotcountId.class,
-        Messunglotcount.class,
-        MessungstaId.class,
-        Messungsta.class,
-        MessunguferbezugId.class,
-        Messunguferbezug.class,
-        MpeilpunktId.class,
-        Mpeilpunkt.class,
-        Mpeilung.class,
-        Probebild.class,
-        Siebanalyse.class,
-        SlotlinksId.class,
-        Slotlinks.class,
-        Slotrechte.class,
-        Sohlprobe.class,
-        Sohltest.class,
-        SprobeId.class,
-        Sprobe.class,
-        Ssiebung.class,
-        SsiebungsiebId.class,
-        Ssiebungsieb.class,
-        StationgewId.class,
-        Stationgew.class,
-        Station.class,
-        TmpGloChanged.class,
-        TmpMesAchanged.class,
-        TmpMesGchanged.class,
-        TmpMesQchanged.class,
-        TmpMesSchanged.class,
-        Zzarchiv.class,
-        Zzprobenahmeart.class,
-        Zzsondierungart.class,
-        Zzthema.class
-    };
-
-    private static Credentials instance;
-
-    public SedDBCredentials() {
-    }
-
-    public SedDBCredentials(
-        String user,
-        String password,
-        String dialect,
-        String driver,
-        String url,
-        String connectionInitSqls
-    ) {
-        super(
-            user, password, dialect, driver, url, connectionInitSqls, CLASSES);
-    }
-
-    public static synchronized Credentials getInstance() {
-        if (instance == null) {
-            String user =
-                Config.getStringXPath(XPATH_USER, DEFAULT_USER);
-            String password =
-                Config.getStringXPath(XPATH_PASSWORD, DEFAULT_PASSWORD);
-            String dialect =
-                Config.getStringXPath(XPATH_DIALECT, DEFAULT_DIALECT);
-            String driver =
-                Config.getStringXPath(XPATH_DRIVER, DEFAULT_DRIVER);
-            String url =
-                Config.getStringXPath(XPATH_URL, DEFAULT_URL);
-            String connectionInitSqls =
-                Config.getStringXPath(
-                    XPATH_CONNECTION_INIT_SQLS,
-                    DEFAULT_CONNECTION_INIT_SQLS);
-
-            instance = new SedDBCredentials(
-                user, password, dialect, driver, url, connectionInitSqls);
-        }
-        return instance;
-    }
-
-    public static Credentials getDefault() {
-        return new SedDBCredentials(
-            DEFAULT_USER,
-            DEFAULT_PASSWORD,
-            DEFAULT_DIALECT,
-            DEFAULT_DRIVER,
-            DEFAULT_URL,
-            DEFAULT_CONNECTION_INIT_SQLS);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/backend/SedDBSessionHolder.java
--- a/flys-backend/src/main/java/de/intevation/flys/backend/SedDBSessionHolder.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-package de.intevation.flys.backend;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-
-public class SedDBSessionHolder
-{
-    private static Logger log =
-        Logger.getLogger(SedDBSessionHolder.class);
-
-    public static final ThreadLocal<Session> HOLDER =
-        new ThreadLocal<Session>() {
-            @Override
-            protected Session initialValue() {
-                return create();
-            }
-        };
-
-    private SedDBSessionHolder() {
-    }
-
-    public synchronized static Session create() {
-        log.debug("create");
-        SessionFactory sessionFactory =
-            SessionFactoryProvider.getSedDBSessionFactory();
-        return sessionFactory.openSession();
-    }
-
-    public static Session acquire() {
-        log.debug("acquire");
-        Session session = create();
-        HOLDER.set(session);
-        return session;
-    }
-
-    public static void release() {
-        log.debug("release");
-        HOLDER.remove();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/backend/SessionFactoryProvider.java
--- a/flys-backend/src/main/java/de/intevation/flys/backend/SessionFactoryProvider.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,170 +0,0 @@
-package de.intevation.flys.backend;
-
-import java.util.Properties;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.SessionFactory;
-
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-
-import org.hibernate.impl.SessionFactoryImpl;
-
-public final class SessionFactoryProvider
-{
-    private static Logger log = Logger.getLogger(SessionFactoryProvider.class);
-
-    //public static final boolean ENABLE_JMX =
-    //    Boolean.getBoolean("flys.backend.enablejmx");
-
-    private static SessionFactory flysSessionFactory;
-    private static SessionFactory sedDBSessionFactory;
-
-    private SessionFactoryProvider() {
-    }
-
-    public static synchronized SessionFactory getSessionFactory() {
-        if (flysSessionFactory == null) {
-            flysSessionFactory =
-                createSessionFactory(FLYSCredentials.getInstance());
-        }
-        return flysSessionFactory;
-    }
-
-    public static SessionFactory createSessionFactory() {
-        return createSessionFactory(FLYSCredentials.getDefault());
-    }
-
-    public static synchronized SessionFactory getSedDBSessionFactory() {
-        if (sedDBSessionFactory == null) {
-            sedDBSessionFactory =
-                createSessionFactory(SedDBCredentials.getInstance());
-        }
-        return sedDBSessionFactory;
-    }
-
-    public static SessionFactory createSedDBSessionFactory() {
-        return createSessionFactory(SedDBCredentials.getDefault());
-    }
-
-    public static SessionFactory createSessionFactory(
-        Credentials credentials
-    ) {
-        Configuration cfg = createConfiguration(credentials);
-
-        SessionFactory factory = cfg.buildSessionFactory();
-
-        /*
-        if (ENABLE_JMX) {
-            registerAsMBean(factory);
-        }
-        else {
-            log.info("No JMX support for hibernate.");
-        }
-        */
-
-        return factory;
-    }
-
-    /** XXX: Commented out till it is configured correctly.
-    public static void registerAsMBean(SessionFactory factory) {
-
-        // 
-
-        StatisticsService statsMBean = new StatisticsService();
-        statsMBean.setSessionFactory(factory);
-        statsMBean.setStatisticsEnabled(true);
-
-        try {
-            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
-            mbs.registerMBean(
-                statsMBean,
-                new ObjectName("Hibernate:application=Statistics"));
-
-            log.info("Enabled JMX support for hibernate.");
-        }
-        catch (MalformedObjectNameException mone) {
-            log.warn(mone, mone);
-        }
-        catch (InstanceAlreadyExistsException iaee) {
-            log.warn(iaee, iaee);
-        }
-        catch (MBeanRegistrationException mbre) {
-            log.warn(mbre, mbre);
-        }
-        catch (NotCompliantMBeanException ncmbe) {
-            log.warn(ncmbe, ncmbe);
-        }
-    }
-    */
-
-    public static Configuration createConfiguration() {
-        return createConfiguration(FLYSCredentials.getInstance());
-    }
-
-    public static Configuration createConfiguration(
-        Credentials credentials
-    ) {
-        Configuration cfg = new Configuration();
-
-        for (Class<?> clazz: credentials.getClasses()) {
-            cfg.addAnnotatedClass(clazz);
-        }
-
-        if (log.isDebugEnabled()) {
-            log.debug("user: "    + credentials.getUser());
-            log.debug("dialect: " + credentials.getDialect());
-            log.debug("driver: "  + credentials.getDriver());
-            log.debug("url: "     + credentials.getUrl());
-        }
-
-        Properties props = new Properties();
-
-        // We rely on our own connection pool
-        props.setProperty(
-            "hibernate.connection.provider_class",
-            "de.intevation.flys.utils.DBCPConnectionProvider");
-
-        props.setProperty(Environment.DIALECT, credentials.getDialect());
-        props.setProperty(Environment.USER,    credentials.getUser());
-        props.setProperty(Environment.PASS,    credentials.getPassword());
-        props.setProperty(Environment.DRIVER,  credentials.getDriver());
-        props.setProperty(Environment.URL,     credentials.getUrl());
-
-        String connectionInitSqls = credentials.getConnectionInitSqls();
-        if (connectionInitSqls != null) {
-            props.setProperty("connectionInitSqls", connectionInitSqls);
-        }
-
-        cfg.mergeProperties(props);
-
-        return cfg;
-    }
-
-
-    public static String getProperty(SessionFactoryImpl factory, String key) {
-        Properties props = factory.getProperties();
-        return props.getProperty(key);
-    }
-
-    public static String getUser(SessionFactoryImpl factory) {
-        return getProperty(factory, Environment.USER);
-    }
-
-
-    public static String getPass(SessionFactoryImpl factory) {
-        return getProperty(factory, Environment.PASS);
-    }
-
-
-    public static String getURL(SessionFactoryImpl factory) {
-        return getProperty(factory, Environment.URL);
-    }
-
-
-    public static String getDriver(SessionFactoryImpl factory) {
-        return getProperty(factory, Environment.DRIVER);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/backend/SessionHolder.java
--- a/flys-backend/src/main/java/de/intevation/flys/backend/SessionHolder.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-package de.intevation.flys.backend;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-
-
-public class SessionHolder
-{
-    private static Logger log =
-        Logger.getLogger(SessionHolder.class);
-
-    public static final ThreadLocal<Session> HOLDER =
-        new ThreadLocal<Session>() {
-            @Override
-            protected Session initialValue() {
-                return create();
-            }
-        };
-
-    private SessionHolder() {
-    }
-
-    public synchronized static Session create() {
-        log.debug("create");
-        SessionFactory sessionFactory =
-            SessionFactoryProvider.getSessionFactory();
-        return sessionFactory.openSession();
-    }
-
-    public static Session acquire() {
-        log.debug("acquire");
-        Session session = create();
-        HOLDER.set(session);
-        return session;
-    }
-
-    public static void release() {
-        log.debug("release");
-        HOLDER.remove();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/backend/SpatialInfo.java
--- a/flys-backend/src/main/java/de/intevation/flys/backend/SpatialInfo.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-package de.intevation.flys.backend;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Query;
-import org.hibernate.Session;
-
-import de.intevation.flys.model.Building;
-import de.intevation.flys.model.CrossSectionTrack;
-import de.intevation.flys.model.Fixpoint;
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.RiverAxis;
-import de.intevation.flys.model.HWSLine;
-
-
-public class SpatialInfo {
-
-    private static Logger logger = Logger.getLogger(SpatialInfo.class);
-
-    protected static String RIVERNAME = System.getProperty(
-        "flys.backend.spatial.river", "Saar");
-
-    protected Session session;
-
-
-    public static void main(String[] args) {
-        logger.info("Start SpatialInfo application.");
-
-        SpatialInfo spatial = null;
-
-        try {
-            spatial = new SpatialInfo();
-
-            River river = spatial.getRiver(RIVERNAME);
-            if (river == null) {
-                logger.warn("Could not find river '" + RIVERNAME + "'!");
-                return;
-            }
-
-            logger.info("Spatial information of River '" + RIVERNAME + "'");
-            spatial.doRiverAxisInfo(river);
-            spatial.doCrossSectionTracksInfo(river);
-            spatial.doBuildingsInfo(river);
-            spatial.doFixpointsInfo(river);
-        }
-        finally {
-            if (spatial != null) {
-                spatial.close();
-            }
-        }
-
-        logger.info("Finish SpatialInfo application.");
-    }
-
-
-    public SpatialInfo() {
-        session = SessionFactoryProvider
-            .createSessionFactory()
-            .openSession();
-    }
-
-
-    public void close() {
-        session.close();
-    }
-
-
-    protected River getRiver(String rivername) {
-        Query query = session.createQuery(
-            "from River where name =:name");
-        query.setParameter("name", rivername);
-
-        List<River> list = query.list();
-
-        if (list == null || list.size() == 0) {
-            logger.warn("No river '" + rivername + "' found!");
-            return null;
-        }
-
-        return list.get(0);
-    }
-
-
-    protected void doRiverAxisInfo(River river) {
-        try {
-            List<RiverAxis> axis = RiverAxis.getRiverAxis(river.getName());
-            if (axis != null && axis.size() > 0) {
-                logger.debug("TODO: Compute length and boundary.");
-            }
-            else {
-                logger.warn("River has no RiverAxis.");
-            }
-        }
-        catch(HibernateException iae) {
-            logger.warn("No vaild river axis found for " + river.getName());
-            return;
-        }
-
-    }
-
-
-    protected void doCrossSectionTracksInfo(River river) {
-        Query query = session.createQuery(
-            "from CrossSectionTrack where river =:river");
-        query.setParameter("river", river);
-
-        List<CrossSectionTrack> list = query.list();
-
-        if (list == null || list.size() == 0) {
-            logger.warn("No CrossSectionTracks for '" + river.getName() + "' found!");
-            return;
-        }
-        else {
-            logger.info("River contains " + list.size() + " CrossSectionTracks.");
-        }
-    }
-
-
-    protected void doBuildingsInfo(River river) {
-        Query query = session.createQuery(
-            "from Building where river =:river");
-        query.setParameter("river", river);
-
-        List<Building> list = query.list();
-
-        if (list == null || list.size() == 0) {
-            logger.warn("No Buildings for '" + river.getName() + "' found!");
-            return;
-        }
-        else {
-            logger.info("River contains " + list.size() + " Buildings.");
-        }
-    }
-
-
-    protected void doFixpointsInfo(River river) {
-        Query query = session.createQuery(
-            "from Fixpoint where river =:river");
-        query.setParameter("river", river);
-
-        List<Fixpoint> list = query.list();
-
-        if (list == null || list.size() == 0) {
-            logger.warn("No Fixpoints for '" + river.getName() + "' found!");
-            return;
-        }
-        else {
-            logger.info("River contains " + list.size() + " Fixpoints.");
-        }
-    }
-
-    @Deprecated
-    protected void doLinesInfo(River river) {
-        doHWSLinesInfo(river);
-    }
-
-    protected void doHWSLinesInfo(River river) {
-        Query query = session.createQuery(
-            "from hws_lines where river =:river");
-        query.setParameter("river", river);
-
-        List<HWSLine> list = query.list();
-
-        if (list == null || list.size() == 0) {
-            logger.warn("No Lines for '" + river.getName() + "' found!");
-            return;
-        }
-        else {
-            logger.info("River contains " + list.size() + " Lines.");
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/Config.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/Config.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +0,0 @@
-package de.intevation.flys.importer;
-
-public class Config
-{
-    public static final String SKIP_DEFAULT =
-        "flys.backend.importer.skip.default";
-
-    public static final String DRY_RUN =
-        "flys.backend.importer.dry.run";
-
-    public static final String INFO_GEW_FILE =
-        "flys.backend.importer.infogew.file";
-
-    public static final String ANNOTATION_TYPES =
-        "flys.backend.importer.annotation.types";
-
-    public static final String SKIP_GAUGES =
-        "flys.backend.importer.skip.gauges";
-
-    public static final String SKIP_BWASTR =
-        "flys.backend.importer.skip.bwastr";
-
-    public static final String SKIP_HISTORICAL_DISCHARGE_TABLES =
-        "flys.backend.importer.skip.historical.discharge.tables";
-
-    public static final String SKIP_ANNOTATIONS =
-        "flys.backend.importer.skip.annotations";
-
-    public static final String SKIP_PRFS =
-        "flys.backend.importer.skip.prfs";
-
-    public static final String SKIP_DA50S =
-        "flys.backend.importer.skip.da50s";
-
-    public static final String SKIP_W80S =
-        "flys.backend.importer.skip.w80s";
-
-    public static final String SKIP_W80_CSVS =
-        "flys.backend.importer.skip.w80.csvs";
-
-    public static final String SKIP_HYKS =
-        "flys.backend.importer.skip.hyks";
-
-    public static final String SKIP_WST =
-        "flys.backend.importer.skip.wst";
-
-    public static final String SKIP_EXTRA_WSTS =
-        "flys.backend.importer.skip.extra.wsts";
-
-    public static final String SKIP_FIXATIONS =
-        "flys.backend.importer.skip.fixations";
-
-    public static final String SKIP_OFFICIAL_LINES =
-        "flys.backend.importer.skip.official.lines";
-
-    public static final String SKIP_FLOOD_WATER =
-        "flys.backend.importer.skip.flood.water";
-
-    public static final String SKIP_FLOOD_PROTECTION =
-        "flys.backend.importer.skip.flood.protection";
-
-    public static final String SKIP_BED_HEIGHT_SINGLE =
-        "flys.backend.importer.skip.bed.height.single";
-
-    public static final String SKIP_DA66S =
-        "flys.backend.importer.skip.da66s";
-
-    public static final String SKIP_BED_HEIGHT_EPOCH =
-        "flys.backend.importer.skip.bed.height.epoch";
-
-    public static final String SKIP_SEDIMENT_DENSITY =
-        "flys.backend.importer.skip.sediment.density";
-
-    public static final String SKIP_MORPHOLOGICAL_WIDTH =
-        "flys.backend.importer.skip.morphological.width";
-
-    public static final String SKIP_FLOW_VELOCITY =
-        "flys.backend.importer.skip.flow.velocity";
-
-    public static final String SKIP_SEDIMENT_YIELD =
-        "flys.backend.importer.skip.sediment.yield";
-
-    public static final String SKIP_WATERLEVELS =
-        "flys.backend.importer.skip.waterlevels";
-
-    public static final String SKIP_WATERLEVEL_DIFFERENCES =
-        "flys.backend.importer.skip.waterlevel.differences";
-
-    public static final String SKIP_MEASUREMENT_STATIONS =
-        "flys.backend.importer.skip.measurement.stations";
-
-    public static final String SKIP_SQ_RELATION =
-        "flys.backend.importer.skip.sq.relation";
-
-
-    public static final Config INSTANCE = new Config();
-
-    private Config () {
-    }
-
-    public static final boolean getFlag(String key) {
-        String flag = System.getProperty(key);
-        return flag != null
-            ? Boolean.valueOf(flag)
-            : Boolean.getBoolean(SKIP_DEFAULT);
-    }
-
-    public boolean dryRun() {
-        return getFlag(DRY_RUN);
-    }
-
-    public String getInfoGewFile() {
-        return System.getProperty(INFO_GEW_FILE);
-    }
-
-    public String getAnnotationTypes() {
-        return System.getProperty(ANNOTATION_TYPES);
-    }
-
-    public boolean skipGauges() {
-        return getFlag(SKIP_GAUGES);
-    }
-
-    public boolean skipHistoricalDischargeTables() {
-        return getFlag(SKIP_HISTORICAL_DISCHARGE_TABLES);
-    }
-
-    public boolean skipBWASTR() {
-        return getFlag(SKIP_BWASTR);
-    }
-
-    public boolean skipAnnotations() {
-        return getFlag(SKIP_ANNOTATIONS);
-    }
-
-    public boolean skipPRFs() {
-        return getFlag(SKIP_PRFS);
-    }
-
-    public boolean skipDA50s() {
-        return getFlag(SKIP_DA50S);
-    }
-
-    public boolean skipW80CSVs() {
-        return getFlag(SKIP_W80_CSVS);
-    }
-
-    public boolean skipW80s() {
-        return getFlag(SKIP_W80S);
-    }
-
-    public boolean skipHYKs() {
-        return getFlag(SKIP_HYKS);
-    }
-
-    public boolean skipWst() {
-        return getFlag(SKIP_WST);
-    }
-
-    public boolean skipExtraWsts() {
-        return getFlag(SKIP_EXTRA_WSTS);
-    }
-
-    public boolean skipFixations() {
-        return getFlag(SKIP_FIXATIONS);
-    }
-
-    public boolean skipOfficialLines() {
-        return getFlag(SKIP_OFFICIAL_LINES);
-    }
-
-    public boolean skipFloodWater() {
-        return getFlag(SKIP_FLOOD_WATER);
-    }
-
-    public boolean skipFloodProtection() {
-        return getFlag(SKIP_FLOOD_PROTECTION);
-    }
-
-    public boolean skipDA66s() {
-        return getFlag(SKIP_DA66S);
-    }
-
-    public boolean skipBedHeightSingle() {
-        return getFlag(SKIP_BED_HEIGHT_SINGLE);
-    }
-
-    public boolean skipBedHeightEpoch() {
-        return getFlag(SKIP_BED_HEIGHT_EPOCH);
-    }
-
-    public boolean skipSedimentDensity() {
-        return getFlag(SKIP_SEDIMENT_DENSITY);
-    }
-
-    public boolean skipMorphologicalWidth() {
-        return getFlag(SKIP_MORPHOLOGICAL_WIDTH);
-    }
-
-    public boolean skipFlowVelocity() {
-        return getFlag(SKIP_FLOW_VELOCITY);
-    }
-
-    public boolean skipSedimentYield() {
-        return getFlag(SKIP_SEDIMENT_YIELD);
-    }
-
-    public boolean skipWaterlevels() {
-        return getFlag(SKIP_WATERLEVELS);
-    }
-
-    public boolean skipWaterlevelDifferences() {
-        return getFlag(SKIP_WATERLEVEL_DIFFERENCES);
-    }
-
-    public boolean skipMeasurementStations() {
-        return getFlag(SKIP_MEASUREMENT_STATIONS);
-    }
-
-    public boolean skipSQRelation() {
-        return getFlag(SKIP_SQ_RELATION);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportAnnotation.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportAnnotation.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.Annotation;
-import de.intevation.flys.model.AnnotationType;
-import de.intevation.flys.model.Range;
-import de.intevation.flys.model.Position;
-import de.intevation.flys.model.Attribute;
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.Edge;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-public class ImportAnnotation
-implements   Comparable<ImportAnnotation>
-{
-    protected ImportAttribute      attribute;
-    protected ImportPosition       position;
-    protected ImportRange          range;
-    protected ImportEdge           edge;
-    protected ImportAnnotationType type;
-
-    protected Annotation      peer;
-
-    public ImportAnnotation() {
-    }
-
-    public ImportAnnotation(
-        ImportAttribute      attribute,
-        ImportPosition       position,
-        ImportRange          range,
-        ImportEdge           edge,
-        ImportAnnotationType type
-    ) {
-        this.attribute = attribute;
-        this.position  = position;
-        this.range     = range;
-        this.edge      = edge;
-        this.type      = type;
-    }
-
-    public int compareTo(ImportAnnotation other) {
-        int d = attribute.compareTo(other.attribute);
-        if (d != 0) {
-            return d;
-        }
-
-        if ((d = position.compareTo(other.position)) != 0) {
-            return d;
-        }
-
-        if ((d = range.compareTo(other.range)) != 0) {
-            return d;
-        }
-
-        if (edge == null && other.edge != null) return -1;
-        if (edge != null && other.edge == null) return +1;
-        if (edge == null && other.edge == null) return 0;
-
-        if ((d = edge.compareTo(other.edge)) != 0) {
-            return d;
-        }
-
-        if (type == null && other.type != null) return -1;
-        if (type != null && other.type == null) return +1;
-        if (type == null && other.type == null) return 0;
-
-        return type.compareTo(other.type);
-    }
-
-    public ImportAttribute getAttribute() {
-        return attribute;
-    }
-
-    public void setAttribute(ImportAttribute attribute) {
-        this.attribute = attribute;
-    }
-
-    public ImportPosition getPosition() {
-        return position;
-    }
-
-    public void setPosition(ImportPosition position) {
-        this.position = position;
-    }
-
-    public ImportRange getRange() {
-        return range;
-    }
-
-    public void setRange(ImportRange range) {
-        this.range = range;
-    }
-
-    public ImportEdge getEdge() {
-        return edge;
-    }
-
-    public void setEdge(ImportEdge edge) {
-        this.edge = edge;
-    }
-
-    public ImportAnnotationType getType() {
-        return type;
-    }
-
-    public void setType(ImportAnnotationType type) {
-        this.type = type;
-    }
-
-    public Annotation getPeer(River river) {
-        if (peer == null) {
-            Range          r = range.getPeer(river);
-            Attribute      a = attribute.getPeer();
-            Position       p = position.getPeer();
-            Edge           e = edge != null ? edge.getPeer() : null;
-            AnnotationType t = type != null ? type.getPeer() : null;
-
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from Annotation where "    +
-                "range=:range and "         +
-                "attribute=:attribute and " +
-                "position=:position and "   +
-                "edge=:edge and "           +
-                "type=:type");
-            query.setParameter("range",     r);
-            query.setParameter("attribute", a);
-            query.setParameter("position",  p);
-            query.setParameter("edge",      e);
-            query.setParameter("type",      t);
-            List<Annotation> annotations = query.list();
-            if (annotations.isEmpty()) {
-                peer = new Annotation(r, a, p, e, t);
-                session.save(peer);
-            }
-            else {
-                peer = annotations.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportAnnotationType.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportAnnotationType.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.AnnotationType;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-public class ImportAnnotationType
-implements   Comparable<ImportAnnotationType>
-{
-    protected String         name;
-    protected AnnotationType peer;
-
-    public ImportAnnotationType() {
-    }
-
-    public ImportAnnotationType(String name) {
-        this.name = name;
-    }
-
-    public int compareTo(ImportAnnotationType other) {
-        return name.compareTo(other.name);
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-    public AnnotationType getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from AnnotationType where name=:name");
-            query.setParameter("name", name);
-            List<AnnotationType> types = query.list();
-            if (types.isEmpty()) {
-                peer = new AnnotationType(name);
-                session.save(peer);
-            }
-            else {
-                peer = types.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportAttribute.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportAttribute.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.Attribute;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-public class ImportAttribute
-implements   Comparable<ImportAttribute>
-{
-    protected String value;
-
-    protected Attribute peer;
-
-    public ImportAttribute() {
-    }
-
-    public ImportAttribute(String value) {
-        this.value = value;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    public int compareTo(ImportAttribute other) {
-        return value.compareTo(other.value);
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (other == this) return true;
-        if (!(other instanceof ImportAttribute)) return false;
-        return value.equals(((ImportAttribute)other).value);
-    }
-
-    @Override
-    public int hashCode() {
-        return value.hashCode();
-    }
-
-    public Attribute getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery("from Attribute where value=:value");
-            query.setString("value", value);
-            List<Attribute> attributes = query.list();
-            if (attributes.isEmpty()) {
-                peer = new Attribute(value);
-                session.save(peer);
-            }
-            else {
-                peer = attributes.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeight.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeight.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-package de.intevation.flys.importer;
-
-
-import java.sql.SQLException;
-
-import org.hibernate.exception.ConstraintViolationException;
-
-import de.intevation.flys.model.River;
-
-
-public interface ImportBedHeight {
-
-    String getDescription();
-
-    void addValue(ImportBedHeightValue value);
-
-    void storeDependencies(River river)
-    throws SQLException, ConstraintViolationException;
-
-    Object getPeer(River river);
-
-    int getValueCount();
-
-    void setYear(int year);
-
-    void setTimeInterval(ImportTimeInterval timeInterval);
-
-    void setSoundingWidth(int soundingWidth);
-
-    void setDescription(String description);
-
-    void setEvaluationBy(String evaluationBy);
-
-    void setRange(ImportRange range);
-
-    void setType(ImportBedHeightType type);
-
-    void setLocationSystem(ImportLocationSystem locationSystem);
-
-    void setCurElevationModel(ImportElevationModel model);
-
-    void setOldElevationModel(ImportElevationModel model);
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightEpoch.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightEpoch.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.hibernate.Query;
-import org.hibernate.Session;
-
-import de.intevation.flys.model.BedHeightEpoch;
-import de.intevation.flys.model.ElevationModel;
-import de.intevation.flys.model.Range;
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.TimeInterval;
-
-
-/** Import Bed Height Data, 'epoch' type from csv file. */
-public class ImportBedHeightEpoch implements ImportBedHeight {
-
-    /** Private logger. */
-    private static Logger log = Logger.getLogger(ImportBedHeightEpoch.class);
-
-    protected String evaluationBy;
-
-    /** De facto the file name. */
-    protected String description;
-
-    protected ImportTimeInterval timeInterval;
-    protected ImportRange range;
-    protected ImportElevationModel curElevationModel;
-    protected ImportElevationModel oldElevationModel;
-
-    protected List<ImportBedHeightEpochValue> values;
-
-    protected BedHeightEpoch peer;
-
-    public ImportBedHeightEpoch(String description) {
-        this.description = description;
-        this.values = new ArrayList<ImportBedHeightEpochValue>();
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public int getValueCount() {
-        return values.size();
-    }
-
-    public void setTimeInterval(ImportTimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    public void setEvaluationBy(String evaluationBy) {
-        this.evaluationBy = evaluationBy;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public void setRange(ImportRange range) {
-        this.range = range;
-    }
-
-    public void setCurElevationModel(ImportElevationModel curElevationModel) {
-        this.curElevationModel = curElevationModel;
-    }
-
-    public void setOldElevationModel(ImportElevationModel oldElevationModel) {
-        this.oldElevationModel = oldElevationModel;
-    }
-
-    /** Does nothing. */
-    public void setYear(int year) {
-        // do nothing
-    }
-
-    /** Does nothing. */
-    public void setSoundingWidth(int soundingWidth) {
-        // do nothing
-    }
-
-
-    /** Does nothing. */
-    public void setLocationSystem(ImportLocationSystem locationSystem) {
-        // do nothing
-    }
-
-
-    /** Does nothing. */
-    public void setType(ImportBedHeightType type) {
-        // do nothing
-    }
-
-    @Override
-    public void addValue(ImportBedHeightValue value) {
-        values.add((ImportBedHeightEpochValue) value);
-    }
-
-    @Override
-    public void storeDependencies(River river) {
-        log.info("Store dependencies for epoch: '" + getDescription() + "'");
-
-        BedHeightEpoch peer = getPeer(river);
-
-        if (curElevationModel != null) {
-            curElevationModel.storeDependencies();
-        }
-
-        if (oldElevationModel != null) {
-            oldElevationModel.storeDependencies();
-        }
-
-        if (peer != null) {
-            log.debug("store values now...");
-
-            for (ImportBedHeightEpochValue value : values) {
-                value.storeDependencies(peer);
-            }
-        }
-
-        Session session = ImporterSession.getInstance().getDatabaseSession();
-        session.flush();
-    }
-
-    /**
-     * Asserts all dependent entities (ElevationModel, TimeInterval, Range,
-     * BedHeighEpoch) are in db and returns bound (either newly created or
-     * freshly fetched) BedHeightEpoch.
-     */
-    @Override
-    public BedHeightEpoch getPeer(River river) {
-        if (peer == null) {
-            ElevationModel theCurModel = null;
-            if (curElevationModel != null) {
-                curElevationModel.storeDependencies();
-                theCurModel = curElevationModel.getPeer();
-            }
-
-            if (theCurModel == null) {
-                log.warn("BHE: Skip file - invalid current elevation model.");
-                return null;
-            }
-
-            TimeInterval theTime = null;
-            if (timeInterval != null) {
-                theTime = timeInterval.getPeer();
-            }
-
-            if (theTime == null) {
-                log.warn("BHE: Skip file - invalid time range.");
-                return null;
-            }
-
-            Range theRange = range != null ? range.getPeer(river) : null;
-
-            if (theRange == null) {
-                log.warn("BHE: invalid km range.");
-            }
-
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-
-            Query query = session.createQuery("from BedHeightEpoch where "
-                + "   river=:river and " + "   timeInterval=:timeInterval and "
-                + "   curElevationModel=:curElevationModel and "
-                + "   range=:range and " + "   evaluationBy=:evaluationBy and "
-                + "   description=:description");
-
-            query.setParameter("river", river);
-            query.setParameter("timeInterval", theTime);
-            query.setParameter("curElevationModel", theCurModel);
-            query.setParameter("range", theRange);
-            query.setParameter("evaluationBy", evaluationBy);
-            query.setParameter("description", description);
-
-            List<BedHeightEpoch> bedHeights = query.list();
-
-            if (bedHeights.isEmpty()) {
-                log.info("Create new BedHeightEpoch DB instance.");
-
-                peer = new BedHeightEpoch(river, theTime, theRange,
-                    theCurModel,
-                    oldElevationModel != null ? oldElevationModel.getPeer()
-                        : null, evaluationBy, description);
-
-                session.save(peer);
-            }
-            else {
-                peer = bedHeights.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightEpochValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightEpochValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import java.math.BigDecimal;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.BedHeightEpoch;
-import de.intevation.flys.model.BedHeightEpochValue;
-
-
-public class ImportBedHeightEpochValue implements ImportBedHeightValue {
-
-    private static final Logger log =
-        Logger.getLogger(ImportBedHeightEpochValue.class);
-
-
-    private BigDecimal station;
-    private BigDecimal height;
-
-    private BedHeightEpochValue peer;
-
-
-    public ImportBedHeightEpochValue() {
-    }
-
-
-    public ImportBedHeightEpochValue(BigDecimal station, BigDecimal height) {
-        this.station = station;
-        this.height  = height;
-    }
-
-
-    public void storeDependencies(BedHeightEpoch bedHeight) {
-        getPeer(bedHeight);
-    }
-
-
-    public BedHeightEpochValue getPeer(BedHeightEpoch bedHeight) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from BedHeightEpochValue where " +
-                "   bedHeight=:bedHeight and " +
-                "   station=:station and " +
-                "   height=:height");
-
-            query.setParameter("bedHeight", bedHeight);
-            query.setParameter("station", station);
-            query.setParameter("height", height);
-
-            List<BedHeightEpochValue> values = query.list();
-
-            if (values.isEmpty()) {
-                peer = new BedHeightEpochValue(
-                    bedHeight,
-                    station,
-                    height
-                );
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightSingle.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightSingle.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.BedHeightSingle;
-import de.intevation.flys.model.BedHeightType;
-import de.intevation.flys.model.ElevationModel;
-import de.intevation.flys.model.Range;
-import de.intevation.flys.model.River;
-
-
-public class ImportBedHeightSingle implements ImportBedHeight
-{
-    private static Logger log = Logger.getLogger(ImportBedHeightSingle.class);
-
-    protected Integer year;
-    protected int soundingWidth;
-
-    protected String evaluationBy;
-    protected String description;
-
-    protected ImportRange          range;
-    protected ImportBedHeightType  type;
-    protected ImportLocationSystem locationSystem;
-    protected ImportElevationModel curElevationModel;
-    protected ImportElevationModel oldElevationModel;
-
-    protected List<ImportBedHeightSingleValue> values;
-
-    protected BedHeightSingle peer;
-
-
-    public ImportBedHeightSingle(String description) {
-        this.description = description;
-        this.values      = new ArrayList<ImportBedHeightSingleValue>();
-    }
-
-
-    public String getDescription() {
-        return description;
-    }
-
-    public int getValueCount() {
-        return values.size();
-    }
-
-
-    public void setYear(int year) {
-        this.year = year;
-    }
-
-    public void setTimeInterval(ImportTimeInterval timeInterval) {
-        // do nothing
-    }
-
-    public void setSoundingWidth(int soundingWidth) {
-        this.soundingWidth = soundingWidth;
-    }
-
-    public void setEvaluationBy(String evaluationBy) {
-        this.evaluationBy = evaluationBy;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public void setRange(ImportRange range) {
-        this.range = range;
-    }
-
-    public void setType(ImportBedHeightType type) {
-        this.type = type;
-    }
-
-    public void setLocationSystem(ImportLocationSystem locationSystem) {
-        this.locationSystem = locationSystem;
-    }
-
-    public void setCurElevationModel(ImportElevationModel curElevationModel) {
-        this.curElevationModel = curElevationModel;
-    }
-
-    public void setOldElevationModel(ImportElevationModel oldElevationModel) {
-        this.oldElevationModel = oldElevationModel;
-    }
-
-    @Override
-    public void addValue(ImportBedHeightValue value) {
-        values.add((ImportBedHeightSingleValue) value);
-    }
-
-    @Override
-    public void storeDependencies(River river) {
-        log.info("Store dependencies for single: '" + getDescription() + "'");
-
-        if (type != null) {
-            type.storeDependencies();
-        }
-
-        if (locationSystem != null) {
-            locationSystem.storeDependencies();
-        }
-
-        if (curElevationModel != null) {
-            curElevationModel.storeDependencies();
-        }
-
-        if (oldElevationModel != null) {
-            oldElevationModel.storeDependencies();
-        }
-
-        BedHeightSingle peer = getPeer(river);
-
-        if (peer != null) {
-            for (ImportBedHeightSingleValue value: values) {
-                value.storeDependencies(peer);
-            }
-        }
-
-        Session session = ImporterSession.getInstance().getDatabaseSession();
-        session.flush();
-    }
-
-    @Override
-    public BedHeightSingle getPeer(River river) {
-        if (peer == null) {
-            BedHeightType  theType     = type != null ? type.getPeer() : null;
-            ElevationModel theCurModel = curElevationModel.getPeer();
-            Range          theRange    = range != null ? range.getPeer(river) : null;
-
-            if (theType == null) {
-                log.warn("BHS: No bed height type given. Skip file '" + 
-			 description + "'");
-                return null;
-            }
-
-            if (theCurModel == null) {
-                log.warn("BHS: No elevation model given. Skip file '" + 
-			 description + "'");
-                return null;
-            }
-
-            if (theRange == null) {
-                log.warn("BHS: No km-range given: '" + 
-			 description + "'");
-            }
-
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from BedHeightSingle where " +
-                "river=:river and year=:year and soundingWidth=:soundingWidth " +
-                "and type=:type and locationSystem=:locationSystem and " +
-                "curElevationModel=:curElevationModel and range=:range");
-
-            query.setParameter("river", river);
-            query.setParameter("year", year);
-            query.setParameter("soundingWidth", soundingWidth);
-            query.setParameter("type", theType);
-            query.setParameter("locationSystem", locationSystem.getPeer());
-            query.setParameter("curElevationModel", theCurModel);
-            query.setParameter("range", range.getPeer(river));
-
-            List<BedHeightSingle> bedHeights = query.list();
-            if (bedHeights.isEmpty()) {
-                log.info("Create new BedHeightSingle DB instance.");
-
-                peer = new BedHeightSingle(
-                    river,
-                    year,
-                    soundingWidth,
-                    theType,
-                    locationSystem.getPeer(),
-                    theCurModel,
-                    oldElevationModel != null ? oldElevationModel.getPeer() : null,
-                    range.getPeer(river),
-                    evaluationBy,
-                    description
-                );
-
-                session.save(peer);
-            }
-            else {
-                peer = bedHeights.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightSingleValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightSingleValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import java.math.BigDecimal;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.BedHeightSingle;
-import de.intevation.flys.model.BedHeightSingleValue;
-
-
-public class ImportBedHeightSingleValue implements ImportBedHeightValue {
-
-    private static final Logger log =
-        Logger.getLogger(ImportBedHeightSingleValue.class);
-
-
-    protected ImportBedHeightSingle bedHeight;
-
-    protected BigDecimal station;
-    protected BigDecimal height;
-    protected BigDecimal uncertainty;
-    protected BigDecimal dataGap;
-    protected BigDecimal soundingWidth;
-    protected BigDecimal width;
-
-    protected BedHeightSingleValue peer;
-
-
-    public ImportBedHeightSingleValue(
-        ImportBedHeightSingle bedHeight,
-        BigDecimal station,
-        BigDecimal height,
-        BigDecimal uncertainty,
-        BigDecimal dataGap,
-        BigDecimal soundingWidth,
-        BigDecimal width
-    ) {
-        this.bedHeight     = bedHeight;
-        this.station       = station;
-        this.height        = height;
-        this.uncertainty   = uncertainty;
-        this.dataGap       = dataGap;
-        this.soundingWidth = soundingWidth;
-        this.width         = width;
-    }
-
-
-    public void storeDependencies(BedHeightSingle bedHeight) {
-        getPeer(bedHeight);
-    }
-
-
-    /**
-     * Add this value to database or return database bound Value, assuring
-     * that the BedHeightSingle exists in db already.
-     */
-    public BedHeightSingleValue getPeer(BedHeightSingle bedHeight) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from BedHeightSingleValue where " +
-                "   bedHeight=:bedHeight and " +
-                "   station=:station and " +
-                "   height=:height and " +
-                "   uncertainty=:uncertainty and " +
-                "   dataGap=:dataGap and " +
-                "   soundingWidth=:soundingWidth and " +
-                "   width=:width");
-
-            query.setParameter("bedHeight", bedHeight);
-            query.setParameter("station", station);
-            query.setParameter("height", height);
-            query.setParameter("uncertainty", uncertainty);
-            query.setParameter("dataGap", dataGap);
-            query.setParameter("soundingWidth", soundingWidth);
-            query.setParameter("width", width);
-
-            List<BedHeightSingleValue> values = query.list();
-            if (values.isEmpty()) {
-                peer = new BedHeightSingleValue(
-                    bedHeight,
-                    station,
-                    height,
-                    uncertainty,
-                    dataGap,
-                    soundingWidth,
-                    width
-                );
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightType.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightType.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.BedHeightType;
-
-
-public class ImportBedHeightType {
-
-    private static final Logger log =
-        Logger.getLogger(ImportBedHeightType.class);
-
-    protected String name;
-
-    protected BedHeightType peer;
-
-    public ImportBedHeightType(BedHeightType peer)  {
-        this.peer = peer;
-        name = peer.getName();
-    }
-
-
-    public ImportBedHeightType(String name) {
-        this.name        = name;
-    }
-
-
-    public void storeDependencies() {
-        getPeer();
-    }
-
-
-    public BedHeightType getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from BedHeightType where name=:name and description=:description");
-
-            query.setParameter("name", name);
-
-            List<BedHeightType> types = query.list();
-
-            if (types.isEmpty()) {
-                peer = new BedHeightType(name);
-                session.save(peer);
-            }
-            else {
-                peer = types.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportBedHeightValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-package de.intevation.flys.importer;
-
-
-public interface ImportBedHeightValue {
-
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportCrossSection.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportCrossSection.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.CrossSection;
-import de.intevation.flys.model.TimeInterval;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-/** CrossSection to be imported, holds list of ImportCrossSectionLines. */
-public class ImportCrossSection
-{
-    private static Logger log = Logger.getLogger(ImportRiver.class);
-
-    protected ImportRiver                  river;
-    protected String                       description;
-    protected ImportTimeInterval           timeInterval;
-    protected List<ImportCrossSectionLine> lines;
-
-    protected CrossSection peer;
-
-    public ImportCrossSection() {
-    }
-
-    public ImportCrossSection(
-        ImportRiver                  river,
-        String                       description,
-        ImportTimeInterval           timeInterval,
-        List<ImportCrossSectionLine> lines
-    ) {
-        this.river        = river;
-        this.description  = description;
-        this.timeInterval = timeInterval;
-        this.lines        = lines;
-        wireWithLines();
-    }
-
-    public void wireWithLines() {
-        for (ImportCrossSectionLine line: lines) {
-            line.setCrossSection(this);
-        }
-    }
-
-    public ImportRiver getRiver() {
-        return river;
-    }
-
-    public void setRiver(ImportRiver river) {
-        this.river = river;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public ImportTimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(ImportTimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    public void storeDependencies() {
-
-        log.info("store cross section '" + description + "'");
-
-        getPeer();
-
-        int i = 1, N = lines.size();
-
-        for (ImportCrossSectionLine line: lines) {
-            line.storeDependencies();
-            log.info("  stored " + i + " lines. remaining: " + (N-i));
-            ++i;
-        }
-    }
-
-    public CrossSection getPeer() {
-
-        if (peer == null) {
-            River r = river.getPeer();
-            TimeInterval t = timeInterval != null
-                ? timeInterval.getPeer()
-                : null;
-
-            Session session =
-                ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from CrossSection where " +
-                "river=:r and "            +
-                "timeInterval=:t and "     +
-                "description=:d");
-
-            query.setParameter("r", r);
-            query.setParameter("t", t);
-            query.setParameter("d", description);
-
-            List<CrossSection> crossSections = query.list();
-            if (crossSections.isEmpty()) {
-                peer = new CrossSection(r, t, description);
-                session.save(peer);
-            }
-            else {
-                peer = crossSections.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportCrossSectionLine.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportCrossSectionLine.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.CrossSection;
-import de.intevation.flys.model.CrossSectionPoint;
-import de.intevation.flys.model.CrossSectionLine;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.TreeMap;
-
-/**
- * A CrossSectionLine (containing points) ready to be transformed into a mapped
- * object and written to db (used in importer).
- */
-public class ImportCrossSectionLine
-{
-    public static final Comparator<CrossSectionPoint> INDEX_CMP =
-        new Comparator<CrossSectionPoint>() {
-            public int compare(CrossSectionPoint a, CrossSectionPoint b) {
-                return a.getColPos().compareTo(b.getColPos());
-            }
-        };
-
-    protected Double km;
-    protected ImportCrossSection crossSection;
-    protected List<XY> points;
-
-    protected CrossSectionLine peer;
-
-    public ImportCrossSectionLine() {
-    }
-
-    public ImportCrossSectionLine(Double km, List<XY> points) {
-        this.km     = km;
-        this.points = points;
-    }
-
-    public ImportCrossSection getCrossSection() {
-        return crossSection;
-    }
-
-    public void setCrossSection(ImportCrossSection crossSection) {
-        this.crossSection = crossSection;
-    }
-
-    public Double getKm() {
-        return km;
-    }
-
-    public void setKm(Double km) {
-        this.km = km;
-    }
-
-    public void storeDependencies() {
-        storePoints();
-    }
-
-
-    /** Write a line and its points. */
-    protected void storePoints() {
-        CrossSectionLine csl = getPeer();
-
-        Map<CrossSectionPoint, CrossSectionPoint> map =
-            new TreeMap<CrossSectionPoint, CrossSectionPoint>(INDEX_CMP);
-
-        // Build index for faster (index) collision lookup.
-        List<CrossSectionPoint> ps = csl.getPoints();
-        if (ps != null) {
-            for (CrossSectionPoint point: ps) {
-                map.put(point, point);
-            }
-        }
-
-        Session session =
-            ImporterSession.getInstance().getDatabaseSession();
-
-        CrossSectionPoint key = new CrossSectionPoint();
-
-        // Somehow it looks as if even with the map it is still possible that
-        // multiple points with same id enter hibernate (and then violate a
-        // constraint). -> TODO
-        for (XY xy: points) {
-            key.setColPos(xy.getIndex());
-            CrossSectionPoint csp = map.get(key);
-            if (csp == null) { // create new
-                csp = new CrossSectionPoint(
-                    csl, key.getColPos(),
-                    Double.valueOf(xy.getX()),
-                    Double.valueOf(xy.getY()));
-            }
-            else { // update old
-                csp.setX(Double.valueOf(xy.getX()));
-                csp.setY(Double.valueOf(xy.getY()));
-            }
-            session.save(csp);
-        }
-    }
-
-    public CrossSectionLine getPeer() {
-        if (peer == null) {
-            CrossSection cs = crossSection.getPeer();
-
-            Session session =
-                ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from CrossSectionLine where crossSection=:cs and km=:km");
-            query.setParameter("cs", cs);
-            query.setParameter("km", km);
-
-            List<CrossSectionLine> lines = query.list();
-            if (lines.isEmpty()) {
-                peer = new CrossSectionLine(cs, km);
-                session.save(peer);
-            }
-            else {
-                peer = lines.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportDepth.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportDepth.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.Depth;
-
-
-public class ImportDepth {
-
-    private static Logger log = Logger.getLogger(ImportDepth.class);
-
-
-    protected Depth peer;
-
-    protected BigDecimal lower;
-    protected BigDecimal upper;
-
-
-    public ImportDepth(BigDecimal lower, BigDecimal upper) {
-        this.lower = lower;
-        this.upper = upper;
-    }
-
-
-    public void storeDependencies() {
-        log.info("store dependencies");
-
-        getPeer();
-    }
-
-
-    public Depth getPeer() {
-        log.info("get peer");
-
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from Depth where " +
-                "   lower=:lower and " +
-                "   upper=:upper");
-
-            query.setParameter("lower", lower);
-            query.setParameter("upper", upper);
-
-            List<Depth> depths = query.list();
-
-            if (depths.isEmpty()) {
-                log.debug("Create new Depth DB instance.");
-
-                peer = new Depth(lower, upper);
-
-                session.save(peer);
-            }
-            else {
-                peer = depths.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportDischargeTable.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportDischargeTable.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.DischargeTable;
-import de.intevation.flys.model.Gauge;
-import de.intevation.flys.model.TimeInterval;
-
-import org.apache.log4j.Logger;
-
-public class ImportDischargeTable
-{
-    private static Logger log = Logger.getLogger(ImportDischargeTable.class);
-
-    protected DischargeTable peer;
-
-    protected String         description;
-
-    protected Integer        kind;
-
-    protected List<ImportDischargeTableValue> dischargeTableValues;
-
-    protected ImportTimeInterval timeInterval;
-
-    public ImportDischargeTable() {
-        this(0, null);
-    }
-
-    public ImportDischargeTable(int kind, String description) {
-        this.kind            = kind;
-        this.description     = description;
-        dischargeTableValues = new ArrayList<ImportDischargeTableValue>();
-    }
-
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-
-    public void addDischargeTableValue(ImportDischargeTableValue value) {
-        dischargeTableValues.add(value);
-    }
-
-
-    public void setDischargeTableValues(List<ImportDischargeTableValue> values){
-        this.dischargeTableValues = values;
-    }
-
-
-    public List<ImportDischargeTableValue> getDischargeTableValues() {
-        return dischargeTableValues;
-    }
-
-    public ImportTimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(ImportTimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-
-    public DischargeTable getPeer(Gauge gauge) {
-        if (peer == null) {
-            TimeInterval ti = timeInterval != null
-                ? timeInterval.getPeer()
-                : null;
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from DischargeTable where " +
-                "gauge.id=:gauge and kind=:kind and " +
-                "description=:description and timeInterval=:interval");
-            query.setParameter("gauge",       gauge.getId());
-            query.setParameter("description", description);
-            query.setParameter("kind",        kind);
-            query.setParameter("interval",    ti);
-
-            List<DischargeTable> dischargeTables = query.list();
-            if (dischargeTables.isEmpty()) {
-                peer = new DischargeTable(gauge, description, null, kind, ti);
-                session.save(peer);
-            }
-            else {
-                peer = dischargeTables.get(0);
-            }
-        }
-
-        return peer;
-    }
-
-
-    public void storeDependencies(Gauge gauge) {
-        log.info("store discharge table '" + description + "'");
-        storeDischargeTableValues(gauge);
-    }
-
-
-    public void storeDischargeTableValues(Gauge gauge) {
-        DischargeTable dischargeTable = getPeer(gauge);
-
-        for (ImportDischargeTableValue value: dischargeTableValues) {
-            value.getPeer(dischargeTable);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportDischargeTableValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportDischargeTableValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-
-import de.intevation.flys.model.DischargeTable;
-import de.intevation.flys.model.DischargeTableValue;
-
-
-public class ImportDischargeTableValue
-{
-    private BigDecimal q;
-    private BigDecimal w;
-
-    private DischargeTableValue peer;
-
-    public ImportDischargeTableValue() {
-    }
-
-
-    public ImportDischargeTableValue(BigDecimal q, BigDecimal w) {
-        this.q = q;
-        this.w = w;
-    }
-
-
-    public DischargeTableValue getPeer(DischargeTable dischargeTable) {
-        if (peer == null) {
-            peer = ImporterSession.getInstance()
-                .getDischargeTableValue(dischargeTable, q, w);
-        }
-
-        return peer;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportDischargeZone.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportDischargeZone.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.DischargeZone;
-import de.intevation.flys.model.River;
-
-
-public class ImportDischargeZone {
-
-    private static final Logger log =
-        Logger.getLogger(ImportDischargeZone.class);
-
-
-    private String gaugeName;
-
-    private BigDecimal value;
-
-    private String lowerDischarge;
-    private String upperDischarge;
-
-    private DischargeZone peer;
-
-
-    public ImportDischargeZone(
-        String     gaugeName,
-        BigDecimal value,
-        String     lowerDischarge,
-        String     upperDischarge
-    ) {
-        this.gaugeName      = gaugeName;
-        this.value          = value;
-        this.lowerDischarge = lowerDischarge;
-        this.upperDischarge = upperDischarge;
-    }
-
-
-    public void storeDependencies(River river) {
-        log.debug("store dependencies");
-
-        getPeer(river);
-    }
-
-
-    public DischargeZone getPeer(River river) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from DischargeZone where " +
-                "   river=:river and " +
-                "   gaugeName=:gaugeName and " +
-                "   value=:value"
-            );
-
-            query.setParameter("river", river);
-            query.setParameter("gaugeName", gaugeName);
-            query.setParameter("value", value);
-
-            List<DischargeZone> zone = query.list();
-
-            if (zone.isEmpty()) {
-                peer = new DischargeZone(
-                    river,
-                    gaugeName,
-                    value,
-                    lowerDischarge,
-                    upperDischarge);
-
-                session.save(peer);
-            }
-            else {
-                peer = zone.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportEdge.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportEdge.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.Edge;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-import java.math.BigDecimal;
-
-public class ImportEdge
-implements   Comparable<ImportEdge>
-{
-    protected BigDecimal top;
-    protected BigDecimal bottom;
-
-    protected Edge peer;
-
-    public ImportEdge() {
-    }
-
-    public ImportEdge(BigDecimal top, BigDecimal bottom) {
-        this.top    = top;
-        this.bottom = bottom;
-    }
-
-    public BigDecimal getTop() {
-        return top;
-    }
-
-    public void setTop(BigDecimal top) {
-        this.top = top;
-    }
-
-    public BigDecimal getBottom() {
-        return bottom;
-    }
-
-    public void setBottom(BigDecimal bottom) {
-        this.bottom = bottom;
-    }
-
-    private static final int compare(BigDecimal a, BigDecimal b) {
-        if (a == null && b != null) return -1;
-        if (a != null && b == null) return +1;
-        if (a == null && b == null) return  0;
-        return a.compareTo(b);
-    }
-
-    public int compareTo(ImportEdge other) {
-        int cmp = compare(top, other.top);
-        return cmp != 0 ? cmp : compare(bottom, other.bottom);
-    }
-
-    public Edge getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from Edge where top=:top and bottom=:bottom");
-            query.setParameter("top", top);
-            query.setParameter("bottom", bottom);
-            List<Edge> edges = query.list();
-            if (edges.isEmpty()) {
-                peer = new Edge(top, bottom);
-                session.save(peer);
-            }
-            else {
-                peer = edges.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportElevationModel.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportElevationModel.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.ElevationModel;
-
-
-public class ImportElevationModel {
-
-    private static final Logger log =
-        Logger.getLogger(ImportElevationModel.class);
-
-    protected String name;
-
-    protected ImportUnit unit;
-
-    protected ElevationModel peer;
-
-
-    public ImportElevationModel(String name, ImportUnit unit) {
-        this.name = name;
-        this.unit = unit;
-    }
-
-
-    public void storeDependencies() {
-        ElevationModel model = getPeer();
-    }
-
-    public ElevationModel getPeer() {
-        if (unit == null) {
-            log.warn("No elevation model specified.");
-            return null;
-        }
-
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from ElevationModel where " +
-                "name=:name and unit=:unit");
-            query.setParameter("name", name);
-            query.setParameter("unit", unit.getPeer());
-            List<ElevationModel> models = query.list();
-
-            if (models.isEmpty()) {
-                log.info("Create new ElevationModel DB instance.");
-
-                peer = new ElevationModel(name, unit.getPeer());
-                session.save(peer);
-            }
-            else {
-                peer = models.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityMeasurement.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityMeasurement.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.FlowVelocityMeasurement;
-import de.intevation.flys.model.River;
-
-
-public class ImportFlowVelocityMeasurement {
-
-    private static final Logger log = Logger
-        .getLogger(ImportFlowVelocityMeasurement.class);
-
-    private String description;
-
-    private List<ImportFlowVelocityMeasurementValue> values;
-
-    private FlowVelocityMeasurement peer;
-
-    public ImportFlowVelocityMeasurement() {
-        this(null);
-    }
-
-    public ImportFlowVelocityMeasurement(String description) {
-        this.description = description;
-        this.values = new ArrayList<ImportFlowVelocityMeasurementValue>();
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public void addValue(ImportFlowVelocityMeasurementValue value) {
-        this.values.add(value);
-    }
-
-    public void storeDependencies(River river) {
-        log.debug("store dependencies");
-
-        FlowVelocityMeasurement peer = getPeer(river);
-
-        if (peer != null) {
-            for (ImportFlowVelocityMeasurementValue value : values) {
-                value.storeDependencies(peer);
-            }
-        }
-    }
-
-    public FlowVelocityMeasurement getPeer(River river) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-
-            Query query = session
-                .createQuery("from FlowVelocityMeasurement where "
-                    + "   river=:river and " + "   description=:description");
-
-            query.setParameter("river", river);
-            query.setParameter("description", description);
-
-            List<FlowVelocityMeasurement> measurement = query.list();
-
-            if (measurement.isEmpty()) {
-                peer = new FlowVelocityMeasurement(river, description);
-
-                session.save(peer);
-            }
-            else {
-                peer = measurement.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityMeasurementValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityMeasurementValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-
-import java.util.Date;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.FlowVelocityMeasurement;
-import de.intevation.flys.model.FlowVelocityMeasurementValue;
-
-
-public class ImportFlowVelocityMeasurementValue {
-
-    private static final Logger log =
-        Logger.getLogger(ImportFlowVelocityMeasurementValue.class);
-
-
-    private Date datetime;
-
-    private String description;
-
-    private BigDecimal station;
-    private BigDecimal w;
-    private BigDecimal q;
-    private BigDecimal v;
-
-    private FlowVelocityMeasurementValue peer;
-
-
-    public ImportFlowVelocityMeasurementValue(
-        Date       datetime,
-        BigDecimal station,
-        BigDecimal w,
-        BigDecimal q,
-        BigDecimal v,
-        String     description
-    ) {
-        this.datetime    = datetime;
-        this.station     = station;
-        this.w           = w;
-        this.q           = q;
-        this.v           = v;
-        this.description = description;
-    }
-
-
-
-    public void storeDependencies(FlowVelocityMeasurement measurement) {
-        log.debug("store dependencies");
-
-        getPeer(measurement);
-    }
-
-
-    public FlowVelocityMeasurementValue getPeer(FlowVelocityMeasurement m) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from FlowVelocityMeasurementValue where " +
-                "   measurement=:measurement and " +
-                "   station=:station and " +
-                "   datetime=:datetime"
-            );
-
-            query.setParameter("measurement", m);
-            query.setParameter("station", station);
-            query.setParameter("datetime", datetime);
-
-            List<FlowVelocityMeasurementValue> values = query.list();
-
-            if (values.isEmpty()) {
-                peer = new FlowVelocityMeasurementValue(
-                    m,
-                    datetime,
-                    station,
-                    w,
-                    q,
-                    v,
-                    description);
-
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityModel.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityModel.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.DischargeZone;
-import de.intevation.flys.model.FlowVelocityModel;
-import de.intevation.flys.model.River;
-
-
-public class ImportFlowVelocityModel {
-
-    private static final Logger log = Logger
-        .getLogger(ImportFlowVelocityModel.class);
-
-    private String description;
-
-    private ImportDischargeZone dischargeZone;
-
-    private List<ImportFlowVelocityModelValue> values;
-
-    private FlowVelocityModel peer;
-
-    public ImportFlowVelocityModel() {
-        values = new ArrayList<ImportFlowVelocityModelValue>();
-    }
-
-    public ImportFlowVelocityModel(String description) {
-        this();
-
-        this.description = description;
-    }
-
-    public ImportFlowVelocityModel(ImportDischargeZone dischargeZone,
-        String description) {
-        this();
-
-        this.dischargeZone = dischargeZone;
-        this.description = description;
-    }
-
-    public void setDischargeZone(ImportDischargeZone dischargeZone) {
-        this.dischargeZone = dischargeZone;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public void addValue(ImportFlowVelocityModelValue value) {
-        this.values.add(value);
-    }
-
-    public void storeDependencies(River river) {
-        log.debug("store dependencies");
-
-        if (dischargeZone == null) {
-            log.warn("skip flow velocity model: No discharge zone specified.");
-            return;
-        }
-
-        dischargeZone.storeDependencies(river);
-
-        FlowVelocityModel peer = getPeer(river);
-
-        if (peer != null) {
-            int i = 0;
-
-            for (ImportFlowVelocityModelValue value : values) {
-                value.storeDependencies(peer);
-                i++;
-            }
-
-            log.info("stored " + i + " flow velocity model values.");
-        }
-    }
-
-    public FlowVelocityModel getPeer(River river) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-
-            DischargeZone zone = dischargeZone.getPeer(river);
-
-            Query query = session.createQuery("from FlowVelocityModel where "
-                + "   dischargeZone=:dischargeZone");
-
-            query.setParameter("dischargeZone", zone);
-
-            List<FlowVelocityModel> model = query.list();
-
-            if (model.isEmpty()) {
-                peer = new FlowVelocityModel(zone, description);
-                session.save(peer);
-            }
-            else {
-                peer = model.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityModelValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityModelValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-
-import java.util.List;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.FlowVelocityModel;
-import de.intevation.flys.model.FlowVelocityModelValue;
-
-
-public class ImportFlowVelocityModelValue {
-
-    private BigDecimal station;
-    private BigDecimal q;
-    private BigDecimal totalChannel;
-    private BigDecimal mainChannel;
-    private BigDecimal shearStress;
-
-    private FlowVelocityModelValue peer;
-
-
-    public ImportFlowVelocityModelValue(
-        BigDecimal station,
-        BigDecimal q,
-        BigDecimal totalChannel,
-        BigDecimal mainChannel,
-        BigDecimal shearStress
-    ) {
-        this.station      = station;
-        this.q            = q;
-        this.totalChannel = totalChannel;
-        this.mainChannel  = mainChannel;
-        this.shearStress  = shearStress;
-    }
-
-
-    public void storeDependencies(FlowVelocityModel model) {
-        getPeer(model);
-    }
-
-
-    public FlowVelocityModelValue getPeer(FlowVelocityModel model) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from FlowVelocityModelValue where " +
-                "   flowVelocity=:model and " +
-                "   station between :station - 0.00001 and :station + 0.00001"
-            );
-
-            query.setParameter("model", model);
-            query.setParameter("station", station.doubleValue());
-
-            List<FlowVelocityModelValue> values = query.list();
-
-            if (values.isEmpty()) {
-                peer = new FlowVelocityModelValue(
-                    model, station, q, totalChannel, mainChannel, shearStress);
-
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportGauge.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportGauge.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,274 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.io.File;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import java.math.BigDecimal;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.Gauge;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.io.IOException;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.parsers.AtFileParser;
-import de.intevation.flys.importer.parsers.StaFileParser;
-
-/** Gauge not in DB. */
-public class ImportGauge
-{
-    private static Logger log = Logger.getLogger(ImportGauge.class);
-
-    public static final String HISTORICAL_DISCHARGE_TABLES =
-        "Histor.Abflusstafeln";
-
-    protected ImportRange range;
-
-    protected File        staFile;
-    protected File        atFile;
-
-    protected String      name;
-    protected BigDecimal  aeo;
-    protected BigDecimal  datum;
-    protected BigDecimal  station;
-    protected Long        officialNumber;
-
-    protected Gauge  peer;
-
-    protected ImportDischargeTable dischargeTable;
-
-    protected List<ImportMainValueType>  mainValueTypes;
-    protected List<ImportNamedMainValue> namedMainValues;
-    protected List<ImportMainValue>      mainValues;
-    protected List<ImportDischargeTable> historicalDischargeTables;
-
-    public ImportGauge() {
-        historicalDischargeTables = new ArrayList<ImportDischargeTable>();
-    }
-
-    public ImportGauge(ImportRange range, File staFile, File atFile) {
-        this();
-        this.range   = range;
-        this.staFile = staFile;
-        this.atFile  = atFile;
-    }
-
-    public void setRange(ImportRange range) {
-        this.range = range;
-    }
-
-    public void setStaFile(File staFile) {
-        this.staFile = staFile;
-    }
-
-    public File getStaFile() {
-        return staFile;
-    }
-
-    public void setAtFile(File atFile) {
-        this.atFile = atFile;
-    }
-
-    public File getAtFile() {
-        return atFile;
-    }
-
-    public BigDecimal getAeo() {
-        return aeo;
-    }
-
-    public void setAeo(BigDecimal aeo) {
-        this.aeo = aeo;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public BigDecimal getDatum() {
-        return datum;
-    }
-
-    public void setDatum(BigDecimal datum) {
-        this.datum = datum;
-    }
-
-    public BigDecimal getStation() {
-        return station;
-    }
-
-    public void setStation(BigDecimal station) {
-        this.station = station;
-    }
-
-    public Long getOfficialNumber() {
-        return officialNumber;
-    }
-
-    public void setOfficialNumber(Long officialNumber) {
-        this.officialNumber = officialNumber;
-    }
-
-    public ImportDischargeTable getDischargeTable() {
-        return dischargeTable;
-    }
-
-    public void setDischargeTable(ImportDischargeTable dischargeTable) {
-        this.dischargeTable = dischargeTable;
-    }
-
-    public List<ImportMainValueType> getMainValueTypes() {
-        return mainValueTypes;
-    }
-
-    public void setMainValueTypes(List<ImportMainValueType> mainValueTypes) {
-        this.mainValueTypes = mainValueTypes;
-    }
-
-    public List<ImportNamedMainValue> getNamedMainValues() {
-        return namedMainValues;
-    }
-
-    public void setNamedMainValues(List<ImportNamedMainValue> namedMainValues) {
-        this.namedMainValues = namedMainValues;
-    }
-
-    public List<ImportMainValue> getMainValues() {
-        return mainValues;
-    }
-
-    public void setMainValues(List<ImportMainValue> mainValues) {
-        this.mainValues = mainValues;
-    }
-
-    public void parseDependencies() throws IOException {
-        StaFileParser sfp = new StaFileParser();
-        sfp.parse(this);
-
-        AtFileParser afp = new AtFileParser();
-        setDischargeTable(afp.parse(getAtFile()));
-        parseHistoricalDischargeTables();
-    }
-
-    public void parseHistoricalDischargeTables() throws IOException {
-        if (Config.INSTANCE.skipHistoricalDischargeTables()) {
-            log.info("skip historical discharge tables");
-            return;
-        }
-
-        log.info("parse historical discharge tables");
-
-        File riverDir = atFile.getParentFile().getParentFile();
-
-        File histDischargeDir = FileTools.repair(
-            new File(riverDir, HISTORICAL_DISCHARGE_TABLES));
-
-        if (!histDischargeDir.isDirectory() || !histDischargeDir.canRead()) {
-            log.info("cannot find '" + histDischargeDir + "'");
-            return;
-        }
-
-        histDischargeDir = FileTools.repair(
-            new File(histDischargeDir, getName()));
-
-        if (!histDischargeDir.isDirectory() || !histDischargeDir.canRead()) {
-            log.info("cannot find '" + histDischargeDir + "'");
-            return;
-        }
-
-        File [] files = histDischargeDir.listFiles();
-
-        if (files == null) {
-            log.info("cannot read directory '" + histDischargeDir + "'");
-            return;
-        }
-
-        for (File file: files) {
-            if (!file.isFile() || !file.canRead()) {
-                continue;
-            }
-            String name = file.getName().toLowerCase();
-            if (!name.endsWith(".at")) {
-                continue;
-            }
-            log.info("found at file '" + file.getName() + "'");
-
-            AtFileParser afp = new AtFileParser();
-            historicalDischargeTables.add(
-                afp.parse(file, HISTORICAL_DISCHARGE_TABLES + "/", 1));
-        }
-    }
-
-    public void storeDependencies(River river) {
-
-        Gauge gauge = getPeer(river);
-
-        log.info("store main value types");
-        for (ImportMainValueType mainValueType: mainValueTypes) {
-            mainValueType.getPeer();
-        }
-
-        log.info("store named main values");
-        for (ImportNamedMainValue namedMainValue: namedMainValues) {
-            namedMainValue.getPeer();
-        }
-
-        log.info("store main values");
-        for (ImportMainValue mainValue: mainValues) {
-            mainValue.getPeer(river);
-        }
-
-        storeDischargeTable(gauge);
-        storeHistoricalDischargeTable(gauge);
-    }
-
-    public void storeDischargeTable(Gauge gauge) {
-        log.info("store discharge table");
-        dischargeTable.getPeer(gauge);
-        dischargeTable.storeDependencies(gauge);
-    }
-
-    public void storeHistoricalDischargeTable(Gauge gauge) {
-        log.info("store historical discharge tables");
-        for (ImportDischargeTable hdt: historicalDischargeTables) {
-            hdt.storeDependencies(gauge);
-        }
-    }
-
-    public Gauge getPeer(River river) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from Gauge where name=:name " +
-                "and river.id=:river");
-            query.setString("name", name);
-            query.setParameter("river", river.getId());
-            List<Gauge> gauges = query.list();
-            if (gauges.isEmpty()) {
-                peer = new Gauge(
-                    name, river,
-                    station, aeo, datum,
-                    officialNumber,
-                    range.getPeer(river));
-                session.save(peer);
-            }
-            else {
-                peer = gauges.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportGrainFraction.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportGrainFraction.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.GrainFraction;
-
-
-public class ImportGrainFraction {
-
-    private static final Logger log =
-        Logger.getLogger(ImportGrainFraction.class);
-
-    private String name;
-
-    private Double lower;
-    private Double upper;
-
-    private GrainFraction peer;
-
-
-    public ImportGrainFraction(String name) {
-        this.name = name;
-    }
-
-
-    public ImportGrainFraction(
-        String     name,
-        Double     lower,
-        Double     upper
-    ) {
-        this.name  = name;
-        this.lower = lower;
-        this.upper = upper;
-    }
-
-
-    public void storeDependencies() {
-        log.debug("store dependencies");
-
-        getPeer();
-    }
-
-
-    public GrainFraction getPeer() {
-        log.debug("get peer");
-
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from GrainFraction where " +
-                "   name=:name and " +
-                "   lower=:lower and " +
-                "   upper=:upper"
-            );
-
-            query.setParameter("name", name);
-            query.setParameter("lower", lower);
-            query.setParameter("upper", upper);
-
-            List<GrainFraction> fractions = query.list();
-            if (fractions.isEmpty()) {
-                log.info("create new GrainFraction");
-
-                peer = new GrainFraction(name, lower, upper);
-                session.save(peer);
-            }
-            else {
-                peer = fractions.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportHYK.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportHYK.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.HYK;
-import de.intevation.flys.model.River;
-
-import java.util.List;
-import java.util.ArrayList;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import org.apache.log4j.Logger;
-
-public class ImportHYK
-{
-    private static Logger log = Logger.getLogger(ImportHYK.class);
-
-    protected ImportRiver river;
-    protected String      description;
-
-    protected List<ImportHYKEntry> entries;
-
-    protected HYK peer;
-
-    public ImportHYK() {
-        entries = new ArrayList<ImportHYKEntry>();
-    }
-
-    public ImportHYK(ImportRiver river, String description) {
-        this();
-        this.river       = river;
-        this.description = description;
-    }
-
-    public ImportRiver getRiver() {
-        return river;
-    }
-
-    public void setRiver(ImportRiver river) {
-        this.river = river;
-    }
-
-    public void addEntry(ImportHYKEntry entry) {
-        entries.add(entry);
-        entry.setHYK(this);
-    }
-
-    public void storeDependencies() {
-        log.info("store HYK '" + description + "'");
-        getPeer();
-        for (int i = 0, N = entries.size(); i < N; ++i) {
-            ImportHYKEntry entry = entries.get(i);
-            log.info("  store km " + entry.getKm() +
-                " (" + (i+1) + " of " + N + ")");
-            entry.storeDependencies();
-        }
-    }
-
-    public HYK getPeer() {
-        if (peer == null) {
-            River r = river.getPeer();
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-            Query query = session.createQuery(
-                "from HYK where river=:river and description=:description");
-            query.setParameter("river", r);
-            query.setParameter("description", description);
-            List<HYK> hyks = query.list();
-            if (hyks.isEmpty()) {
-                peer = new HYK(r, description);
-                session.save(peer);
-            }
-            else {
-                peer = hyks.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportHYKEntry.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportHYKEntry.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.HYKEntry;
-import de.intevation.flys.model.HYK;
-
-import java.util.Date;
-import java.util.List;
-import java.util.ArrayList;
-
-import java.math.BigDecimal;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-public class ImportHYKEntry
-{
-    protected ImportHYK  hyk;
-    protected BigDecimal km;
-    protected Date       measure;
-
-    protected List<ImportHYKFormation> formations;
-
-    protected HYKEntry peer;
-
-    public ImportHYKEntry() {
-        formations = new ArrayList<ImportHYKFormation>();
-    }
-
-    public ImportHYKEntry(
-        ImportHYK  hyk,
-        BigDecimal km,
-        Date       measure
-    ) {
-        this();
-        this.hyk     = hyk;
-        this.km      = km;
-        this.measure = measure;
-    }
-
-    public ImportHYK getHYK() {
-        return hyk;
-    }
-
-    public void setHYK(ImportHYK hyk) {
-        this.hyk = hyk;
-    }
-
-    public BigDecimal getKm() {
-        return km;
-    }
-
-    public void setKm(BigDecimal km) {
-        this.km = km;
-    }
-
-    public void addFormation(ImportHYKFormation formation) {
-        int numFormation = formations.size();
-        formations.add(formation);
-        formation.setFormationNum(numFormation);
-        formation.setEntry(this);
-    }
-
-    public void storeDependencies() {
-        getPeer();
-        for (ImportHYKFormation formation: formations) {
-            formation.storeDependencies();
-        }
-    }
-
-    public HYKEntry getPeer() {
-        if (peer == null) {
-            HYK h = hyk.getPeer();
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-            Query query = session.createQuery(
-                "from HYKEntry where HYK=:hyk " +
-                "and km=:km and measure=:measure");
-            query.setParameter("hyk", h);
-            query.setParameter("km", km);
-            query.setParameter("measure", measure);
-            List<HYKEntry> entries = query.list();
-            if (entries.isEmpty()) {
-                peer = new HYKEntry(h, km, measure);
-                session.save(peer);
-            }
-            else {
-                peer = entries.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportHYKFlowZone.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportHYKFlowZone.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.HYKFormation;
-import de.intevation.flys.model.HYKFlowZone;
-import de.intevation.flys.model.HYKFlowZoneType;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-import java.math.BigDecimal;
-
-public class ImportHYKFlowZone
-{
-    protected ImportHYKFormation    formation;
-    protected ImportHYKFlowZoneType type;
-    protected BigDecimal            a;
-    protected BigDecimal            b;
-
-    protected HYKFlowZone peer;
-
-    public ImportHYKFlowZone() {
-    }
-
-    public ImportHYKFlowZone(
-        ImportHYKFormation    formation,
-        ImportHYKFlowZoneType type,
-        BigDecimal            a,
-        BigDecimal            b
-    ) {
-        this.formation = formation;
-        this.type      = type;
-        this.a         = a;
-        this.b         = b;
-    }
-
-    public ImportHYKFormation getFormation() {
-        return formation;
-    }
-
-    public void setFormation(ImportHYKFormation formation) {
-        this.formation = formation;
-    }
-
-    public void storeDependencies() {
-        getPeer();
-    }
-
-    public HYKFlowZone getPeer() {
-        if (peer == null) {
-            HYKFormation    f = formation.getPeer();
-            HYKFlowZoneType t = type.getPeer();
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-            Query query = session.createQuery(
-                "from HYKFlowZone where formation=:formation " +
-                "and type=:type and a=:a and b=:b");
-            query.setParameter("formation", f);
-            query.setParameter("type", t);
-            query.setParameter("a", a);
-            query.setParameter("b", b);
-            List<HYKFlowZone> zones = query.list();
-            if (zones.isEmpty()) {
-                peer = new HYKFlowZone(f, t, a, b);
-                session.save(peer);
-            }
-            else {
-                peer = zones.get(0);
-            }
-
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportHYKFlowZoneType.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportHYKFlowZoneType.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.HYKFlowZoneType;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-public class ImportHYKFlowZoneType
-{
-    private String          name;
-    private HYKFlowZoneType peer;
-
-    public ImportHYKFlowZoneType() {
-    }
-
-    public ImportHYKFlowZoneType(String name) {
-        this.name = name;
-    }
-
-    public HYKFlowZoneType getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-            Query query = session.createQuery(
-                "from HYKFlowZoneType where name=:name");
-            query.setParameter("name", name);
-            List<HYKFlowZoneType> flowZoneTypes = query.list();
-            if (flowZoneTypes.isEmpty()) {
-                peer = new HYKFlowZoneType(name);
-                session.save(peer);
-            }
-            else {
-                peer = flowZoneTypes.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportHYKFormation.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportHYKFormation.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,150 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.HYKFormation;
-import de.intevation.flys.model.HYKEntry;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.math.BigDecimal;
-
-public class ImportHYKFormation
-{
-    protected int            formationNum;
-    protected ImportHYKEntry entry;
-    protected BigDecimal     top;
-    protected BigDecimal     bottom;
-    protected BigDecimal     distanceVL;
-    protected BigDecimal     distanceHF;
-    protected BigDecimal     distanceVR;
-
-    protected List<ImportHYKFlowZone> zones;
-
-    protected HYKFormation peer;
-
-    public ImportHYKFormation() {
-        zones = new ArrayList<ImportHYKFlowZone>();
-    }
-
-    public ImportHYKFormation(
-        int            formationNum,
-        ImportHYKEntry entry,
-        BigDecimal     top,
-        BigDecimal     bottom,
-        BigDecimal     distanceVL,
-        BigDecimal     distanceHF,
-        BigDecimal     distanceVR
-    ) {
-        this();
-        this.formationNum = formationNum;
-        this.entry        = entry;
-        this.top          = top;
-        this.bottom       = bottom;
-        this.distanceVL   = distanceVL;
-        this.distanceHF   = distanceHF;
-        this.distanceVR   = distanceVR;
-    }
-
-    public void addFlowZone(ImportHYKFlowZone zone) {
-        zones.add(zone);
-        zone.setFormation(this);
-    }
-
-    public int getFormationNum() {
-        return formationNum;
-    }
-
-    public void setFormationNum(int formationNum) {
-        this.formationNum = formationNum;
-    }
-
-    public ImportHYKEntry getEntry() {
-        return entry;
-    }
-
-    public void setEntry(ImportHYKEntry entry) {
-        this.entry = entry;
-    }
-
-    public BigDecimal getTop() {
-        return top;
-    }
-
-    public void setTop(BigDecimal top) {
-        this.top = top;
-    }
-
-    public BigDecimal getBottom() {
-        return bottom;
-    }
-
-    public void setBottom(BigDecimal bottom) {
-        this.bottom = bottom;
-    }
-
-    public BigDecimal getDistanceVL() {
-        return distanceVL;
-    }
-
-    public void setDistanceVL(BigDecimal distanceVL) {
-        this.distanceVL = distanceVL;
-    }
-
-    public BigDecimal getDistanceHF() {
-        return distanceHF;
-    }
-
-    public void setDistanceHF(BigDecimal distanceHF) {
-        this.distanceHF = distanceHF;
-    }
-
-    public BigDecimal getDistanceVR() {
-        return distanceVR;
-    }
-
-    public void setDistanceVR(BigDecimal distanceVR) {
-        this.distanceVR = distanceVR;
-    }
-
-    public void storeDependencies() {
-        getPeer();
-        for (ImportHYKFlowZone zone: zones) {
-            zone.storeDependencies();
-        }
-    }
-
-    public HYKFormation getPeer() {
-        if (peer == null) {
-            HYKEntry e = entry.getPeer();
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-            Query query = session.createQuery(
-                "from HYKFormation where formationNum=:formationNum " +
-                "and entry=:entry and top=:top and bottom=:bottom " +
-                "and distanceVL=:distanceVL and distanceHF=:distanceHF " +
-                "and distanceVR=:distanceVR");
-            query.setParameter("formationNum", formationNum);
-            query.setParameter("entry", e);
-            query.setParameter("top", top);
-            query.setParameter("bottom", bottom);
-            query.setParameter("distanceVL", distanceVL);
-            query.setParameter("distanceHF", distanceHF);
-            query.setParameter("distanceVR", distanceVR);
-            List<HYKFormation> formations = query.list();
-            if (formations.isEmpty()) {
-                peer = new HYKFormation(
-                    formationNum, e, top, bottom,
-                    distanceVL, distanceHF, distanceVR);
-                session.save(peer);
-            }
-            else {
-                peer = formations.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportLocationSystem.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportLocationSystem.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.LocationSystem;
-
-
-public class ImportLocationSystem {
-
-    private static final Logger log =
-        Logger.getLogger(ImportLocationSystem.class);
-
-
-    protected String name;
-    protected String description;
-
-    protected LocationSystem peer;
-
-
-    public ImportLocationSystem(String name, String description) {
-        this.name        = name;
-        this.description = description;
-    }
-
-    public void storeDependencies() {
-        log.info("store LocationSystem '" + name + "'");
-        LocationSystem ls = getPeer();
-
-        Session session = ImporterSession.getInstance().getDatabaseSession();
-        session.flush();
-    }
-
-    public LocationSystem getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from LocationSystem where " +
-                "name=:name and description=:description");
-            query.setParameter("name", name);
-            query.setParameter("description", description);
-
-            List<LocationSystem> lss = query.list();
-            if (lss.isEmpty()) {
-                peer = new LocationSystem(name, description);
-                session.save(peer);
-            }
-            else {
-                peer = lss.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportMainValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportMainValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import java.math.BigDecimal;
-
-import de.intevation.flys.model.MainValue;
-import de.intevation.flys.model.Gauge;
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.NamedMainValue;
-import de.intevation.flys.model.TimeInterval;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-public class ImportMainValue
-{
-    protected ImportGauge          gauge;
-    protected ImportNamedMainValue mainValue;
-    protected BigDecimal           value;
-    protected ImportTimeInterval   timeInterval;
-
-    protected MainValue peer;
-
-    public ImportMainValue() {
-    }
-
-    public ImportMainValue(
-        ImportGauge          gauge,
-        ImportNamedMainValue mainValue,
-        BigDecimal           value,
-        ImportTimeInterval   timeInterval
-    ) {
-        this.gauge        = gauge;
-        this.mainValue    = mainValue;
-        this.value        = value;
-        this.timeInterval = timeInterval;
-    }
-
-    public ImportGauge getGauge() {
-        return gauge;
-    }
-
-    public void setGauge(ImportGauge gauge) {
-        this.gauge = gauge;
-    }
-
-    public ImportNamedMainValue getMainValue() {
-        return mainValue;
-    }
-
-    public void setMainValue(ImportNamedMainValue mainValue) {
-        this.mainValue = mainValue;
-    }
-
-    public BigDecimal getValue() {
-        return value;
-    }
-
-    public void setValue(BigDecimal value) {
-        this.value = value;
-    }
-
-    public MainValue getPeer(River river) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery("from MainValue where "
-                + "gauge.id=:gauge_id and mainValue.id=:name_id "
-                + "and timeInterval = :time "
-                + "and value=:value");
-            Gauge          g = gauge.getPeer(river);
-            NamedMainValue n = mainValue.getPeer();
-            TimeInterval   t = timeInterval != null
-                ? timeInterval.getPeer()
-                : null;
-            query.setParameter("gauge_id", g.getId());
-            query.setParameter("name_id",  n.getId());
-            query.setParameter("value",    value);
-            query.setParameter("time",     t);
-            List<MainValue> values = query.list();
-            if (values.isEmpty()) {
-                peer = new MainValue(g, n, value, null);
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportMainValueType.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportMainValueType.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.MainValueType;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-public class ImportMainValueType
-implements   Comparable<ImportMainValueType>
-{
-    protected String name;
-
-    protected MainValueType peer;
-
-    public ImportMainValueType() {
-    }
-
-    public ImportMainValueType(String name) {
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public int compareTo(ImportMainValueType other) {
-        return name.compareTo(other.name);
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (other == this) return true;
-        if (!(other instanceof ImportMainValueType)) return false;
-        return name.equals(((ImportMainValueType)other).name);
-    }
-
-    @Override
-    public int hashCode() {
-        return name.hashCode();
-    }
-
-    public MainValueType getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery("from MainValueType where name=:name");
-            query.setString("name", name);
-            List<MainValueType> values = query.list();
-            if (values.isEmpty()) {
-                peer = new MainValueType(name);
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportMeasurementStation.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportMeasurementStation.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.hibernate.Session;
-
-import de.intevation.flys.model.Gauge;
-import de.intevation.flys.model.MeasurementStation;
-import de.intevation.flys.model.Range;
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.TimeInterval;
-
-
-public class ImportMeasurementStation {
-
-    private static final Logger log = Logger
-        .getLogger(ImportMeasurementStation.class);
-
-    private MeasurementStation peer;
-
-    public String name;
-    public Double station;
-    public ImportRange range;
-    public String measurementType;
-    public String riverside;
-    public String gauge;
-    public ImportTimeInterval observationTimerange;
-    public String operator;
-    public String description;
-
-    public ImportMeasurementStation() {
-    }
-
-    private Gauge getGaugeFromDB() {
-        Session session = ImporterSession.getInstance().getDatabaseSession();
-
-        org.hibernate.Query query = session
-            .createQuery("FROM Gauge WHERE name=:name");
-
-        query.setParameter("name", gauge);
-        List<Gauge> gauges = query.list();
-
-        return gauges.isEmpty() ? null : gauges.get(0);
-    }
-
-    public boolean storeDependencies(River river) {
-        getPeer(river);
-
-        return peer != null;
-    }
-
-    public Object getPeer(River river) {
-        if (peer == null) {
-            Gauge gauge = null;
-            try {
-                gauge = getGaugeFromDB();
-                if (gauge == null) {
-                    log.warn("No gauge found for measurement station '" + name
-                        + "'");
-                }
-            }
-            catch (Exception e) {
-                log.error("Exception: " + e.getMessage());
-            }
-
-            Range range = null;
-
-            if (this.range != null) {
-                range = this.range.getPeer(river);
-            }
-
-            if (range == null) {
-                log.warn("No range found for measurement station '" + name + "'");
-            }
-
-            TimeInterval observationTimerange = this.observationTimerange
-                .getPeer();
-            if (observationTimerange == null) {
-                log.warn("No time range found for measurement station '"
-                    + name + "'");
-            }
-
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-
-            org.hibernate.Query query = session
-                .createQuery(
-                    "FROM MeasurementStation " +
-                    "WHERE river=:river" +
-                    "   AND station=:station " +
-                    "   AND measurement_type=:measurement_type ");
-
-            query.setParameter("river", river);
-            query.setParameter("station", station);
-            query.setParameter("measurement_type", measurementType);
-
-            List<MeasurementStation> stations = query.list();
-
-            if (stations.isEmpty()) {
-                log.info("create new measurement station '" + name + "'");
-
-                peer = new MeasurementStation(river, name, measurementType,
-                    riverside, station, range, gauge, this.gauge,
-                    observationTimerange, operator, description);
-
-                session.save(peer);
-            }
-        }
-
-        return peer;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportMorphWidth.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportMorphWidth.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.MorphologicalWidth;
-import de.intevation.flys.model.River;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-
-
-public class ImportMorphWidth {
-
-    private static Logger log = Logger.getLogger(ImportMorphWidth.class);
-
-    protected MorphologicalWidth peer;
-
-    protected ImportUnit unit;
-
-    protected List<ImportMorphWidthValue> values;
-
-    public ImportMorphWidth() {
-        this.values = new ArrayList<ImportMorphWidthValue>();
-    }
-
-    public void addValue(ImportMorphWidthValue value) {
-        this.values.add(value);
-    }
-
-    public void setUnit(ImportUnit unit) {
-        this.unit = unit;
-    }
-
-    public void storeDependencies(River river) {
-        log.info("store dependencies");
-
-        MorphologicalWidth peer = getPeer(river);
-
-        if (peer != null) {
-            log.info("store morphological width values");
-
-            for (ImportMorphWidthValue value : values) {
-                value.storeDependencies(peer);
-            }
-        }
-    }
-
-    public MorphologicalWidth getPeer(River river) {
-        log.info("get peer");
-
-        if (peer == null) {
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-
-            Query query = session.createQuery("from MorphologicalWidth where "
-                + "   river=:river and " + "   unit=:unit");
-
-            query.setParameter("river", river);
-            query.setParameter("unit", unit.getPeer());
-
-            List<MorphologicalWidth> widths = query.list();
-
-            if (widths.isEmpty()) {
-                log.debug("Create new MorphologicalWidth DB instance.");
-
-                peer = new MorphologicalWidth(river, unit.getPeer());
-
-                session.save(peer);
-            }
-            else {
-                peer = widths.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportMorphWidthValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportMorphWidthValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.MorphologicalWidth;
-import de.intevation.flys.model.MorphologicalWidthValue;
-
-
-public class ImportMorphWidthValue {
-
-    private static Logger log = Logger.getLogger(ImportMorphWidthValue.class);
-
-
-    protected MorphologicalWidthValue peer;
-
-    protected BigDecimal station;
-    protected BigDecimal width;
-
-    protected String description;
-
-
-    public ImportMorphWidthValue(
-        BigDecimal station,
-        BigDecimal width,
-        String     description
-    ) {
-        this.station     = station;
-        this.width       = width;
-        this.description = description;
-    }
-
-
-    public void storeDependencies(MorphologicalWidth parent) {
-        getPeer(parent);
-    }
-
-
-    public MorphologicalWidthValue getPeer(MorphologicalWidth parent) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from MorphologicalWidthValue where " +
-                "   morphologicalWidth=:morphologicalWidth and " +
-                "   station=:station and " +
-                "   width=:width and " +
-                "   description=:description");
-
-            query.setParameter("morphologicalWidth", parent);
-            query.setParameter("station", station);
-            query.setParameter("width", width);
-            query.setParameter("description", description);
-
-            List<MorphologicalWidthValue> values = query.list();
-
-            if (values.isEmpty()) {
-                peer = new MorphologicalWidthValue(
-                    parent,
-                    station,
-                    width,
-                    description
-                );
-
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportNamedMainValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportNamedMainValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import de.intevation.flys.model.NamedMainValue;
-import de.intevation.flys.model.MainValueType;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-public class ImportNamedMainValue
-{
-    protected ImportMainValueType mainValueType;
-    protected String              name;
-
-    protected NamedMainValue      peer;
-
-    public ImportNamedMainValue() {
-    }
-
-    public ImportNamedMainValue(
-        ImportMainValueType mainValueType,
-        String              name
-    ) {
-        this.mainValueType = mainValueType;
-        this.name          = name;
-    }
-
-    public ImportMainValueType getMainValueType() {
-        return mainValueType;
-    }
-
-    public void setMainValueType(ImportMainValueType mainValueType) {
-        this.mainValueType = mainValueType;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public NamedMainValue getPeer() {
-        if (peer == null) {
-            MainValueType type = mainValueType.getPeer();
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from NamedMainValue where " +
-                "name=:name and type.id=:id");
-            query.setString("name", name);
-            query.setParameter("id", type.getId());
-            List<NamedMainValue> named = query.list();
-            if (named.isEmpty()) {
-                peer = new NamedMainValue(name, type);
-                session.save(peer);
-            }
-            else {
-                peer = named.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportPosition.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportPosition.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.Position;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-public class ImportPosition
-implements   Comparable<ImportPosition>
-{
-    protected String value;
-
-    protected Position peer;
-
-    public ImportPosition() {
-    }
-
-    public ImportPosition(String value) {
-        this.value = value;
-    }
-
-    public int compareTo(ImportPosition other) {
-        return value.compareTo(other.value);
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    public Position getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery("from Position where value=:value");
-            query.setString("value", value);
-            List<Position> positions = query.list();
-            if (positions.isEmpty()) {
-                peer = new Position(value);
-                session.save(peer);
-            }
-            else {
-                peer = positions.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
-
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportRange.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportRange.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.Range;
-import de.intevation.flys.model.River;
-
-import java.math.BigDecimal;
-
-import org.apache.log4j.Logger;
-
-/** A range that is about to be imported. */
-public class ImportRange
-implements   Comparable<ImportRange>
-{
-    /** Private logger. */
-    private static Logger log = Logger.getLogger(ImportRange.class);
-
-    protected BigDecimal a;
-    protected BigDecimal b;
-
-    protected Range peer;
-
-    public ImportRange() {
-    }
-
-    public ImportRange(BigDecimal a, BigDecimal b) {
-        this.a = a;
-        this.b = b;
-    }
-
-    private static final int compare(BigDecimal a, BigDecimal b) {
-        if (a == null && b == null) {
-            return 0;
-        }
-        if (a == null && b != null) {
-            return -1;
-        }
-        if (a != null && b == null) {
-            return +1;
-        }
-        return a.compareTo(b);
-    }
-
-    public void fixRangesOrder() {
-        if (compare(a, b) > 0) {
-            BigDecimal t = a; a = b; b = t;
-        }
-    }
-
-    public int compareTo(ImportRange other) {
-        int cmp = compare(a, other.a);
-        if (cmp != 0) return cmp;
-        return compare(b, other.b);
-    }
-
-    public BigDecimal getA() {
-        return a;
-    }
-
-    public void setA(BigDecimal a) {
-        this.a = a;
-    }
-
-    public BigDecimal getB() {
-        return b;
-    }
-
-    public void setB(BigDecimal b) {
-        this.b = b;
-    }
-
-    public Range getPeer(River river) {
-        if (peer == null) {
-            peer = ImporterSession.getInstance().getRange(river, a, b);
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportRiver.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportRiver.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1464 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.artifacts.common.utils.FileTools.HashedFile;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.importer.parsers.AnnotationClassifier;
-import de.intevation.flys.importer.parsers.AnnotationsParser;
-import de.intevation.flys.importer.parsers.BedHeightEpochParser;
-import de.intevation.flys.importer.parsers.BedHeightSingleParser;
-import de.intevation.flys.importer.parsers.CrossSectionParser;
-import de.intevation.flys.importer.parsers.DA50Parser;
-import de.intevation.flys.importer.parsers.DA66Parser;
-import de.intevation.flys.importer.parsers.FlowVelocityMeasurementParser;
-import de.intevation.flys.importer.parsers.FlowVelocityModelParser;
-import de.intevation.flys.importer.parsers.HYKParser;
-import de.intevation.flys.importer.parsers.MeasurementStationsParser;
-import de.intevation.flys.importer.parsers.MorphologicalWidthParser;
-import de.intevation.flys.importer.parsers.PRFParser;
-import de.intevation.flys.importer.parsers.PegelGltParser;
-import de.intevation.flys.importer.parsers.SQRelationParser;
-import de.intevation.flys.importer.parsers.SedimentDensityParser;
-import de.intevation.flys.importer.parsers.SedimentYieldParser;
-import de.intevation.flys.importer.parsers.W80Parser;
-import de.intevation.flys.importer.parsers.W80CSVParser;
-import de.intevation.flys.importer.parsers.WaterlevelDifferencesParser;
-import de.intevation.flys.importer.parsers.WaterlevelParser;
-import de.intevation.flys.importer.parsers.WstParser;
-
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.Unit;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-
-
-/** Import all river-related data (files) that can be found. */
-public class ImportRiver
-{
-    /** Private logger. */
-    private static Logger log = Logger.getLogger(ImportRiver.class);
-
-    public static final String PEGEL_GLT = "PEGEL.GLT";
-
-    public static final String FIXATIONS = "Fixierungen";
-
-    public static final String EXTRA_LONGITUDINALS =
-        "Zus.L\u00e4ngsschnitte";
-
-    public static final String [] OFFICIAL_LINES_FOLDERS = {
-        "Basisdaten",
-        "Fixierungen" };
-
-    public static final String OFFICIAL_LINES =
-        "Amtl_Linien.wst";
-
-    public static final String FLOOD_WATER = "HW-Marken";
-
-    public static final String FLOOD_PROTECTION =
-        "HW-Schutzanlagen";
-
-    public static final String MINFO_DIR = "Morphologie";
-
-    public static final String BED_HEIGHT_DIR = "Sohlhoehen";
-
-    public static final String BED_HEIGHT_SINGLE_DIR = "Einzeljahre";
-
-    public static final String BED_HEIGHT_EPOCH_DIR = "Epochen";
-
-    public static final String SEDIMENT_DENSITY_DIR = "Sedimentdichte";
-
-    public static final String MORPHOLOGICAL_WIDTH_DIR = "morphologische_Breite";
-
-    public static final String FLOW_VELOCITY_DIR = "Geschwindigkeit_Schubspannung";
-
-    public static final String FLOW_VELOCITY_MODEL = "Modellrechnungen";
-
-    public static final String FLOW_VELOCITY_MEASUREMENTS = "v-Messungen";
-
-    public static final String SEDIMENT_YIELD_DIR = "Fracht";
-
-    public static final String SEDIMENT_YIELD_SINGLE_DIR = "Einzeljahre";
-
-    public static final String SEDIMENT_YIELD_EPOCH_DIR = "Epochen";
-
-    public static final String MINFO_FIXATIONS_DIR = "Fixierungsanalyse";
-
-    public static final String MINFO_WATERLEVELS_DIR = "Wasserspiegellagen";
-
-    public static final String MINFO_WATERLEVEL_DIFF_DIR = "Wasserspiegeldifferenzen";
-
-    public static final String MINFO_BASE_DIR = "Basisdaten";
-
-    public static final String MINFO_CORE_DATA_FILE = "Stammdaten_Messstellen.csv";
-
-    public static final String MINFO_SQ_DIR = "Feststofftransport-Abfluss-Beziehung";
-
-    protected String name;
-
-    protected Long officialNumber;
-
-    protected File wstFile;
-
-    protected File bbInfoFile;
-
-    protected List<ImportGauge> gauges;
-
-    protected List<ImportAnnotation> annotations;
-
-    protected List<ImportHYK> hyks;
-
-    protected List<ImportCrossSection> crossSections;
-
-    protected List<ImportWst> extraWsts;
-
-    protected List<ImportWst> fixations;
-
-    protected List<ImportWst> officialLines;
-
-    protected List<ImportWst> floodWater;
-
-    protected List<ImportWst> floodProtection;
-
-    /** Wst-structures from waterlevel-csv files. */
-    protected List<ImportWst> waterlevels;
-
-    /** Wst-structures from waterlevel-difference-csv files. */
-    protected List<ImportWst> waterlevelDifferences;
-
-    protected List<ImportBedHeight> bedHeightSingles;
-
-    protected List<ImportBedHeight> bedHeightEpochs;
-
-    protected List<ImportSedimentDensity> sedimentDensities;
-
-    protected List<ImportMorphWidth> morphologicalWidths;
-
-    protected List<ImportFlowVelocityModel> flowVelocityModels;
-
-    protected List<ImportFlowVelocityMeasurement> flowVelocityMeasurements;
-
-    protected List<ImportSedimentYield> sedimentYields;
-
-    protected List<ImportMeasurementStation> measurementStations;
-
-    protected List<ImportSQRelation> sqRelations;
-
-    protected ImportWst wst;
-
-    protected ImportUnit wstUnit;
-
-    protected AnnotationClassifier annotationClassifier;
-
-    /** Database-mapped River instance. */
-    protected River peer;
-
-
-    /** Callback-implementation for CrossSectionParsers:
-     * Accept files with different md5(?)sums than what has already been parsed,
-     * on successfull parse, add data. */
-    class ImportRiverCrossSectionParserCallback implements CrossSectionParser.Callback {
-        Set<HashedFile> files = new HashSet<HashedFile>();
-        String type;
-
-
-        /**
-         * Create new Callback, given type which is used for logging
-         * purposes only.
-         */
-        public ImportRiverCrossSectionParserCallback (String type) {
-            this.type = type;
-        }
-
-
-        /** Accept file if not duplicate. */
-        public boolean accept(File file) {
-            HashedFile hf = new HashedFile(file);
-            boolean success = files.add(hf);
-            if (!success) {
-                log.warn(type + " file '" + file + "' seems to be a duplicate.");
-            }
-            return success;
-        }
-
-
-        /** Add crosssection. */
-        public void parsed(CrossSectionParser parser) {
-           log.debug("callback from " + type + " parser");
-
-           addCrossSections(parser);
-        }
-    } // ImportRiverCrossSectionParserCallback
-
-
-    public ImportRiver() {
-        hyks                      = new ArrayList<ImportHYK>();
-        crossSections             = new ArrayList<ImportCrossSection>();
-        extraWsts                 = new ArrayList<ImportWst>();
-        fixations                 = new ArrayList<ImportWst>();
-        officialLines             = new ArrayList<ImportWst>();
-        floodWater                = new ArrayList<ImportWst>();
-        waterlevels               = new ArrayList<ImportWst>();
-        waterlevelDifferences     = new ArrayList<ImportWst>();
-        floodProtection           = new ArrayList<ImportWst>();
-        sedimentDensities         = new ArrayList<ImportSedimentDensity>();
-        morphologicalWidths       = new ArrayList<ImportMorphWidth>();
-        flowVelocityModels        = new ArrayList<ImportFlowVelocityModel>();
-        flowVelocityMeasurements  = new ArrayList<ImportFlowVelocityMeasurement>();
-        sedimentYields            = new ArrayList<ImportSedimentYield>();
-        measurementStations       = new ArrayList<ImportMeasurementStation>();
-        sqRelations               = new ArrayList<ImportSQRelation>();
-    }
-
-    public ImportRiver(
-        String               name,
-        File                 wstFile,
-        File                 bbInfoFile,
-        AnnotationClassifier annotationClassifier
-    ) {
-        this();
-        this.name                 = name;
-        this.wstFile              = wstFile;
-        this.bbInfoFile           = bbInfoFile;
-        this.annotationClassifier = annotationClassifier;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public Long getOfficialNumber() {
-        return this.officialNumber;
-    }
-
-    public void setOfficialNumber(Long officialNumber) {
-        this.officialNumber = officialNumber;
-    }
-
-    public File getWstFile() {
-        return wstFile;
-    }
-
-    public void setWstFile(File wstFile) {
-        this.wstFile = wstFile;
-    }
-
-    public File getBBInfo() {
-        return bbInfoFile;
-    }
-
-    public void setBBInfo(File bbInfoFile) {
-        this.bbInfoFile = bbInfoFile;
-    }
-
-    public ImportWst getWst() {
-        return wst;
-    }
-
-    public void setWst(ImportWst wst) {
-        this.wst = wst;
-    }
-
-    public File getMinfoDir() {
-        File riverDir  = wstFile.getParentFile().getParentFile().getParentFile();
-        return new File(riverDir, MINFO_DIR);
-    }
-
-    public void parseDependencies() throws IOException {
-        parseGauges();
-        parseAnnotations();
-        parsePRFs();
-        parseDA66s();
-        parseDA50s();
-        parseW80s();
-        parseW80CSVs();
-        parseHYKs();
-        parseWst();
-        parseExtraWsts();
-        parseFixations();
-        parseOfficialLines();
-        parseFloodWater();
-        parseFloodProtection();
-        parseBedHeight();
-        parseSedimentDensity();
-        parseMorphologicalWidth();
-        parseFlowVelocity();
-        parseSedimentYield();
-        parseWaterlevels();
-        parseWaterlevelDifferences();
-        parseMeasurementStations();
-        parseSQRelation();
-    }
-
-    public void parseFloodProtection() throws IOException {
-        if (Config.INSTANCE.skipFloodProtection()) {
-            log.info("skip parsing flood protection");
-            return;
-        }
-
-        log.info("Parse flood protection wst file");
-
-        File riverDir = wstFile.getParentFile().getParentFile();
-
-        File dir = FileTools.repair(new File(riverDir, FLOOD_PROTECTION));
-
-        if (!dir.isDirectory() || !dir.canRead()) {
-            log.info("no directory '" + dir + "' found");
-            return;
-        }
-
-        File [] files = dir.listFiles();
-
-        if (files == null) {
-            log.warn("cannot read '" + dir + "'");
-            return;
-        }
-
-        for (File file: files) {
-            if (!file.isFile() || !file.canRead()) {
-                continue;
-            }
-            String name = file.getName().toLowerCase();
-            if (!(name.endsWith(".zus") || name.endsWith(".wst"))) {
-                continue;
-            }
-            log.info("found file '" + file.getName() + "'");
-            WstParser wstParser = new WstParser();
-            wstParser.parse(file);
-            ImportWst iw = wstParser.getWst();
-            iw.setKind(5);
-            iw.setDescription(FLOOD_PROTECTION + "/" + iw.getDescription());
-            floodProtection.add(iw);
-        }
-    }
-
-    public void storeOfficialNumber() {
-        if (Config.INSTANCE.skipBWASTR()) {
-            log.info("skip storing official number.");
-            return;
-        }
-        getPeer().setOfficialNumber(officialNumber);
-    }
-
-    public void parseBedHeight() throws IOException {
-        File minfoDir     = getMinfoDir();
-        File bedHeightDir = new File(minfoDir, BED_HEIGHT_DIR);
-        File singlesDir   = new File(bedHeightDir, BED_HEIGHT_SINGLE_DIR);
-        File epochDir     = new File(bedHeightDir, BED_HEIGHT_EPOCH_DIR);
-
-        if (Config.INSTANCE.skipBedHeightSingle()) {
-            log.info("skip parsing bed height single.");
-        }
-        else {
-            log.info("Parse bed height single.");
-            parseBedHeightSingles(singlesDir);
-        }
-
-        if (Config.INSTANCE.skipBedHeightEpoch()) {
-            log.info("skip parsing bed height epochs.");
-        }
-        else {
-            log.info("Parse bed height epochs.");
-            parseBedHeightEpochs(epochDir);
-        }
-    }
-
-
-    protected void parseSedimentDensity() throws IOException {
-        if (Config.INSTANCE.skipSedimentDensity()) {
-            log.info("skip parsing sediment density.");
-            return;
-        }
-
-        log.debug("Parse sediment density");
-
-        File minfoDir = getMinfoDir();
-        File sediment = new File(minfoDir, SEDIMENT_DENSITY_DIR);
-
-        File[] files = sediment.listFiles();
-
-        if (files == null) {
-            log.warn("Cannot read directory '" + sediment + "'");
-            return;
-        }
-
-        SedimentDensityParser parser = new SedimentDensityParser();
-
-        for (File file: files) {
-            parser.parse(file);
-        }
-
-        sedimentDensities = parser.getSedimentDensities();
-
-        log.info("Parsed " + sedimentDensities.size() + " sediment densities.");
-    }
-
-
-    protected void parseMorphologicalWidth() throws IOException {
-        if (Config.INSTANCE.skipMorphologicalWidth()) {
-            log.info("skip parsing morphological width.");
-            return;
-        }
-
-        log.debug("Parse morphological width");
-
-        File minfoDir = getMinfoDir();
-        File morphDir = new File(minfoDir, MORPHOLOGICAL_WIDTH_DIR);
-
-        File[] files = morphDir.listFiles();
-
-        if (files == null) {
-            log.warn("Cannot read directory '" + morphDir + "'");
-            return;
-        }
-
-        MorphologicalWidthParser parser = new MorphologicalWidthParser();
-
-        for (File file: files) {
-            parser.parse(file);
-        }
-
-        morphologicalWidths = parser.getMorphologicalWidths();
-
-        log.info("Parsed " + morphologicalWidths.size() + " morph. widths files.");
-    }
-
-
-    protected void parseFlowVelocity() throws IOException {
-        if (Config.INSTANCE.skipFlowVelocity()) {
-            log.info("skip parsing flow velocity");
-            return;
-        }
-
-        log.debug("Parse flow velocity");
-
-        File minfoDir   = getMinfoDir();
-        File flowDir    = new File(minfoDir, FLOW_VELOCITY_DIR);
-        File modelDir   = new File(flowDir, FLOW_VELOCITY_MODEL);
-        File measureDir = new File(flowDir, FLOW_VELOCITY_MEASUREMENTS);
-
-        File[] modelFiles   = modelDir.listFiles();
-        File[] measureFiles = measureDir.listFiles();
-
-        if (modelFiles == null) {
-            log.warn("Cannot read directory '" + modelDir + "'");
-        }
-        else {
-            FlowVelocityModelParser parser = new FlowVelocityModelParser();
-
-            for (File model: modelFiles) {
-                log.debug("Parse file '" + model + "'");
-                parser.parse(model);
-            }
-
-            flowVelocityModels = parser.getModels();
-        }
-
-        if (measureFiles == null) {
-            log.warn("Cannot read directory '" + measureDir + "'");
-        }
-        else {
-            FlowVelocityMeasurementParser parser =
-                new FlowVelocityMeasurementParser();
-
-            for (File measurement: measureFiles) {
-                log.debug("Parse file '" + measurement + "'");
-                parser.parse(measurement);
-            }
-
-            flowVelocityMeasurements = parser.getMeasurements();
-        }
-    }
-
-
-    protected void parseSedimentYield() throws IOException {
-        if (Config.INSTANCE.skipSedimentYield()) {
-            log.info("skip parsing sediment yield data");
-            return;
-        }
-
-        log.debug("Parse sediment yield data");
-
-        File minfoDir         = getMinfoDir();
-        File sedimentYieldDir = new File(minfoDir, SEDIMENT_YIELD_DIR);
-
-        File singleDir = new File(sedimentYieldDir, SEDIMENT_YIELD_SINGLE_DIR);
-        File epochDir  = new File(sedimentYieldDir, SEDIMENT_YIELD_EPOCH_DIR);
-
-        File[] singles = singleDir.listFiles();
-        File[] epochs  = epochDir.listFiles();
-
-        SedimentYieldParser parser = new SedimentYieldParser();
-
-        if (singles == null || singles.length == 0) {
-            log.warn("Cannot read directory '" + singleDir + "'");
-        }
-        else {
-            for (File file: singles) {
-                if (file.isDirectory()) {
-                    for (File child: file.listFiles()) {
-                        parser.parse(child);
-                    }
-                }
-                else {
-                    parser.parse(file);
-                }
-            }
-        }
-
-        if (epochs == null || epochs.length == 0) {
-            log.warn("Cannot read directory '" + epochDir + "'");
-        }
-        else {
-            for (File file: epochs) {
-                if (file.isDirectory()) {
-                    for (File child: file.listFiles()) {
-                        parser.parse(child);
-                    }
-                }
-                else {
-                    parser.parse(file);
-                }
-            }
-        }
-
-        sedimentYields = parser.getSedimentYields();
-    }
-
-
-    protected void parseWaterlevels() throws IOException {
-        if (Config.INSTANCE.skipWaterlevels()) {
-            log.info("skip parsing waterlevels");
-            return;
-        }
-
-        log.info("Parse waterlevels");
-
-        File minfo  = getMinfoDir();
-        File fixDir = new File(minfo, MINFO_FIXATIONS_DIR);
-        File wspDir = new File(fixDir, MINFO_WATERLEVELS_DIR);
-
-        File[] files = wspDir.listFiles();
-
-        if (files == null) {
-            log.warn("Cannot read directory for wl '" + wspDir + "'");
-            return;
-        }
-
-        WaterlevelParser parser = new WaterlevelParser();
-
-        for (File file: files) {
-            parser.parse(file);
-        }
-
-        // The parsed ImportWaterlevels are converted to
-        // 'fixation'-wsts now.
-        for(ImportWst iw: parser.getWaterlevels()) {
-            iw.setDescription("CSV/" + iw.getDescription());
-            iw.setKind(6);
-            waterlevels.add(iw);
-        }
-    }
-
-    protected void parseMeasurementStations() throws IOException {
-        if (Config.INSTANCE.skipMeasurementStations()) {
-            log.info("skip parsing measurement stations");
-            return;
-        }
-
-        log.info("Parse measurement stations");
-
-        File minfo = getMinfoDir();
-        File minfoBaseDir = new File(minfo, MINFO_BASE_DIR);
-        File coredataFile = new File(minfoBaseDir, MINFO_CORE_DATA_FILE);
-
-        if (coredataFile == null || !coredataFile.exists()) {
-            log.warn("No core data file '" + coredataFile.getAbsolutePath() + "' found");
-            return;
-        }
-
-        MeasurementStationsParser parser = new MeasurementStationsParser();
-        try {
-            parser.parse(coredataFile);
-            measurementStations = parser.getMeasurementStations();
-
-            log.info("Successfully parsed " + measurementStations.size() + " measurement stations.");
-        }
-        catch (IOException ioe) {
-            log.error("unable to parse file '" + coredataFile.getName() +
-                ": " + ioe.getMessage());
-        }
-    }
-
-
-    protected void parseWaterlevelDifferences() throws IOException {
-        if (Config.INSTANCE.skipWaterlevelDifferences()) {
-            log.info("skip parsing waterlevel differences");
-            return;
-        }
-
-        log.info("Parse waterlevel differences");
-
-        File minfo  = getMinfoDir();
-        File fixDir = new File(minfo, MINFO_FIXATIONS_DIR);
-        File diffDir = new File(fixDir, MINFO_WATERLEVEL_DIFF_DIR);
-
-        File[] files = diffDir.listFiles();
-
-        if (files == null) {
-            log.warn("Cannot read directory '" + diffDir + "'");
-            return;
-        }
-
-        WaterlevelDifferencesParser parser = new WaterlevelDifferencesParser();
-
-        for (File file: files) {
-            parser.parse(file);
-        }
-
-        // WaterlevelDifferences become Wsts now.
-        for(ImportWst iw: parser.getDifferences()) {
-            iw.setDescription("CSV/" + iw.getDescription());
-            iw.setKind(7);
-            waterlevelDifferences.add(iw);
-        }
-    }
-
-
-    protected void parseSQRelation() throws IOException {
-        if (Config.INSTANCE.skipSQRelation()) {
-            log.info("skip parsing sq relation");
-            return;
-        }
-
-        log.info("Parse sq relations");
-
-        File minfo = getMinfoDir();
-        File sqDir = new File(minfo, MINFO_SQ_DIR);
-
-        File[] files = sqDir.listFiles();
-
-        if (files == null) {
-            log.warn("Cannot read directory '" + sqDir + "'");
-            return;
-        }
-
-        SQRelationParser parser = new SQRelationParser();
-
-        for (File file: files) {
-            parser.parse(file);
-        }
-
-        sqRelations = parser.getSQRelations();
-
-        log.debug("Parsed " + sqRelations.size() + " SQ relations.");
-    }
-
-
-    protected void parseBedHeightSingles(File dir) throws IOException {
-        log.debug("Parse bed height singles");
-
-        File[] files = dir.listFiles();
-
-        if (files == null) {
-            log.warn("Cannot read directory '" + dir + "'");
-            return;
-        }
-
-        BedHeightSingleParser parser = new BedHeightSingleParser();
-
-        for (File file: files) {
-            parser.parse(file);
-        }
-
-        bedHeightSingles = parser.getBedHeights();
-    }
-
-
-    protected void parseBedHeightEpochs(File dir) throws IOException {
-        log.debug("Parse bed height epochs");
-
-        File[] files = dir.listFiles();
-
-        if (files == null) {
-            log.warn("Cannot read directory '" + dir + "'");
-            return;
-        }
-
-        BedHeightEpochParser parser = new BedHeightEpochParser();
-
-        for (File file: files) {
-            parser.parse(file);
-        }
-
-        bedHeightEpochs = parser.getBedHeights();
-    }
-
-
-    public void parseFloodWater() throws IOException {
-        if (Config.INSTANCE.skipFloodWater()) {
-            log.info("skip parsing flod water");
-            return;
-        }
-
-        log.info("Parse flood water wst file");
-
-        File riverDir = wstFile.getParentFile().getParentFile();
-
-        File dir = FileTools.repair(new File(riverDir, FLOOD_WATER));
-
-        if (!dir.isDirectory() || !dir.canRead()) {
-            log.info("no directory '" + dir + "' found");
-            return;
-        }
-
-        File [] files = dir.listFiles();
-
-        if (files == null) {
-            log.warn("cannot read '" + dir + "'");
-            return;
-        }
-
-        for (File file: files) {
-            if (!file.isFile() || !file.canRead()) {
-                continue;
-            }
-            String name = file.getName().toLowerCase();
-            if (!(name.endsWith(".zus") || name.endsWith(".wst"))) {
-                continue;
-            }
-            log.info("found file '" + file.getName() + "'");
-            WstParser wstParser = new WstParser();
-            wstParser.parse(file);
-            ImportWst iw = wstParser.getWst();
-            iw.setKind(4);
-            iw.setDescription(FLOOD_WATER + "/" + iw.getDescription());
-            floodWater.add(iw);
-        }
-    }
-
-    public void parseOfficialLines() throws IOException {
-        if (Config.INSTANCE.skipOfficialLines()) {
-            log.info("skip parsing official lines");
-            return;
-        }
-
-        log.info("Parse official wst files");
-
-        File riverDir = wstFile.getParentFile().getParentFile();
-
-        for (String folder: OFFICIAL_LINES_FOLDERS) {
-            File dir = FileTools.repair(new File(riverDir, folder));
-
-            if (!dir.isDirectory() || !dir.canRead()) {
-                log.info("no directory '" + folder + "' found");
-                continue;
-            }
-
-            File file = FileTools.repair(new File(dir, OFFICIAL_LINES));
-            if (!file.isFile() || !file.canRead()) {
-                log.warn("no official lines wst file found");
-                continue;
-            }
-            log.debug("Found WST file: " + file);
-
-            WstParser wstParser = new WstParser();
-            wstParser.parse(file);
-            ImportWst iw = wstParser.getWst();
-            iw.setKind(3);
-            iw.setDescription(folder + "/" + iw.getDescription());
-            officialLines.add(iw);
-        } // for all folders
-
-    }
-
-    public void parseFixations() throws IOException {
-        if (Config.INSTANCE.skipFixations()) {
-            log.info("skip parsing fixations");
-            return;
-        }
-
-        log.info("Parse fixation wst files");
-
-        File riverDir = wstFile.getParentFile().getParentFile();
-
-        File fixDir = FileTools.repair(
-            new File(riverDir, FIXATIONS));
-
-        if (!fixDir.isDirectory() || !fixDir.canRead()) {
-            log.info("no fixation wst file directory found");
-            return;
-        }
-
-        File [] files = fixDir.listFiles();
-
-        if (files == null) {
-            log.warn("cannot read fixations wst file directory");
-            return;
-        }
-
-        for (File file: files) {
-            if (!file.isFile() || !file.canRead()) {
-                continue;
-            }
-            String name = file.getName().toLowerCase();
-            if (!name.endsWith(".wst")) {
-                continue;
-            }
-            log.debug("Found WST file: " + file);
-
-            WstParser wstParser = new WstParser();
-            wstParser.parse(file);
-            ImportWst iw = wstParser.getWst();
-            iw.setKind(2);
-            iw.setDescription(FIXATIONS+ "/" + iw.getDescription());
-            fixations.add(iw);
-        }
-    }
-
-    public void parseExtraWsts() throws IOException {
-        if (Config.INSTANCE.skipExtraWsts()) {
-            log.info("skip parsing extra WST files");
-            return;
-        }
-
-        log.info("Parse extra longitudinal wst files");
-
-        File riverDir = wstFile.getParentFile().getParentFile();
-
-        File extraDir = FileTools.repair(
-            new File(riverDir, EXTRA_LONGITUDINALS));
-
-        if (!extraDir.isDirectory() || !extraDir.canRead()) {
-            log.info("no extra longitudinal wst file directory found");
-            return;
-        }
-
-        File [] files = extraDir.listFiles();
-
-        if (files == null) {
-            log.warn("cannot read extra longitudinal wst file directory");
-            return;
-        }
-
-        for (File file: files) {
-            if (!file.isFile() || !file.canRead()) {
-                continue;
-            }
-            String name = file.getName().toLowerCase();
-            if (!(name.endsWith(".zus") || name.endsWith(".wst"))) {
-                continue;
-            }
-            log.debug("Found WST file: " + file);
-
-            WstParser wstParser = new WstParser();
-            wstParser.parse(file);
-            ImportWst iw = wstParser.getWst();
-            iw.setKind(1);
-            iw.setDescription(EXTRA_LONGITUDINALS + "/" + iw.getDescription());
-            extraWsts.add(iw);
-        }
-
-    }
-
-    public void parseWst() throws IOException {
-        if (Config.INSTANCE.skipWst()) {
-            log.info("skip parsing WST file");
-            return;
-        }
-
-        WstParser wstParser = new WstParser();
-        wstParser.parse(wstFile);
-        wst = wstParser.getWst();
-    }
-
-    public void parseGauges() throws IOException {
-        if (Config.INSTANCE.skipGauges()) {
-            log.info("skip parsing gauges");
-            return;
-        }
-
-        File gltFile = new File(wstFile.getParentFile(), PEGEL_GLT);
-        gltFile = FileTools.repair(gltFile);
-
-        if (!gltFile.isFile() || !gltFile.canRead()) {
-            log.warn("cannot read gauges from '" + gltFile + "'");
-            return;
-        }
-
-        PegelGltParser pgltp = new PegelGltParser();
-        pgltp.parse(gltFile);
-
-        gauges = pgltp.getGauges();
-
-        for (ImportGauge gauge: gauges) {
-            gauge.parseDependencies();
-        }
-    }
-
-    public void parseAnnotations() throws IOException {
-        if (Config.INSTANCE.skipAnnotations()) {
-            log.info("skip parsing annotations");
-            return;
-        }
-
-        File riverDir = wstFile.getParentFile().getParentFile();
-        AnnotationsParser aparser =
-            new AnnotationsParser(annotationClassifier);
-        aparser.parse(riverDir);
-
-        annotations = aparser.getAnnotations();
-    }
-
-    public void parseHYKs() {
-        if (Config.INSTANCE.skipHYKs()) {
-            log.info("skip parsing HYK files");
-            return;
-        }
-
-        log.info("looking for HYK files");
-        HYKParser parser = new HYKParser();
-        File riverDir = wstFile
-            .getParentFile()  // Basisdaten
-            .getParentFile()  // Hydrologie
-            .getParentFile(); // <river>
-
-        parser.parseHYKs(riverDir, new HYKParser.Callback() {
-
-            Set<HashedFile> hfs = new HashSet<HashedFile>();
-
-            @Override
-            public boolean hykAccept(File file) {
-                HashedFile hf = new HashedFile(file);
-                boolean success = hfs.add(hf);
-                if (!success) {
-                    log.warn("HYK file '" + file + "' seems to be a duplicate.");
-                }
-                return success;
-            }
-
-            @Override
-            public void hykParsed(HYKParser parser) {
-                log.debug("callback from HYK parser");
-                ImportHYK hyk = parser.getHYK();
-                hyk.setRiver(ImportRiver.this);
-                hyks.add(hyk);
-            }
-        });
-    }
-
-
-    /** Add cross sections with description, years and lines to
-     * store. */
-    private void addCrossSections(CrossSectionParser parser) {
-        String  description = parser.getDescription();
-        Integer year        = parser.getYear();
-        ImportTimeInterval ti = year != null
-            ? new ImportTimeInterval(yearToDate(year))
-            : null;
-
-        Map<Double, List<XY>> data = parser.getData();
-
-        List<ImportCrossSectionLine> lines =
-            new ArrayList<ImportCrossSectionLine>(data.size());
-
-        for (Map.Entry<Double, List<XY>> entry: data.entrySet()) {
-            Double   km     = entry.getKey();
-            List<XY> points = entry.getValue();
-            lines.add(new ImportCrossSectionLine(km, points));
-        }
-
-        crossSections.add(new ImportCrossSection(
-            ImportRiver.this, description, ti, lines));
-    }
-
-    /** Create a W80 Parser and parse w80 files found. */
-    public void parseW80s() {
-        if (Config.INSTANCE.skipW80s()) {
-            log.info("skip parsing W80s");
-            return;
-        }
-        W80Parser parser = new W80Parser();
-        File riverDir = wstFile
-            .getParentFile()  // Basisdaten
-            .getParentFile()  // Hydrologie
-            .getParentFile(); // <river>
-
-        ImportRiverCrossSectionParserCallback w80Callback =
-            new ImportRiverCrossSectionParserCallback("w80");
-        parser.parseW80s(riverDir, w80Callback);
-    }
-
-    /** Create a W80 Parser and parse w80 files found. */
-    public void parseW80CSVs() {
-        if (Config.INSTANCE.skipW80CSVs()) {
-            log.info("skip parsing W80 csvs");
-            return;
-        }
-        W80CSVParser parser = new W80CSVParser();
-        File riverDir = wstFile
-            .getParentFile()  // Basisdaten
-            .getParentFile()  // Hydrologie
-            .getParentFile(); // <river>
-
-        // Construct the Cross-Section-Data path.
-        File csDir = new File(riverDir.getPath()
-            + File.separator + "Geodaesie"
-            + File.separator + "Querprofile"
-            + File.separator + "QP-Daten");
-
-        ImportRiverCrossSectionParserCallback w80CSVCallback =
-            new ImportRiverCrossSectionParserCallback("w80-csv");
-        parser.parseW80CSVs(csDir, w80CSVCallback);
-    }
-
-
-    /**
-     * Create and use a DA50Parser, parse the files found, add the
-     * ross-sections found.
-     */
-    public void parseDA50s() {
-        if (Config.INSTANCE.skipDA50s()) {
-            log.info("skip parsing DA50s");
-            return;
-        }
-        DA50Parser parser = new DA50Parser();
-        File riverDir = wstFile
-            .getParentFile()  // Basisdaten
-            .getParentFile()  // Hydrologie
-            .getParentFile(); // <river>
-
-        ImportRiverCrossSectionParserCallback da50Callback =
-            new ImportRiverCrossSectionParserCallback("da50");
-        parser.parseDA50s(riverDir, da50Callback);
-    }
-
-
-    /** Create a DA66 Parser and parse the da66 files found. */
-    // TODO this is a copy of parsePRFs, extract interfaces (e.g. CrossSectionParser).
-    public void parseDA66s() {
-        if (Config.INSTANCE.skipDA66s()) {
-            log.info("skip parsing DA66s");
-            return;
-        }
-
-        log.info("looking for DA66 files");
-        DA66Parser parser = new DA66Parser();
-        File riverDir = wstFile
-            .getParentFile()  // Basisdaten
-            .getParentFile()  // Hydrologie
-            .getParentFile(); // <river>
-
-        ImportRiverCrossSectionParserCallback da66Callback =
-            new ImportRiverCrossSectionParserCallback("da66");
-        parser.parseDA66s(riverDir, da66Callback);
-    }
-
-    /** Create a PRFParser and let it parse the prf files found. */
-    public void parsePRFs() {
-        if (Config.INSTANCE.skipPRFs()) {
-            log.info("skip parsing PRFs");
-            return;
-        }
-
-        log.info("looking for PRF files");
-        PRFParser parser = new PRFParser();
-        File riverDir = wstFile
-            .getParentFile()  // Basisdaten
-            .getParentFile()  // Hydrologie
-            .getParentFile(); // <river>
-
-        ImportRiverCrossSectionParserCallback prfCallback =
-            new ImportRiverCrossSectionParserCallback("prf");
-        parser.parsePRFs(riverDir, prfCallback);
-    }
-
-    public static Date yearToDate(int year) {
-        Calendar cal = Calendar.getInstance();
-        cal.set(year, 5, 15, 12, 0, 0);
-        long ms = cal.getTimeInMillis();
-        cal.setTimeInMillis(ms - ms%1000);
-        return cal.getTime();
-    }
-
-    public void storeDependencies() {
-        storeWstUnit();
-        storeAnnotations();
-        storeHYKs();
-        storeCrossSections();
-        storeGauges();
-        storeWst();
-        storeExtraWsts();
-        storeFixations();
-        storeOfficialLines();
-        storeFloodWater();
-        storeFloodProtection();
-        storeBedHeight();
-        storeSedimentDensity();
-        storeMorphologicalWidth();
-        storeFlowVelocity();
-        storeSedimentYield();
-        storeWaterlevels();
-        storeWaterlevelDifferences();
-        storeMeasurementStations();
-        storeSQRelations();
-        storeOfficialNumber();
-    }
-
-    public void storeWstUnit() {
-        if (wst == null) {
-            wstUnit = new ImportUnit("NN + m");
-        }
-        else {
-            wstUnit = wst.getUnit();
-        }
-    }
-
-    public void storeHYKs() {
-        if (!Config.INSTANCE.skipHYKs()) {
-            log.info("store HYKs");
-            getPeer();
-            for (ImportHYK hyk: hyks) {
-                hyk.storeDependencies();
-            }
-        }
-    }
-
-    public void storeCrossSections() {
-        if (!Config.INSTANCE.skipPRFs()
-            || !Config.INSTANCE.skipDA66s()
-            || !Config.INSTANCE.skipDA50s()
-            || !Config.INSTANCE.skipW80s()
-            || !Config.INSTANCE.skipW80CSVs()) {
-            log.info("store cross sections");
-            getPeer();
-            for (ImportCrossSection crossSection: crossSections) {
-                crossSection.storeDependencies();
-            }
-        }
-    }
-
-    public void storeWst() {
-        if (!Config.INSTANCE.skipWst()) {
-            River river = getPeer();
-            wst.storeDependencies(river);
-        }
-    }
-
-    public void storeFixations() {
-        if (!Config.INSTANCE.skipFixations()) {
-            log.info("store fixation wsts");
-            River river = getPeer();
-            for (ImportWst fWst: fixations) {
-                log.debug("Fixation name: " + fWst.getDescription());
-                fWst.storeDependencies(river);
-            }
-        }
-    }
-
-
-    /** Store wsts from waterlevel-csv files. */
-    public void storeWaterlevels() {
-        if (!Config.INSTANCE.skipWaterlevels())
-
-        log.info("store waterlevel wsts from csv");
-        River river = getPeer();
-        for (ImportWst wWst: waterlevels) {
-            log.debug("Waterlevel name: " + wWst.getDescription());
-            wWst.storeDependencies(river);
-        }
-    }
-
-
-    /** Store wsts from waterleveldifference-csv files. */
-    public void storeWaterlevelDifferences() {
-        if (!Config.INSTANCE.skipWaterlevelDifferences())
-
-        log.info("store waterleveldifferences wsts from csv");
-        River river = getPeer();
-        for (ImportWst dWst: waterlevelDifferences) {
-            log.debug("water.diff.: name " + dWst.getDescription());
-            dWst.storeDependencies(river);
-        }
-    }
-
-
-    public void storeExtraWsts() {
-        if (!Config.INSTANCE.skipExtraWsts()) {
-            log.info("store extra wsts");
-            River river = getPeer();
-            for (ImportWst wst: extraWsts) {
-                log.debug("name: " + wst.getDescription());
-                wst.storeDependencies(river);
-            }
-        }
-    }
-
-    public void storeOfficialLines() {
-        if (!Config.INSTANCE.skipOfficialLines()) {
-            log.info("store official lines wsts");
-            River river = getPeer();
-            for (ImportWst wst: officialLines) {
-                log.debug("name: " + wst.getDescription());
-                wst.storeDependencies(river);
-            }
-        }
-    }
-
-    public void storeFloodWater() {
-        if (!Config.INSTANCE.skipFloodWater()) {
-            log.info("store flood water wsts");
-            River river = getPeer();
-            for (ImportWst wst: floodWater) {
-                log.debug("name: " + wst.getDescription());
-                wst.storeDependencies(river);
-            }
-        }
-    }
-
-
-    public void storeFloodProtection() {
-        if (!Config.INSTANCE.skipFloodProtection()) {
-            log.info("store flood protection wsts");
-            River river = getPeer();
-            for (ImportWst wst: floodProtection) {
-                log.debug("name: " + wst.getDescription());
-                wst.storeDependencies(river);
-            }
-        }
-    }
-
-
-    public void storeBedHeight() {
-        if (!Config.INSTANCE.skipBedHeightSingle()) {
-            log.info("store bed heights single");
-            storeBedHeightSingle();
-        }
-
-        if (!Config.INSTANCE.skipBedHeightEpoch()) {
-            log.info("store bed height epoch.");
-            storeBedHeightEpoch();
-        }
-    }
-
-
-    private void storeBedHeightSingle() {
-        River river = getPeer();
-
-        if (bedHeightSingles != null) {
-            for (ImportBedHeight tmp: bedHeightSingles) {
-                ImportBedHeightSingle single = (ImportBedHeightSingle) tmp;
-
-                String desc = single.getDescription();
-
-                log.debug("name: " + desc);
-
-		single.storeDependencies(river);
-
-            }
-        }
-        else {
-            log.info("No single bed heights to store.");
-        }
-    }
-
-
-    private void storeBedHeightEpoch() {
-        River river = getPeer();
-
-        if (bedHeightEpochs != null) {
-            for (ImportBedHeight tmp: bedHeightEpochs) {
-                ImportBedHeightEpoch epoch = (ImportBedHeightEpoch) tmp;
-
-                String desc = epoch.getDescription();
-
-                log.debug("name: " + desc);
-
-		epoch.storeDependencies(river);
-
-            }
-        }
-        else {
-            log.info("No epoch bed heights to store.");
-        }
-    }
-
-    public void storeSedimentDensity() {
-        if (!Config.INSTANCE.skipSedimentDensity()) {
-            log.info("store sediment density");
-
-            River river = getPeer();
-
-            for (ImportSedimentDensity density: sedimentDensities) {
-                String desc = density.getDescription();
-
-                log.debug("name: " + desc);
-
-		density.storeDependencies(river);
-
-            }
-        }
-    }
-
-    public void storeMorphologicalWidth() {
-        if (!Config.INSTANCE.skipMorphologicalWidth()) {
-            log.info("store morphological width");
-
-            River river = getPeer();
-
-            for (ImportMorphWidth width: morphologicalWidths) {
-
-		width.storeDependencies(river);
-
-            }
-        }
-    }
-
-    public void storeFlowVelocity() {
-        if (!Config.INSTANCE.skipFlowVelocity()) {
-            log.info("store flow velocity");
-
-            River river = getPeer();
-
-            for (ImportFlowVelocityModel flowVelocityModel: flowVelocityModels){
-
-		flowVelocityModel.storeDependencies(river);
-
-            }
-
-            for (ImportFlowVelocityMeasurement m: flowVelocityMeasurements) {
-
-		m.storeDependencies(river);
-
-            }
-        }
-    }
-
-
-    public void storeSedimentYield() {
-        if (!Config.INSTANCE.skipSedimentYield()) {
-            log.info("store sediment yield data");
-
-            River river = getPeer();
-
-            for (ImportSedimentYield sedimentYield: sedimentYields) {
-
-		sedimentYield.storeDependencies(river);
-
-            }
-        }
-    }
-
-
-    public void storeMeasurementStations() {
-        if (!Config.INSTANCE.skipMeasurementStations()) {
-            log.info("store measurement stations");
-
-            River river = getPeer();
-
-            int count = 0;
-
-            for (ImportMeasurementStation station: measurementStations) {
-
-		boolean success = station.storeDependencies(river);
-		if (success) {
-		    count++;
-		}
-
-            }
-
-            log.info("stored " + count + " measurement stations.");
-        }
-    }
-
-
-    public void storeSQRelations() {
-        if (!Config.INSTANCE.skipSQRelation()) {
-            log.info("store sq relations");
-
-            River river = getPeer();
-
-            int count = 0;
-
-            for (ImportSQRelation sqRelation: sqRelations) {
-
-		sqRelation.storeDependencies(river);
-		count++;
-
-            }
-
-            log.info("stored " + count + " sq relations.");
-        }
-    }
-
-
-    public void storeAnnotations() {
-        if (!Config.INSTANCE.skipAnnotations()) {
-            River river = getPeer();
-            for (ImportAnnotation annotation: annotations) {
-                annotation.getPeer(river);
-            }
-        }
-    }
-
-    public void storeGauges() {
-        if (!Config.INSTANCE.skipGauges()) {
-            log.info("store gauges:");
-            River river = getPeer();
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-            for (ImportGauge gauge: gauges) {
-                log.info("\tgauge: " + gauge.getName());
-                gauge.storeDependencies(river);
-                ImporterSession.getInstance().getDatabaseSession();
-                session.flush();
-            }
-        }
-    }
-
-    public River getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery("from River where name=:name");
-
-            Unit u = null;
-            if (wstUnit != null) {
-                u = wstUnit.getPeer();
-            }
-
-            query.setString("name", name);
-            List<River> rivers = query.list();
-            if (rivers.isEmpty()) {
-                log.info("Store new river '" + name + "'");
-                peer = new River(name, u);
-                if (!Config.INSTANCE.skipBWASTR()) {
-                    peer.setOfficialNumber(officialNumber);
-                }
-                session.save(peer);
-            }
-            else {
-                peer = rivers.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportSQRelation.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportSQRelation.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.exception.ConstraintViolationException;
-
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.SQRelation;
-import de.intevation.flys.model.TimeInterval;
-
-
-public class ImportSQRelation {
-
-    private static Logger log = Logger.getLogger(ImportSQRelation.class);
-
-    private ImportTimeInterval timeInterval;
-
-    private String description;
-
-    private List<ImportSQRelationValue> values;
-
-    private SQRelation peer;
-
-    public ImportSQRelation() {
-        this.values = new ArrayList<ImportSQRelationValue>();
-    }
-
-    public void storeDependencies(River river) {
-        log.info("store dependencies");
-
-        SQRelation peer = getPeer(river);
-
-        if (peer != null) {
-            int count = 0;
-
-            for (ImportSQRelationValue value : values) {
-                try {
-                    value.storeDependencies(peer);
-                    count++;
-                }
-                catch (SQLException sqle) {
-                    log.warn("ISQ: Unable to store sq relation value.", sqle);
-                }
-                catch (ConstraintViolationException cve) {
-                    log.warn("ISQ: Unable to store sq relation value.", cve);
-                }
-            }
-
-            log.info("stored " + count + " sq relation values.");
-        }
-    }
-
-    public SQRelation getPeer(River river) {
-        log.debug("getPeer()");
-
-        if (peer == null) {
-            TimeInterval timeInter = timeInterval.getPeer();
-
-            if (timeInter == null) {
-                log.warn("ISQ: Cannot determine sq relation without time interval");
-                return null;
-            }
-
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-
-            Query query = session
-                .createQuery("FROM SQRelation WHERE river=:river AND timeInterval=:timeInter");
-
-            query.setParameter("river", river);
-            query.setParameter("timeInter", timeInter);
-
-            List<SQRelation> sq = query.list();
-
-            if (sq.isEmpty()) {
-                log.info("create new SQ relation '" + description + "'");
-
-                peer = new SQRelation(river, timeInter, description);
-                session.save(peer);
-            }
-            else {
-                peer = sq.get(0);
-            }
-        }
-
-        return peer;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public void setTimeInterval(ImportTimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    public void addValue(ImportSQRelationValue value) {
-        if (value != null) {
-            this.values.add(value);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportSQRelationValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportSQRelationValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-import java.sql.SQLException;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.exception.ConstraintViolationException;
-
-import de.intevation.flys.model.MeasurementStation;
-import de.intevation.flys.model.SQRelation;
-import de.intevation.flys.model.SQRelationValue;
-
-
-public class ImportSQRelationValue {
-
-    private static Logger log = Logger.getLogger(ImportSQRelationValue.class);
-
-
-    private SQRelationValue peer;
-
-    private String parameter;
-
-    private Double km;
-    private Double a;
-    private Double b;
-    private Double qMax;
-    private Double rSQ;
-    private Integer nTot;
-    private Integer nOutlier;
-    private Double cFerguson;
-    private Double cDuan;
-
-
-    public ImportSQRelationValue(
-        String parameter,
-        Double km,
-        Double a,
-        Double b,
-        Double qMax,
-        Double rSQ,
-        Integer nTot,
-        Integer nOutlier,
-        Double cFerguson,
-        Double cDuan
-    ) {
-        this.parameter = parameter;
-        this.km        = km;
-        this.a         = a;
-        this.b         = b;
-        this.qMax      = qMax;
-        this.rSQ       = rSQ;
-        this.nTot      = nTot;
-        this.nOutlier  = nOutlier;
-        this.cFerguson = cFerguson;
-        this.cDuan     = cDuan;
-    }
-
-
-    public void storeDependencies(SQRelation owner)
-    throws SQLException, ConstraintViolationException
-    {
-        getPeer(owner);
-    }
-
-
-    public SQRelationValue getPeer(SQRelation owner) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from MeasurementStation " +
-                "   where station between :kml and :kmh");
-            query.setDouble("kml", km - 1e-4);
-            query.setDouble("kmh", km + 1e-4);
-
-            List<MeasurementStation> result = query.list();
-
-            if (result.isEmpty()) {
-                log.error("No measurement stations found at km " + km);
-                return null;
-            }
-
-            Query query2 = session.createQuery(
-                "from SQRelationValue " +
-                "   where sqRelation=:owner " +
-                "   and parameter=:parameter" +
-                "   and measurementStation=:measurementStation" +
-                "   and a=:a" +
-                "   and b=:b" +
-                "   and qMax=:qMax" +
-                "   and rSQ=:rSQ" +
-                "   and cFerguson=:cFerguson" +
-                "   and cDuan=:cDuan");
-
-            query2.setParameter("owner", owner);
-            query2.setString("parameter", parameter);
-            query2.setParameter("measurementStation", result.get(0));
-            query2.setBigDecimal("a", toBigDecimal(a));
-            query2.setBigDecimal("b", toBigDecimal(b));
-            query2.setBigDecimal("qMax", toBigDecimal(qMax));
-            query2.setBigDecimal("rSQ", toBigDecimal(rSQ));
-            query2.setBigDecimal("cFerguson", toBigDecimal(cFerguson));
-            query2.setBigDecimal("cDuan", toBigDecimal(cDuan));
-
-            List<SQRelationValue> values = query2.list();
-
-            if (values.isEmpty()) {
-                peer = new SQRelationValue(
-                    owner,
-                    parameter,
-                    result.get(0),
-                    a,
-                    b,
-                    qMax,
-                    rSQ,
-                    nTot,
-                    nOutlier,
-                    cFerguson,
-                    cDuan
-                );
-
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-        return peer;
-    }
-
-    private static final BigDecimal toBigDecimal(Double x) {
-        if (x == null) return null;
-        return new BigDecimal(x);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportSedimentDensity.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportSedimentDensity.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.hibernate.Query;
-import org.hibernate.Session;
-
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.SedimentDensity;
-
-
-public class ImportSedimentDensity {
-
-    private static Logger log = Logger.getLogger(ImportSedimentDensity.class);
-
-    protected SedimentDensity peer;
-
-    protected ImportDepth depth;
-
-    protected String description;
-
-    protected List<ImportSedimentDensityValue> values;
-
-    public ImportSedimentDensity(String description) {
-        this.description = description;
-        this.values = new ArrayList<ImportSedimentDensityValue>();
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDepth(ImportDepth depth) {
-        this.depth = depth;
-    }
-
-    public void addValue(ImportSedimentDensityValue value) {
-        values.add(value);
-    }
-
-    public void storeDependencies(River river) {
-        log.info("store dependencies");
-
-        if (depth != null) {
-            depth.storeDependencies();
-        }
-
-        SedimentDensity peer = getPeer(river);
-
-        if (peer != null) {
-            log.info("store sediment density values.");
-            for (ImportSedimentDensityValue value : values) {
-                value.storeDependencies(peer);
-            }
-        }
-    }
-
-    public SedimentDensity getPeer(River river) {
-        log.info("get peer");
-
-        if (depth == null) {
-            log.warn("cannot store sediment density '" + description
-                + "': no depth");
-            return null;
-        }
-
-        if (peer == null) {
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-
-            Query query = session.createQuery("from SedimentDensity where "
-                + "   river=:river and " + "   depth=:depth");
-
-            query.setParameter("river", river);
-            query.setParameter("depth", depth.getPeer());
-
-            List<SedimentDensity> density = query.list();
-
-            if (density.isEmpty()) {
-                log.debug("Create new SedimentDensity DB instance.");
-
-                peer = new SedimentDensity(river, depth.getPeer(),
-                    description);
-
-                session.save(peer);
-            }
-            else {
-                peer = density.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportSedimentDensityValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportSedimentDensityValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.SedimentDensity;
-import de.intevation.flys.model.SedimentDensityValue;
-
-
-public class ImportSedimentDensityValue {
-
-    private static final Logger log =
-        Logger.getLogger(ImportSedimentDensityValue.class);
-
-
-    protected SedimentDensityValue peer;
-
-    protected BigDecimal station;
-
-    protected BigDecimal shoreOffset;
-
-    protected BigDecimal density;
-
-    private BigDecimal year;
-
-    protected String description;
-
-
-    public ImportSedimentDensityValue(
-        BigDecimal station,
-        BigDecimal shoreOffset,
-        BigDecimal density,
-        BigDecimal year,
-        String     description
-    ) {
-        this.station     = station;
-        this.shoreOffset = shoreOffset;
-        this.density     = density;
-        this.year        = year;
-        this.description = description;
-    }
-
-
-    public void storeDependencies(SedimentDensity sedimentDensity) {
-        log.info("store dependencies");
-
-        getPeer(sedimentDensity);
-    }
-
-
-    public SedimentDensityValue getPeer(SedimentDensity sedimentDensity) {
-        log.info("get peer");
-
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-
-            Query query = session.createQuery(
-                "from SedimentDensityValue where " +
-                "   sedimentDensity=:sedimentDensity and " +
-                "   station=:station and " +
-                "   shoreOffset=:shoreOffset and " +
-                "   density=:density and " +
-                "   year=:year and " +
-                "   description=:description");
-
-            query.setParameter("sedimentDensity", sedimentDensity);
-            query.setParameter("station", station);
-            query.setParameter("shoreOffset", shoreOffset);
-            query.setParameter("density", density);
-            query.setParameter("year", year);
-            query.setParameter("description", description);
-
-            List<SedimentDensityValue> values = query.list();
-            if (values.isEmpty()) {
-                log.debug("Create new SedimentDensityValue DB instance.");
-
-                peer = new SedimentDensityValue(
-                    sedimentDensity,
-                    station,
-                    shoreOffset,
-                    density,
-                    year,
-                    description);
-
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportSedimentYield.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportSedimentYield.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.GrainFraction;
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.SedimentYield;
-import de.intevation.flys.model.TimeInterval;
-import de.intevation.flys.model.Unit;
-
-
-public class ImportSedimentYield {
-
-    private static Logger log = Logger.getLogger(ImportSedimentYield.class);
-
-    private ImportGrainFraction grainFraction;
-
-    private ImportUnit unit;
-
-    private ImportTimeInterval timeInterval;
-
-    private String description;
-
-    private List<ImportSedimentYieldValue> values;
-
-    private SedimentYield peer;
-
-    public ImportSedimentYield(String description) {
-        this.values = new ArrayList<ImportSedimentYieldValue>();
-        this.description = description;
-    }
-
-    public void setTimeInterval(ImportTimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    public void setUnit(ImportUnit unit) {
-        this.unit = unit;
-    }
-
-    public void setGrainFraction(ImportGrainFraction grainFraction) {
-        this.grainFraction = grainFraction;
-    }
-
-    public void addValue(ImportSedimentYieldValue value) {
-        this.values.add(value);
-    }
-
-    public void storeDependencies(River river) {
-        log.debug("store dependencies");
-
-        if (grainFraction != null) {
-            grainFraction.storeDependencies();
-        }
-
-        SedimentYield peer = getPeer(river);
-
-        if (peer != null) {
-            int i = 0;
-
-            for (ImportSedimentYieldValue value : values) {
-                value.storeDependencies(peer);
-                i++;
-            }
-
-            log.info("stored " + i + " sediment yield values.");
-        }
-    }
-
-    public SedimentYield getPeer(River river) {
-        log.debug("get peer");
-
-        GrainFraction gf = grainFraction != null ? grainFraction.getPeer()
-            : null;
-
-        Unit u = unit != null ? unit.getPeer() : null;
-
-        TimeInterval ti = timeInterval != null ? timeInterval.getPeer() : null;
-
-        if (ti == null || u == null) {
-            log.warn("Skip invalid SedimentYield: time interval or unit null!");
-            return null;
-        }
-
-        if (peer == null) {
-            Session session = ImporterSession.getInstance()
-                .getDatabaseSession();
-            Query query = session.createQuery("from SedimentYield where "
-                + "   river=:river and "
-                + "   grainFraction=:grainFraction and " + "   unit=:unit and "
-                + "   timeInterval=:timeInterval and "
-                + "   description=:description");
-
-            query.setParameter("river", river);
-            query.setParameter("grainFraction", gf);
-            query.setParameter("unit", u);
-            query.setParameter("timeInterval", ti);
-            query.setParameter("description", description);
-
-            List<SedimentYield> yields = query.list();
-            if (yields.isEmpty()) {
-                log.debug("create new SedimentYield");
-
-                peer = new SedimentYield(river, u, ti, gf, description);
-                session.save(peer);
-            }
-            else {
-                peer = yields.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportSedimentYieldValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportSedimentYieldValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.SedimentYield;
-import de.intevation.flys.model.SedimentYieldValue;
-
-
-public class ImportSedimentYieldValue {
-
-    private Double station;
-    private Double value;
-
-    private SedimentYieldValue peer;
-
-
-    public ImportSedimentYieldValue(Double station, Double value) {
-        this.station = station;
-        this.value   = value;
-    }
-
-
-    public void storeDependencies(SedimentYield sedimentYield) {
-        getPeer(sedimentYield);
-    }
-
-
-    public SedimentYieldValue getPeer(SedimentYield sedimentYield) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from SedimentYieldValue where " +
-                "   sedimentYield=:sedimentYield and " +
-                "   station=:station and " +
-                "   value=:value"
-            );
-
-            query.setParameter("sedimentYield", sedimentYield);
-            query.setParameter("station", station);
-            query.setParameter("value", value);
-
-            List<SedimentYieldValue> values = query.list();
-            if (values.isEmpty()) {
-                peer = new SedimentYieldValue(sedimentYield, station, value);
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportTimeInterval.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportTimeInterval.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.TimeInterval;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-import java.util.Date;
-
-import org.apache.log4j.Logger;
-
-public class ImportTimeInterval
-{
-    private static Logger log = Logger.getLogger(ImportTimeInterval.class);
-
-    protected Date startTime;
-    protected Date stopTime;
-
-    protected TimeInterval peer;
-
-    public ImportTimeInterval() {
-    }
-
-    public ImportTimeInterval(Date startTime) {
-        this.startTime = startTime;
-        this.stopTime = null;
-    }
-
-    public ImportTimeInterval(Date startTime, Date stopTime) {
-	Date start;
-	Date stop;
-	if (startTime == null) {
-	    start = stopTime;
-	    stop = null;
-	}
-	else {
-	    start = startTime;
-	    stop = stopTime;
-	}
-
-        if (stop != null && start.after(stop)) {
-            this.stopTime = start;
-            this.startTime = stop;
-        }
-        else {
-            this.startTime = start;
-            this.stopTime  = stop;
-        }
-    }
-
-    public Date getStartTime() {
-        return startTime;
-    }
-
-    public void setStartTime(Date startTime) {
-        this.startTime = startTime;
-    }
-
-    public Date getStopTime() {
-        return stopTime;
-    }
-
-    public void setStopTime(Date stopTime) {
-        this.stopTime = stopTime;
-    }
-
-    public TimeInterval getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            if (startTime == null) {
-                log.error("Null Start time will be ignored.");
-            }
-            Query query;
-            if (stopTime == null) {
-                query = session.createQuery(
-                    "from TimeInterval where startTime=:a and stopTime is null");
-            }
-            else {
-                query = session.createQuery(
-                    "from TimeInterval where startTime=:a and stopTime=:b");
-                query.setParameter("b", stopTime);
-            }
-            query.setParameter("a", startTime);
-
-            List<TimeInterval> intervals = query.list();
-            if (intervals.isEmpty()) {
-                peer = new TimeInterval(startTime, stopTime);
-                session.save(peer);
-            }
-            else {
-                peer = intervals.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportUnit.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportUnit.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.model.Unit;
-
-
-public class ImportUnit
-{
-    private static final Logger log = Logger.getLogger(ImportUnit.class);
-
-    protected String name;
-
-    protected Unit peer;
-
-
-    public ImportUnit(String name) {
-        this.name = name;
-    }
-
-
-    public String getName() {
-        return name;
-    }
-
-
-    public Unit getPeer() {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery("from Unit where name=:name");
-            query.setParameter("name", name);
-
-            List<Unit> units = query.list();
-            if (units.isEmpty()) {
-                log.info("Store new unit '" + name + "'");
-
-                peer = new Unit(name);
-                session.save(peer);
-            }
-            else {
-                peer = units.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportWst.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportWst.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.Wst;
-import de.intevation.flys.model.River;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ImportWst
-{
-    private static Logger log = Logger.getLogger(ImportWst.class);
-
-    protected String description;
-
-    protected Integer kind;
-
-    protected List<ImportWstColumn> columns;
-
-    protected ImportUnit unit;
-
-    /** Wst as in db. */
-    protected Wst peer;
-
-    public ImportWst() {
-        kind = 0;
-        columns = new ArrayList<ImportWstColumn>();
-    }
-
-    public ImportWst(String description) {
-        this();
-        this.description = description;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public Integer getKind() {
-        return kind;
-    }
-
-    public void setKind(Integer kind) {
-        this.kind = kind;
-    }
-
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    /** Create columns that can be accessed with getColumn. */
-    public void setNumberColumns(int numColumns) {
-        for (int i = 0; i < numColumns; ++i) {
-            columns.add(new ImportWstColumn(this, null, null, i));
-        }
-    }
-
-    public int getNumberColumns() {
-        return columns.size();
-    }
-
-    public ImportWstColumn getColumn(int index) {
-        return columns.get(index);
-    }
-
-    public List<ImportWstColumn> getColumns() {
-        return columns;
-    }
-
-    /** Adds a column. Assumes that columns wst is this instance. */
-    public void addColumn(ImportWstColumn column) {
-        columns.add(column);
-    }
-
-    public ImportUnit getUnit() {
-        return unit;
-    }
-
-    public void setUnit(ImportUnit unit) {
-        this.unit = unit;
-    }
-
-    public void storeDependencies(River river) {
-
-        log.info("store '" + description + "'");
-        Wst wst = getPeer(river);
-
-        for (ImportWstColumn column: columns) {
-            column.storeDependencies(river);
-        }
-
-        Session session = ImporterSession.getInstance().getDatabaseSession();
-        session.flush();
-    }
-
-    public void fixRangesOrder() {
-        for (ImportWstColumn column: columns) {
-            column.fixRangesOrder();
-        }
-    }
-
-    /** Get corresponding mapped wst (from database). */
-    public Wst getPeer(River river) {
-        if (peer == null) {
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from Wst where " +
-                "river=:river and description=:description and kind=:kind");
-            query.setParameter("river",       river);
-            query.setParameter("description", description);
-            query.setParameter("kind",        kind);
-            List<Wst> wsts = query.list();
-            if (wsts.isEmpty()) {
-                peer = new Wst(river, description, kind);
-                session.save(peer);
-            }
-            else {
-                peer = wsts.get(0);
-            }
-
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportWstColumn.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportWstColumn.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.Wst;
-import de.intevation.flys.model.WstColumn;
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.TimeInterval;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-import java.util.ArrayList;
-
-import java.math.BigDecimal;
-
-import org.apache.log4j.Logger;
-
-
-/** Unmapped column of a WST. */
-public class ImportWstColumn
-{
-    private static Logger log = Logger.getLogger(ImportWstColumn.class);
-
-    protected ImportWst wst;
-    protected String    name;
-    protected String    description;
-    protected Integer   position;
-
-    protected ImportTimeInterval timeInterval;
-
-    protected List<ImportWstColumnQRange> columnQRanges;
-    protected List<ImportWstColumnValue>  columnValues;
-
-    protected WstColumn peer;
-
-    public ImportWstColumn() {
-        columnQRanges = new ArrayList<ImportWstColumnQRange>();
-        columnValues  = new ArrayList<ImportWstColumnValue>();
-    }
-
-    public ImportWstColumn(
-        ImportWst wst,
-        String    name,
-        String    description,
-        Integer   position
-    ) {
-        this();
-        this.wst         = wst;
-        this.name        = name;
-        this.description = description;
-        this.position    = position;
-    }
-
-    public ImportWst getWst() {
-        return wst;
-    }
-
-    public void setWst(ImportWst wst) {
-        this.wst = wst;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public Integer getPosition() {
-        return position;
-    }
-
-    public void setPosition(Integer position) {
-        this.position = position;
-    }
-
-    public void addColumnValue(BigDecimal position, BigDecimal w) {
-        columnValues.add(
-            new ImportWstColumnValue(this, position, w));
-    }
-
-    public void addColumnQRange(ImportWstQRange columnQRange) {
-        columnQRanges.add(
-            new ImportWstColumnQRange(this, columnQRange));
-    }
-
-
-    /** Get the Column Values stored in this column. */
-    public List<ImportWstColumnValue> getColumnValues() {
-        return columnValues;
-    }
-
-
-    public void storeDependencies(River river) {
-        log.info("store column '" + name + "'");
-        WstColumn column = getPeer(river);
-
-        for (ImportWstColumnQRange columnQRange: columnQRanges) {
-            columnQRange.getPeer(river);
-        }
-
-        for (ImportWstColumnValue columnValue: columnValues) {
-            columnValue.getPeer(river);
-        }
-    }
-
-    public ImportTimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(ImportTimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    /** Get corresponding mapped wst-column (from database). */
-    public WstColumn getPeer(River river) {
-        if (peer == null) {
-            Wst w = wst.getPeer(river);
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from WstColumn where " +
-                "wst=:wst and name=:name and description=:description" +
-                " and position=:position");
-            query.setParameter("wst",         w);
-            query.setParameter("name",        name);
-            query.setParameter("description", description);
-            query.setParameter("position",    position);
-
-            TimeInterval ti = timeInterval != null
-                ? timeInterval.getPeer()
-                : null;
-
-            List<WstColumn> columns = query.list();
-            if (columns.isEmpty()) {
-                peer = new WstColumn(w, name, description, position, ti);
-                session.save(peer);
-            }
-            else {
-                peer = columns.get(0);
-            }
-        }
-        return peer;
-    }
-
-    public void fixRangesOrder() {
-        for (ImportWstColumnQRange wcqr: columnQRanges) {
-            wcqr.fixRangesOrder();
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportWstColumnQRange.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportWstColumnQRange.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.WstColumnQRange;
-import de.intevation.flys.model.WstQRange;
-import de.intevation.flys.model.WstColumn;
-import de.intevation.flys.model.River;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-public class ImportWstColumnQRange
-{
-    protected ImportWstColumn wstColumn;
-    protected ImportWstQRange qRange;
-
-    protected WstColumnQRange peer;
-
-    public ImportWstColumnQRange() {
-    }
-
-    public ImportWstColumnQRange(
-        ImportWstColumn wstColumn,
-        ImportWstQRange qRange
-    ) {
-        this.wstColumn = wstColumn;
-        this.qRange    = qRange;
-    }
-
-    public ImportWstColumn getWstColumn() {
-        return wstColumn;
-    }
-
-    public void setWstColumn(ImportWstColumn wstColumn) {
-        this.wstColumn = wstColumn;
-    }
-
-    public ImportWstQRange getQRange() {
-        return qRange;
-    }
-
-    public void setQRange(ImportWstQRange qRange) {
-        this.qRange = qRange;
-    }
-
-    public void fixRangesOrder() {
-        qRange.fixRangesOrder();
-    }
-
-    public WstColumnQRange getPeer(River river) {
-        if (peer == null) {
-            WstColumn c = wstColumn.getPeer(river);
-            WstQRange q = qRange.getPeer(river);
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from WstColumnQRange where " +
-                "wstColumn=:c and wstQRange=:q");
-            query.setParameter("c", c);
-            query.setParameter("q", q);
-            List<WstColumnQRange> cols = query.list();
-            if (cols.isEmpty()) {
-                peer = new WstColumnQRange(c, q);
-                session.save(peer);
-            }
-            else {
-                peer = cols.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportWstColumnValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportWstColumnValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.flys.model.WstColumnValue;
-import de.intevation.flys.model.WstColumn;
-import de.intevation.flys.model.River;
-
-import java.math.BigDecimal;
-
-import org.apache.log4j.Logger;
-
-public class ImportWstColumnValue
-{
-    protected Logger logger = Logger.getLogger(ImportWstColumnValue.class);
-
-    protected BigDecimal      position;
-    protected BigDecimal      w;
-    protected ImportWstColumn wstColumn;
-
-    protected WstColumnValue  peer;
-
-    public ImportWstColumnValue() {
-    }
-
-    public ImportWstColumnValue(
-        ImportWstColumn wstColumn,
-        BigDecimal      position,
-        BigDecimal      w
-    ) {
-        this.wstColumn = wstColumn;
-        this.position  = position;
-        this.w         = w;
-    }
-
-    public BigDecimal getPosition() {
-        return position;
-    }
-
-    public void setPosition(BigDecimal position) {
-        this.position = position;
-    }
-
-    public BigDecimal getW() {
-        return w;
-    }
-
-    public void setW(BigDecimal w) {
-        this.w = w;
-    }
-
-    public ImportWstColumn getWstColumn() {
-        return wstColumn;
-    }
-
-    public void setWstColumn(ImportWstColumn wstColumn) {
-        this.wstColumn = wstColumn;
-    }
-
-    public WstColumnValue getPeer(River river) {
-        if (peer == null) {
-            WstColumn c = wstColumn.getPeer(river);
-            peer = ImporterSession.getInstance().getWstColumnValue(
-                c, position, w);
-        }
-
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImportWstQRange.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportWstQRange.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-
-import de.intevation.flys.model.WstQRange;
-import de.intevation.flys.model.River;
-import de.intevation.flys.model.Range;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import java.util.List;
-
-public class ImportWstQRange
-{
-    protected ImportRange range;
-    protected BigDecimal  q;
-
-    protected WstQRange peer;
-
-    public ImportWstQRange() {
-    }
-
-    public ImportWstQRange(
-        ImportRange range,
-        BigDecimal  q
-    ) {
-        this.range = range;
-        this.q     = q;
-    }
-
-    public ImportRange getRange() {
-        return range;
-    }
-
-    public void setRange(ImportRange range) {
-        this.range = range;
-    }
-
-    public BigDecimal getQ() {
-        return q;
-    }
-
-    public void setQ(BigDecimal q) {
-        this.q = q;
-    }
-
-    public void fixRangesOrder() {
-        range.fixRangesOrder();
-    }
-
-    public WstQRange getPeer(River river) {
-        if (peer == null) {
-            Range r = range.getPeer(river);
-            Session session = ImporterSession.getInstance().getDatabaseSession();
-            Query query = session.createQuery(
-                "from WstQRange where " +
-                "range=:range and q=:q");
-            query.setParameter("range", r);
-            query.setParameter("q",     q);
-            List<WstQRange> wstQRanges = query.list();
-            if (wstQRanges.isEmpty()) {
-                peer = new WstQRange(r, q);
-                session.save(peer);
-            }
-            else {
-                peer = wstQRanges.get(0);
-            }
-        }
-        return peer;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/Importer.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/Importer.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,200 +0,0 @@
-package de.intevation.flys.importer;
-
-import de.intevation.artifacts.common.utils.XMLUtils;
-
-import de.intevation.flys.importer.parsers.AnnotationClassifier;
-import de.intevation.flys.importer.parsers.BundesWasserStrassenParser;
-import de.intevation.flys.importer.parsers.InfoGewParser;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import java.sql.SQLException;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Transaction;
-import org.hibernate.HibernateException;
-
-import org.w3c.dom.Document;
-
-import de.intevation.flys.utils.StringUtil;
-
-/** Data Importer. Further processing happens per-river. */
-public class Importer
-{
-    /** Private logger. */
-    private static Logger log = Logger.getLogger(Importer.class);
-
-    private static String BWASTR_ID_CSV_FILE = "BWASTR_ID.csv";
-
-    protected List<ImportRiver> rivers;
-
-    public Importer() {
-    }
-
-    public Importer(List<ImportRiver> rivers) {
-        this.rivers = rivers;
-    }
-
-    public List<ImportRiver> getRivers() {
-        return rivers;
-    }
-
-    public void setRivers(List<ImportRiver> rivers) {
-        this.rivers = rivers;
-    }
-
-    /** Write rivers and their dependencies/dependants to db. */
-    public void writeRivers() {
-        log.debug("write rivers started");
-
-        for (ImportRiver river: rivers) {
-            log.debug("writing river '" + river.getName() + "'");
-            river.storeDependencies();
-            ImporterSession.getInstance().getDatabaseSession().flush();
-        }
-
-        log.debug("write rivers finished");
-    }
-
-    public void writeToDatabase() {
-
-        Transaction tx = null;
-
-        try {
-            tx = ImporterSession.getInstance()
-                .getDatabaseSession().beginTransaction();
-
-            try {
-                writeRivers();
-            }
-            catch (HibernateException he) {
-                Throwable t = he.getCause();
-                while (t instanceof SQLException) {
-                    SQLException sqle = (SQLException) t;
-                    log.error("SQL exeception chain:", sqle);
-                    t = sqle.getNextException();
-                }
-                throw he;
-            }
-
-            tx.commit();
-        }
-        catch (RuntimeException re) {
-            if (tx != null) {
-                tx.rollback();
-            }
-            throw re;
-        }
-    }
-
-    public static AnnotationClassifier getAnnotationClassifier() {
-        String annotationTypes = Config.INSTANCE.getAnnotationTypes();
-
-        if (annotationTypes == null) {
-            log.info("no annotation types file configured.");
-            return null;
-        }
-
-        File file = new File(annotationTypes);
-
-        log.info("use annotation types file '" + file + "'");
-
-        if (!(file.isFile() && file.canRead())) {
-            log.warn("annotation type file '" + file + "' is not readable.");
-            return null;
-        }
-
-        Document rules = XMLUtils.parseDocument(file);
-
-        if (rules == null) {
-            log.warn("cannot parse annotation types file.");
-            return null;
-        }
-
-        return new AnnotationClassifier(rules);
-    }
-
-
-    /** Starting point for importing river data. */
-    public static void main(String [] args) {
-
-        InfoGewParser infoGewParser = new InfoGewParser(
-            getAnnotationClassifier());
-
-        log.info("Start parsing rivers...");
-
-        File bwastrFile = null;
-
-        for (String gew: args) {
-            log.info("parsing info gew file: " + gew);
-            File gewFile = new File(gew);
-            if (bwastrFile == null) {
-                bwastrFile = new File(gewFile.getParentFile(), BWASTR_ID_CSV_FILE);
-            }
-            try {
-                infoGewParser.parse(gewFile);
-            }
-            catch (IOException ioe) {
-                log.error("error while parsing gew: " + gew, ioe);
-                System.exit(1);
-            }
-        }
-
-        String gew = Config.INSTANCE.getInfoGewFile();
-        if (gew != null && gew.length() > 0) {
-            log.info("parsing info gew file: " + gew);
-            File gewFile = new File(gew);
-            if (bwastrFile == null) {
-                bwastrFile = new File(gewFile.getParentFile(), BWASTR_ID_CSV_FILE);
-            }
-            try {
-                infoGewParser.parse(gewFile);
-            }
-            catch (IOException ioe) {
-                log.error("error while parsing gew: " + gew, ioe);
-                System.exit(1);
-            }
-        }
-
-        // Look for official numbers.
-        BundesWasserStrassenParser bwastrIdParser =
-            new BundesWasserStrassenParser();
-
-        // Read bwastFile (river-dir + BWASTR_ID_CSV_FILE).
-        if (!Config.INSTANCE.skipBWASTR()) {
-            try{
-                bwastrIdParser.parse(bwastrFile);
-                HashMap<String,Long> map = bwastrIdParser.getMap();
-
-                // Now link rivers with official numbers.
-                for(ImportRiver river: infoGewParser.getRivers()) {
-                    for(Map.Entry<String, Long> entry: map.entrySet()) {
-                        if (StringUtil.containsIgnoreCase(entry.getKey(), river.getName())) {
-                            river.setOfficialNumber(entry.getValue());
-                            log.debug(river.getName() + " is mapped to bwastr " + entry.getValue());
-                        }
-                    }
-                }
-            } catch (IOException ioe) {
-                log.warn("BWASTR-file could not be loaded.");
-            }
-        }
-        else {
-            log.debug("skip reading BWASTR_ID.csv");
-        }
-
-        if (!Config.INSTANCE.dryRun()) {
-            new Importer(infoGewParser.getRivers()).writeToDatabase();
-        }
-        else {
-            log.info("Dry run, not writing to database.");
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ImporterSession.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImporterSession.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,187 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import java.math.BigDecimal;
-
-import org.hibernate.SessionFactory;
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.FlushMode;
-
-import de.intevation.flys.backend.SessionFactoryProvider;
-
-import de.intevation.flys.model.WstColumnValue;
-import de.intevation.flys.model.WstColumn;
-import de.intevation.flys.model.DischargeTableValue;
-import de.intevation.flys.model.DischargeTable;
-import de.intevation.flys.model.Range;
-import de.intevation.flys.model.River;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.artifacts.common.utils.LRUCache;
-
-public class ImporterSession
-{
-    private static Logger log = Logger.getLogger(ImporterSession.class);
-
-    private static final ThreadLocal<ImporterSession> SESSION =
-        new ThreadLocal<ImporterSession>() {
-            @Override
-            protected ImporterSession initialValue() {
-                return new ImporterSession();
-            }
-        };
-
-    protected Session databaseSession;
-
-    protected LRUCache<Integer, Map<ValueKey, WstColumnValue>>
-        wstColumnValues;
-
-    protected LRUCache<Integer, Map<ValueKey, DischargeTableValue>>
-        dischargeTableValues;
-
-    protected LRUCache<Integer, Map<ValueKey, Range>>
-        ranges;
-
-    public static ImporterSession getInstance() {
-        return SESSION.get();
-    }
-
-    public ImporterSession() {
-        SessionFactory sessionFactory =
-            SessionFactoryProvider.createSessionFactory();
-        databaseSession = sessionFactory.openSession();
-        //databaseSession.setFlushMode(FlushMode.MANUAL);
-
-        wstColumnValues =
-            new LRUCache<Integer, Map<ValueKey, WstColumnValue>>();
-
-        dischargeTableValues =
-            new LRUCache<Integer, Map<ValueKey, DischargeTableValue>>();
-
-        ranges = new LRUCache<Integer, Map<ValueKey, Range>>();
-    }
-
-    public Session getDatabaseSession() {
-        return databaseSession;
-    }
-
-    public WstColumnValue getWstColumnValue(
-        WstColumn  column,
-        BigDecimal position,
-        BigDecimal w
-    ) {
-        Integer c = column.getId();
-
-        Map<ValueKey, WstColumnValue> map = wstColumnValues.get(c);
-
-        if (map == null) {
-            map = new TreeMap<ValueKey, WstColumnValue>(
-                ValueKey.EPSILON_COMPARATOR);
-            wstColumnValues.put(c, map);
-            Query query = databaseSession.createQuery(
-                "from WstColumnValue where wstColumn.id=:cid");
-            query.setParameter("cid", c);
-            for (Iterator iter = query.iterate(); iter.hasNext();) {
-                WstColumnValue wcv = (WstColumnValue)iter.next();
-                map.put(new ValueKey(wcv.getPosition(), wcv.getW()), wcv);
-            }
-        }
-
-        ValueKey key = new ValueKey(position, w);
-
-        WstColumnValue wcv = map.get(key);
-
-        if (wcv != null) {
-            return wcv;
-        }
-
-        wcv = new WstColumnValue(column, position, w);
-
-        databaseSession.save(wcv);
-
-        map.put(key, wcv);
-
-        return wcv;
-    }
-
-    public DischargeTableValue getDischargeTableValue(
-        DischargeTable table,
-        BigDecimal     q,
-        BigDecimal     w
-    ) {
-        Integer t = table.getId();
-
-        Map<ValueKey, DischargeTableValue> map =
-            dischargeTableValues.get(t);
-
-        if (map == null) {
-            map = new TreeMap<ValueKey, DischargeTableValue>(
-                ValueKey.EPSILON_COMPARATOR);
-            dischargeTableValues.put(t, map);
-            Query query = databaseSession.createQuery(
-                "from DischargeTableValue where dischargeTable.id=:tid");
-            query.setParameter("tid", t);
-            for (Iterator iter = query.iterate(); iter.hasNext();) {
-                DischargeTableValue dctv = (DischargeTableValue)iter.next();
-                map.put(new ValueKey(dctv.getQ(), dctv.getW()), dctv);
-            }
-        }
-
-        ValueKey key = new ValueKey(q, w);
-
-        DischargeTableValue dctv = map.get(key);
-
-        if (dctv != null) {
-            return dctv;
-        }
-
-        dctv = new DischargeTableValue(table, q, w);
-
-        databaseSession.save(dctv);
-
-        map.put(key, dctv);
-
-        return dctv;
-    }
-
-    public Range getRange(River river, BigDecimal a, BigDecimal b) {
-        Integer r = river.getId();
-
-        Map<ValueKey, Range> map = ranges.get(r);
-
-        if (map == null) {
-            map = new TreeMap<ValueKey, Range>(
-                ValueKey.EPSILON_COMPARATOR);
-            ranges.put(r, map);
-            Query query = databaseSession.createQuery(
-                "from Range where river.id=:rid");
-            query.setParameter("rid", r);
-            for (Iterator iter = query.iterate(); iter.hasNext();) {
-                Range range = (Range)iter.next();
-                map.put(new ValueKey(range.getA(), range.getB()), range);
-            }
-        }
-
-        ValueKey key = new ValueKey(a, b);
-
-        Range range = map.get(key);
-
-        if (range != null) {
-            return range;
-        }
-
-        range = new Range(a, b, river);
-
-        databaseSession.save(range);
-
-        map.put(key, range);
-
-        return range;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/ValueKey.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ValueKey.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-package de.intevation.flys.importer;
-
-import java.math.BigDecimal;
-
-import java.util.Comparator;
-
-public class ValueKey
-{
-    public static final double EPSILON = 1e-6;
-
-    public static final Comparator<ValueKey> EPSILON_COMPARATOR =
-        new Comparator<ValueKey>()
-    {
-        public int compare(ValueKey x, ValueKey y) {
-            int cmp = ValueKey.compare(x.a, y.a);
-            if (cmp != 0) return cmp;
-            return ValueKey.compare(x.b, y.b);
-        }
-    };
-
-    public static int compare(BigDecimal a, BigDecimal b) {
-        if (a == null && b == null) return  0;
-        if (a != null && b == null) return +1;
-        if (a == null && b != null) return -1;
-
-        double diff = a.doubleValue() - b.doubleValue();
-        if (diff < -EPSILON) return -1;
-        return diff > EPSILON ? +1 : 0;
-    }
-
-    protected BigDecimal a;
-    protected BigDecimal b;
-
-    public ValueKey() {
-    }
-
-    public ValueKey(BigDecimal a, BigDecimal b) {
-        this.a = a;
-        this.b = b;
-    }
-
-    @Override
-    public int hashCode() {
-        return ((a != null ? a.hashCode() : 0) << 16)
-              | (b != null ? b.hashCode() : 0);
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof ValueKey)) {
-            return false;
-        }
-        ValueKey o = (ValueKey)other;
-        return !(
-               (a == null && o.a != null)
-            || (a != null && o.a == null)
-            || (a != null && !a.equals(o.a))
-            || (b == null && o.b != null)
-            || (b != null && o.b == null)
-            || (b != null && !b.equals(o.b)));
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/XY.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/XY.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-package de.intevation.flys.importer;
-
-
-/** Two doubles and an int index. */
-public class XY
-implements   Comparable<XY>
-{
-    public static final double X_EPSILON = 1e-4;
-
-    protected double x;
-    protected double y;
-    protected int    index;
-
-    public XY() {
-    }
-
-    public XY(double x, double y, int index) {
-        this.x     = x;
-        this.y     = y;
-        this.index = index;
-    }
-
-    @Override
-    public int compareTo(XY other) {
-        if (x + X_EPSILON < other.x) return -1;
-        if (x > other.x + X_EPSILON) return +1;
-        if (index < other.index)     return -1;
-        if (index > other.index)     return +1;
-        return 0;
-    }
-
-    public double getX() {
-        return x;
-    }
-
-    public void setX(double x) {
-        this.x = x;
-    }
-
-    public double getY() {
-        return y;
-    }
-
-    public void setY(double y) {
-        this.y = y;
-    }
-
-    public int getIndex() {
-        return index;
-    }
-
-    public void setIndex(int index) {
-        this.index = index;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/AnnotationClassifier.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/AnnotationClassifier.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Element;
-
-import javax.xml.xpath.XPathConstants;
-
-import java.util.Map;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ArrayList;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.artifacts.common.utils.XMLUtils;
-
-import de.intevation.flys.importer.ImportAnnotationType;
-import de.intevation.flys.importer.Importer;
-
-public class AnnotationClassifier
-{
-    private static Logger log = Logger.getLogger(Importer.class);
-
-    public static final String TYPES_XPATH =
-        "/annotation/types/type";
-
-    public static final String FILE_PATTERNS_XPATH =
-        "/annotation/patterns/file";
-
-    public static final String DESCRIPTION_PATTERNS_XPATH =
-        "/annotation/patterns/line";
-
-
-    public static class Pair {
-
-        protected Pattern              pattern;
-        protected ImportAnnotationType annType;
-
-        public Pair(Pattern pattern, ImportAnnotationType annType) {
-            this.pattern  = pattern;
-            this.annType = annType;
-        }
-
-        public ImportAnnotationType match(String s) {
-            Matcher m = pattern.matcher(s);
-            return m.matches() ? annType : null;
-        }
-    } // class Pair
-
-
-    protected Map<String, ImportAnnotationType> types;
-    protected List<Pair>                        filePatterns;
-    protected List<Pair>                        descPatterns;
-
-    protected ImportAnnotationType defaultType;
-
-    public AnnotationClassifier() {
-    }
-
-    public AnnotationClassifier(Document rules) {
-        types        = new HashMap<String, ImportAnnotationType>();
-        filePatterns = new ArrayList<Pair>();
-        descPatterns = new ArrayList<Pair>();
-
-        buildRules(rules);
-    }
-
-    protected void buildRules(Document rules) {
-        buildTypes(rules);
-        buildFilePatterns(rules);
-        buildDescriptionPatterns(rules);
-    }
-
-    protected void buildTypes(Document rules) {
-
-        NodeList typeList = (NodeList)XMLUtils.xpath(
-            rules,
-            TYPES_XPATH,
-            XPathConstants.NODESET,
-            null);
-
-        if (typeList == null) {
-            log.info("no rules found.");
-            return;
-        }
-
-        for (int i = 0, N = typeList.getLength(); i < N; ++i) {
-            Element typeElement = (Element)typeList.item(i);
-            String name = typeElement.getAttribute("name");
-            if (name.length() == 0) {
-                log.warn("ANNCLASS: rule has no name");
-                continue;
-            }
-
-            ImportAnnotationType aic = new ImportAnnotationType(name);
-
-            types.put(name, aic);
-
-            if (typeElement.getAttribute("default").equals("true")) {
-                defaultType = aic;
-            }
-        }
-    }
-
-    protected void buildFilePatterns(Document rules) {
-
-        NodeList patternList = (NodeList)XMLUtils.xpath(
-            rules,
-            FILE_PATTERNS_XPATH,
-            XPathConstants.NODESET,
-            null);
-
-        if (patternList == null) {
-            log.info("no file patterns found.");
-            return;
-        }
-
-        for (int i = 0, N = patternList.getLength(); i < N; ++i) {
-            Element element = (Element)patternList.item(i);
-            Pair pair = buildPair(element);
-            if (pair != null) {
-                filePatterns.add(pair);
-            }
-        }
-    }
-
-    protected void buildDescriptionPatterns(Document rules) {
-
-        NodeList patternList = (NodeList)XMLUtils.xpath(
-            rules,
-            DESCRIPTION_PATTERNS_XPATH,
-            XPathConstants.NODESET,
-            null);
-
-        if (patternList == null) {
-            log.info("no line patterns found.");
-            return;
-        }
-
-        for (int i = 0, N = patternList.getLength(); i < N; ++i) {
-            Element element = (Element)patternList.item(i);
-            Pair pair = buildPair(element);
-            if (pair != null) {
-                descPatterns.add(pair);
-            }
-        }
-    }
-
-    protected Pair buildPair(Element element) {
-        String pattern = element.getAttribute("pattern");
-        String type    = element.getAttribute("type");
-
-        if (pattern.length() == 0) {
-            log.warn("ANNCLASS: pattern has no 'pattern' attribute.");
-            return null;
-        }
-
-        if (type.length() == 0) {
-            log.warn("ANNCLASS: pattern has no 'type' attribute.");
-            return null;
-        }
-
-        ImportAnnotationType annType = types.get(type);
-
-        if (annType == null) {
-            log.warn("ANNCLASS: pattern has unknown type '" + type + "'");
-            return null;
-        }
-
-        Pattern p;
-
-        try {
-            p = Pattern.compile(pattern,
-                    Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);
-        }
-        catch (IllegalArgumentException iae) {
-            log.warn("ANNCLASS: pattern '" + pattern + "' is invalid.", iae);
-            return null;
-        }
-
-        return new Pair(p, annType);
-    }
-
-    public ImportAnnotationType getDefaultType() {
-        return defaultType;
-    }
-
-    public ImportAnnotationType classifyFile(String filename) {
-        return classifyFile(filename, null);
-    }
-
-    public ImportAnnotationType classifyFile(
-        String                filename,
-        ImportAnnotationType def
-    ) {
-        if (filename.toLowerCase().endsWith(".km")) {
-            filename = filename.substring(0, filename.length()-3);
-        }
-
-        for (Pair pair: filePatterns) {
-            ImportAnnotationType annType = pair.match(filename);
-            if (annType != null) {
-                return annType;
-            }
-        }
-
-        return def;
-    }
-
-    public ImportAnnotationType classifyDescription(String description) {
-        return classifyDescription(description, null);
-    }
-
-    public ImportAnnotationType classifyDescription(
-        String                description,
-        ImportAnnotationType def
-    ) {
-        for (Pair pair: descPatterns) {
-            ImportAnnotationType annType = pair.match(description);
-            if (annType != null) {
-                return annType;
-            }
-        }
-
-        return def;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/AnnotationsParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/AnnotationsParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.util.HashMap;
-import java.util.TreeSet;
-import java.util.List;
-import java.util.ArrayList;
-
-import java.io.IOException;
-import java.io.File;
-import java.io.LineNumberReader;
-import java.io.InputStreamReader;
-import java.io.FileInputStream;
-
-import java.math.BigDecimal;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.importer.ImportAnnotation;
-import de.intevation.flys.importer.ImportRange;
-import de.intevation.flys.importer.ImportEdge;
-import de.intevation.flys.importer.ImportAnnotationType;
-import de.intevation.flys.importer.ImportAttribute;
-import de.intevation.flys.importer.ImportPosition;
-
-public class AnnotationsParser
-{
-    private static Logger log = Logger.getLogger(AnnotationsParser.class);
-
-    public static final String ENCODING = "ISO-8859-1";
-
-    public static final String [] TO_SCAN = {
-        "Basisdaten",
-        "Streckendaten",
-        ".." + File.separator +
-            "Morphologie" + File.separator + "Streckendaten"
-    };
-
-    protected HashMap<String, ImportAttribute> attributes;
-    protected HashMap<String, ImportPosition>  positions;
-    protected TreeSet<ImportAnnotation>        annotations;
-    protected AnnotationClassifier             classifier;
-
-    public AnnotationsParser() {
-        this(null);
-    }
-
-    public AnnotationsParser(AnnotationClassifier classifier) {
-        attributes  = new HashMap<String, ImportAttribute>();
-        positions   = new HashMap<String, ImportPosition>();
-        annotations = new TreeSet<ImportAnnotation>();
-        this.classifier = classifier;
-    }
-
-    public void parseFile(File file) throws IOException {
-        log.info("parsing km file: '" + file + "'");
-
-        ImportAnnotationType defaultIAT = null;
-
-        if (classifier != null) {
-            defaultIAT = classifier.classifyFile(
-                file.getName(),
-                classifier.getDefaultType());
-        }
-
-        LineNumberReader in = null;
-        try {
-            in =
-                new LineNumberReader(
-                new InputStreamReader(
-                new FileInputStream(file), ENCODING));
-
-            String line = null;
-            while ((line = in.readLine()) != null) {
-                if ((line = line.trim()).length() == 0
-                || line.startsWith("*")) {
-                    continue;
-                }
-
-                String [] parts = line.split("\\s*;\\s*");
-
-                if (parts.length < 3) {
-                    log.warn("ANN: not enough columns in line "
-                        + in.getLineNumber());
-                    continue;
-                }
-
-                ImportPosition position = positions.get(parts[0]);
-                if (position == null) {
-                    position = new ImportPosition(parts[0]);
-                    positions.put(parts[0], position);
-                }
-
-                ImportAttribute attribute = attributes.get(parts[1]);
-                if (attribute == null) {
-                    attribute = new ImportAttribute(parts[1]);
-                    attributes.put(parts[1], attribute);
-                }
-
-                String [] r = parts[2].replace(",", ".").split("\\s*#\\s*");
-
-                BigDecimal from, to;
-
-                try {
-                    from = new BigDecimal(r[0]);
-                    to   = r.length < 2 ? null : new BigDecimal(r[1]);
-                    if (to != null && from.compareTo(to) > 0) {
-                        BigDecimal t = from; from = to; to = t;
-                    }
-                }
-                catch (NumberFormatException nfe) {
-                    log.warn("ANN: invalid number in line " + in.getLineNumber());
-                    continue;
-                }
-
-                ImportEdge edge = null;
-
-                if (parts.length == 4) { // Only 'Unterkante'
-                    try {
-                        edge = new ImportEdge(
-                            null,
-                            new BigDecimal(parts[3].trim().replace(',', '.')));
-                    }
-                    catch (NumberFormatException nfe) {
-                        log.warn("ANN: cannot parse 'Unterkante' in line " +
-                            in.getLineNumber());
-                    }
-                }
-                else if (parts.length > 4) { // 'Unterkante' and 'Oberkante'
-                    String bottom = parts[3].trim().replace(',', '.');
-                    String top    = parts[4].trim().replace(',', '.');
-                    try {
-                        BigDecimal b = bottom.length() == 0
-                            ? null
-                            : new BigDecimal(bottom);
-                        BigDecimal t = top.length() == 0
-                            ? null
-                            : new BigDecimal(top);
-                        edge = new ImportEdge(t, b);
-                    }
-                    catch (NumberFormatException nfe) {
-                        log.warn(
-                            "ANN: cannot parse 'Unterkante' or 'Oberkante' in line "
-                            + in.getLineNumber());
-                    }
-                }
-
-                ImportRange range = new ImportRange(from, to);
-
-                ImportAnnotationType type = classifier != null
-                    ? classifier.classifyDescription(line, defaultIAT)
-                    : null;
-
-                ImportAnnotation annotation = new ImportAnnotation(
-                    attribute, position, range, edge, type);
-
-                if (!annotations.add(annotation)) {
-                    log.info("ANN: duplicated annotation '" + parts[0] +
-                        "' in line " + in.getLineNumber());
-                }
-            }
-        }
-        finally {
-            if (in != null) {
-                in.close();
-            }
-        }
-    }
-
-    public void parse(File root) throws IOException {
-
-        for (String toScan: TO_SCAN) {
-            File directory = FileTools.repair(new File(root, toScan));
-            if (!directory.isDirectory()) {
-                log.warn("ANN: '" + directory + "' is not a directory.");
-                continue;
-            }
-            File [] files = directory.listFiles();
-            if (files == null) {
-                log.warn("ANN: cannot list directory '" + directory + "'");
-                continue;
-            }
-
-            for (File file: files) {
-                if (file.isFile() && file.canRead()
-                && file.getName().toLowerCase().endsWith(".km")) {
-                    parseFile(file);
-                }
-            }
-        } // for all directories to scan
-    }
-
-    public List<ImportAnnotation> getAnnotations() {
-        return new ArrayList<ImportAnnotation>(annotations);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/AtFileParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/AtFileParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.io.IOException;
-import java.math.BigDecimal;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportDischargeTable;
-import de.intevation.flys.importer.ImportDischargeTableValue;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-
-import java.util.Date;
-import java.util.Calendar;
-
-import de.intevation.flys.importer.ImportTimeInterval;
-
-/** Parse *.at (Abflusstafeln?) files. */
-public class AtFileParser {
-
-    public static final String ENCODING = "ISO-8859-1";
-
-    private static Logger logger = Logger.getLogger(AtFileParser.class);
-
-    // regular expression from hell to find out time range
-    public static final Pattern DATE_LINE = Pattern.compile(
-        "^\\*\\s*Abflu[^t]+tafel?\\s*([^\\d]+)"  +
-        "(\\d{1,2})?\\.?(\\d{1,2})?\\.?(\\d{2,4})\\s*(?:(?:bis)|-)?\\s*" +
-        "(?:(\\d{1,2})?\\.?(\\d{1,2})?\\.?(\\d{2,4}))?\\s*.*$");
-
-    public AtFileParser() {
-    }
-
-
-    public ImportDischargeTable parse(File file) throws IOException {
-        return parse(file, "", 0);
-    }
-
-    public ImportDischargeTable parse(
-        File   file,
-        String prefix,
-        int    kind
-    )
-    throws IOException {
-
-        logger.info("parsing AT file: " + file);
-
-        BufferedReader br = null;
-
-        String line       = null;
-
-        boolean beginning = true;
-
-        ImportDischargeTable dischargeTable =
-            new ImportDischargeTable(kind, prefix + file.getName());
-
-        Date from = null;
-        Date to   = null;
-
-        try {
-            br = new BufferedReader(
-                 new InputStreamReader(
-                 new FileInputStream(file), ENCODING));
-
-            while ((line = br.readLine()) != null) {
-
-                String tmp = line.trim();
-
-                if (tmp.length() == 0) {
-                    continue;
-                }
-
-                Matcher m = DATE_LINE.matcher(tmp);
-                if (m.matches()) {
-                    from = guessDate(m.group(2), m.group(3), m.group(4));
-                    to   = guessDate(m.group(5), m.group(6), m.group(7));
-                    if (from == null) {
-                        Date t = from; from = to; to = t;
-                    }
-                    continue;
-                }
-
-                if (tmp.startsWith("#! name=")) {
-                    // XXX Skip the name,  because we don't know where to save
-                    // it at the moment
-
-                    //String name = tmp.substring(8);
-                    continue;
-                }
-
-                if (tmp.startsWith("#") || tmp.startsWith("*")) {
-                    continue;
-                }
-
-                String[] splits = tmp.replace(',', '.').split("\\s+");
-
-                if ((splits.length < 2) || (splits.length > 11)) {
-                    logger.warn("Found an invalid row in the AT file.");
-                    continue;
-                }
-
-                String strW = splits[0].trim();
-                double W    = Double.parseDouble(strW);
-
-                /* shift is used to differenciate between lines with
-                 * exactly 10 Qs and lines with less than 10 Qs. The shift
-                 * is only modified when it is the first line.
-                 */
-                int shift = -1;
-
-                if (splits.length != 11 && beginning) {
-                    shift = 10 - splits.length;
-                }
-
-
-                for (int i = 1; i < splits.length; i++) {
-                    double iW = W + shift + i;
-                    double iQ = Double.parseDouble(splits[i].trim());
-
-                    dischargeTable.addDischargeTableValue(
-                        new ImportDischargeTableValue(
-                            new BigDecimal(iQ/100.0),
-                            new BigDecimal(iW/100.0)));
-                }
-
-                beginning = false;
-            }
-        }
-        catch (NumberFormatException pe) {
-            logger.warn("AT: invalid number " + pe.getMessage());
-        }
-        finally {
-            if (br != null) {
-                br.close();
-            }
-        }
-
-        if (from != null) {
-            if (to != null && from.compareTo(to) > 0) {
-                Date t = from; from = to; to = t;
-            }
-            logger.info("from: " + from + " to: " + to);
-            ImportTimeInterval interval = new ImportTimeInterval(from, to);
-            dischargeTable.setTimeInterval(interval);
-        }
-
-        logger.info("Finished parsing AT file: " + file);
-
-        return dischargeTable;
-    }
-
-    public static Date guessDate(String day, String month, String year) {
-        // TODO evaluate whether DateGuesser class can do that.
-        if (day == null && month == null && year == null) {
-            return null;
-        }
-
-        logger.debug("day: " + day + " month: " + month + " year: " + year);
-
-        int dayI = 15;
-        if (day != null) {
-            try {
-                dayI = Integer.parseInt(day.trim());
-            }
-            catch (NumberFormatException nfe) {
-            }
-        }
-
-        int monthI = 6;
-        if (month != null) {
-            try {
-                monthI = Integer.parseInt(month.trim());
-            }
-            catch (NumberFormatException nfe) {
-            }
-        }
-
-        int yearI = 1900;
-        if (year != null) {
-            try {
-                yearI = Integer.parseInt(year.trim());
-                if (yearI < 100) {
-                    if (yearI < 20) {
-                        yearI += 2000;
-                    }
-                    else {
-                        yearI += 1900;
-                    }
-                }
-            }
-            catch (NumberFormatException nfe) {
-            }
-        }
-
-        Calendar cal = Calendar.getInstance();
-        cal.set(yearI, monthI-1, dayI, 12, 0, 0);
-        long ms = cal.getTimeInMillis();
-        cal.setTimeInMillis(ms - ms%1000);
-        return cal.getTime();
-    }
-
-
-    /** Parse one or more files, (useful for debugging), */
-    public static void main(String [] args) {
-
-        AtFileParser parser = new AtFileParser();
-
-        try {
-            for (String arg: args) {
-                parser.parse(new File(arg));
-            }
-        } catch(Exception e) {
-            logger.error("Exception caught " + e);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/BedHeightEpochParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/BedHeightEpochParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.math.BigDecimal;
-
-import java.text.ParseException;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportBedHeight;
-import de.intevation.flys.importer.ImportBedHeightEpoch;
-import de.intevation.flys.importer.ImportBedHeightEpochValue;
-
-
-/** Parses BedHeightEpochs from csv file. */
-public class BedHeightEpochParser extends BedHeightParser {
-
-    /** Our own logger. */
-    private static final Logger log =
-        Logger.getLogger(BedHeightEpochParser.class);
-
-
-    @Override
-    protected ImportBedHeight newImportBedHeight(String description) {
-        return new ImportBedHeightEpoch(description);
-    }
-
-
-    /**
-     * Handle a non-comment, none-Metadata line of csv file, adding
-     * ImportBedHeightEpochValues to the given ImportBedHeight object.
-     */
-    @Override
-    protected void handleDataLine(ImportBedHeight obj, String line) {
-        String[] values = line.split(SEPERATOR_CHAR);
-
-        if (values == null || values.length == 0 || values[0].length() == 0) {
-            // There might be quite some ";" found.
-            //log.warn("Skip invalid data line: " + line);
-            return;
-        }
-
-        BigDecimal km;
-
-        try {
-            km = new BigDecimal(nf.parse(values[0]).doubleValue());
-        }
-        catch (ParseException e) {
-            log.warn("Unparseable number in data row: " + line);
-            return;
-        }
-
-
-        // Handle "gap" lines like '255,0;'
-        if (values.length < 2) {
-            ImportBedHeightEpochValue value = new ImportBedHeightEpochValue(
-                km,
-                null
-            );
-
-            obj.addValue(value);
-            return;
-        }
-
-        try {
-            ImportBedHeightEpochValue value = new ImportBedHeightEpochValue(
-                km,
-                new BigDecimal(nf.parse(values[1]).doubleValue())
-            );
-
-            obj.addValue(value);
-        }
-        catch (ParseException e) {
-            log.warn("Unparseable number in data row: " + line);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/BedHeightParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/BedHeightParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,411 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-
-import java.math.BigDecimal;
-
-import java.text.NumberFormat;
-import java.text.ParseException;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import java.io.IOException;
-import java.io.LineNumberReader;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportBedHeight;
-import de.intevation.flys.importer.ImportBedHeightType;
-import de.intevation.flys.importer.ImportElevationModel;
-import de.intevation.flys.importer.ImportLocationSystem;
-import de.intevation.flys.importer.ImportRange;
-import de.intevation.flys.importer.ImportTimeInterval;
-import de.intevation.flys.importer.ImportUnit;
-import de.intevation.flys.model.BedHeightType;
-import de.intevation.flys.importer.ImporterSession;
-
-public abstract class BedHeightParser {
-
-    private static final Logger log =
-        Logger.getLogger(BedHeightParser.class);
-
-    public static final String ENCODING = "ISO-8859-1";
-
-    public static final Locale DEFAULT_LOCALE = Locale.GERMAN;
-
-    public static final String START_META_CHAR = "#";
-    public static final String SEPERATOR_CHAR  = ";";
-
-    public static final Pattern META_YEAR =
-        Pattern.compile("^Jahr: [^0-9]*(\\d*).*");
-
-    public static final Pattern META_TIMEINTERVAL =
-        Pattern.compile("^Zeitraum: Epoche (\\d*)-(\\d*).*");
-
-    public static final Pattern META_TYPE =
-        Pattern.compile("^Aufnahmeart: (.*).*");
-
-    public static final Pattern META_LOCATION_SYSTEM =
-        Pattern.compile("^Lagesystem: (.*).*");
-
-    public static final Pattern META_CUR_ELEVATION_SYSTEM =
-        Pattern.compile("^H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*");
-
-    public static final Pattern META_OLD_ELEVATION_SYSTEM =
-        Pattern.compile("^urspr.ngliches H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*");
-
-    public static final Pattern META_SOUNDING_WIDTH =
-        Pattern.compile("^ausgewertete Peilbreite: (\\d*).*");
-
-    public static final Pattern META_RANGE =
-        Pattern.compile("^Strecke:\\D*(\\d++.?\\d*) ?- ?(\\d++.?\\d*).*");
-
-    public static final Pattern META_EVALUATION_BY =
-        Pattern.compile("^Auswerter: (.*).*");
-
-    public static final Pattern META_COMMENTS =
-        Pattern.compile("^Weitere Bemerkungen: (.*).*");
-
-
-    protected static NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
-
-
-    protected List<ImportBedHeight> bedHeights;
-
-
-    protected abstract ImportBedHeight newImportBedHeight(String description);
-
-    /** Handle a line of file that contains data (in contrast to comments, meta). */
-    protected abstract void handleDataLine(
-        ImportBedHeight importBedHeight,
-        String          line
-    );
-
-
-
-    public BedHeightParser() {
-        this.bedHeights = new ArrayList<ImportBedHeight>();
-    }
-
-
-    public List<ImportBedHeight> getBedHeights() {
-        return bedHeights;
-    }
-
-
-    public void parse(File file) throws IOException {
-        log.info("Parsing bed height single file '" + file + "'");
-
-        ImportBedHeight obj = newImportBedHeight(file.getName());
-
-        LineNumberReader in = null;
-        try {
-            in =
-                new LineNumberReader(
-                new InputStreamReader(
-                new FileInputStream(file), ENCODING));
-
-            String line = null;
-            while ((line = in.readLine()) != null) {
-                if ((line = line.trim()).length() == 0) {
-                    continue;
-                }
-
-                if (line.startsWith(START_META_CHAR)) {
-                    handleMetaLine(obj, line);
-                }
-                else {
-                    handleDataLine(obj, line);
-                }
-            }
-
-            log.info("File contained " + obj.getValueCount() + " values.");
-            bedHeights.add(obj);
-        }
-        finally {
-            if (in != null) {
-                in.close();
-            }
-        }
-    }
-
-
-    protected static String stripMetaLine(String line) {
-        String tmp = line.substring(1, line.length());
-
-        if (tmp.startsWith(" ")) {
-            return tmp.substring(1, tmp.length());
-        }
-        else {
-            return tmp;
-        }
-    }
-
-
-    public static Date getDateFromYear(int year) {
-        Calendar cal = Calendar.getInstance();
-        cal.set(year, 0, 1);
-
-        return cal.getTime();
-    }
-
-
-    protected void handleMetaLine(ImportBedHeight obj, String line) {
-        String meta = stripMetaLine(line);
-
-        if (handleMetaYear(obj, meta)) {
-            return;
-        }
-        else if (handleMetaTimeInterval(obj, meta)) {
-            return;
-        }
-        else if (handleMetaSoundingWidth(obj, meta)) {
-            return;
-        }
-        else if (handleMetaComment(obj, meta)) {
-            return;
-        }
-        else if (handleMetaEvaluationBy(obj, meta)) {
-            return;
-        }
-        else if (handleMetaRange(obj, meta)) {
-            return;
-        }
-        else if (handleMetaType(obj, meta)) {
-            return;
-        }
-        else if (handleMetaLocationSystem(obj, meta)) {
-            return;
-        }
-        else if (handleMetaCurElevationModel(obj, meta)) {
-            return;
-        }
-        else if (handleMetaOldElevationModel(obj, meta)) {
-            return;
-        }
-        else {
-            log.warn("BHP: Meta line did not match any known type: " + line);
-        }
-    }
-
-
-    protected boolean handleMetaYear(ImportBedHeight obj, String line) {
-        Matcher m = META_YEAR.matcher(line);
-
-        if (m.matches()) {
-            String tmp = m.group(1);
-            if (tmp.length() > 0) {
-                obj.setYear(Integer.parseInt(tmp));
-            }
-            else {
-                log.warn("BHP: No year given.");
-            }
-            return true;
-        }
-
-        return false;
-    }
-
-
-    protected boolean handleMetaTimeInterval(ImportBedHeight obj, String line) {
-        Matcher m = META_TIMEINTERVAL.matcher(line);
-
-        if (m.matches()) {
-            String lo = m.group(1);
-            String up = m.group(2);
-
-            log.debug("Found time interval: " + lo + " - " + up);
-
-            try {
-                int lower = Integer.valueOf(lo);
-                int upper = Integer.valueOf(up);
-
-                Date fromYear = getDateFromYear(lower);
-                Date toYear   = getDateFromYear(upper);
-
-                obj.setTimeInterval(new ImportTimeInterval(fromYear, toYear));
-            }
-            catch (NumberFormatException e) {
-                log.warn("BHP: could not parse timeinterval", e);
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    protected boolean handleMetaSoundingWidth(ImportBedHeight obj, String line) {
-        Matcher m = META_SOUNDING_WIDTH.matcher(line);
-
-        if (m.matches()) {
-            String tmp = m.group(1);
-
-            try {
-                obj.setSoundingWidth(Integer.valueOf(tmp));
-                return true;
-            }
-            catch (NumberFormatException e) {
-                log.warn("BHP: Could not parse sounding width: " + line, e);
-                log.warn("-> Set default value '0'");
-            }
-            obj.setSoundingWidth(0);
-        }
-
-        return false;
-    }
-
-
-    protected boolean handleMetaComment(ImportBedHeight obj, String line) {
-        Matcher m = META_COMMENTS.matcher(line);
-
-        if (m.matches()) {
-            String tmp = m.group(1);
-
-            obj.setDescription(tmp);
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    protected boolean handleMetaEvaluationBy(
-        ImportBedHeight obj,
-        String                line
-    ) {
-        Matcher m = META_EVALUATION_BY.matcher(line);
-
-        if (m.matches()) {
-            String tmp = m.group(1);
-            tmp = tmp.replace(";", "");
-
-            obj.setEvaluationBy(tmp);
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    protected boolean handleMetaRange(ImportBedHeight obj, String line) {
-        Matcher m = META_RANGE.matcher(line);
-
-        if (m.matches() && m.groupCount() >= 2) {
-            String a = m.group(1).replace(";", "");
-            String b = m.group(2).replace(";", "");
-
-            try {
-                BigDecimal lower = new BigDecimal(nf.parse(a).doubleValue());
-                BigDecimal upper = new BigDecimal(nf.parse(b).doubleValue());
-
-                obj.setRange(new ImportRange(lower, upper));
-
-                return true;
-            }
-            catch (ParseException e) {
-                log.warn("BHP: could not parse range", e);
-            }
-        }
-
-        return false;
-    }
-
-
-    protected boolean handleMetaType(ImportBedHeight obj, String line) {
-        Matcher m = META_TYPE.matcher(line);
-
-        if (m.matches()) {
-            String tmp = m.group(1).replace(";", "");
-
-            BedHeightType bht = BedHeightType.fetchBedHeightTypeForType(
-		tmp, ImporterSession.getInstance().getDatabaseSession());
-
-            if (bht != null) {
-                obj.setType(new ImportBedHeightType(bht));
-                return true;
-            }
-
-            log.warn("Unknown bed height type: '" + tmp + "'");
-        }
-
-        return false;
-    }
-
-
-    protected boolean handleMetaLocationSystem(
-        ImportBedHeight obj,
-        String          line
-    ) {
-        Matcher m = META_LOCATION_SYSTEM.matcher(line);
-
-        if (m.matches()) {
-            String tmp = m.group(1).replace(";", "");
-
-            obj.setLocationSystem(new ImportLocationSystem(tmp, tmp));
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    protected boolean handleMetaCurElevationModel(
-        ImportBedHeight obj,
-        String          line
-    ) {
-        Matcher m = META_CUR_ELEVATION_SYSTEM.matcher(line);
-
-        if (m.matches()) {
-            String name = m.group(1);
-            String num  = m.group(2);
-            String unit = m.group(3);
-
-            obj.setCurElevationModel(new ImportElevationModel(
-                name + " " + num,
-                new ImportUnit(unit)
-            ));
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    protected boolean handleMetaOldElevationModel(
-        ImportBedHeight obj,
-        String          line
-    ) {
-        Matcher m = META_OLD_ELEVATION_SYSTEM.matcher(line);
-
-        if (m.matches()) {
-            String name = m.group(1);
-            String num  = m.group(2);
-            String unit = m.group(3);
-
-            obj.setOldElevationModel(new ImportElevationModel(
-                name + " " + num,
-                new ImportUnit(unit)
-            ));
-
-            return true;
-        }
-
-        return false;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/BedHeightSingleParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/BedHeightSingleParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.math.BigDecimal;
-
-import java.text.ParseException;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportBedHeight;
-import de.intevation.flys.importer.ImportBedHeightSingle;
-import de.intevation.flys.importer.ImportBedHeightSingleValue;
-
-
-public class BedHeightSingleParser extends BedHeightParser {
-
-    private static final Logger log =
-        Logger.getLogger(BedHeightSingleParser.class);
-
-
-
-    @Override
-    protected ImportBedHeight newImportBedHeight(String description) {
-        return new ImportBedHeightSingle(description);
-    }
-
-
-
-    /**
-     * Create ImportBedHeightSingleValue from a line of csv file, add
-     * it to the ImportBedHeight.
-     */
-    @Override
-    protected void handleDataLine(ImportBedHeight obj, String line) {
-        String[] values = line.split(SEPERATOR_CHAR);
-
-        if (values == null || (values.length != 1 && values.length < 6)) {
-            //log.warn("BSP: Error while parsing data line: '" + line + "'");
-            return;
-        }
-
-        BigDecimal km;
-
-        try {
-            km = new BigDecimal(nf.parse(values[0]).doubleValue());
-        }
-        catch (ParseException e) {
-            // We expect a lot of ";;;;;;" lines.
-            //log.warn("BSP: Error while parsing km of data row.", e);
-            return;
-        }
-
-        // Handle gaps like "10,0;;;;;".
-        if (values.length == 1) {
-            ImportBedHeightSingleValue value = new ImportBedHeightSingleValue(
-                (ImportBedHeightSingle) obj,
-                km,
-                null, null, null, null, null);
-            obj.addValue(value);
-            return;
-        }
-
-        // Because we cannot enforce consistency of values with complete data
-        // via null constraints in the database (as there are "gap" values),
-        // do this checks manually.
-        if (values[3].length() == 0 || values[4].length() == 0
-            || values[5].length() == 0) {
-            //log.warn("BSP: Error while parsing data row (manual null constraint violated).");
-            return;
-        }
-
-        try {
-            ImportBedHeightSingleValue value = new ImportBedHeightSingleValue(
-                (ImportBedHeightSingle) obj,
-                km,
-                new BigDecimal(nf.parse(values[1]).doubleValue()),
-                new BigDecimal(nf.parse(values[2]).doubleValue()),
-                new BigDecimal(nf.parse(values[3]).doubleValue()),
-                parseBigDecimal(values[4], line),
-                new BigDecimal(nf.parse(values[5]).doubleValue())
-            );
-
-            obj.addValue(value);
-        }
-        catch (ParseException e) {
-            log.warn("BSP: unparseable value in data row.", e);
-        }
-    }
-    
-    private BigDecimal parseBigDecimal(String value, String line) {
-        BigDecimal result = null;
-        try {
-            Double dValue = Double.valueOf(value.replace(",", "."));
-            result = new BigDecimal(dValue.doubleValue());
-        }
-        catch (NumberFormatException nfe) {
-            log.warn(
-                "Could not parse " +
-                value +
-                " in bed heigt single row: "
-                + line);
-        }
-        return result;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/BundesWasserStrassenParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/BundesWasserStrassenParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.util.HashMap;
-
-import org.apache.log4j.Logger;
-
-/** Parse CSV file that contains official numbers for rivers. */
-public class BundesWasserStrassenParser extends LineParser {
-
-    /** Private logger. */
-    private static final Logger logger =
-        Logger.getLogger(BundesWasserStrassenParser.class);
-
-    /** Map from rivernames to Official numbers. */
-    private HashMap<String,Long> numberMap;
-
-
-    public BundesWasserStrassenParser() {
-        numberMap = new HashMap<String,Long>();
-    }
-
-
-    /** No need to reset. */
-    @Override
-    protected void reset() {
-    }
-
-
-    /** No action needed on eof. */
-    @Override
-    protected void finish() {
-    }
-
-
-    /** Handle a line of the bwastr-id file. */
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        String[] vals = line.split(",");
-        // Try both "," and ";" as separator.
-        if (vals.length != 2) {
-            vals = line.split(";");
-            if (vals.length != 2) {
-                logger.warn("Invalid bwastr-id line:\n" + line);
-                return;
-            }
-        }
-        try {
-            String name = unwrap(vals[0].toLowerCase());
-            String numberStr = unwrap(vals[1]);
-            Long number = Long.valueOf(numberStr);
-            numberMap.put(name, number);
-        }
-        catch (NumberFormatException e) {
-            logger.warn("Invalid number in bwastr-id line:\n" + line);
-        }
-    }
-
-
-    /** Get river -> official number mapping. */
-    public HashMap<String,Long> getMap() {
-        return numberMap;
-    }
-
-
-    /** Remove leading and trailing quotes. */
-    protected String unwrap(String input) {
-        if (input.startsWith("\"")) {
-            input = input.substring(1);
-        }
-        if (input.endsWith("\"")) {
-            input = input.substring(0, input.length() - 1);
-        }
-        return input;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/CrossSectionParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/CrossSectionParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import de.intevation.flys.importer.XY;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-
-public interface CrossSectionParser {
-
-    public String getDescription();
-
-    public Integer getYear();
-
-    public Map<Double,List<XY>> getData();
-
-    public interface Callback {
-        boolean accept(File file);
-        void    parsed(CrossSectionParser parser);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/DA50Parser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/DA50Parser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.List;
-import java.util.TreeMap;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.XY;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.utils.EpsilonComparator;
-
-
-/**
- * To create cross-sections, generate: Map<double,list<xy>> from files
- * in da50 format.
- */
-public class DA50Parser extends LineParser implements CrossSectionParser
-{
-    /** Private logger. */
-    private static Logger logger = Logger.getLogger(DA50Parser.class);
-
-    /** The current line to which add points. */
-    private List<XY> currentLine;
-
-    /** Data collected so far, last element will be currentLine. */
-    protected Map<Double, List<XY>> data;
-
-
-    /** Trivial constructor. */
-    public DA50Parser() {
-        data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP);
-    }
-
-
-    /** Get the description of the cross section parsed. */
-    @Override
-    public String getDescription() {
-        return FileTools.removeExtension(getFileName());
-    }
-
-
-    /** Get the year of this cross sections measurement. */
-    @Override
-    public Integer getYear() {
-        return null;
-    }
-
-
-    /**
-     * Return the data parsed.
-     * @return map of stations (km) to list of points.
-     */
-    @Override
-    public Map<Double, List<XY>> getData() {
-        return data;
-    }
-
-
-    /** Walk a directory tree and attempt parsing all *.d50 files. */
-    public void parseDA50s(File root, final Callback callback) {
-
-        FileTools.walkTree(root, new FileTools.FileVisitor() {
-            @Override
-            public boolean visit(File file) {
-                // TODO check presence of TIM file.
-                if (file.isFile() && file.canRead()
-                && file.getName().toLowerCase().endsWith(".d50")
-                && (callback == null || callback.accept(file))) {
-                    reset();
-                    try {
-                        parse(file);
-                        logger.info("parsing done");
-                        if (callback != null) {
-                            callback.parsed(DA50Parser.this);
-                        }
-                    }
-                    catch (IOException ioe) {
-                        logger.error("IOException while parsing file");
-                        return false;
-                    }
-                }
-                return true;
-            }
-        });
-    }
-
-
-    /** Called before consuming first line of file. */
-    public void reset() {
-        data.clear();
-        currentLine = new ArrayList<XY>();
-    }
-
-
-    /**
-     * Called for each line. Try to extract info from a da50 line.
-     */
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        String pointId  = line.substring(0,2);
-        String streetId = line.substring(2,9);
-        String station  = line.substring(9,18);
-        String free     = line.substring(18,20);
-        String gkLRight = line.substring(20,30);
-        String gkLHigh  = line.substring(30,40);
-        String gkRRight = line.substring(40,50);
-        String gkRHigh  = line.substring(50,60);
-        String distance = line.substring(60,70);
-
-        // TODO Intersect/Correlate these with e.g. TIM files.
-        // TODO note that as-is these points are really useless.
-        currentLine = new ArrayList<XY>();
-        currentLine.add(new XY(0, 10,0));
-        currentLine.add(new XY(Double.parseDouble(distance), 10, 1));
-    }
-
-
-    /** Called when file is fully consumed. */
-    @Override
-    protected void finish() {
-        logger.info("Parsed " + data.size() + " lines");
-    }
-
-
-    /** Parses files given as arguments. */
-    public static void main(String [] args) {
-
-        DA50Parser parser = new DA50Parser();
-
-        logger.warn("Start parsing files.");
-        for (String arg: args) {
-            parser.parseDA50s(new File(arg), null);
-            logger.warn("Parsing a file.");
-        }
-        logger.error("Finished parsing files.");
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/DA66Parser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/DA66Parser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,459 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.importer.XY;
-
-import de.intevation.flys.utils.EpsilonComparator;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.log4j.Logger;
-
-
-/**
- * To create cross-sections, generate: Map<double,list<xy>> from files
- * in da66 format.
- */
-public class DA66Parser extends LineParser implements CrossSectionParser
-{
-    /** Private logger. */
-    private static Logger logger = Logger.getLogger(DA66Parser.class);
-
-    private static String HEAD_HEAD = "00";
-    private static String HEAD_GEOM = "66"; // "Values"
-    private static String HEAD_ENDG = "88"; // Probably never used.
-
-    /** Regex to match lines of files in da66 format. */
-    private static final Pattern LINE_PATTERN =
-        Pattern.compile("^([0-9 -]{2})" + // Type (00|66|88)
-                        "([0-9 -]{5})" + // unset
-                        "([0-9 -]{2})" + // id
-                        "([0-9 -]{9})" + // station
-                        "([0-9 -]{2})" + // running number
-                        "([0-9 -]{1})?" + // point id
-                        /*
-                        Would be great if we could express the pattern as this:
-                        ([0-9 -]{1})([0-9 -JKMLMNOPQR]{7})([0-9 -]{7})+
-                        */
-                        "([0-9 -JKMLMNOPQR]{7})?" + // y
-                        "([0-9 -]{7})?" + // z
-                        "([0-9 -]{1})?" + // point id
-                        "([0-9 -JKMLMNOPQR]{7})?" + // y
-                        "([0-9 -]{7})?" + // z
-                        "([0-9 -]{1})?" + // point id
-                        "([0-9 -JKMLMNOPQR]{7})?" + // y
-                        "([0-9 -]{7})?" + // z
-                        "([0-9 -]{1})?" + // point id
-                        "([0-9 -JKMLMNOPQR]{7})?" + // y
-                        "([0-9 -]{7})?" // z
-                        );
-
-
-    /** Indices to match group of main regex. */
-    private static enum FIELD {
-        HEAD      ( 1),
-        UNSET     ( 2),
-        ID        ( 3),
-        STATION   ( 4),
-        RUNNR     ( 5),
-        POINT_1_ID( 6),
-        POINT_1_Y ( 7),
-        POINT_1_Z ( 8),
-        POINT_2_ID( 9),
-        POINT_2_Y (10),
-        POINT_2_Z (11),
-        POINT_3_ID(12),
-        POINT_3_Y (13),
-        POINT_3_Z (14),
-        POINT_4_ID(15),
-        POINT_4_Y (16),
-        POINT_4_Z (17);
-
-        private int idx;
-        FIELD(int idx) {
-            this.idx = idx;
-        }
-        int getIdx() {
-            return idx;
-        }
-    }
-
-
-    /** Header lines of da66 can define a type. */
-    private static enum Type {
-        DATE                     ( 0),
-        HEKTOSTONE_LEFT          ( 1), //grm. "Standlinie"
-        HEKTOSTONE_RIGHT         ( 2),
-        CHANNEL_LEFT             ( 3), //grm. "Fahrrinne"
-        CHANNEL_RIGHT            ( 4),
-        CHANNEL_2_LEFT           ( 5),
-        CHANNEL_2_RIGHT          ( 6),
-        GIW_1972                 ( 7),
-        GROIN_DIST_LEFT          ( 8), //grm. "Buhnenkopfabstand links"
-        GROIN_HEIGHT_LEFT        ( 9),
-        GROIN_SLOPE_LEFT         (10),
-        GROIN_DIST_RIGHT         (11),
-        GROIN_HEIGHT_RIGHT       (12),
-        GROIN_SLOPE_RIGHT        (13),
-        STRIKE_LEFT              (14), //grm. "Streichlinie links"
-        AXIS                     (15),
-        STRIKE_RIGHT             (16),
-        GROIN_BACK_SLOPE_LEFT    (17), //grm. "Buhnenrueckenneigung"
-        GROIN_BACK_SLOPE_RIGHT   (18),
-        GIW_1932                 (19),
-        GIW_1982                 (20),
-        STAND_ISLAND_1           (21),
-        STAND_ISLAND_2           (22),
-        STAND_ISLAND_3           (23),
-        STAND_ISLAND_4           (24),
-        UNSPECIFIED_1            (25),
-        UNSPECIFIED_2            (26),
-        HHW                      (27),
-        OLD_PROFILE_NULL         (28),
-        AW_1978                  (29),
-        SIGN_LEFT                (30),
-        SIGN_RIGHT               (31),
-        DIST_SIGNAL_CHANNEL_LEFT (32),
-        DIST_SIGNAL_CHANNEL_RIGHT(33),
-        UNSPECIFIED_3            (34),
-        UNSPECIFIED_4            (35),
-        UNSPECIFIED_5            (36),
-        UNSPECIFIED_6            (37),
-        SHORE_LEFT               (38),
-        SHORE_RIGHT              (39),
-        UNSPECIFIED_7            (40);
-
-        private final int id;
-        Type(int id) {
-            this.id = id;
-        }
-        public int getId() {
-            return id;
-        }
-    }
-
-
-    /** Available types. */
-    private static HashMap<Integer, Type> typeMap;
-
-
-    /** Types we can deal with. */
-    private static List<Type> implementedTypes;
-
-
-    static {
-        typeMap = new HashMap<Integer, Type>();
-        for (Type t: Type.values()) {
-            typeMap.put(new Integer(t.getId()), t);
-        }
-        // TODO populate and respect header type.
-        implementedTypes = new ArrayList<Type>();
-        //implementedTypes.add(..);
-    }
-
-
-    /** The current line to which add points. */
-    private List<XY> currentLine;
-
-
-    /** Data collected so far, last element will be currentLine. */
-    protected Map<Double, List<XY>> data;
-
-
-    /** Trivial constructor. */
-    public DA66Parser() {
-        data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP);
-    }
-
-
-    /** Get the description of the cross section parsed. */
-    @Override
-    public String getDescription() {
-        return FileTools.removeExtension(getFileName());
-    }
-
-
-    /** Get the year of this cross sections measurement. */
-    @Override
-    public Integer getYear() {
-        return null;
-    }
-
-
-    /**
-     * Return the data parsed.
-     * @return map of stations (km) to list of points.
-     */
-    @Override
-    public Map<Double, List<XY>> getData() {
-        return data;
-    }
-
-
-    /**
-     * Walk a directory tree, parse its *.da66 files and store the
-     * data found.
-     */
-    public void parseDA66s(File root, final Callback callback) {
-
-        FileTools.walkTree(root, new FileTools.FileVisitor() {
-            @Override
-            public boolean visit(File file) {
-                if (file.isFile() && file.canRead()
-                && file.getName().toLowerCase().endsWith(".d66")
-                && (callback == null || callback.accept(file))) {
-                    reset();
-                    try {
-                        parse(file);
-                        logger.info("parsing done");
-                        if (callback != null) {
-                            callback.parsed(DA66Parser.this);
-                        }
-                    }
-                    catch (IOException ioe) {
-                        logger.error("IOException while parsing file");
-                        return false;
-                    }
-                }
-                return true;
-            }
-        });
-    }
-
-
-    /**
-     * Get the Index of the last cross-section lines point.
-     * @return last points index, -1 if not available.
-     */
-    private int lastPointIdx() {
-        if (currentLine == null || currentLine.isEmpty()) {
-            return -1;
-        }
-        XY lastPoint = this.currentLine.get(currentLine.size()-1);
-        return lastPoint.getIndex();
-    }
-
-
-    /** Returns station, deciding if it could in cm, in which case convert. */
-    private double stationInKm(double station) {
-        if (station > 10000) {
-            return station/100000d;
-        }
-        else {
-            return station;
-        }
-    }
-
-
-    /** Apply the convention how to deal with numbers < -99.999 .*/
-    private String applyLetterConvention(String orig) {
-        if (orig.endsWith("-")) {
-            return "-" + orig.replace("-","");
-        }
-        else if (orig.endsWith("J")) {
-            return "-" + orig.replace("J","1");
-        }
-        else if (orig.endsWith("K")) {
-            return "-" + orig.replace("K","2");
-        }
-        else if (orig.endsWith("L")) {
-            return "-" + orig.replace("L","3");
-        }
-        else if (orig.endsWith("M")) {
-            return "-" + orig.replace("M","4");
-        }
-        else if (orig.endsWith("N")) {
-            return "-" + orig.replace("N","5");
-        }
-        else if (orig.endsWith("O")) {
-            return "-" + orig.replace("O","6");
-        }
-        else if (orig.endsWith("P")) {
-            return "-" + orig.replace("P","7");
-        }
-        else if (orig.endsWith("Q")) {
-            return "-" + orig.replace("Q","8");
-        }
-        else if (orig.endsWith("R")) {
-            return "-" + orig.replace("R","9");
-        }
-        else {
-            return orig;
-        }
-    }
-
-    /**
-     * Add a Point (YZ,Index) to the current cross section line.
-     * @param y The y coordinate of new point.
-     * @param z The z coordinate of new point.
-     * @param idx Ignored, the parameter of new point.
-     * @return true if point could been added, false otherwise (e.g. not
-     *         parsable y or z values.
-     */
-    private boolean addPoint(String y, String z, String idx) {
-        if (z == null || y == null || idx == null) {
-            logger.error("Incomplete point definition");
-            return false;
-        }
-
-        double iy;
-        double iz;
-        // Handle letter convention.
-        y = applyLetterConvention(y);
-        try {
-            iy = Double.parseDouble(y) / 1000d;
-            iz = Double.parseDouble(z) / 1000d;
-        }
-        catch(java.lang.NumberFormatException nfe) {
-            logger.error("Could not parse Number: " + nfe.getMessage());
-            return false;
-        }
-
-        // We ignore idx, and increment instead.
-        int index;
-        int lastPointIdx = lastPointIdx();
-        if (lastPointIdx <= 0) {
-            index = 1;
-        } else {
-            index = lastPointIdx + 1;
-        }
-
-        currentLine.add(new XY(iy, iz, index));
-        return true;
-    }
-
-
-    /** Called before consuming first line of file. */
-    public void reset() {
-        data.clear();
-        currentLine = new ArrayList<XY>();
-    }
-
-
-    /**
-     * Called for each line. Try to extract info from a da66 line.
-     */
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        String head = line.substring(0,2);
-        if (HEAD_HEAD.equals(head)) {
-                //logger.debug("New station");
-                Matcher m = LINE_PATTERN.matcher(line);
-                if (m.find()) {
-                    // Actually matches!
-                    // TODO 'move' last line to match river axis
-                    // TODO find river axis intersection
-                    currentLine = new ArrayList<XY>();
-                    double station = stationInKm(Double.parseDouble(m.group(FIELD.STATION.getIdx())));
-                    data.put(station, currentLine);
-                }
-                else {
-                    logger.error("HEAD line bad.");
-                }
-        }
-        else if (HEAD_GEOM.equals(head)) {
-            Matcher m = LINE_PATTERN.matcher(line);
-            if (m.find()) {
-                //logger.info("Station: " + m.group(FIELD.STATION.getIdx()));
-                // TODO if last station differs, error and abort
-                if (m.group(FIELD.POINT_1_ID.getIdx()) != null) {
-                    // Point 1
-                    if(addPoint(
-                        m.group(FIELD.POINT_1_Y.getIdx()),
-                        m.group(FIELD.POINT_1_Z.getIdx()),
-                        m.group(FIELD.POINT_1_ID.getIdx()))) {
-                        // Point added.
-                    }
-                    else {
-                        // Problematic point.
-                        logger.error("A point could not be added");
-                    }
-                }
-                if (m.group(FIELD.POINT_2_ID.getIdx()) != null) {
-                    // Point 2
-                    if(addPoint(
-                        m.group(FIELD.POINT_2_Y.getIdx()),
-                        m.group(FIELD.POINT_2_Z.getIdx()),
-                        m.group(FIELD.POINT_2_ID.getIdx()))) {
-                        // Point added.
-                    }
-                    else {
-                        // Problematic point.
-                        logger.error("A point could not be added");
-                    }
-                }
-                if (m.group(FIELD.POINT_3_ID.getIdx()) != null) {
-                    // Point 3
-                    if(addPoint(
-                        m.group(FIELD.POINT_3_Y.getIdx()),
-                        m.group(FIELD.POINT_3_Z.getIdx()),
-                        m.group(FIELD.POINT_3_ID.getIdx()))) {
-                        // Point added.
-                    }
-                    else {
-                        // Problematic point.
-                        logger.error("A point could not be added");
-                    }
-                }
-                if (m.group(FIELD.POINT_4_ID.getIdx()) != null) {
-                    // Point 4
-                    if(addPoint(
-                        m.group(FIELD.POINT_4_Y.getIdx()),
-                        m.group(FIELD.POINT_4_Z.getIdx()),
-                        m.group(FIELD.POINT_4_ID.getIdx()))) {
-                        // Point added.
-                    }
-                    else {
-                        // Problematic point.
-                        logger.error("A point could not be added");
-                    }
-                }
-            }
-            else {
-                logger.warn("Line could not be parsed: ");
-                logger.warn(line);
-            }
-        }
-        else if (HEAD_GEOM.equals(head)) {
-            logger.debug("Hit a 88");
-        }
-        else {
-            logger.error("Do not know how to treat da66 line:");
-            logger.error(line);
-        }
-    }
-
-
-    /** Called when file is fully consumed. */
-    @Override
-    protected void finish() {
-        // TODO 'move' last line to match river axis
-        logger.info("Parsed " + data.size() + " lines");
-    }
-
-
-    /** Parses files given as arguments. */
-    public static void main(String [] args) {
-
-        DA66Parser parser = new DA66Parser();
-
-        logger.warn("Start parsing files.");
-        for (String arg: args) {
-            parser.parseDA66s(new File(arg), null);
-            logger.warn("Parsing a file.");
-        }
-        logger.error("Finished parsing files.");
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/FlowVelocityMeasurementParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/FlowVelocityMeasurementParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import de.intevation.flys.importer.ImportFlowVelocityMeasurement;
-import de.intevation.flys.importer.ImportFlowVelocityMeasurementValue;
-
-import java.math.BigDecimal;
-
-import java.text.DateFormat;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-public class FlowVelocityMeasurementParser extends LineParser {
-
-    private static final Logger log =
-        Logger.getLogger(FlowVelocityMeasurementParser.class);
-
-    private static final NumberFormat nf =
-        NumberFormat.getInstance(DEFAULT_LOCALE);
-
-    private static final DateFormat df =
-        new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
-
-
-    private List<ImportFlowVelocityMeasurement> measurements;
-
-    private ImportFlowVelocityMeasurement current;
-
-
-    public FlowVelocityMeasurementParser() {
-        measurements = new ArrayList<ImportFlowVelocityMeasurement>();
-    }
-
-
-    public List<ImportFlowVelocityMeasurement> getMeasurements() {
-        return measurements;
-    }
-
-    @Override
-    protected void reset() {
-        current = new ImportFlowVelocityMeasurement();
-    }
-
-
-    @Override
-    protected void finish() {
-        current.setDescription(fileName);
-        measurements.add(current);
-    }
-
-
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        if (line.startsWith(START_META_CHAR)) {
-            handleMetaLine(stripMetaLine(line));
-        }
-        else {
-            handleDataLine(line);
-        }
-    }
-
-
-    public void handleMetaLine(String line) {
-    }
-
-
-    public void handleDataLine(String line) {
-        String[] cols = line.split(SEPERATOR_CHAR);
-
-        if (cols.length < 8) {
-            log.warn("skip invalid data line: '" + line + "'");
-            return;
-        }
-
-        try {
-            double km     = nf.parse(cols[1]).doubleValue();
-            double w      = nf.parse(cols[5]).doubleValue();
-            double q      = nf.parse(cols[6]).doubleValue();
-            double v      = nf.parse(cols[7]).doubleValue();
-
-            String timestr     = cols[3] + " " + cols[4];
-            String description = cols.length > 8 ? cols[8] : null;
-
-            current.addValue(new ImportFlowVelocityMeasurementValue(
-                df.parse(timestr),
-                new BigDecimal(km),
-                new BigDecimal(w),
-                new BigDecimal(q),
-                new BigDecimal(v),
-                description
-            ));
-        }
-        catch (ParseException pe) {
-            log.warn("Unparseable flow velocity values:", pe);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/FlowVelocityModelParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/FlowVelocityModelParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,269 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.math.BigDecimal;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportDischargeZone;
-import de.intevation.flys.importer.ImportFlowVelocityModel;
-import de.intevation.flys.importer.ImportFlowVelocityModelValue;
-import de.intevation.flys.utils.EpsilonComparator;
-
-
-public class FlowVelocityModelParser extends LineParser {
-
-    private static final Logger log =
-        Logger.getLogger(FlowVelocityModelParser.class);
-
-    private static final Pattern META_REGEX =
-        Pattern.compile(".*Rechnung (.*) \\(Pegel (.*)\\).*");
-
-    private static final Pattern META_GAUGE =
-        Pattern.compile("(.*) Q=(\\w*)m3/s");
-
-    private static final Pattern META_MAINVALUE_A =
-        Pattern.compile("([a-zA-Z]+)+(\\d+)*");
-
-    private static final Pattern META_MAINVALUE_B =
-        Pattern.compile("(([a-zA-Z]+)+(\\d+)*)\\s*-\\s*(([a-zA-Z]+)+(\\d+)*)");
-
-    private static final Pattern META_MAINVALUE_C =
-        Pattern.compile("([0-9]++)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)");
-
-    private static final Pattern META_MAINVALUE_D =
-        Pattern.compile("(([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)) bis (([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*))");
-
-    private static final Pattern META_MAINVALUE_E =
-        Pattern.compile("(([a-zA-Z]+)+(\\d+)*) bis (([a-zA-Z]+)+(\\d+)*)");
-
-    private static final NumberFormat nf =
-        NumberFormat.getInstance(DEFAULT_LOCALE);
-
-
-    private List<ImportFlowVelocityModel> models;
-
-    private ImportFlowVelocityModel current;
-
-    protected String description;
-
-    protected TreeSet<Double> kmExists;
-
-
-    public FlowVelocityModelParser() {
-        models = new ArrayList<ImportFlowVelocityModel>();
-        kmExists = new TreeSet<Double>(EpsilonComparator.CMP);
-    }
-
-
-    public List<ImportFlowVelocityModel> getModels() {
-        return models;
-    }
-
-    @Override
-    public void parse(File file) throws IOException {
-        description = file.getName();
-
-        super.parse(file);
-    }
-
-    @Override
-    protected void reset() {
-        current = new ImportFlowVelocityModel(description);
-        kmExists.clear();
-    }
-
-
-    @Override
-    protected void finish() {
-        models.add(current);
-
-	//	description = null;
-    }
-
-
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        if (line.startsWith(START_META_CHAR)) {
-            handleMetaLine(stripMetaLine(line));
-        }
-        else {
-            handleDataLine(line);
-        }
-    }
-
-
-    protected void handleMetaLine(String line) {
-        Matcher m = META_REGEX.matcher(line);
-
-        if (m.matches()) {
-            String mainValueStr = m.group(1);
-            String gaugeStr     = m.group(2);
-
-            Object[] valueData = handleMainValueString(mainValueStr);
-            Object[] gaugeData = handleGaugeString(gaugeStr);
-
-            if (valueData == null || valueData.length < 2) {
-                log.warn("skip invalid MainValue part: '" + line + "'");
-                return;
-            }
-
-            if (gaugeData == null || gaugeData.length < 2) {
-                log.warn("skip invalid gauge part: '" + line + "'");
-                return;
-            }
-
-            if (log.isDebugEnabled()) {
-                log.debug("Found meta information:");
-                log.debug("   Gauge: " + gaugeData[0]);
-                log.debug("   Value: " + gaugeData[1]);
-                log.debug("   Lower: " + valueData[0]);
-                log.debug("   upper: " + valueData[1]);
-            }
-
-            current.setDischargeZone(new ImportDischargeZone(
-                (String) gaugeData[0],
-                (BigDecimal) gaugeData[1],
-                (String) valueData[0],
-                (String) valueData[1]
-            ));
-        }
-    }
-
-
-    protected Object[] handleMainValueString(String mainValueStr) {
-        Matcher mA = META_MAINVALUE_A.matcher(mainValueStr);
-        if (mA.matches()) {
-            String name = mA.group(0);
-
-            return new Object[] { name, name };
-        }
-
-        Matcher mB = META_MAINVALUE_B.matcher(mainValueStr);
-        if (mB.matches()) {
-            String lower = mB.group(1);
-            String upper = mB.group(4);
-
-            return new Object[] { lower, upper };
-        }
-
-        Matcher mC = META_MAINVALUE_C.matcher(mainValueStr);
-        if (mC.matches()) {
-            String facA  = mC.group(1);
-            String nameA = mC.group(2);
-            String facB  = mC.group(3);
-            String nameB = mC.group(4);
-
-            String fac  = facA  != null ? facA  : facB;
-            String name = nameA != null ? nameA : nameB;
-
-            String mainValue = fac + " " + name;
-
-            return new Object[] { mainValue, mainValue };
-        }
-
-        Matcher mD = META_MAINVALUE_D.matcher(mainValueStr);
-        if (mD.matches()) {
-            String loFacA  = mD.group(2);
-            String loNameA = mD.group(3);
-            String loFacB  = mD.group(4);
-            String loNameB = mD.group(5);
-
-            String upFacA  = mD.group(7);
-            String upNameA = mD.group(8);
-            String upFacB  = mD.group(9);
-            String upNameB = mD.group(10);
-
-            String loFac  = loFacA  != null ? loFacA  : loFacB;
-            String loName = loNameA != null ? loNameA : loNameB;
-
-            String upFac  = upFacA  != null ? upFacA  : upFacB;
-            String upName = upNameA != null ? upNameA : upNameB;
-
-            String loMainValue = loFac + " " + loName;
-            String upMainValue = upFac + " " + upName;
-
-            return new Object[] { loMainValue, upMainValue };
-        }
-
-        Matcher mE = META_MAINVALUE_E.matcher(mainValueStr);
-        if (mE.matches()) {
-            String lower = mE.group(1);
-            String upper = mE.group(4);
-
-            return new Object[] { lower, upper };
-        }
-
-        return null;
-    }
-
-
-    protected Object[] handleGaugeString(String gaugeStr) {
-        Matcher m = META_GAUGE.matcher(gaugeStr);
-
-        if (m.matches()) {
-            String name = m.group(1);
-            String qStr = m.group(2);
-
-            try {
-                return new Object[] {
-                    name,
-                    new BigDecimal(nf.parse(qStr).doubleValue()) };
-            }
-            catch (ParseException pe) {
-                log.warn("Could not parse Q value: '" + qStr + "'");
-            }
-        }
-
-        return null;
-    }
-
-
-    protected void handleDataLine(String line) {
-        String[] cols = line.split(SEPERATOR_CHAR);
-
-        if (cols.length < 5) {
-            log.warn("skip invalid data line: '" + line + "'");
-            return;
-        }
-
-        try {
-            double km = nf.parse(cols[0]).doubleValue();
-
-            Double key = Double.valueOf(km);
-
-            if (kmExists.contains(key)) {
-                log.warn("duplicate stattion '" + km + "': -> ignored");
-                return;
-            }
-
-            double q      = nf.parse(cols[1]).doubleValue();
-            double total  = nf.parse(cols[2]).doubleValue();
-            double main   = nf.parse(cols[3]).doubleValue();
-            double stress = nf.parse(cols[4]).doubleValue();
-
-            current.addValue(new ImportFlowVelocityModelValue(
-                new BigDecimal(km),
-                new BigDecimal(q),
-                new BigDecimal(total),
-                new BigDecimal(main),
-                new BigDecimal(stress)
-            ));
-
-            kmExists.add(key);
-        }
-        catch (ParseException pe) {
-            log.warn("Unparseable flow velocity values:", pe);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/HYKParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/HYKParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,344 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.importer.ImportHYK;
-import de.intevation.flys.importer.ImportHYKEntry;
-import de.intevation.flys.importer.ImportHYKFormation;
-import de.intevation.flys.importer.ImportHYKFlowZone;
-import de.intevation.flys.importer.ImportHYKFlowZoneType;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Date;
-import java.util.Calendar;
-
-import java.math.BigDecimal;
-
-import org.apache.log4j.Logger;
-
-public class HYKParser
-{
-    private static Logger log = Logger.getLogger(HYKParser.class);
-
-    public interface Callback {
-        boolean hykAccept(File file);
-        void    hykParsed(HYKParser parser);
-    } // interface Callback
-
-    public static enum State {
-        LINE_1, LINE_2, LINE_3, LINE_4, LINE_5, LINE_6
-    };
-
-    private static final String ENCODING = "ISO-8859-1";
-
-    protected Map<String, ImportHYKFlowZoneType> flowZoneTypes;
-
-    protected ImportHYK hyk;
-
-    public HYKParser() {
-        flowZoneTypes = new HashMap<String, ImportHYKFlowZoneType>();
-    }
-
-    public ImportHYK getHYK() {
-        return hyk;
-    }
-
-    private static Date yearToDate(Integer year) {
-        if (year == null) {
-            return null;
-        }
-        Calendar cal = Calendar.getInstance();
-        cal.set(year, 0, 1, 12, 0, 0);
-        long ms = cal.getTimeInMillis();
-        cal.setTimeInMillis(ms - ms%1000);
-        return cal.getTime();
-    }
-
-    public boolean parse(File file) {
-
-        boolean debug = log.isDebugEnabled();
-
-        log.info("Parsing HYK file '" + file + "'");
-
-        LineNumberReader in = null;
-
-        String description =
-            file.getParentFile().getName() + "/" + file.getName();
-
-        hyk = new ImportHYK(null, description);
-
-        try {
-            in =
-                new LineNumberReader(
-                new InputStreamReader(
-                new FileInputStream(file), ENCODING));
-
-            String line;
-
-            State state = State.LINE_1;
-
-            int numFormations = 0;
-
-            BigDecimal km         = null;
-            BigDecimal top        = null;
-            BigDecimal bottom     = null;
-            BigDecimal distanceVL = null;
-            BigDecimal distanceHF = null;
-            BigDecimal distanceVR = null;
-
-            Integer    year       = null;
-            int        numZones   = 0;
-
-            ImportHYKFlowZoneType [] fzts     = null;
-            BigDecimal            [] coords   = null;
-            int                      coordPos = 0;
-
-            ImportHYKEntry     entry     = null;
-            ImportHYKFormation formation = null;
-
-            while ((line = in.readLine()) != null) {
-
-                if (line.startsWith("*") || line.startsWith("----")) {
-                    continue;
-                }
-
-                line = line.trim();
-
-                if (state != State.LINE_5 && line.length() == 0) {
-                    continue;
-                }
-
-                String [] parts = line.split("\\s+");
-
-                if (debug) {
-                    log.debug("'" + line + "': " + state);
-                }
-
-                switch (state) {
-                    case LINE_1:
-                        if (parts.length < 2) {
-                            log.error("HYK 1: not enough elements in line " +
-                                in.getLineNumber());
-                            return false;
-                        }
-
-                        if (parts.length == 2) {
-                            // no year given
-                            year = null;
-                        }
-                        else {
-                            try {
-                                year = Integer.valueOf(parts[1]);
-                            }
-                            catch (NumberFormatException nfe) {
-                                log.error(
-                                    "year is not an integer in line " +
-                                    in.getLineNumber());
-                                return false;
-                            }
-                        }
-                        try {
-                            km = new BigDecimal(parts[0]);
-                            numFormations = Integer.parseInt(
-                                parts[parts.length > 2 ? 2 : 1]);
-                        }
-                        catch (NumberFormatException nfe) {
-                            log.error(
-                                "parsing number of formations " +
-                                "or km failed in line " + in.getLineNumber());
-                            return false;
-                        }
-                        entry = new ImportHYKEntry(hyk, km, yearToDate(year));
-                        hyk.addEntry(entry);
-
-                        state = State.LINE_2;
-                        break;
-
-                    case LINE_2:
-                        if (parts.length < 3) {
-                            log.error("HYK 2: not enough elements in line " +
-                                in.getLineNumber());
-                            return false;
-                        }
-                        try {
-                            numZones = Integer.parseInt(parts[0]);
-                            bottom   = new BigDecimal(parts[1]);
-                            top      = new BigDecimal(parts[2]);
-                        }
-                        catch (NumberFormatException nfe) {
-                            log.error(
-                                "HYK: parsing num zones, bottom or top height " +
-                                "failed in line " + in.getLineNumber());
-                            return false;
-                        }
-                        formation = new ImportHYKFormation();
-                        formation.setBottom(bottom);
-                        formation.setTop(top);
-                        entry.addFormation(formation);
-
-                        state = State.LINE_3;
-                        break;
-
-                    case LINE_3:
-                        if (parts.length != numZones) {
-                            log.error(
-                                "HYK: number of flow zones mismatches " +
-                                "in line " + in.getLineNumber());
-                            return false;
-                        }
-
-                        fzts = new ImportHYKFlowZoneType[parts.length];
-                        for (int i = 0; i < fzts.length; ++i) {
-                            fzts[i] = getFlowZoneType(parts[i]);
-                        }
-                        coords = new BigDecimal[numZones];
-                        state = State.LINE_4;
-                        break;
-
-                    case LINE_4:
-                        try {
-                            int N = Math.min(parts.length, coords.length);
-                            for (coordPos = 0; coordPos < N; ++coordPos) {
-                                coords[coordPos] =
-                                    new BigDecimal(parts[coordPos]);
-                            }
-                        }
-                        catch (NumberFormatException nfe) {
-                            log.error("HYK: cannot parse number in line " +
-                                in.getLineNumber());
-                            return false;
-                        }
-                        state = State.LINE_5;
-                        break;
-
-                    case LINE_5:
-                        if (parts.length + coordPos < coords.length) {
-                            log.error("HYK 5: not enough elements in line " +
-                                in.getLineNumber());
-                            return false;
-                        }
-                        try {
-                            for (int i = 0;
-                                i < parts.length && coordPos < coords.length;
-                                ++i, ++coordPos
-                            ) {
-                                coords[coordPos] = new BigDecimal(parts[i]);
-                            }
-                        }
-                        catch (NumberFormatException nfe) {
-                            log.error("HYK: cannot parse number in line " +
-                                in.getLineNumber());
-                            return false;
-                        }
-                        for (int i = 0; i < coords.length; ++i) {
-                            BigDecimal a = coords[i];
-                            BigDecimal b = coords[i == coords.length-1 ? i : i+1];
-                            if (a.compareTo(b) > 0) {
-                                log.warn("HYK: zone coordinates swapped in line " +
-                                    in.getLineNumber());
-                                BigDecimal c = a; a = b; b = c;
-                            }
-                            ImportHYKFlowZone zone = new ImportHYKFlowZone(
-                                formation, fzts[i], a, b);
-                            formation.addFlowZone(zone);
-                        }
-                        state = State.LINE_6;
-                        break;
-
-                    case LINE_6:
-                        if (parts.length < 3) {
-                            log.error("HYK 6: not enough elements in line " +
-                                in.getLineNumber());
-                            return false;
-                        }
-                        try {
-                            distanceVL = new BigDecimal(parts[0]);
-                            distanceHF = new BigDecimal(parts[1]);
-                            distanceVR = new BigDecimal(parts[2]);
-                        }
-                        catch (NumberFormatException nfe) {
-                            log.error("HYK: cannot parse number in line " +
-                                in.getLineNumber());
-                            return false;
-                        }
-                        formation.setDistanceVL(distanceVL);
-                        formation.setDistanceHF(distanceHF);
-                        formation.setDistanceVR(distanceVR);
-
-                        // continue with next formation.
-                        state = --numFormations > 0 // formations left?
-                            ? State.LINE_2
-                            : State.LINE_1;
-                        break;
-                }
-            }
-        }
-        catch (IOException ioe) {
-            log.error("HYK: Error reading file.", ioe);
-            return false;
-        }
-        finally {
-            if (in != null) {
-                try {
-                    in.close();
-                }
-                catch (IOException ioe) {
-                    log.error("HYK: Error closing file.", ioe);
-                }
-            }
-        }
-        return true;
-    }
-
-    protected ImportHYKFlowZoneType getFlowZoneType(String name) {
-        name = name.toUpperCase();
-        ImportHYKFlowZoneType fzt = flowZoneTypes.get(name);
-        if (fzt == null) {
-            log.info("New flow zone type: " + name);
-            fzt = new ImportHYKFlowZoneType(name);
-            flowZoneTypes.put(name, fzt);
-        }
-        return fzt;
-    }
-
-    protected void reset() {
-        hyk = null;
-    }
-
-    public void parseHYKs(File root, final Callback callback) {
-
-        FileTools.walkTree(root, new FileTools.FileVisitor() {
-            @Override
-            public boolean visit(File file) {
-                if (file.isFile() && file.canRead()
-                && file.getName().toLowerCase().endsWith(".hyk")
-                && (callback == null || callback.hykAccept(file))) {
-                    reset();
-                    boolean success = parse(file);
-                    log.info("parsing " + (success ? "succeeded" : "failed"));
-                    if (success && callback != null) {
-                        callback.hykParsed(HYKParser.this);
-                    }
-                }
-                return true;
-            }
-        });
-    }
-
-    public static void main(String [] args) {
-
-        HYKParser parser = new HYKParser();
-
-        for (String arg: args) {
-            parser.parseHYKs(new File(arg), null);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/InfoGewParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/InfoGewParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,138 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-
-import java.util.List;
-import java.util.ArrayList;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-
-import java.io.IOException;
-import java.io.LineNumberReader;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.importer.ImportRiver;
-
-
-/** Processes files mentioned in an info file for a river. */
-public class InfoGewParser
-{
-    private static Logger log = Logger.getLogger(InfoGewParser.class);
-
-    public static final String ENCODING = "ISO-8859-1";
-
-    public static final Pattern GEWAESSER =
-        Pattern.compile("^\\s*Gew\u00e4sser\\s*:\\s*(.+)");
-
-    public static final Pattern WST_DATEI =
-        Pattern.compile("^\\s*WSTDatei\\s*:\\s*(.+)");
-
-    public static final Pattern BB_INFO =
-        Pattern.compile("^\\s*B\\+B-Info\\s*:\\s*(.+)");
-
-    protected ArrayList<ImportRiver> rivers;
-
-    protected AnnotationClassifier annotationClassifier;
-
-    public InfoGewParser() {
-        this(null);
-    }
-
-    public InfoGewParser(AnnotationClassifier annotationClassifier) {
-        rivers = new ArrayList<ImportRiver>();
-        this.annotationClassifier = annotationClassifier;
-    }
-
-    public List<ImportRiver> getRivers() {
-        return rivers;
-    }
-
-    public static final String normalize(String f) {
-        return f.replace("\\", "/").replace("/", File.separator);
-    }
-
-    /** Handle a gew, wst, or bb_info file. */
-    public void parse(File file) throws IOException {
-
-        LineNumberReader in = null;
-
-        File root = file.getParentFile();
-
-        try {
-            in =
-                new LineNumberReader(
-                new InputStreamReader(
-                new FileInputStream(file), ENCODING));
-
-            String line = null;
-
-            String riverName  = null;
-            File   wstFile    = null;
-            File   bbInfoFile = null;
-
-            while ((line = in.readLine()) != null) {
-                if ((line = line.trim()).length() == 0) {
-                    continue;
-                }
-                Matcher m = GEWAESSER.matcher(line);
-
-                if (m.matches()) {
-                    String river = m.group(1);
-                    log.info("Found river '" + river + "'");
-                    if (riverName != null) {
-                        rivers.add(new ImportRiver(
-                            riverName,
-                            wstFile,
-                            bbInfoFile,
-                            annotationClassifier));
-                    }
-                    riverName  = river;
-                    wstFile    = null;
-                    bbInfoFile = null;
-                }
-                else if ((m = WST_DATEI.matcher(line)).matches()) {
-                    String wstFilename = m.group(1);
-                    File wst = new File(wstFilename = normalize(wstFilename));
-                    if (!wst.isAbsolute()) {
-                        wst = new File(root, wstFilename);
-                    }
-                    wst = FileTools.repair(wst);
-                    log.info("Found wst file '" + wst + "'");
-                    if (!wst.isFile() || !wst.canRead()) {
-                        log.warn("cannot access WST file '" + wstFilename + "'");
-                        continue;
-                    }
-                    wstFile = wst;
-                }
-                else if ((m = BB_INFO.matcher(line)).matches()) {
-                    //TODO: Make it relative to the wst file.
-                    String bbInfo = m.group(1);
-                    bbInfoFile = new File(normalize(bbInfo));
-                }
-            }
-            if (riverName != null) {
-                rivers.add(new ImportRiver(
-                    riverName,
-                    wstFile,
-                    bbInfoFile,
-                    annotationClassifier));
-            }
-        }
-        finally {
-            if (in != null) {
-                in.close();
-            }
-        }
-
-        for (ImportRiver river: rivers) {
-            river.parseDependencies();
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/LineParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/LineParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,139 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-
-import java.text.DateFormat;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-
-import java.io.IOException;
-import java.io.LineNumberReader;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-
-import org.apache.log4j.Logger;
-
-
-/**
- * Base-Class for prasers for line-based file formats.
- * Calls reset(), then read line by line, calling handleLine() for each,
- * then calls finish().
- */
-public abstract class LineParser {
-
-    /** Private logger. */
-    private static final Logger log = Logger.getLogger(LineParser.class);
-
-    public static final String ENCODING = "ISO-8859-1";
-
-    public static final Locale DEFAULT_LOCALE = Locale.GERMAN;
-
-    public static final String START_META_CHAR = "#";
-    public static final String SEPERATOR_CHAR  = ";";
-
-
-    protected abstract void handleLine(int lineNum, String line);
-
-    protected abstract void reset();
-
-    protected abstract void finish();
-
-    /** Name of file parsed. */
-    protected String fileName;
-
-    protected File inputFile;
-
-
-    /**
-     * This method reads each line of <i>file</i>. At the beginning,
-     * <i>reset()</i> is called; afterwards for each line <i>handleLine()</i> is
-     * called; at the end <i>finish</i> is called.
-     *
-     * @param file The file which should be parsed.
-     */
-    public void parse(File file) throws IOException {
-        log.info("Parsing file '" + file + "'");
-
-        inputFile = file;
-
-        fileName = file.getName();
-
-        reset();
-
-        LineNumberReader in = null;
-        try {
-            in =
-                new LineNumberReader(
-                new InputStreamReader(
-                new FileInputStream(file), ENCODING));
-
-            String line    = null;
-            int    lineNum = 1;
-            while ((line = in.readLine()) != null) {
-                if ((line = line.trim()).length() == 0) {
-                    lineNum++;
-                    continue;
-                }
-
-                handleLine(lineNum++, line);
-            }
-        }
-        finally {
-            if (in != null) {
-                in.close();
-            }
-        }
-
-        finish();
-    }
-
-
-    /** Returns the name of the file parsed. */
-    protected String getFileName() {
-        return fileName;
-    }
-
-    /** Returns the file currently parsed. */
-    protected File getInputFile() {
-        return inputFile;
-    }
-
-
-    protected static String stripMetaLine(String line) {
-        String tmp = line.substring(1, line.length());
-
-        if (tmp.startsWith(" ")) {
-            return tmp.substring(1, tmp.length());
-        }
-        else {
-            return tmp;
-        }
-    }
-
-    public static double getDouble(String doubleString) throws ParseException {
-        NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
-        Number value = nf.parse(doubleString);
-
-        return value.doubleValue();
-    }
-
-    public static Date getDate(String dateString) throws ParseException {
-        DateFormat df = SimpleDateFormat.getDateInstance(
-            SimpleDateFormat.MEDIUM, DEFAULT_LOCALE);
-
-        return df.parse(dateString);
-    }
-
-
-    public static Date getDateFromYear(int year) {
-        Calendar cal = Calendar.getInstance();
-        cal.set(year, 0, 1);
-
-        return cal.getTime();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/MeasurementStationsParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/MeasurementStationsParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,187 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.math.BigDecimal;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportMeasurementStation;
-import de.intevation.flys.importer.ImportRange;
-import de.intevation.flys.importer.ImportTimeInterval;
-
-
-public class MeasurementStationsParser extends LineParser {
-
-    public static class MeasurementStationParserException extends Exception {
-
-        private static final long serialVersionUID = 1L;
-
-        public MeasurementStationParserException(String msg) {
-            super(msg);
-        }
-    }
-
-    public static final int MIN_COLUMNS = 10;
-
-    private static final Logger log = Logger
-        .getLogger(MeasurementStationsParser.class);
-
-    private List<ImportMeasurementStation> measurementStations;
-    private ImportMeasurementStation current;
-
-    @Override
-    protected void reset() {
-        this.measurementStations = new ArrayList<ImportMeasurementStation>();
-    }
-
-    @Override
-    protected void finish() {
-    }
-
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        if (line == null || line.startsWith(START_META_CHAR)) {
-            log.info("skip meta information at line " + lineNum);
-            return;
-        }
-
-        try {
-            current = new ImportMeasurementStation();
-            handleDataLine(line);
-            measurementStations.add(current);
-        }
-        catch (MeasurementStationParserException e) {
-            log.warn("Problem in line " + lineNum + ": " + e.getMessage());
-        }
-    }
-
-    public List<ImportMeasurementStation> getMeasurementStations() {
-        return measurementStations;
-    }
-
-    protected void handleDataLine(String line)
-        throws MeasurementStationParserException {
-        String[] cols = line.split(SEPERATOR_CHAR);
-
-        if (cols == null || cols.length < MIN_COLUMNS) {
-            int num = cols != null ? cols.length : 0;
-            throw new MeasurementStationParserException("Not enough columns: "
-                + num);
-        }
-
-        current.name = getName(cols);
-        current.station = getStation(cols);
-        current.range = getRange(cols);
-        current.measurementType = getMeasurementType(cols);
-        current.riverside = getRiverside(cols);
-        current.gauge = getGauge(cols);
-        current.observationTimerange = getObservationTimerange(cols);
-        current.operator = getOperator(cols);
-        current.description = getDescription(cols);
-
-        log.debug("Found new measurement station '" + current.name + "' at km "
-            + current.station);
-    }
-
-    protected String getName(String[] cols)
-        throws MeasurementStationParserException {
-        if (cols[0] == null || cols[0].length() == 0) {
-            throw new MeasurementStationParserException("invalid name '"
-                + cols[0] + "'");
-        }
-
-        return cols[0];
-    }
-
-    protected double getStation(String[] cols)
-        throws MeasurementStationParserException {
-        if (cols[1] == null || cols[1].length() == 0) {
-            throw new MeasurementStationParserException("invalid station '"
-                + cols[1] + "'");
-        }
-
-        try {
-            return getDouble(cols[1]);
-        }
-        catch (ParseException e) {
-            throw new MeasurementStationParserException(
-                "unable to parse station: " + e.getMessage());
-        }
-    }
-
-    protected ImportRange getRange(String[] cols) {
-        if (cols[4] == null || cols[4].length() == 0) {
-            log.warn("No upper value for range found in '" + cols[4] + "'");
-            return null;
-        }
-
-        if (cols[5] == null || cols[5].length() == 0) {
-            log.warn("No upper value for range found in '" + cols[5] + "'");
-            return null;
-        }
-
-        try {
-            double lower = getDouble(cols[4]);
-            double upper = getDouble(cols[5]);
-
-            return new ImportRange(new BigDecimal(lower), new BigDecimal(upper));
-        }
-        catch (ParseException e) {
-            log.warn("unable to parse range: " + e.getMessage());
-            return null;
-        }
-    }
-
-    protected String getMeasurementType(String[] cols)
-        throws MeasurementStationParserException {
-        if (cols[2] == null || cols[2].length() == 0) {
-            throw new MeasurementStationParserException(
-                "invalid measurement type '" + cols[2] + "'");
-        }
-
-        return cols[2];
-    }
-
-    protected String getRiverside(String[] cols) {
-        return cols[3];
-    }
-
-    protected String getGauge(String[] cols) {
-        if (cols[6] == null || cols[6].length() == 0) {
-            log.warn("invalid gauge found: '" + cols[6] + "'");
-        }
-
-        return cols[6];
-    }
-
-    protected ImportTimeInterval getObservationTimerange(String[] cols) {
-        if (cols[8] == null || cols[8].length() == 0) {
-                log.warn("Found invalid observation time '" + cols[8] + "'");
-        }
-
-        try {
-            Date date = getDate(cols[8]);
-
-            if (date != null) {
-                return new ImportTimeInterval(date);
-            }
-            log.warn("Observation time date invalid: '" + cols[8] + "'");
-        }
-        catch (ParseException pe) {
-            log.warn("Observation time date not parseable: '" + cols[8] + "'");
-            return null;
-        }
-        return null;
-    }
-
-    protected String getOperator(String[] cols) {
-        return cols[9];
-    }
-
-    protected String getDescription(String[] cols) {
-        return cols.length > 10 ? cols[10] : null;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/MorphologicalWidthParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/MorphologicalWidthParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.math.BigDecimal;
-
-import java.text.NumberFormat;
-import java.text.ParseException;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportMorphWidth;
-import de.intevation.flys.importer.ImportMorphWidthValue;
-import de.intevation.flys.importer.ImportUnit;
-
-
-public class MorphologicalWidthParser extends LineParser {
-
-    private static final Logger log =
-        Logger.getLogger(MorphologicalWidthParser.class);
-
-    public static final NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
-
-    public static final Pattern META_UNIT =
-        Pattern.compile("^Einheit: \\[(.*)\\].*");
-
-    protected List<ImportMorphWidth> morphWidths;
-
-    protected ImportMorphWidth current;
-
-
-    public MorphologicalWidthParser() {
-        morphWidths = new ArrayList<ImportMorphWidth>();
-    }
-
-
-    @Override
-    protected void reset() {
-        current = new ImportMorphWidth();
-    }
-
-
-    @Override
-    protected void finish() {
-        if (current != null) {
-            morphWidths.add(current);
-        }
-    }
-
-
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        if (line.startsWith(START_META_CHAR)) {
-            handleMetaLine(stripMetaLine(line));
-        }
-        else {
-            handleDataLine(line);
-        }
-    }
-
-
-    protected void handleMetaLine(String line) {
-        if (handleMetaUnit(line)) {
-            return;
-        }
-        else {
-            log.warn("MWP: Unknown meta line: '" + line + "'");
-        }
-    }
-
-
-    protected boolean handleMetaUnit(String line) {
-        Matcher m = META_UNIT.matcher(line);
-
-        if (m.matches()) {
-            String unit = m.group(1);
-
-            current.setUnit(new ImportUnit(unit));
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    protected void handleDataLine(String line) {
-        String[] vals = line.split(SEPERATOR_CHAR);
-
-        if (vals == null || vals.length < 2) {
-            log.warn("MWP: skip invalid data line: '" + line + "'");
-            return;
-        }
-
-        try {
-            BigDecimal km    = new BigDecimal(nf.parse(vals[0]).doubleValue());
-            BigDecimal width = new BigDecimal(nf.parse(vals[1]).doubleValue());
-
-            String desc = vals.length > 2 ? vals[2] : null;
-
-            current.addValue(new ImportMorphWidthValue(
-                km,
-                width,
-                desc
-            ));
-        }
-        catch (ParseException pe) {
-            log.warn("MWP: unparseable number in data row: " + line);
-        }
-    }
-
-
-    public List<ImportMorphWidth> getMorphologicalWidths() {
-        return morphWidths;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/PRFParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/PRFParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,419 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Collections;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-
-import java.io.File;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.XY;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-
-/**
- * Parse files in .prf format and generate a mapping of double
- * (km) to List of Points (XY).
- */
-public class PRFParser implements CrossSectionParser
-{
-    private static Logger log = Logger.getLogger(PRFParser.class);
-
-    public static final String ENCODING =
-        System.getProperty("flys.backend.prf.encoding", "ISO-8859-1");
-
-    public static final Pattern DATA_PATTERN =
-        Pattern.compile(
-            "\\((\\d+)x\\s*,\\s*(\\d+)\\(" +
-            "\\s*f(\\d+)\\.(\\d+)\\s*,\\s*f(\\d+)\\.(\\d+)\\s*\\)?\\)?");
-
-    public static final Pattern KM_PATTERN =
-        Pattern.compile("\\((\\d+)x\\s*,\\s*f(\\d+)\\.(\\d+)\\s*\\)?");
-
-    public static final Pattern YEAR_PATTERN =
-        Pattern.compile("(\\d{4})");
-
-    public static final int MIN_YEAR = 1800;
-    public static final int MAX_YEAR = 2100;
-
-    public static class DataFormat {
-
-        protected int deleteChars;
-        protected int maxRepetitions;
-        protected int firstIntegerPlaces;
-        protected int firstFractionPlaces;
-        protected int secondIntegerPlaces;
-        protected int secondFractionPlaces;
-
-        protected double firstShift;
-        protected double secondShift;
-
-        public DataFormat() {
-        }
-
-        public DataFormat(Matcher m) {
-            deleteChars          = Integer.parseInt(m.group(1));
-            maxRepetitions       = Integer.parseInt(m.group(2));
-            firstIntegerPlaces   = Integer.parseInt(m.group(3));
-            firstFractionPlaces  = Integer.parseInt(m.group(4));
-            secondIntegerPlaces  = Integer.parseInt(m.group(5));
-            secondFractionPlaces = Integer.parseInt(m.group(6));
-
-            firstShift  = Math.pow(10, firstFractionPlaces);
-            secondShift = Math.pow(10, secondFractionPlaces);
-        }
-
-        public int extractData(String line, List<XY> kmData) {
-            int L = line.length();
-            if (L <= deleteChars) {
-                return -1;
-            }
-
-            int pos = deleteChars;
-
-            boolean debug = log.isDebugEnabled();
-
-
-            int rep = 0;
-            for (;rep < maxRepetitions; ++rep) {
-                if (pos >= L || pos + firstIntegerPlaces >= L) {
-                    break;
-                }
-                String first = line.substring(
-                    pos, pos + firstIntegerPlaces);
-
-                String second = line.substring(
-                    pos + firstIntegerPlaces,
-                    Math.min(L, pos+firstIntegerPlaces+secondIntegerPlaces));
-
-                double x, y;
-                try {
-                    x = Double.parseDouble(first);
-                    y = Double.parseDouble(second);
-                }
-                catch (NumberFormatException nfe) {
-                    // broken line -> substract from dataset skip
-                    return -1;
-                }
-
-                if (first.indexOf('.') < 0) {
-                    x /= firstShift;
-                }
-
-                if (firstFractionPlaces > 0) {
-                    x = (int)(x*firstShift)/firstShift;
-                }
-
-                if (second.indexOf('.') < 0) {
-                    y /= secondShift;
-                }
-
-                if (secondFractionPlaces > 0) {
-                    y = (int)(y*secondShift)/secondShift;
-                }
-
-                kmData.add(new XY(x, y, kmData.size()));
-
-                pos += firstIntegerPlaces + secondIntegerPlaces;
-            }
-
-            return rep == maxRepetitions ? 1 : 0;
-        }
-    } // class DataFormat
-
-    public static class KMFormat {
-
-        protected int deleteChars;
-        protected int integerPlaces;
-        protected int fractionPlaces;
-
-        protected double shift;
-
-        public KMFormat() {
-        }
-
-        public KMFormat(Matcher m) {
-            deleteChars    = Integer.parseInt(m.group(1));
-            integerPlaces  = Integer.parseInt(m.group(2));
-            fractionPlaces = Integer.parseInt(m.group(3));
-
-            shift = Math.pow(10, fractionPlaces);
-        }
-
-        public double extractKm(String line) throws NumberFormatException {
-
-            if (line.length() <= deleteChars) {
-                throw new NumberFormatException("line too short");
-            }
-
-            String kmS =
-                line.substring(deleteChars, deleteChars+integerPlaces);
-
-            double km = Double.parseDouble(kmS.trim());
-
-            if (kmS.indexOf('.') < 0) {
-                km /= shift;
-            }
-
-            return fractionPlaces > 0
-                ? ((int)(km*shift))/shift
-                : km;
-        }
-    } // class KMFormat
-
-    protected Map<Double, List<XY>> data;
-
-    protected Integer year;
-
-    protected String description;
-
-
-    public PRFParser() {
-        data = new TreeMap<Double, List<XY>>();
-    }
-
-    @Override
-    public Integer getYear() {
-        return year;
-    }
-
-    public void setYear(Integer year) {
-        this.year = year;
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @Override
-    public Map<Double, List<XY>> getData() {
-        return data;
-    }
-
-    public void setData(Map<Double, List<XY>> data) {
-        this.data = data;
-    }
-
-    protected void sortLists() {
-        for (List<XY> xy: data.values()) {
-            Collections.sort(xy);
-        }
-    }
-
-    public static final Integer findYear(String s) {
-        Matcher m = YEAR_PATTERN.matcher(s);
-        while (m.find()) {
-            int year = Integer.parseInt(m.group(1));
-            if (year >= MIN_YEAR && year <= MAX_YEAR) {
-                return Integer.valueOf(year);
-            }
-        }
-        return null;
-    }
-
-    public boolean parse(File file) {
-
-        if (!(file.isFile() && file.canRead())) {
-            log.warn("PRF: cannot open file '" + file + "'");
-            return false;
-        }
-
-        log.info("parsing PRF file: '" + file + "'");
-
-        description = FileTools.removeExtension(file.getName());
-
-        year = findYear(file.getName());
-
-        if (year == null) {
-            File parent = file.getParentFile();
-            if (parent != null) {
-                description = parent.getName() + "/" + description;
-                year = findYear(parent.getName());
-            }
-        }
-
-        if (year != null) {
-            log.info("year of sounding: " + year);
-        }
-
-        LineNumberReader in = null;
-
-        try {
-            in =
-                new LineNumberReader(
-                new InputStreamReader(
-                new FileInputStream(file), ENCODING));
-
-            String line = in.readLine();
-
-            if (line == null || (line = line.trim()).length() == 0) {
-                log.warn("PRF: file is empty.");
-                return false;
-            }
-
-            Matcher m = DATA_PATTERN.matcher(line);
-
-            if (!m.matches()) {
-                log.warn("PRF: First line does not look like a PRF data pattern.");
-                return false;
-            }
-
-            DataFormat dataFormat = new DataFormat(m);
-
-            if ((line = in.readLine()) == null
-            || (line = line.trim()).length() == 0) {
-                log.warn("PRF: premature EOF. Expected integer in line 2");
-                return false;
-            }
-
-            try {
-                if (Integer.parseInt(line) != dataFormat.maxRepetitions) {
-                    log.warn("PRF: Expected " +
-                        dataFormat.maxRepetitions + " in line 2");
-                    return false;
-                }
-            }
-            catch (NumberFormatException nfe) {
-                log.warn("PRF: invalid integer in line 2", nfe);
-                return false;
-            }
-
-            if ((line = in.readLine()) == null) {
-                log.warn(
-                    "PRF: premature EOF. Expected pattern for km extraction");
-                return false;
-            }
-
-            m = KM_PATTERN.matcher(line);
-
-            if (!m.matches()) {
-                log.warn(
-                    "PRF: line 4 does not look like a PRF km extraction pattern.");
-                return false;
-            }
-
-            KMFormat kmFormat = new KMFormat(m);
-
-            if ((line = in.readLine()) == null
-            || (line = line.trim()).length() == 0) {
-                log.warn("PRF: premature EOF. Expected skip row count.");
-                return false;
-            }
-
-            int lineSkipCount;
-            try {
-                if ((lineSkipCount = Integer.parseInt(line)) < 0) {
-                    throw new IllegalArgumentException(lineSkipCount + " < 0");
-                }
-            }
-            catch (NumberFormatException nfe) {
-                log.warn(
-                    "PRF: line 5 is not an positive integer.");
-                return false;
-            }
-
-            int skip = lineSkipCount;
-
-            while ((line = in.readLine()) != null) {
-                if (skip > 0) {
-                    --skip;
-                    continue;
-                }
-                double km;
-                try {
-                    km = kmFormat.extractKm(line);
-                }
-                catch (NumberFormatException iae) {
-                    log.warn("PRF: cannot extract km in line " + in.getLineNumber());
-                    return false;
-                }
-
-                Double station = Double.valueOf(km);
-
-                List<XY> kmData = data.get(station);
-
-                if (kmData == null) {
-                    //log.debug("found new km: " + station);
-                    kmData = new ArrayList<XY>();
-                    data.put(station, kmData);
-                }
-
-                int c = dataFormat.extractData(line, kmData);
-                if (c < 1) {
-                    skip = lineSkipCount + c;
-                }
-            }
-
-            // sort all the lists by x and index
-            sortLists();
-        }
-        catch (IOException ioe) {
-            log.error("Error reading PRF file.", ioe);
-            return false;
-        }
-        finally {
-            if (in != null) {
-                try {
-                    in.close();
-                }
-                catch (IOException ioe) {
-                    log.error("Error closing PRF file.", ioe);
-                }
-            }
-        }
-
-        return true;
-    }
-
-    public void reset() {
-        data.clear();
-        year        = null;
-        description = null;
-    }
-
-    public void parsePRFs(File root, final CrossSectionParser.Callback callback) {
-
-        FileTools.walkTree(root, new FileTools.FileVisitor() {
-            @Override
-            public boolean visit(File file) {
-                if (file.isFile() && file.canRead()
-                && file.getName().toLowerCase().endsWith(".prf")
-                && (callback == null || callback.accept(file))) {
-                    reset();
-                    boolean success = parse(file);
-                    log.info("parsing " + (success ? "succeeded" : "failed"));
-                    if (success && callback != null) {
-                        callback.parsed(PRFParser.this);
-                    }
-                }
-                return true;
-            }
-        });
-    }
-
-    public static void main(String [] args) {
-
-        PRFParser parser = new PRFParser();
-
-        for (String arg: args) {
-            parser.parsePRFs(new File(arg), null);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/PegelGltParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/PegelGltParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-
-import java.util.List;
-import java.util.ArrayList;
-
-import java.io.IOException;
-import java.io.LineNumberReader;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-
-import java.math.BigDecimal;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.importer.ImportGauge;
-import de.intevation.flys.importer.ImportRange;
-
-public class PegelGltParser
-{
-    private static Logger log = Logger.getLogger(PegelGltParser.class);
-
-    public static final String ENCODING = "ISO-8859-1";
-
-    public static final String KM = "km:";
-
-    protected List<ImportGauge> gauges;
-
-    public PegelGltParser() {
-        gauges = new ArrayList<ImportGauge>();
-    }
-
-    public List<ImportGauge> getGauges() {
-        return gauges;
-    }
-
-    public void parse(File file) throws IOException {
-
-        File parent = file.getParentFile();
-
-        log.info("parsing GLT file '" + file + "'");
-        LineNumberReader in = null;
-        try {
-            in =
-                new LineNumberReader(
-                new InputStreamReader(
-                new FileInputStream(file), ENCODING));
-
-            String line = null;
-            while ((line = in.readLine()) != null) {
-                if ((line = line.trim()).length() == 0) {
-                    continue;
-                }
-
-                int kmPos = line.indexOf(KM);
-                if (kmPos < 0) {
-                    log.warn("GLT: no gauge found in line " + in.getLineNumber());
-                    continue;
-                }
-
-                String gaugeName = line.substring(0, kmPos).trim();
-                log.info("Found gauge '" + gaugeName + "'");
-
-                line = line.substring(kmPos + KM.length()).trim();
-
-                String [] parts = line.split("\\s+");
-                if (parts.length < 4) {
-                    log.warn("GLT: line " + in.getLineNumber()
-                        + " has not enough columns.");
-                    continue;
-                }
-
-                BigDecimal from = new BigDecimal(parts[0].replace(",", "."));
-                BigDecimal to   = new BigDecimal(parts[1].replace(",", "."));
-                if (from.compareTo(from) > 0) {
-                    BigDecimal t = from; from = to; to = t;
-                }
-                ImportRange range = new ImportRange(from, to);
-                File staFile = FileTools.repair(new File(parent, parts[2]));
-                File atFile  = FileTools.repair(new File(parent, parts[3]));
-
-                if (log.isDebugEnabled()) {
-                    log.debug("\tfrom: " + from);
-                    log.debug("\tto: " + to);
-                    log.debug("\tsta: " + staFile);
-                    log.debug("\tat: " + atFile);
-                }
-
-                gauges.add(new ImportGauge(range, staFile, atFile));
-            }
-        }
-        finally {
-            if (in != null) {
-                in.close();
-            }
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/SQRelationParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/SQRelationParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,170 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportSQRelation;
-import de.intevation.flys.importer.ImportSQRelationValue;
-import de.intevation.flys.importer.ImportTimeInterval;
-
-
-public class SQRelationParser extends LineParser {
-
-    private static final Logger log =
-        Logger.getLogger(SQRelationParser.class);
-
-    private static final Pattern TIMERANGE_REGEX =
-        Pattern.compile(".*Zeitraum.*\\s(\\w*)-(\\w*).*");
-
-    private static final NumberFormat nf =
-        NumberFormat.getInstance(DEFAULT_LOCALE);
-
-
-    private List<ImportSQRelation> relations;
-
-    private ImportSQRelation current;
-
-    private String currentDescription;
-
-
-    public SQRelationParser() {
-        relations = new ArrayList<ImportSQRelation>();
-    }
-
-
-    public List<ImportSQRelation> getSQRelations() {
-        return relations;
-    }
-
-    @Override
-    public void parse(File file) throws IOException {
-        this.currentDescription = file.getName();
-        super.parse(file);
-    }
-
-
-    @Override
-    protected void reset() {
-        current = new ImportSQRelation();
-    }
-
-
-    @Override
-    protected void finish() {
-        if (current != null) {
-            current.setDescription(currentDescription);
-            relations.add(current);
-        }
-    }
-
-
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        if (line.startsWith(START_META_CHAR)) {
-            handleMetaLine(stripMetaLine(line));
-        }
-        else {
-            handleDataLine(line);
-        }
-    }
-
-
-    protected void handleMetaLine(String line) {
-        Matcher m = TIMERANGE_REGEX.matcher(line);
-
-        if (m.matches()) {
-            String lo = m.group(1);
-            String hi = m.group(2);
-
-            log.debug("Found timerange " + lo + " - " + hi);
-
-            try {
-                int low  = nf.parse(lo).intValue();
-                int high = nf.parse(hi).intValue();
-
-                current.setTimeInterval(new ImportTimeInterval(
-                    getDateFromYear(low),
-                    getDateFromYear(high)
-                ));
-            }
-            catch (ParseException nfe) {
-                log.warn("Cannot parse time range.", nfe);
-            }
-        }
-    }
-
-
-    protected void handleDataLine(String line) {
-        String[] cols = line.split(SEPERATOR_CHAR);
-
-        if (cols.length < 14) {
-            log.warn("skip invalid data line: '" + line + "'");
-            return;
-        }
-
-        Double km = parseDouble(cols[3], line);
-        Double a = parseDouble(cols[6], line);
-        Double b = parseDouble(cols[7], line);
-        Double qMax = parseDouble(cols[8], line);
-        Double rSq = parseDouble(cols[9], line);
-        Integer nTot = parseInteger(cols[10], line);
-        Integer nOutlier = parseInteger(cols[11], line);
-        Double cFer = parseDouble(cols[12], line);
-        Double cDuan = parseDouble(cols[13], line);
-        if (km == null || a == null || b == null || 
-	    qMax == null || cols[1].length() == 0) {
-	    if (km == null) {
-		log.error("No km for measurement station: Can not reference measurement station: "
-		    + line);
-	    }
-	    if ( a == null || b == null || 
-		qMax == null || cols[1].length() == 0) {
-		log.error("Incomplete SQ-relation row (missing a, b, Qmax or parameter): "
-		    + line);
-	    }
-	    return;
-        }
-        current.addValue(new ImportSQRelationValue(
-            cols[1],
-            km,
-            a,
-            b,
-            qMax,
-            rSq,
-            nTot,
-            nOutlier,
-            cFer,
-            cDuan));
-    }
-
-    private Double parseDouble(String value, String line) {
-        Double result = null;
-        try {
-            result = Double.valueOf(value.replace(",", "."));
-        }
-        catch (NumberFormatException nfe) {
-            log.warn("Unparseable " + value + " in sq relation row: " + line);
-        }
-        return result;
-    }
-
-    private Integer parseInteger(String value, String line) {
-        Integer result = null;
-        try {
-            result = Integer.valueOf(value);
-        }
-        catch (NumberFormatException nfe) {
-            log.warn("Unparseable " + value + " in sq relation row: " + line);
-        }
-        return result;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/SedimentDensityParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/SedimentDensityParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import de.intevation.flys.importer.ImportDepth;
-import de.intevation.flys.importer.ImportSedimentDensity;
-import de.intevation.flys.importer.ImportSedimentDensityValue;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.math.BigDecimal;
-
-import java.text.NumberFormat;
-import java.text.ParseException;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.log4j.Logger;
-
-public class SedimentDensityParser extends LineParser {
-
-    private static final Logger log =
-        Logger.getLogger(SedimentDensityParser.class);
-
-    public static final NumberFormat nf =
-        NumberFormat.getInstance(DEFAULT_LOCALE);
-
-    public static final Pattern META_DEPTH =
-        Pattern.compile("^Tiefe: (\\w++)-(\\w++)( (\\w++))?.*");
-
-    protected List<ImportSedimentDensity> sedimentDensities;
-
-    protected ImportSedimentDensity current;
-
-    protected String currentDescription;
-
-
-    public SedimentDensityParser() {
-        sedimentDensities = new ArrayList<ImportSedimentDensity>();
-    }
-
-
-    @Override
-    public void parse(File file) throws IOException {
-        currentDescription = file.getName();
-
-        super.parse(file);
-    }
-
-
-    @Override
-    protected void reset() {
-        current = new ImportSedimentDensity(currentDescription);
-    }
-
-
-    @Override
-    protected void finish() {
-        if (current != null) {
-            sedimentDensities.add(current);
-        }
-    }
-
-
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        if (line.startsWith(START_META_CHAR)) {
-            handleMetaLine(stripMetaLine(line));
-        }
-        else {
-            handleDataLine(line);
-        }
-    }
-
-
-    protected void handleMetaLine(String line) {
-        if (handleMetaDepth(line)) {
-            return;
-        }
-        else {
-            log.warn("Unknown meta line: '" + line + "'");
-        }
-    }
-
-
-    protected boolean handleMetaDepth(String line) {
-        Matcher m = META_DEPTH.matcher(line);
-
-        if (m.matches()) {
-            String lo   = m.group(1);
-            String up   = m.group(2);
-
-            log.info("Found sediment density depth: " + lo + " - " + up + " cm");
-
-            try {
-                ImportDepth depth = new ImportDepth(
-                    new BigDecimal(nf.parse(lo).doubleValue()),
-                    new BigDecimal(nf.parse(up).doubleValue())
-                );
-
-                current.setDepth(depth);
-
-                return true;
-            }
-            catch (ParseException pe) {
-                log.warn("Unparseable numbers in: '" + line + "'");
-            }
-        }
-        else {
-            log.debug("Meta line doesn't contain depth information: " + line);
-        }
-
-        return false;
-    }
-
-
-    protected void handleDataLine(String line) {
-        String[] vals = line.split(SEPERATOR_CHAR);
-
-        if (vals == null || vals.length < 3) {
-            log.warn("skip invalid data line: '" + line + "'");
-            return;
-        }
-
-        BigDecimal km = null;
-        BigDecimal shoreOffset = null;
-        BigDecimal density = null;
-        try {
-            km          = new BigDecimal(nf.parse(vals[0]).doubleValue());
-            density     = new BigDecimal(nf.parse(vals[2]).doubleValue());
-            if (!vals[1].isEmpty()) {
-                shoreOffset = new BigDecimal(nf.parse(vals[1]).doubleValue());
-            }
-        }
-        catch (ParseException pe) {
-            log.warn("Unparseable numbers in '" + line + "'");
-        }
-
-        if (km == null || density == null) {
-            log.warn("SDP: No km nor density given. Skip line");
-            return;
-        }
-
-        BigDecimal year = null;
-
-        current.addValue(new ImportSedimentDensityValue(
-            km,
-            shoreOffset,
-            density,
-            year,
-            currentDescription));
-    }
-
-
-    public List<ImportSedimentDensity> getSedimentDensities() {
-        return sedimentDensities;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/SedimentYieldParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/SedimentYieldParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,393 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.text.NumberFormat;
-import java.text.ParseException;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportGrainFraction;
-import de.intevation.flys.importer.ImportSedimentYield;
-import de.intevation.flys.importer.ImportSedimentYieldValue;
-import de.intevation.flys.importer.ImportTimeInterval;
-import de.intevation.flys.importer.ImportUnit;
-import de.intevation.flys.model.GrainFraction;
-
-
-public class SedimentYieldParser extends LineParser {
-
-    private static final Logger log =
-        Logger.getLogger(SedimentYieldParser.class);
-
-
-    public static final NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
-
-
-    public static final String FRAKTION_START = "Fraktion:";
-
-    public static final String FRACTION_COARSE_STR =
-        ".*Grobkorn.*";
-
-    public static final String FRACTION_FINE_MIDDLE_STR =
-        ".*Fein-Mittel-Kies.*";
-
-    public static final String FRACTION_SAND =
-        ".*Sand.*";
-
-    public static final String FRACTION_SUSP_SAND =
-        ".*susp_Sand.*";
-
-    public static final String FRACTION_SUSP_SAND_BED =
-        ".*bettbild_Anteil_susp_Sand.*";
-
-    public static final String FRACTION_SUSP_SAND_BED_EPOCH =
-        ".*susp_Sand_bettbildAnteil.*";
-
-    public static final String FRACTION_SUSPENDED_SEDIMENT =
-        ".*Schwebstoff.*";
-
-    public static final String FRACTION_TOTAL =
-        ".*gesamt.*";
-
-
-    public static final Pattern TIMEINTERVAL_SINGLE =
-        Pattern.compile("\\D*([0-9]+?)\\D*");
-
-    public static final Pattern TIMEINTERVAL_EPOCH =
-        Pattern.compile("\\D*([0-9]+?)\\s*-\\s*([0-9]+?)\\D*");
-
-    public static final Pattern META_FRACTION =
-        Pattern.compile("^Fraktion: (.*)");
-
-    public static final Pattern META_UNIT =
-        Pattern.compile("^Einheit: \\[(.*)\\].*");
-
-    public static final Pattern META_COLUMN_NAMES =
-        Pattern.compile("^Fluss-km.*");
-
-    public static final Pattern META_GRAIN_FRACTION_A =
-        Pattern.compile("\\D*(([0-9]+?,[0-9]+?)\\s*-|([0-9]++)\\s*-)(([0-9]+?,[0-9]+?)|([0-9]++))\\s*([a-zA-Z]+?)\\W*\\D*");
-
-    public static final Pattern META_GRAIN_FRACTION_B =
-        Pattern.compile("(<|>){1}\\s*(\\w++)\\s*(([0-9]+?,[0-9]+?)\\s*-|([0-9]++)\\s*-)(([0-9]+?,[0-9]+?)|([0-9]++))\\s*([a-zA-Z]+?)");
-
-    public static final Pattern META_GRAIN_FRACTION_C =
-        Pattern.compile("(<|>){1}\\s*((([0-9]+?,[0-9]+?)|([0-9]++))\\s*(\\w+))");
-
-
-    protected List<ImportSedimentYield> sedimentYields;
-
-    protected ImportSedimentYield[] current;
-
-    protected ImportGrainFraction grainFraction;
-
-    protected ImportUnit unit;
-
-    protected String description;
-
-    protected String[] columnNames;
-
-
-    public SedimentYieldParser() {
-        sedimentYields = new ArrayList<ImportSedimentYield>();
-    }
-
-
-    @Override
-    public void parse(File file) throws IOException {
-        description = file.getName();
-
-        super.parse(file);
-    }
-
-
-    @Override
-    protected void reset() {
-        current       = null;
-        grainFraction = null;
-        unit          = null;
-    }
-
-
-    @Override
-    protected void finish() {
-        if (current != null) {
-            for (ImportSedimentYield isy: current) {
-                sedimentYields.add(isy);
-            }
-        }
-
-        description = null;
-    }
-
-
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        if (line.startsWith(START_META_CHAR)) {
-            handleMetaLine(stripMetaLine(line));
-        }
-        else {
-            handleDataLine(line);
-        }
-    }
-
-
-    protected void handleMetaLine(String line) {
-        if (handleMetaUnit(line)) {
-            return;
-        }
-        else if (handleMetaFraction(line)) {
-            return;
-        }
-        else if (handleColumnNames(line)) {
-            return;
-        }
-        else {
-            log.warn("SYP: Unknown meta line: '" + line + "'");
-        }
-    }
-
-
-    protected boolean handleMetaUnit(String line) {
-        Matcher m = META_UNIT.matcher(line);
-
-        if (m.matches()) {
-            unit = new ImportUnit(m.group(1));
-            return true;
-        }
-
-        return false;
-    }
-
-
-    public boolean handleMetaFraction(String line) {
-        Matcher m = META_FRACTION.matcher(line);
-
-        if (m.matches()) {
-            String tmp = m.group(1);
-
-            this.grainFraction = buildGrainFraction(tmp);
-
-            return true;
-        }
-        else if (line.startsWith(FRAKTION_START)) {
-            String newLine = line.replace(FRAKTION_START, "").trim();
-            if (newLine.length() == 0) {
-                log.debug("Found total grain fraction.");
-                this.grainFraction = new ImportGrainFraction(GrainFraction.TOTAL);
-
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-
-    public boolean handleColumnNames(String line) {
-        Matcher m = META_COLUMN_NAMES.matcher(line);
-
-        if (m.matches()) {
-            columnNames = line.split(SEPERATOR_CHAR);
-
-            initializeSedimentYields();
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    protected void handleDataLine(String line) {
-        String[] vals = line.split(SEPERATOR_CHAR);
-
-        if (vals == null || vals.length < columnNames.length-1) {
-            log.warn("SYP: skip invalid data line: '" + line + "'");
-            return;
-        }
-
-        try {
-            Double km = nf.parse(vals[0]).doubleValue();
-
-            for (int i = 1, n = columnNames.length-1; i < n; i++) {
-                String curVal = vals[i];
-
-                if (curVal != null && curVal.length() > 0) {
-                    current[i-1].addValue(new ImportSedimentYieldValue(
-                        km, nf.parse(vals[i]).doubleValue()
-                    ));
-                }
-            }
-        }
-        catch (ParseException pe) {
-            log.warn("SYP: unparseable number in data row '" + line + "':", pe);
-        }
-    }
-
-
-    private void initializeSedimentYields() {
-        // skip first column (Fluss-km) and last column (Hinweise)
-        current = new ImportSedimentYield[columnNames.length-2];
-
-        for (int i = 0, n = columnNames.length; i < n-2; i++) {
-            current[i] = new ImportSedimentYield(this.description);
-            current[i].setTimeInterval(getTimeInterval(columnNames[i+1]));
-            current[i].setUnit(unit);
-            current[i].setGrainFraction(grainFraction);
-        }
-    }
-
-
-    private ImportTimeInterval getTimeInterval(String column) {
-        try {
-            Matcher a = TIMEINTERVAL_EPOCH.matcher(column);
-            if (a.matches()) {
-                int yearA = nf.parse(a.group(1)).intValue();
-                int yearB = nf.parse(a.group(2)).intValue();
-
-                return new ImportTimeInterval(
-                    getDateFromYear(yearA),
-                    getDateFromYear(yearB)
-                );
-            }
-
-            Matcher b = TIMEINTERVAL_SINGLE.matcher(column);
-            if (b.matches()) {
-                int year = nf.parse(b.group(1)).intValue();
-
-                return new ImportTimeInterval(getDateFromYear(year));
-            }
-
-            log.warn("SYP: Unknown time interval string: '" + column + "'");
-        }
-        catch (ParseException pe) {
-            log.warn("SYP: Could not parse years: " + column, pe);
-        }
-
-        return null;
-    }
-
-
-    private ImportGrainFraction buildGrainFraction(String gfStr) {
-        Matcher a = META_GRAIN_FRACTION_A.matcher(gfStr);
-        if (a.matches()) {
-            String lowerA = a.group(2);
-            String lowerB = a.group(3);
-
-            String upperA = a.group(4);
-            String upperB = a.group(5);
-
-            String lower = lowerA != null ? lowerA : lowerB;
-            String upper = upperA != null ? upperA : upperB;
-
-            try {
-                return new ImportGrainFraction(
-                    getGrainFractionTypeName(this.description),
-                    nf.parse(lower).doubleValue(),
-                    nf.parse(upper).doubleValue()
-                );
-            }
-            catch (ParseException pe) {
-                log.warn("SYP: Could not parse ranges of: '" + gfStr + "'");
-            }
-        }
-
-        Matcher b = META_GRAIN_FRACTION_B.matcher(gfStr);
-        if (b.matches()) {
-            String lowerA  = b.group(4);
-            String lowerB  = b.group(5);
-            String upperA  = b.group(6);
-            String upperB  = b.group(7);
-
-            String lower = lowerA != null ? lowerA : lowerB;
-            String upper = upperA != null ? upperA : upperB;
-
-            try {
-                return new ImportGrainFraction(
-                    getGrainFractionTypeName(this.description),
-                    nf.parse(lower).doubleValue(),
-                    nf.parse(upper).doubleValue()
-                );
-            }
-            catch (ParseException pe) {
-                log.warn("SYP: Could not parse ranges of: '" + gfStr + "'");
-            }
-        }
-
-        Matcher c = META_GRAIN_FRACTION_C.matcher(gfStr);
-        if (c.matches()) {
-            String oper     = c.group(1);
-            String valueStr = c.group(3);
-
-            try {
-                Double value = nf.parse(valueStr).doubleValue();
-
-                if (oper.equals(">")) {
-                    return new ImportGrainFraction(
-                        getGrainFractionTypeName(this.description),
-                        value,
-                        null
-                    );
-                }
-                else {
-                    return new ImportGrainFraction(
-                        getGrainFractionTypeName(this.description),
-                        null,
-                        value
-                    );
-                }
-            }
-            catch (ParseException pe) {
-                log.warn("SYP: Could not parse ranges of: '" + gfStr + "'");    
-            }
-        }
-
-        log.warn("SYP: Unknown grain fraction: '" + gfStr + "'");
-
-        return null;
-    }
-
-
-    public static String getGrainFractionTypeName(String filename) {
-        if (Pattern.matches(FRACTION_COARSE_STR, filename)) {
-	    return GrainFraction.COARSE;
-        }
-        else if (Pattern.matches(FRACTION_FINE_MIDDLE_STR, filename)) {
-            return GrainFraction.FINE_MIDDLE;
-        }
-        else if (Pattern.matches(FRACTION_SUSP_SAND_BED, filename) ||
-            Pattern.matches(FRACTION_SUSP_SAND_BED_EPOCH, filename)) {
-            return GrainFraction.SUSP_SAND_BED;
-        }
-        else if (Pattern.matches(FRACTION_SUSP_SAND, filename)) {
-            return GrainFraction.SUSP_SAND;
-        }
-	else if (Pattern.matches(FRACTION_SAND, filename)) {
-            return GrainFraction.SAND;
-        }
-        else if (Pattern.matches(FRACTION_SUSPENDED_SEDIMENT, filename)) {
-            return GrainFraction.SUSPENDED_SEDIMENT;
-        }
-        else if (Pattern.matches(FRACTION_TOTAL, filename)) {
-            return GrainFraction.TOTAL;
-        }
-        else {
-            log.warn("SYP: Unknown grain fraction '" + filename + "'");
-            return "unknown";
-        }
-    }
-
-
-    public List<ImportSedimentYield> getSedimentYields() {
-        return sedimentYields;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/StaFileParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/StaFileParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,338 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.LineNumberReader;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-
-import java.math.BigDecimal;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportMainValueType;
-import de.intevation.flys.importer.ImportMainValue;
-import de.intevation.flys.importer.ImportNamedMainValue;
-import de.intevation.flys.importer.ImportGauge;
-import de.intevation.flys.importer.ImportTimeInterval;
-import de.intevation.flys.utils.DateGuesser;
-
-public class StaFileParser
-{
-    private static Logger log = Logger.getLogger(StaFileParser.class);
-
-    public static final String ENCODING = "ISO-8859-1";
-
-    public static final String TYPES =
-        System.getProperty("flys.backend.main.value.types", "QWTD");
-
-    public static final boolean NOT_PARSE_GAUGE_NUMBERS =
-        Boolean.getBoolean("flys.backend.sta.not.parse.gauge.numbers");
-
-    public static final Pattern QWTD_ =
-        Pattern.compile("\\s*([^\\s]+)\\s+([^\\s]+)\\s+([" +
-            Pattern.quote(TYPES) + "]).*");
-
-    public static final class NameAndTimeInterval {
-        private String             name;
-        private ImportTimeInterval timeInterval;
-
-        public NameAndTimeInterval(String name) {
-            this(name, null);
-        }
-
-        public NameAndTimeInterval(String name, ImportTimeInterval timeInterval) {
-            this.name         = name;
-            this.timeInterval = timeInterval;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public ImportTimeInterval getTimeInterval() {
-            return timeInterval;
-        }
-    } // class NameAndTimeInterval
-
-    public StaFileParser() {
-    }
-
-    public boolean parse(ImportGauge gauge) throws IOException {
-
-        File file = gauge.getStaFile();
-
-        log.info("parsing STA file: " + file);
-        LineNumberReader in = null;
-        try {
-            in =
-                new LineNumberReader(
-                new InputStreamReader(
-                new FileInputStream(file), ENCODING));
-
-            String line = in.readLine();
-
-            if (line == null) {
-                log.warn("STA file is empty.");
-                return false;
-            }
-
-            if (line.length() < 37) {
-                log.warn("First line in STA file is too short.");
-                return false;
-            }
-
-            String gaugeName = line.substring(16, 28).trim();
-
-            Long gaugeNumber = null;
-
-            if (!NOT_PARSE_GAUGE_NUMBERS) {
-                String gaugeNumberString = line.substring(8, 16).trim();
-
-                try {
-                    gaugeNumber = Long.parseLong(gaugeNumberString);
-                }
-                catch (NumberFormatException nfe) {
-                    log.warn("STA: '" + gaugeNumberString +
-                        "' is not a valid long number.");
-                }
-            }
-
-            gauge.setName(gaugeName);
-            gauge.setOfficialNumber(gaugeNumber);
-
-            if (log.isDebugEnabled()) {
-                log.debug(
-                    "name/number: '" + gaugeName + "' '" + gaugeNumber + "'");
-            }
-
-            String [] values = line.substring(38).trim().split("\\s+", 2);
-
-            if (values.length < 2) {
-                log.warn("STA: Not enough columns for aeo and datum.");
-            }
-            try {
-                gauge.setAeo(new BigDecimal(values[0].replace(",", ".")));
-                gauge.setDatum(new BigDecimal(values[1].replace(",", ".")));
-            }
-            catch (NumberFormatException nfe) {
-                log.warn("STA: cannot parse aeo or datum.");
-                return false;
-            }
-
-            line = in.readLine();
-
-            if (line == null) {
-                log.warn("STA file has not enough lines");
-                return false;
-            }
-
-            if (line.length() < 36) {
-                log.warn("STA: second line is too short");
-                return false;
-            }
-
-            try {
-                gauge.setStation(
-                    new BigDecimal(line.substring(29, 36).trim()));
-            }
-            catch (NumberFormatException nfe) {
-                log.warn("STA: parsing of the datum of the gauge failed");
-                return false;
-            }
-
-            // overread the next six lines
-            for (int i = 0; i < 6; ++i) {
-                if ((line = in.readLine()) == null) {
-                    log.warn("STA file is too short");
-                    return false;
-                }
-            }
-
-            HashMap<String, ImportMainValueType> types =
-                new HashMap<String, ImportMainValueType>();
-
-            ArrayList<ImportNamedMainValue> namedMainValues =
-                new ArrayList<ImportNamedMainValue>();
-
-            ArrayList<ImportMainValue> mainValues =
-                new ArrayList<ImportMainValue>();
-
-            while ((line = in.readLine()) != null) {
-                Matcher m = QWTD_.matcher(line);
-                if (m.matches()) {
-                    BigDecimal value;
-                    try {
-                        value = new BigDecimal(m.group(2).replace(",", "."));
-                    }
-                    catch (NumberFormatException nfe) {
-                        log.warn("STA: value not parseable in line "
-                            + in.getLineNumber());
-                        continue;
-                    }
-                    String typeString = m.group(3);
-                    log.debug("\t type: " + typeString);
-                    ImportMainValueType type = types.get(typeString);
-                    if (type == null) {
-                        type = new ImportMainValueType(typeString);
-                        types.put(typeString, type);
-                    }
-                    String name = m.group(1);
-                    NameAndTimeInterval nat = parseName(name);
-                    ImportNamedMainValue namedMainValue =
-                        new ImportNamedMainValue(type, nat.getName());
-                    namedMainValues.add(namedMainValue);
-
-                    ImportMainValue mainValue = new ImportMainValue(
-                        gauge,
-                        namedMainValue,
-                        value,
-                        nat.getTimeInterval());
-
-                    mainValues.add(mainValue);
-                }
-                else {
-                    // TODO: treat as a comment
-                }
-            }
-            gauge.setMainValueTypes(
-                new ArrayList<ImportMainValueType>(types.values()));
-            gauge.setNamedMainValues(namedMainValues);
-            gauge.setMainValues(mainValues);
-        }
-        finally {
-            if (in != null) {
-                in.close();
-            }
-        }
-        log.info("finished parsing STA file: " + file);
-        return true;
-    }
-
-    protected NameAndTimeInterval parseName(String name) {
-        List<String> result = new ArrayList<String>();
-
-        unbracket(name, 0, result);
-
-        int length = result.size();
-
-        if (length < 1) { // Should not happen.
-            return new NameAndTimeInterval(name);
-        }
-
-        if (length == 1) { // No date at all -> use first part.
-            return new NameAndTimeInterval(result.get(0).trim());
-        }
-
-        if (length == 2) { // e.g. W(1994) or W(1994 - 1999)
-            String type = result.get(0).trim();
-
-            ImportTimeInterval timeInterval = getTimeInterval(
-                result.get(1).trim());
-
-            if (timeInterval == null) { // No date at all.
-                type = name;
-            }
-
-            return new NameAndTimeInterval(type, timeInterval);
-        }
-
-        if (length == 3) { // e.g W(Q(1994)) or W(Q(1994 - 1999))
-
-            String type =
-                result.get(0).trim() + "(" + 
-                result.get(1).trim() + ")";
-
-            ImportTimeInterval timeInterval = getTimeInterval(
-                result.get(2).trim());
-
-            if (timeInterval == null) { // No date at all.
-                type = name;
-            }
-
-            return new NameAndTimeInterval(type, timeInterval);
-        }
-
-        // more than 3 elements return unmodified.
-
-        return new NameAndTimeInterval(name);
-    }
-
-    private static ImportTimeInterval getTimeInterval(String datePart) {
-
-        int minus = datePart.indexOf('-');
-
-        if (minus < 0) { // '-' not found
-
-            Date date = null;
-            try {
-                date = DateGuesser.guessDate(datePart);
-            }
-            catch (IllegalArgumentException iae) {
-                log.warn("STA: Invalid date '" + datePart + "'");
-                return null;
-            }
-
-            return new ImportTimeInterval(date);
-        }
-
-        // Found '-' so we have <from> - <to>
-        String startPart = datePart.substring(0, minus).trim();
-        String endPart   = datePart.substring(minus).trim();
-
-        Date startDate = null;
-        Date endDate   = null;
-
-        try {
-            startDate = DateGuesser.guessDate(startPart);
-        }
-        catch (IllegalArgumentException iae) {
-            log.warn("STA: Invalid start date '" + startPart + "'");
-        }
-
-        try {
-            endDate = DateGuesser.guessDate(endPart);
-        }
-        catch (IllegalArgumentException iae) {
-            log.warn("STA: Invalid end date '" + endPart + "'");
-        }
-
-        if (startDate == null) {
-            log.warn("STA: Need start date.");
-            return null;
-        }
-
-        return new ImportTimeInterval(startDate, endDate);
-    }
-
-    private static int unbracket(String s, int index, List<String> result) {
-        StringBuilder sb = new StringBuilder();
-        int length = s.length();
-        while (index < length) {
-            char c = s.charAt(index);
-            switch (c) {
-                case '(':
-                    index = unbracket(s, index+1, result);
-                    break;
-                case ')':
-                    result.add(0, sb.toString());
-                    return index+1;
-                default:
-                    sb.append(c);
-                    ++index;
-            }
-        }
-        result.add(0, sb.toString());
-
-        return index;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/W80CSVParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/W80CSVParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,291 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.importer.XY;
-
-import de.intevation.flys.importer.parsers.tim.Coordinate;
-
-import de.intevation.flys.utils.DateGuesser;
-import de.intevation.flys.utils.EpsilonComparator;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.log4j.Logger;
-
-
-/**
- * To create cross-sections, generate: Map<double,list<xy>> from files
- * in w80/csv format.
- */
-public class W80CSVParser extends LineParser implements CrossSectionParser
-{
-    /** Private logger. */
-    private static Logger logger = Logger.getLogger(W80CSVParser.class);
-
-
-    /** The current line to which add points. */
-    private List<XY> currentLine;
-
-
-    /** Data collected so far, last element will be currentLine. */
-    protected Map<Double, List<XY>> data;
-
-
-    /** Anchor to project to. */
-    private static class Anchor extends Coordinate {
-
-        private static final double EPSILON = 1e-5;
-
-        private double station;
-
-        public Anchor(double x, double y, double z, double station) {
-            super(x, y, z);
-            this.station = station;
-        }
-
-        public boolean sameStation(double station) {
-            return Math.abs(this.station - station) < EPSILON;
-        }
-    }
-
-
-    /** Reference point for simple projection. */
-    private Anchor anchor;
-
-
-    /**
-     * Reference point for distance calculations, introduced to
-     * deal with bends in the lines.
-     * Array has two entrys: first is GK-Right, second GK-High.
-     */
-    private double[] lastPointGK;
-
-
-    /** Measurement date of anchor as listed in w80 file. */
-    private Date anchorDate;
-
-
-    private double distanceToLastPoint(double gkr, double gkh) {
-        double dx = gkr - lastPointGK[0];
-        double dy = gkh - lastPointGK[1];
-        double d  = dx*dx + dy*dy;
-
-        return Math.sqrt(d);
-    }
-
-
-    /** Trivial constructor. */
-    public W80CSVParser() {
-        data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP);
-    }
-
-
-    /**
-     * Get the description of the cross section parsed -
-     * directory name of current file.
-     */
-    @Override
-    public String getDescription() {
-        return getInputFile().getParentFile().getName();
-    }
-
-
-    /** Get the year of this cross sections measurement. */
-    @Override
-    public Integer getYear() {
-        if (anchorDate == null) {
-            return null;
-        }
-        Calendar dateCalendar = Calendar.getInstance();
-        dateCalendar.setTime(anchorDate);
-        return dateCalendar.get(Calendar.YEAR);
-    }
-
-
-    /**
-     * Return the data parsed.
-     * @return map of stations (km) to list of points.
-     */
-    @Override
-    public Map<Double, List<XY>> getData() {
-        return data;
-    }
-
-
-    /** Recursively descend root, ask the callback for every file
-     * found and parse it if callback acks. When done, notify callback. */
-    public void parseW80CSVs(File root, final Callback callback) {
-
-        FileTools.walkTree(root, new FileTools.FileVisitor() {
-            @Override
-            public boolean visit(File file) {
-                if (file.isFile() && file.canRead()
-                && file.getName().toLowerCase().endsWith(".csv")
-                && (callback == null || callback.accept(file))) {
-                    reset();
-                    try {
-                        parse(file);
-                        logger.info("parsing done");
-                        if (callback != null) {
-                            callback.parsed(W80CSVParser.this);
-                        }
-                    }
-                    catch (IOException ioe) {
-                        logger.error("IOException while parsing file");
-                        return false;
-                    }
-                }
-                return true;
-            }
-        });
-    }
-
-
-    /** Called before consuming first line of file. */
-    public void reset() {
-        data.clear();
-        currentLine = new ArrayList<XY>();
-        anchor = null;
-        anchorDate = null;
-        lastPointGK = new double[] {0d,0d};
-    }
-
-
-    /**
-     * Get the Index of the last cross-section lines point.
-     * @return last points index, -1 if not available.
-     */
-    private int getLastPointIdx() {
-        if (currentLine == null || currentLine.isEmpty()) {
-            return -1;
-        }
-        XY lastPoint = this.currentLine.get(currentLine.size()-1);
-        return lastPoint.getIndex();
-    }
-
-
-    private double getLastPointX() {
-        if (currentLine == null || currentLine.isEmpty()) {
-            return 0d;
-        }
-        XY lastPoint = this.currentLine.get(currentLine.size()-1);
-        return lastPoint.getX();
-    }
-
-
-    /**
-     * Add a Point (YZ,Index) to the current cross section line.
-     * @param y The y coordinate of new point.
-     * @param z The z coordinate of new point.
-     * @param idx Ignored, the parameter of new point.
-     * @return true if point could been added, false otherwise (e.g. not
-     *         parsable y or z values.
-     */
-    private boolean addPoint(double gkr, double gkh, double height, String idx) {
-        // Calculate distance between this and lst point (add distances).
-        double d = distanceToLastPoint(gkr, gkh);
-        double totalX = getLastPointX() + d;
-
-        // We ignore idx, and increment instead.
-        int index;
-        int lastPointIdx = getLastPointIdx();
-        if (lastPointIdx <= 0) {
-            index = 1;
-        } else {
-            index = lastPointIdx + 1;
-        }
-
-        this.lastPointGK[0] = gkr;
-        this.lastPointGK[1] = gkh;
-        currentLine.add(new XY(totalX, height/1000d, index));
-        return true;
-    }
-
-    // As per documentation:
-    // BW;WPA;ST;UF;PN;LS;BL-LS;Y;X;Z;DL;LZK;SY;SX;SZ;BML;HS;BL-HS;H;DH;HZK;SH;WVA;BMH;BMP;DST;DB;LDS;LKZ;
-
-
-    /**
-     * Called for each line. Try to extract info from a w80 line.
-     * @param lineNum Number of line (starting with 1).
-     */
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        // First two lines are 'comment'-like.
-        if (lineNum == 1 || lineNum == 2) {
-            return;
-        }
-        // The 'shore' field shows which side of the river the shore is measured.
-        // Therefore, the points have to be added in the correct order (also
-        // because later distances are calculated which cannot be
-        // negative.
-        String[] fields = line.split(";");
-        String station = fields[2];
-        String shore   = fields[3];
-        // TODO: There is 'station' and a 'shore'-code behind.
-        // 1 = left, 2 = right. none = middle
-        String pointIndex = line.substring(16,21);
-        // For GK, first seven digits are of interest.
-        String gkRight = fields[7];
-        String gkHigh  = fields[8];
-        String date    = fields[10];
-        String height  = fields[18];
-        String dateH   = line.substring(54,60);
-        String dateDec = line.substring(64,70);
-
-        double stationKm = Double.parseDouble(station) / 1000d;
-        double gkRightKm = Double.parseDouble(gkRight.replace(",","."));//.substring(0,7));
-        double gkHighKm  = Double.parseDouble(gkHigh.replace(",","."));//.substring(0,7));
-        double heightM   = Double.parseDouble(height.replace(",","."));
-
-        // New (or first) line.
-        if (anchor == null || !anchor.sameStation(stationKm)) {
-            anchor = new Anchor(gkRightKm, gkHighKm, heightM, stationKm);
-            lastPointGK[0] = gkRightKm;
-            lastPointGK[1] = gkHighKm;
-            currentLine = new ArrayList<XY>();
-            data.put(stationKm, currentLine);
-            currentLine.add(new XY(0d, heightM, 0));
-            try {
-                anchorDate = DateGuesser.guessDate(date);
-            }
-            catch (IllegalArgumentException iae) {
-                logger.warn("W80CSV: Invalid date '" + date + "'.");
-            }
-        }
-        else {
-            addPoint(gkRightKm, gkHighKm, heightM, pointIndex);
-        }
-    }
-
-
-    /** Called when file is fully consumed. */
-    @Override
-    protected void finish() {
-        logger.info("Parsed " + data.size() + " lines");
-    }
-
-
-    /** Parses files given as arguments. */
-    public static void main(String [] args) {
-
-        W80CSVParser parser = new W80CSVParser();
-
-        logger.warn("Start parsing files.");
-        for (String arg: args) {
-            logger.warn("Parsing a file.");
-            parser.parseW80CSVs(new File(arg), null);
-        }
-        logger.error("Finished parsing files.");
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/W80Parser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/W80Parser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,289 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.flys.importer.XY;
-
-import de.intevation.flys.importer.parsers.tim.Coordinate;
-
-import de.intevation.flys.utils.DateGuesser;
-import de.intevation.flys.utils.EpsilonComparator;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.log4j.Logger;
-
-
-/**
- * To create cross-sections, generate: Map<double,list<xy>> from files
- * in w80 format.
- */
-public class W80Parser extends LineParser implements CrossSectionParser
-{
-    /** Private logger. */
-    private static Logger logger = Logger.getLogger(W80Parser.class);
-
-
-    /** The current line to which add points. */
-    private List<XY> currentLine;
-
-
-    /** Data collected so far, last element will be currentLine. */
-    protected Map<Double, List<XY>> data;
-
-
-    /** Anchor to project to. */
-    private static class Anchor extends Coordinate {
-
-        private static final double EPSILON = 1e-5;
-
-        private double station;
-
-        public Anchor(double x, double y, double z, double station) {
-            super(x, y, z);
-            this.station = station;
-        }
-
-        public boolean sameStation(double station) {
-            return Math.abs(this.station - station) < EPSILON;
-        }
-    }
-
-
-    /** Reference point for simple projection. */
-    private Anchor anchor;
-
-
-    /**
-     * Reference point for distance calculations, introduced to
-     * deal with bends in the lines.
-     * Array has two entrys: first is GK-Right, second GK-High.
-     */
-    private double[] lastPointGK;
-
-
-    /** Measurement date of anchor as listed in w80 file. */
-    private Date anchorDate;
-
-
-    private double distanceToLastPoint(double gkr, double gkh) {
-        double dx = gkr - lastPointGK[0];
-        double dy = gkh - lastPointGK[1];
-        double d  = dx*dx + dy*dy;
-
-        return Math.sqrt(d);
-    }
-
-
-    /** Trivial constructor. */
-    public W80Parser() {
-        data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP);
-    }
-
-
-    /** Get the description of the cross section parsed. */
-    @Override
-    public String getDescription() {
-        return FileTools.removeExtension(getFileName());
-    }
-
-
-    /** Get the year of this cross sections measurement. */
-    @Override
-    public Integer getYear() {
-        if (anchorDate == null) {
-            return null;
-        }
-        Calendar dateCalendar = Calendar.getInstance();
-        dateCalendar.setTime(anchorDate);
-        return dateCalendar.get(Calendar.YEAR);
-    }
-
-
-    /**
-     * Return the data parsed.
-     * @return map of stations (km) to list of points.
-     */
-    @Override
-    public Map<Double, List<XY>> getData() {
-        return data;
-    }
-
-
-    public void parseW80s(File root, final Callback callback) {
-
-        FileTools.walkTree(root, new FileTools.FileVisitor() {
-            @Override
-            public boolean visit(File file) {
-                if (file.isFile() && file.canRead()
-                && file.getName().toLowerCase().endsWith(".w80")
-                && (callback == null || callback.accept(file))) {
-                    reset();
-                    try {
-                        parse(file);
-                        logger.info("parsing done");
-                        if (callback != null) {
-                            callback.parsed(W80Parser.this);
-                        }
-                    }
-                    catch (IOException ioe) {
-                        logger.error("IOException while parsing file");
-                        return false;
-                    }
-                }
-                return true;
-            }
-        });
-    }
-
-
-    /** Called before consuming first line of file. */
-    public void reset() {
-        data.clear();
-        currentLine = new ArrayList<XY>();
-        anchor = null;
-        anchorDate = null;
-        lastPointGK = new double[] {0d,0d};
-    }
-
-
-    /**
-     * Get the Index of the last cross-section lines point.
-     * @return last points index, -1 if not available.
-     */
-    private int getLastPointIdx() {
-        if (currentLine == null || currentLine.isEmpty()) {
-            return -1;
-        }
-        XY lastPoint = this.currentLine.get(currentLine.size()-1);
-        return lastPoint.getIndex();
-    }
-
-
-    private double getLastPointX() {
-        if (currentLine == null || currentLine.isEmpty()) {
-            return 0d;
-        }
-        XY lastPoint = this.currentLine.get(currentLine.size()-1);
-        return lastPoint.getX();
-    }
-
-
-    /**
-     * Add a Point (YZ,Index) to the current cross section line.
-     * @param y The y coordinate of new point.
-     * @param z The z coordinate of new point.
-     * @param idx Ignored, the parameter of new point.
-     * @return true if point could been added, false otherwise (e.g. not
-     *         parsable y or z values.
-     */
-    private boolean addPoint(double gkr, double gkh, double height, String idx) {
-        // Calculate distance between this and lst point (add distances).
-        double d = distanceToLastPoint(gkr, gkh);
-        double totalX = getLastPointX() + d;
-
-        // We ignore idx, and increment instead.
-        int index;
-        int lastPointIdx = getLastPointIdx();
-        if (lastPointIdx <= 0) {
-            index = 1;
-        } else {
-            index = lastPointIdx + 1;
-        }
-
-        this.lastPointGK[0] = gkr;
-        this.lastPointGK[1] = gkh;
-        currentLine.add(new XY(totalX, height/1000d, index));
-        return true;
-    }
-
-
-    /**
-     * Called for each line. Try to extract info from a w80 line.
-     */
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        // The 'shore' field shows which side of the river the shore is measured.
-        // Therefore, the points have to be added in the correct order (also
-        // because later distances are calculated which cannot be
-        // negative.
-        String pointId = line.substring(0,20);
-        String station = line.substring(9,15);
-        String shore   = line.substring(15,16);
-        // TODO: There is 'station' and a 'shore'-code behind.
-        // 1 = left, 2 = right. none = middle
-        String pointIndex = line.substring(16,21);
-        // For GK, first seven digits are of interest.
-        String gkRight = line.substring(20,30);
-        String gkHigh  = line.substring(30,40);
-        String date    = line.substring(40,46);
-        /* Fields not (yet?) of interest for FLYS
-        String locType = line.substring(46,47);
-        */
-        String height  = line.substring(47,54);
-        String dateH   = line.substring(54,60);
-        /* Fields not (yet?) of interest for FLYS
-        String typeH   = line.substring(60,61);
-        String kindH   = line.substring(61,64);
-        */
-        String dateDec = line.substring(64,70);
-        /* Fields not (yet?) of interest for FLYS
-        String note    = line.substring(70,78);
-        String actual  = line.substring(78);
-        */
-
-        double stationKm = Double.parseDouble(station) / 1000d;
-        double gkRightKm = Double.parseDouble(gkRight.substring(0,7));
-        double gkHighKm  = Double.parseDouble(gkHigh.substring(0,7));
-        double heightM   = Double.parseDouble(height);
-
-        // New (or first) line.
-        if (anchor == null || !anchor.sameStation(stationKm)) {
-            anchor = new Anchor(gkRightKm, gkHighKm, heightM, stationKm);
-            lastPointGK[0] = gkRightKm;
-            lastPointGK[1] = gkHighKm;
-            currentLine = new ArrayList<XY>();
-            data.put(stationKm, currentLine);
-            currentLine.add(new XY(0d, heightM, 0));
-            try {
-                anchorDate = DateGuesser.guessDate(date);
-            }
-            catch (IllegalArgumentException iae) {
-                logger.warn("W80: Invalid date '" + date + "'.");
-            }
-        }
-        else {
-            addPoint(gkRightKm, gkHighKm, heightM, pointIndex);
-        }
-    }
-
-
-    /** Called when file is fully consumed. */
-    @Override
-    protected void finish() {
-        logger.info("Parsed " + data.size() + " lines");
-    }
-
-
-    /** Parses files given as arguments. */
-    public static void main(String [] args) {
-
-        W80Parser parser = new W80Parser();
-
-        logger.warn("Start parsing files.");
-        for (String arg: args) {
-            logger.warn("Parsing a file.");
-            parser.parseW80s(new File(arg), null);
-        }
-        logger.error("Finished parsing files.");
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/WaterlevelDifferencesParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/WaterlevelDifferencesParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,197 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportUnit;
-
-import de.intevation.flys.importer.ImportWst;
-import de.intevation.flys.importer.ImportWstColumn;
-
-
-/**
- * Parse WaterlevelDifferences CSV file.
- */
-public class WaterlevelDifferencesParser extends LineParser {
-
-    private static final Logger log =
-        Logger.getLogger(WaterlevelDifferencesParser.class);
-
-    private static final NumberFormat nf =
-        NumberFormat.getInstance(DEFAULT_LOCALE);
-
-    public static final Pattern META_UNIT =
-        Pattern.compile("^Einheit: \\[(.*)\\].*");
-
-    /** List of parsed differences as ImportWst s. */
-    private List<ImportWst> differences;
-
-    private ImportWstColumn[] columns;
-
-    /** The currently processed dataset. */
-    private ImportWst current;
-
-
-    public WaterlevelDifferencesParser() {
-        differences = new ArrayList<ImportWst>();
-    }
-
-
-    /** Get the differences as wst parsed so far. */
-    public List<ImportWst> getDifferences() {
-        return differences;
-    }
-
-
-    /**
-     * Parse a csv waterleveldifferenceparser and create a ImportWst object
-     * from it.
-     */
-    @Override
-    public void parse(File file) throws IOException {
-        current = new ImportWst(file.getName());
-        current.setKind(7);
-
-        super.parse(file);
-    }
-
-
-    /** No rewind implemented. */
-    @Override
-    protected void reset() {
-    }
-
-
-    @Override
-    protected void finish() {
-        if (columns != null && current != null) {
-            // TODO figure out if its needed, as the columns
-            //      are registered at their construction time.
-            for (ImportWstColumn col: columns) {
-                // TODO place a current.addColumn(col); here?
-            }
-
-            differences.add(current);
-        }
-
-        current = null;
-        columns = null;
-    }
-
-
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        if (line.startsWith(START_META_CHAR)) {
-            handleMetaLine(stripMetaLine(line));
-        }
-        else {
-            handleDataLine(line);
-        }
-    }
-
-
-    private void handleMetaLine(String meta) {
-        if (handleMetaUnit(meta)) {
-            return;
-        }
-        else {
-            handleMetaColumnNames(meta);
-        }
-    }
-
-
-    private boolean handleMetaUnit(String meta) {
-        Matcher m = META_UNIT.matcher(meta);
-
-        if (m.matches()) {
-            String unit = m.group(1);
-            log.debug("Found unit: '" + unit + "'");
-
-            current.setUnit(new ImportUnit(unit));
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    private boolean handleMetaColumnNames(String meta) {
-        Pattern META_COLUMN_NAMES = Pattern.compile("Fluss-km;(.*)");
-        Matcher m = META_COLUMN_NAMES.matcher(meta);
-
-        if (m.matches()) {
-            String colStr = m.group(1);
-            String[] cols = colStr.split(SEPERATOR_CHAR);
-
-            log.debug("Found " + cols.length + " columns.");
-
-            initColumns(cols);
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    private void initColumns(String[] cols) {
-        current.setNumberColumns(cols.length);
-        columns = current.getColumns().toArray(new ImportWstColumn[cols.length]);
-
-        for (int i = 0; i < cols.length; i++) {
-            String name = cols[i].replace("\"", "");
-
-            log.debug("Create new column '" + name + "'");
-            current.getColumn(i).setName(name);
-            current.getColumn(i).setDescription(name);
-        }
-    }
-
-
-    private void handleDataLine(String line) {
-        String[] cols = line.split(SEPERATOR_CHAR);
-
-        if (cols == null || cols.length < 2) {
-            log.warn("skip invalid waterlevel-diff line: '" + line + "'");
-            return;
-        }
-
-        try {
-            Double station = nf.parse(cols[0]).doubleValue();
-
-            for (int i = 0; i < columns.length; i++) {
-                int idx = i+1;
-
-                if (idx >= cols.length) {
-                    log.warn("Insufficient column numbers: " + line);
-                    continue;
-                }
-
-                String value = cols[idx];
-
-                try {
-                    columns[i].addColumnValue(
-                        new BigDecimal(station),
-                        new BigDecimal(nf.parse(value).doubleValue()));
-                }
-                catch (ParseException pe) {
-                    log.warn("Could not parse value: '" + value + "'");
-                }
-            }
-        }
-        catch (ParseException pe) {
-            log.warn("Could not parse station: '" + line + "'");
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/WaterlevelParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/WaterlevelParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,191 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.io.File;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.importer.ImportUnit;
-
-import de.intevation.flys.importer.ImportRange;
-import de.intevation.flys.importer.ImportWst;
-import de.intevation.flys.importer.ImportWstColumn;
-import de.intevation.flys.importer.ImportWstColumnValue;
-import de.intevation.flys.importer.ImportWstQRange;
-
-
-/**
- * Parse CSV Waterlevel files.
- * As these waterlevels are probably used in fixation analysis
- * only, functionality to export them to "fixation"-wsts
- * has been added (the ImportWaterlevel*- stuff is actually
- * not needed to do so.)
- */
-public class WaterlevelParser extends LineParser {
-
-    private static final Logger log = Logger.getLogger(WaterlevelParser.class);
-
-    private static final NumberFormat nf =
-        NumberFormat.getInstance(DEFAULT_LOCALE);
-
-    private static final Pattern META_Q_RANGE =
-        Pattern.compile("Abfluss\\s\\[(.*)\\];(.*)");
-
-    public static final Pattern META_UNIT =
-        Pattern.compile("^Einheit: \\[(.*)\\].*");
-
-    private List<ImportWst> waterlevels;
-
-    private ImportWst current;
-
-    /** The Waterlevel-Wst s will always have but one column. */
-    private ImportWstColumn column;
-
-    /** The current (incomplete) Q Range. */
-    private ImportWstQRange currentQRange;
-
-    /** The current (incomplete) km range for Q Range. */
-    private ImportRange currentRange;
-
-    private String currentDescription;
-
-
-    public WaterlevelParser() {
-        waterlevels = new ArrayList<ImportWst>();
-    }
-
-
-    public List<ImportWst> getWaterlevels() {
-        return waterlevels;
-    }
-
-
-    @Override
-    public void parse(File file) throws IOException {
-        currentDescription = file.getName();
-
-        super.parse(file);
-    }
-
-
-    @Override
-    protected void reset() {
-        currentQRange = null;
-        current       = new ImportWst(currentDescription);
-        current.setNumberColumns(1);
-        column        = current.getColumn(0);
-        column.setName(currentDescription);
-        column.setDescription(currentDescription);
-        current.setKind(6);
-    }
-
-
-    @Override
-    protected void finish() {
-        if (current != null) {
-            if (currentQRange != null) {
-                List<ImportWstColumnValue> cValues = column.getColumnValues();
-                // Set end of range to last station.
-                currentRange.setB(cValues.get(cValues.size() -1).getPosition());
-                currentQRange.setRange(currentRange);
-                column.addColumnQRange(currentQRange);
-            }
-
-            waterlevels.add(current);
-        }
-    }
-
-    @Override
-    protected void handleLine(int lineNum, String line) {
-        if (line.startsWith(START_META_CHAR)) {
-            handleMetaLine(stripMetaLine(line));
-            return;
-        }
-        else if (handleQRange(line)) {
-            return;
-        }
-        else {
-            handleDataLine(line);
-            return;
-        }
-    }
-
-
-    private void handleMetaLine(String meta) {
-        Matcher m = META_UNIT.matcher(meta);
-
-        if (m.matches()) {
-            String unit = m.group(1);
-            log.debug("Found unit: '" + unit + "'");
-
-            current.setUnit(new ImportUnit(unit));
-        }
-    }
-
-
-    private boolean handleQRange(String line) {
-        Matcher m = META_Q_RANGE.matcher(line);
-
-        if (m.matches()) {
-            String unitStr  = m.group(1);
-            String valueStr = m.group(2);
-            try {
-                if (currentQRange != null) {
-                    // Finish off the last one.
-                    List<ImportWstColumnValue> cValues = column.getColumnValues();
-                    // Set end of range to last station.
-                    currentRange.setB(cValues.get(cValues.size() -1).getPosition());
-                    currentQRange.setRange(currentRange);
-                    column.addColumnQRange(currentQRange);
-                }
-                currentQRange = new ImportWstQRange(null,
-                    new BigDecimal(nf.parse(valueStr).doubleValue()));
-                currentRange = new ImportRange();
-
-                log.debug("Found new Q range: Q=" + valueStr);
-
-                return true;
-            }
-            catch (ParseException pe) {
-                log.warn("Unparseable Q range: '" + line + "'");
-            }
-        }
-
-        return false;
-    }
-
-
-    private void handleDataLine(String line) {
-        String[] cols = line.split(SEPERATOR_CHAR);
-
-        if (cols == null || cols.length < 2) {
-            log.warn("skip invalid waterlevel line: '" + line + "'");
-            return;
-        }
-
-        try {
-            // Store the value and remember the position for QRange, if needed.
-            Double station = nf.parse(cols[0]).doubleValue();
-            Double value   = nf.parse(cols[1]).doubleValue();
-
-            BigDecimal stationBD = new BigDecimal(station);
-
-            column.addColumnValue(stationBD, new BigDecimal(value));
-
-            if (currentRange.getA() == null) {
-                currentRange.setA(stationBD);
-            }
-        }
-        catch (ParseException pe) {
-            log.warn("Unparseable number in data row: " + line);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/WstParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/WstParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,464 +0,0 @@
-package de.intevation.flys.importer.parsers;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.LineNumberReader;
-import java.io.InputStreamReader;
-import java.io.FileInputStream;
-
-import java.text.NumberFormat;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.utils.StringUtil;
-import de.intevation.flys.utils.DateGuesser;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-
-import java.math.BigDecimal;
-
-import de.intevation.flys.importer.ImportWstQRange;
-import de.intevation.flys.importer.ImportWstColumn;
-import de.intevation.flys.importer.ImportTimeInterval;
-import de.intevation.flys.importer.ImportRange;
-import de.intevation.flys.importer.ImportUnit;
-import de.intevation.flys.importer.ImportWst;
-
-public class WstParser
-{
-    private static Logger log = Logger.getLogger(WstParser.class);
-
-    public static final String COLUMN_BEZ_TEXT   = "column-bez-text";
-    public static final String COLUMN_BEZ_BREITE = "column-bez-breite";
-    public static final String COLUMN_QUELLE     = "column-quelle";
-    public static final String COLUMN_DATUM      = "column-datum";
-
-    public static final BigDecimal UNDEFINED_ZERO =
-        new BigDecimal(0.0);
-    public static final BigDecimal MIN_RANGE =
-        new BigDecimal(-Double.MAX_VALUE);
-    public static final BigDecimal MAX_RANGE =
-        new BigDecimal(Double.MAX_VALUE);
-
-    public static final String ENCODING = "ISO-8859-1";
-
-    public static final Pattern UNIT_COMMENT =
-        Pattern.compile("\\*\\s*[kK][mM]\\s+(.+)");
-
-    public static final Pattern UNIT =
-        Pattern.compile("[^\\[]*\\[([^]]+)\\].*");
-
-    public static final double INTERVAL_GAP = 0.00001d;
-
-    protected ImportWst wst;
-
-    protected ImportRange lastRange;
-
-    public WstParser() {
-    }
-
-    public ImportWst getWst() {
-        return wst;
-    }
-
-    public void setWst(ImportWst wst) {
-        this.wst = wst;
-    }
-
-    public ImportTimeInterval guessDate(String string) {
-        try {
-            return new ImportTimeInterval(
-                DateGuesser.guessDate(string));
-        }
-        catch (IllegalArgumentException iae) {
-        }
-        return null;
-    }
-
-    public void parse(File file) throws IOException {
-
-        log.info("Parsing WST file '" + file + "'");
-
-        wst = new ImportWst(file.getName());
-
-        LineNumberReader in = null;
-        try {
-            in =
-                new LineNumberReader(
-                new InputStreamReader(
-                new FileInputStream(file), ENCODING));
-
-            String input;
-            boolean first = true;
-            int columnCount = 0;
-
-            String [] lsBezeichner   = null;
-            String [] langBezeichner = null;
-            int    [] colNaWidths    = null;
-            String [] quellen        = null;
-            String [] daten          = null;
-
-            BigDecimal [] aktAbfluesse   = null;
-            BigDecimal [] firstAbfluesse = null;
-
-            BigDecimal minKm   = MAX_RANGE;
-            BigDecimal maxKm   = MIN_RANGE;
-            BigDecimal kmHist1 = null;
-            BigDecimal kmHist2 = null;
-
-            boolean columnHeaderChecked = false;
-
-            String einheit = "Wasserstand [NN + m]";
-
-            HashSet<BigDecimal> kms = new HashSet<BigDecimal>();
-
-            while ((input = in.readLine()) != null) {
-                String line = input;
-                if (first) { // fetch number of columns
-                    if ((line = line.trim()).length() == 0) {
-                        continue;
-                    }
-                    try {
-                        columnCount = Integer.parseInt(line);
-                        if (columnCount <= 0) {
-                            throw new NumberFormatException(
-                                "number columns <= 0");
-                        }
-                        log.debug("Number of columns: " + columnCount);
-                        wst.setNumberColumns(columnCount);
-                        lsBezeichner = new String[columnCount];
-                    }
-                    catch (NumberFormatException nfe) {
-                        log.warn("WST: invalid number.", nfe);
-                        continue;
-                    }
-                    first = false;
-                    continue;
-                }
-
-                line = line.replace(',', '.');
-
-                if (line.startsWith("*\u001f")) {
-                    BigDecimal [] data =
-                        parseLineAsDouble(line, columnCount, false, true);
-
-                    if (aktAbfluesse != null) {
-                        if (kmHist1 != null && kmHist2 != null
-                        && kmHist1.compareTo(kmHist2) < 0) {
-                            BigDecimal t = minKm; minKm = maxKm; maxKm = t;
-                        }
-                        addInterval(minKm, maxKm, aktAbfluesse);
-                        minKm = MAX_RANGE;
-                        maxKm = MIN_RANGE;
-                    }
-
-                    aktAbfluesse = new BigDecimal[columnCount];
-                    log.debug("new q range: " + columnCount);
-                    for (int i = 0; i < Math.min(columnCount, data.length); ++i) {
-                        if (data[i] != null) {
-                            log.debug("  column: " + data[i]);
-                            aktAbfluesse[i] = data[i];
-                        }
-                    }
-
-                    if (firstAbfluesse == null) {
-                        firstAbfluesse = (BigDecimal [])aktAbfluesse.clone();
-                    }
-                    continue;
-                }
-
-                if (line.startsWith("*!")) {
-                    String spezial = line.substring(2).trim();
-
-                    if (spezial.length() == 0) {
-                        continue;
-                    }
-
-                    if (spezial.startsWith(COLUMN_BEZ_TEXT)) {
-                        spezial = spezial.substring(COLUMN_BEZ_TEXT.length()).trim();
-                        if (spezial.length() == 0) {
-                            continue;
-                        }
-                        langBezeichner = StringUtil.splitQuoted(spezial, '"');
-                    }
-                    else if (spezial.startsWith(COLUMN_BEZ_BREITE)) {
-                        spezial = spezial.substring(COLUMN_BEZ_BREITE.length()).trim();
-
-                        if (spezial.length() == 0) {
-                            continue;
-                        }
-
-                        String[] split = spezial.split("\\s+");
-
-                        colNaWidths = new int[split.length];
-                        for (int i=0; i < split.length; i++) {
-                            colNaWidths[i] = Integer.parseInt(split[i]);
-                        }
-                    }
-                    else if (spezial.startsWith(COLUMN_QUELLE)) {
-                        if (spezial.length() == 0) {
-                            continue;
-                        }
-                        quellen = StringUtil.splitQuoted(spezial, '"');
-                    }
-                    else if (spezial.startsWith(COLUMN_DATUM)) {
-                        spezial = spezial.substring(COLUMN_DATUM.length()).trim();
-                        if (spezial.length() == 0) {
-                            continue;
-                        }
-                        daten = StringUtil.splitQuoted(spezial, '"');
-                    }
-                    continue;
-                }
-
-                if (line.length() < 11) {
-                    continue;
-                }
-
-                if (line.startsWith("*")) {
-                    Matcher m = UNIT_COMMENT.matcher(line);
-                    if (m.matches()) {
-                        log.debug("unit comment found");
-                        // XXX: This hack is needed because desktop
-                        // FLYS is broken figuring out the unit
-                        String [] units = m.group(1).split("\\s{2,}");
-                        m = UNIT.matcher(units[0]);
-                        einheit = m.matches() ? m.group(1) : units[0];
-                        log.debug("unit: " + einheit);
-                    }
-                    continue;
-                }
-
-                if (firstAbfluesse != null) {
-                    if (!columnHeaderChecked) {
-                        int unknownCount = 0;
-                        HashSet<String> uniqueColumnNames =
-                            new HashSet<String>();
-                        for (int i = 0; i < lsBezeichner.length; ++i) {
-                            if (lsBezeichner[i] == null
-                            || lsBezeichner[i].length() == 0) {
-                                double q = firstAbfluesse[i].doubleValue();
-                                if (q < 0.001) {
-                                    lsBezeichner[i] =
-                                        "<unbekannt #" + unknownCount + ">";
-                                    ++unknownCount;
-                                }
-                                else {
-                                    lsBezeichner[i] = "Q="+format(q);
-                                }
-                            }
-                            String candidate = lsBezeichner[i];
-                            int collision = 1;
-                            while (!uniqueColumnNames.add(candidate)) {
-                                candidate = lsBezeichner[i] +
-                                    " (" + collision + ")";
-                                ++collision;
-                            }
-                            ImportWstColumn iwc = wst.getColumn(i);
-                            iwc.setName(candidate);
-                            String potentialDate = daten != null && i < daten.length
-                                ? daten[i]
-                                : candidate;
-                            iwc.setTimeInterval(guessDate(potentialDate));
-                        }
-                        columnHeaderChecked = true;
-                    }
-
-                    BigDecimal [] data =
-                        parseLineAsDouble(line, columnCount, true, false);
-
-                    BigDecimal kaem = data[0];
-
-                    if (!kms.add(kaem)) {
-                        log.warn(
-                            "WST: km " + kaem +
-                            " (line " + in.getLineNumber() +
-                            ") found more than once. -> ignored");
-                        continue;
-                    }
-
-                    kmHist2 = kmHist1;
-                    kmHist1 = kaem;
-
-                    if (kaem.compareTo(minKm) < 0) {
-                        minKm = kaem;
-                    }
-                    if (kaem.compareTo(maxKm) > 0) {
-                        maxKm = kaem;
-                    }
-
-                    // extract values
-                    for (int i = 0; i < columnCount; ++i) {
-                        addValue(kaem, data[i+1], i);
-                    }
-
-                }
-                else { // firstAbfluesse == null
-                    if (langBezeichner != null) {
-                        lsBezeichner = StringUtil.fitArray(
-                            langBezeichner, lsBezeichner);
-                    }
-                    else if (colNaWidths != null) {
-                        for (int j = 0, i = 0, N = input.length();
-                             j < colNaWidths.length && i < N;
-                             i += colNaWidths[j++]
-                        ) {
-                            lsBezeichner[j] = input.substring(
-                                i, i+colNaWidths[j]).trim();
-                        }
-                    }
-                    else {
-                        // first column begins at position 8 in line
-                        for (int i = 8, col = 0; i < input.length(); i += 9) {
-                            if ((i + 9) > input.length()) {
-                                i = input.length() - 10;
-                            }
-                            // one column header is 9 chars wide
-                            lsBezeichner[col++] =
-                                input.substring(i, i + 9).trim();
-
-                            if (col == lsBezeichner.length) {
-                                break;
-                            }
-                        }
-                    }
-                }
-
-            } // for all lines in WST file
-
-            wst.setUnit(new ImportUnit(einheit));
-
-            if (kmHist1 != null && kmHist2 != null
-            && kmHist1.compareTo(kmHist2) < 0) {
-                BigDecimal t = minKm; minKm = maxKm; maxKm = t;
-            }
-            addInterval(minKm, maxKm, aktAbfluesse);
-
-            fixRangesOrder();
-        }
-        finally {
-            if (in != null) {
-                in.close();
-            }
-        }
-    }
-
-    protected void fixRangesOrder() {
-        wst.fixRangesOrder();
-    }
-
-    protected void addValue(BigDecimal km, BigDecimal w, int index) {
-        if (w != null) {
-            ImportWstColumn column = wst.getColumn(index);
-            column.addColumnValue(km, w);
-        }
-    }
-
-    private static final NumberFormat NF = getNumberFormat();
-
-    private static final NumberFormat getNumberFormat() {
-        NumberFormat nf = NumberFormat.getInstance();
-        nf.setMinimumFractionDigits(2);
-        nf.setMaximumFractionDigits(2);
-        return nf;
-    }
-
-    protected static String format(double value) {
-        return NF.format(value);
-    }
-
-    protected void addInterval(
-        BigDecimal    from,
-        BigDecimal    to,
-        BigDecimal [] values
-    ) {
-        log.debug("addInterval: " + from + " " + to);
-
-        if (values == null || from == MAX_RANGE || from == MIN_RANGE) {
-            return;
-        }
-
-        ImportRange range = new ImportRange(from, to);
-
-        // little workaround to make the q ranges tightly fit.
-        // Leave a very small gap to ensure that the range queries
-        // still work.
-
-        if (lastRange != null) {
-            double a1 = lastRange.getA().doubleValue();
-            double b1 = lastRange.getB().doubleValue();
-            double a2 = range.getA().doubleValue();
-
-            if (a1 < b1) {
-                lastRange.setB(new BigDecimal(a2 - INTERVAL_GAP));
-            }
-            else { // a1 >= b1
-                lastRange.setB(new BigDecimal(a2 + INTERVAL_GAP));
-            }
-        }
-
-        for (int i = 0; i < values.length; ++i) {
-            ImportWstColumn column = wst.getColumn(i);
-            ImportWstQRange wstQRange = new ImportWstQRange(range, values[i]);
-            column.addColumnQRange(wstQRange);
-        }
-
-        lastRange = range;
-    }
-
-    private static final BigDecimal [] parseLineAsDouble(
-        String  line,
-        int     count,
-        boolean bStation,
-        boolean bParseEmptyAsZero
-    ) {
-        String [] tokens = parseLine(line, count, bStation);
-
-        BigDecimal [] doubles = new BigDecimal[tokens.length];
-
-        for (int i = 0; i < doubles.length; ++i) {
-            String token = tokens[i].trim();
-            if (token.length() != 0) {
-                doubles[i] = new BigDecimal(token);
-            }
-            else if (bParseEmptyAsZero) {
-                doubles[i] = UNDEFINED_ZERO;
-            }
-        }
-
-        return doubles;
-    }
-
-    private static String [] parseLine(
-        String  line,
-        int     tokenCount,
-        boolean bParseStation
-    ) {
-        ArrayList<String> strings = new ArrayList<String>();
-
-        if (bParseStation) {
-            if (line.length() < 8) {
-                throw new IllegalArgumentException("station too short");
-            }
-            strings.add(line.substring(0, 8));
-        }
-
-        int pos = 9;
-        for (int i = 0; i < tokenCount; ++i) {
-            if (line.length() >= pos + 8) {
-                strings.add(line.substring(pos, pos + 8));
-            }
-            else {
-                strings.add("");
-            }
-            pos += 9;
-        }
-
-        return strings.toArray(new String[strings.size()]);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/tim/Coordinate.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/tim/Coordinate.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-package de.intevation.flys.importer.parsers.tim;
-
-/** X,Y,Z- triple. */
-public class Coordinate
-{
-    public double x;
-    public double y;
-    public double z;
-
-    public Coordinate() {
-    }
-
-    public Coordinate(Coordinate c) {
-        this(c.x, c.y, c.z);
-    }
-
-    public Coordinate(double x, double y) {
-        this(x, y, 0d);
-    }
-
-    public Coordinate(double x, double y, double z) {
-        this.x = x;
-        this.y = y;
-        this.z = z;
-    }
-
-    public double getX() {
-        return this.x;
-    }
-
-    public double getY() {
-        return this.y;
-    }
-
-    public final double distanceSqr(double ox, double oy) {
-        double dx = x - ox;
-        double dy = y - oy;
-        return dx*dx + dy*dy;
-    }
-
-    public final double distance(double xo, double yo) {
-        return Math.sqrt(distanceSqr(xo, yo));
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/tim/LexiComparator.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/tim/LexiComparator.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-package de.intevation.flys.importer.parsers.tim;
-
-import java.util.Comparator;
-
-public class LexiComparator implements Comparator<Coordinate> {
-
-    public static final LexiComparator CMP = new LexiComparator();
-
-    @Override
-    public int compare(Coordinate a, Coordinate b) {
-        if (a.x < b.x) return -1;
-        if (a.x > b.x) return +1;
-        if (a.y < b.y) return -1;
-        if (a.y > b.y) return +1;
-        return 0;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/tim/Line.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/tim/Line.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-package de.intevation.flys.importer.parsers.tim;
-
-/** Two coordinates and a helper. */
-public class Line {
-
-    public Coordinate a;
-    public Coordinate b;
-
-    public Line() {
-    }
-
-    public Line(Coordinate a, Coordinate b) {
-        this.a = a;
-        this.b = b;
-    }
-
-    /** Project coordinate to line. */
-    public double distanceToFirst(Coordinate c) {
-
-        double nx = b.x - a.x;
-        double ny = b.y - a.y;
-
-        double len = Math.sqrt(nx*nx + ny*ny);
-
-        nx /= len;
-        ny /= len;
-
-        double px = c.x - a.x;
-        double py = c.y - a.y;
-
-        return nx*px + ny*py;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/importer/parsers/tim/TIMParser.java
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/tim/TIMParser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-package de.intevation.flys.importer.parsers.tim;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.utils.EpsilonComparator;
-
-/** Parser for single .tim files. */
-public class TIMParser
-{
-    /** Private logger. */
-    private static Logger logger = Logger.getLogger(TIMParser.class);
-
-    /** Proper encoding. */
-    public static final String ENCODING =
-        System.getProperty("tim.encoding", "ISO-8859-1");
-
-    /** Map of stations (km) to points (xyz). */
-    protected Map<Double, List<Coordinate>> lines;
-
-    public TIMParser() {
-        lines = new TreeMap<Double, List<Coordinate>>(EpsilonComparator.CMP);
-    }
-
-    /** Access map of stations (km) to coordinates (xyz). */
-    public Map<Double, List<Coordinate>> getLines() {
-        return lines;
-    }
-
-    /** Get number of lines (data). */
-    public int numLines() {
-        return lines.size();
-    }
-
-    /** Parse single .tim file. */
-    public void load(String filename) throws IOException {
-        BufferedReader reader =
-            new BufferedReader(
-            new InputStreamReader(
-            new FileInputStream(filename), ENCODING));
-        try {
-            String row;
-            while ((row = reader.readLine()) != null) {
-                if (row.length() < 54) {
-                    logger.warn("row too short");
-                    continue;
-                }
-                double station, x, y, z;
-                try {
-                    station = Double.parseDouble(row.substring( 9, 16))/1000d;
-                    x       = Double.parseDouble(row.substring(20, 30))/1000d;
-                    y       = Double.parseDouble(row.substring(30, 40))/1000d;
-                    z       = Double.parseDouble(row.substring(47, 54))/10000d;
-                } catch (NumberFormatException nfe) {
-                    logger.warn("Invalid row");
-                    continue;
-                }
-
-                Double km = station;
-
-                List<Coordinate> line = lines.get(km);
-                if (line == null) {
-                    line = new ArrayList<Coordinate>();
-                    lines.put(km, line);
-                }
-
-                line.add(new Coordinate(x, y, z));
-            }
-            // Bring coords in lexicographical order.
-            sortCoordinates();
-        } finally {
-            reader.close();
-        }
-    }
-
-    /** Sort coordinates of lines lexicographically. */
-    protected void sortCoordinates() {
-        for (List<Coordinate> line: lines.values()) {
-            Collections.sort(line, LexiComparator.CMP);
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Annotation.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Annotation.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "annotations")
-public class Annotation
-implements   Serializable
-{
-    private Integer        id;
-    private Range          range;
-    private Attribute      attribute;
-    private Position       position;
-    private Edge           edge;
-    private AnnotationType type;
-
-    public Annotation() {
-    }
-
-    public Annotation(
-        Range          range,
-        Attribute      attribute,
-        Position       position,
-        Edge           edge,
-        AnnotationType type
-    ) {
-        this.range     = range;
-        this.attribute = attribute;
-        this.position  = position;
-        this.edge      = edge;
-        this.type      = type;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_ANNOTATIONS_ID_SEQ",
-        sequenceName   = "ANNOTATIONS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_ANNOTATIONS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "range_id")
-    public Range getRange() {
-        return range;
-    }
-
-    public void setRange(Range range) {
-        this.range = range;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "attribute_id")
-    public Attribute getAttribute() {
-        return attribute;
-    }
-
-    public void setAttribute(Attribute attribute) {
-        this.attribute = attribute;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "position_id")
-    public Position getPosition() {
-        return position;
-    }
-
-    public void setPosition(Position position) {
-        this.position = position;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "edge_id")
-    public Edge getEdge() {
-        return edge;
-    }
-
-    public void setEdge(Edge edge) {
-        this.edge = edge;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "type_id")
-    public AnnotationType getType() {
-        return type;
-    }
-
-    public void setType(AnnotationType type) {
-        this.type = type;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/AnnotationType.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/AnnotationType.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
- at Entity
- at Table(name = "annotation_types")
-public class AnnotationType
-implements   Serializable
-{
-    private Integer id;
-    private String  name;
-
-    public AnnotationType() {
-    }
-
-    public AnnotationType(String name) {
-        this.name = name;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_ANNOTATION_TYPES_ID_SEQ",
-        sequenceName   = "ANNOTATION_TYPES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_ANNOTATION_TYPES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Attribute.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Attribute.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
- at Entity
- at Table(name = "attributes")
-public class Attribute
-implements   Serializable
-{
-    private Integer id;
-
-    private String  value;
-
-    public Attribute() {
-    }
-
-    public Attribute(String value) {
-        this.value = value;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_ATTRIBUTES_ID_SEQ",
-        sequenceName   = "ATTRIBUTES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_ATTRIBUTES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "value")
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/AxisKind.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/AxisKind.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "axis_kinds")
-public class AxisKind implements Serializable {
-    private Integer id;
-    private String name;
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    /**
-     * Get name.
-     *
-     * @return The display Name of the kind as String.
-     */
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/BedHeightEpoch.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/BedHeightEpoch.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,211 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "bed_height_epoch")
-public class BedHeightEpoch implements Serializable {
-
-    private Integer id;
-
-    private River river;
-
-    private TimeInterval timeInterval;
-
-    private ElevationModel curElevationModel;
-    private ElevationModel oldElevationModel;
-
-    private Range range;
-
-    private String evaluationBy;
-    private String description;
-
-    private List<BedHeightEpochValue> values;
-
-
-    public BedHeightEpoch() {
-    }
-
-
-    public BedHeightEpoch(
-        River          river,
-        TimeInterval   timeInterval,
-        Range          range,
-        ElevationModel curElevationModel,
-        ElevationModel oldElevationModel,
-        String         evaluationBy,
-        String         description
-    ) {
-        this.river             = river;
-        this.timeInterval      = timeInterval;
-        this.range             = range;
-        this.curElevationModel = curElevationModel;
-        this.oldElevationModel = oldElevationModel;
-        this.evaluationBy      = evaluationBy;
-        this.description       = description;
-        this.values            = new ArrayList<BedHeightEpochValue>();
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_BED_HEIGHT_EPOCH_ID_SEQ",
-        sequenceName   = "BED_HEIGHT_EPOCH_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_BED_HEIGHT_EPOCH_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id" )
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "time_interval_id")
-    public TimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(TimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "cur_elevation_model_id")
-    public ElevationModel getCurElevationModel() {
-        return curElevationModel;
-    }
-
-    public void setCurElevationModel(ElevationModel curElevationModel) {
-        this.curElevationModel = curElevationModel;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "old_elevation_model_id")
-    public ElevationModel getOldElevationModel() {
-        return oldElevationModel;
-    }
-
-    public void setOldElevationModel(ElevationModel oldElevationModel) {
-        this.oldElevationModel = oldElevationModel;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "range_id")
-    public Range getRange() {
-        return range;
-    }
-
-    public void setRange(Range range) {
-        this.range = range;
-    }
-
-    @Column(name = "evaluation_by")
-    public String getEvaluationBy() {
-        return evaluationBy;
-    }
-
-    public void setEvaluationBy(String evaluationBy) {
-        this.evaluationBy = evaluationBy;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @OneToMany
-    @JoinColumn(name = "bed_height_epoch_id")
-    public List<BedHeightEpochValue> getValues() {
-        return values;
-    }
-
-    public void setValues(List<BedHeightEpochValue> values) {
-        this.values = values;
-    }
-
-
-    public static List<BedHeightEpoch> getBedHeightEpochs(
-        River  river,
-        double kmLo,
-        double kmHi
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from BedHeightEpoch where river=:river");
-
-        query.setParameter("river", river);
-
-        // TODO Do km range filtering in SQL statement
-
-        List<BedHeightEpoch> epochs = query.list();
-        List<BedHeightEpoch> good   = new ArrayList<BedHeightEpoch>();
-
-        OUTER: for (BedHeightEpoch e: epochs) {
-            for (BedHeightEpochValue value: e.getValues()) {
-                double station = value.getStation().doubleValue();
-
-                if (station >= kmLo && station <= kmHi) {
-                    good.add(e);
-                    continue OUTER;
-                }
-            }
-        }
-
-        return good;
-    }
-
-
-    public static BedHeightEpoch getBedHeightEpochById(int id) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from BedHeightEpoch where id=:id");
-
-        query.setParameter("id", id);
-
-        List<BedHeightEpoch> singles = query.list();
-
-        return singles != null ? singles.get(0) : null;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/BedHeightEpochValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/BedHeightEpochValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-package de.intevation.flys.model;
-
-import java.util.List;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "bed_height_epoch_values")
-public class BedHeightEpochValue
-implements   Serializable
-{
-    private static Logger logger =
-        Logger.getLogger(BedHeightEpochValue.class);
-
-    private Integer id;
-
-    private BedHeightEpoch bedHeight;
-
-    private BigDecimal station;
-    private BigDecimal height;
-
-
-    public BedHeightEpochValue() {
-    }
-
-    public BedHeightEpochValue(
-        BedHeightEpoch bedHeight,
-        BigDecimal station,
-        BigDecimal height
-    ) {
-        this.bedHeight = bedHeight;
-        this.station   = station;
-        this.height    = height;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_BED_EPOCH_VALUE_ID_SEQ",
-        sequenceName   = "BED_EPOCH_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_BED_EPOCH_VALUE_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "bed_height_epoch_id" )
-    public BedHeightEpoch getBedHeight() {
-        return bedHeight;
-    }
-
-    public void setBedHeight(BedHeightEpoch bedHeight) {
-        this.bedHeight = bedHeight;
-    }
-
-    @Column(name = "station")
-    public BigDecimal getStation() {
-        return station;
-    }
-
-    public void setStation(BigDecimal station) {
-        this.station = station;
-    }
-
-    @Column(name = "height")
-    public BigDecimal getHeight() {
-        return height;
-    }
-
-    public void setHeight(BigDecimal height) {
-        this.height = height;
-    }
-
-
-    public static List<BedHeightEpochValue> getBedHeightEpochValues(
-        BedHeightEpoch epoch,
-        double kmLo,
-        double kmHi
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from BedHeightEpochValue where bedHeight=:epoch " +
-            "   and station >= :kmLo and station <= :kmHi");
-
-        query.setParameter("epoch", epoch);
-        query.setParameter("kmLo", new BigDecimal(kmLo));
-        query.setParameter("kmHi", new BigDecimal(kmHi));
-
-        return query.list();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/BedHeightSingle.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/BedHeightSingle.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,272 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "bed_height_single")
-public class BedHeightSingle implements Serializable {
-
-    private Integer id;
-    private Integer year;
-    private Integer soundingWidth;
-
-    private String evaluationBy;
-    private String description;
-
-    private River river;
-
-    private BedHeightType  type;
-
-    private LocationSystem locationSystem;
-
-    private ElevationModel curElevationModel;
-
-    private ElevationModel oldElevationModel;
-
-    private Range range;
-
-    private List<BedHeightSingleValue> values;
-
-
-    public BedHeightSingle() {
-    }
-
-
-    public BedHeightSingle(
-        River          river,
-        Integer        year,
-        Integer        soundingWidth,
-        BedHeightType  type,
-        LocationSystem locationSystem,
-        ElevationModel curElevationModel,
-        Range          range
-    ) {
-        this(
-            river,
-            year,
-            soundingWidth,
-            type,
-            locationSystem,
-            curElevationModel,
-            null,
-            range,
-            null,
-            null);
-    }
-
-
-    public BedHeightSingle(
-        River          river,
-        Integer        year,
-        Integer        soundingWidth,
-        BedHeightType  type,
-        LocationSystem locationSystem,
-        ElevationModel curElevationModel,
-        ElevationModel oldElevationModel,
-        Range          range,
-        String         evaluationBy,
-        String         description
-    ) {
-        this.river             = river;
-        this.year              = year;
-        this.soundingWidth     = soundingWidth;
-        this.type              = type;
-        this.locationSystem    = locationSystem;
-        this.curElevationModel = curElevationModel;
-        this.oldElevationModel = oldElevationModel;
-        this.range             = range;
-        this.evaluationBy      = evaluationBy;
-        this.description       = description;
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_BED_HEIGHT_SINGLE_ID_SEQ",
-        sequenceName   = "BED_HEIGHT_SINGLE_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_BED_HEIGHT_SINGLE_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id" )
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @Column(name = "year")
-    public Integer getYear() {
-        return year;
-    }
-
-    public void setYear(Integer year) {
-        this.year = year;
-    }
-
-    @Column(name = "sounding_width")
-    public Integer getSoundingWidth() {
-        return soundingWidth;
-    }
-
-    public void setSoundingWidth(Integer soundingWidth) {
-        this.soundingWidth = soundingWidth;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "type_id")
-    public BedHeightType getType() {
-        return type;
-    }
-
-    public void setType(BedHeightType type) {
-        this.type = type;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "location_system_id")
-    public LocationSystem getLocationSystem() {
-        return locationSystem;
-    }
-
-    public void setLocationSystem(LocationSystem locationSystem) {
-        this.locationSystem = locationSystem;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "cur_elevation_model_id")
-    public ElevationModel getCurElevationModel() {
-        return curElevationModel;
-    }
-
-    public void setCurElevationModel(ElevationModel curElevationModel) {
-        this.curElevationModel = curElevationModel;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "old_elevation_model_id")
-    public ElevationModel getOldElevationModel() {
-        return oldElevationModel;
-    }
-
-    public void setOldElevationModel(ElevationModel oldElevationModel) {
-        this.oldElevationModel = oldElevationModel;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "range_id")
-    public Range getRange() {
-        return range;
-    }
-
-    public void setRange(Range range) {
-        this.range = range;
-    }
-
-    @Column(name = "evaluation_by")
-    public String getEvaluationBy() {
-        return evaluationBy;
-    }
-
-    public void setEvaluationBy(String evaluationBy) {
-        this.evaluationBy = evaluationBy;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @OneToMany
-    @JoinColumn(name = "bed_height_single_id")
-    public List<BedHeightSingleValue> getValues() {
-        return values;
-    }
-
-    public void setValues(List<BedHeightSingleValue> values) {
-        this.values = values;
-    }
-
-
-    public static List<BedHeightSingle> getBedHeightSingles(
-        River  river,
-        double kmLo,
-        double kmHi
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from BedHeightSingle where river=:river");
-
-        query.setParameter("river", river);
-
-        // TODO Do km range filtering in SQL statement
-
-        List<BedHeightSingle> singles = query.list();
-        List<BedHeightSingle> good    = new ArrayList<BedHeightSingle>();
-
-        for (BedHeightSingle s: singles) {
-            for (BedHeightSingleValue value: s.getValues()) {
-                double station = value.getStation().doubleValue();
-
-                if (station >= kmLo && station <= kmHi) {
-                    good.add(s);
-                    break;
-                }
-            }
-        }
-
-        return good;
-    }
-
-
-    public static BedHeightSingle getBedHeightSingleById(int id) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from BedHeightSingle where id=:id");
-
-        query.setParameter("id", id);
-
-        List<BedHeightSingle> singles = query.list();
-
-        return singles != null ? singles.get(0) : null;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/BedHeightSingleValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/BedHeightSingleValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,167 +0,0 @@
-package de.intevation.flys.model;
-
-import java.util.List;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "bed_height_single_values")
-public class BedHeightSingleValue
-implements   Serializable
-{
-    private static Logger logger =
-        Logger.getLogger(BedHeightSingleValue.class);
-
-    private Integer id;
-
-    private BedHeightSingle bedHeight;
-
-    private BigDecimal station;
-    private BigDecimal height;
-    private BigDecimal uncertainty;
-    private BigDecimal dataGap;
-    private BigDecimal soundingWidth;
-    private BigDecimal width;
-
-
-    public BedHeightSingleValue() {
-    }
-
-    public BedHeightSingleValue(
-        BedHeightSingle bedHeight,
-        BigDecimal station,
-        BigDecimal height,
-        BigDecimal uncertainty,
-        BigDecimal dataGap,
-        BigDecimal soundingWidth,
-        BigDecimal width
-    ) {
-        this.bedHeight     = bedHeight;
-        this.station       = station;
-        this.height        = height;
-        this.uncertainty   = uncertainty;
-        this.dataGap       = dataGap;
-        this.soundingWidth = soundingWidth;
-        this.width         = width;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_BED_SINGLE_VALUE_ID_SEQ",
-        sequenceName   = "BED_SINGLE_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_BED_SINGLE_VALUE_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "bed_height_single_id" )
-    public BedHeightSingle getBedHeight() {
-        return bedHeight;
-    }
-
-    public void setBedHeight(BedHeightSingle bedHeight) {
-        this.bedHeight = bedHeight;
-    }
-
-    @Column(name = "station")
-    public BigDecimal getStation() {
-        return station;
-    }
-
-    public void setStation(BigDecimal station) {
-        this.station = station;
-    }
-
-    @Column(name = "height")
-    public BigDecimal getHeight() {
-        return height;
-    }
-
-    public void setHeight(BigDecimal height) {
-        this.height = height;
-    }
-
-    @Column(name="uncertainty")
-    public BigDecimal getUncertainty() {
-        return uncertainty;
-    }
-
-    public void setUncertainty(BigDecimal uncertainty) {
-        this.uncertainty = uncertainty;
-    }
-
-    @Column(name="data_gap")
-    public BigDecimal getDataGap() {
-        return dataGap;
-    }
-
-    public void setDataGap(BigDecimal dataGap) {
-        this.dataGap = dataGap;
-    }
-
-    @Column(name="sounding_width")
-    public BigDecimal getSoundingWidth() {
-        return soundingWidth;
-    }
-
-    public void setSoundingWidth(BigDecimal soundingWidth) {
-        this.soundingWidth = soundingWidth;
-    }
-
-    @Column(name="width")
-    public BigDecimal getWidth() {
-        return width;
-    }
-
-    public void setWidth(BigDecimal width) {
-        this.width = width;
-    }
-
-
-    public static List<BedHeightSingleValue> getBedHeightSingleValues(
-        BedHeightSingle single,
-        double kmLo,
-        double kmHi
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from BedHeightSingleValue where bedHeight=:single " +
-            "   and station >= :kmLo and station <= :kmHi");
-
-        query.setParameter("single", single);
-        query.setParameter("kmLo", new BigDecimal(kmLo));
-        query.setParameter("kmHi", new BigDecimal(kmHi));
-
-        return query.list();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/BedHeightType.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/BedHeightType.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-
-import de.intevation.flys.backend.SessionHolder;
-
- at Entity
- at Table(name = "bed_height_type")
-public class BedHeightType
-implements   Serializable
-{
-    private static Logger log = Logger.getLogger(BedHeightType.class);
-
-    private Integer id;
-    private String  name;
-
-
-    public BedHeightType() {
-    }
-
-    public BedHeightType(String name) {
-        this.name = name;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_BED_HEIGHT_TYPE_ID_SEQ",
-        sequenceName   = "BED_HEIGHT_TYPE_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_BED_HEIGHT_TYPE_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public static BedHeightType fetchBedHeightTypeForType(String type) {
-	return fetchBedHeightTypeForType(type, null);
-    }
-
-    public static BedHeightType fetchBedHeightTypeForType(String name, Session session) {
-
-	if (session == null) {
-	    session = SessionHolder.HOLDER.get();
-	}
-
-        Query query = session.createQuery(
-            "from BedHeightType where name=:name");
-
-        query.setParameter("name", name);
-
-        List<Object> results = query.list();
-
-        return results.isEmpty() ? null : (BedHeightType)results.get(0);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/BoundaryKind.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/BoundaryKind.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "boundary_kinds")
-public class BoundaryKind implements Serializable {
-
-    private Integer id;
-    private String name;
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    /**
-     * Get name.
-     *
-     * @return name of the kind of boundary as String.
-     */
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Building.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Building.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import com.vividsolutions.jts.geom.LineString;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "buildings")
-public class Building
-implements   Serializable
-{
-    private Integer    id;
-    private River      river;
-    private String     name;
-    private LineString geom;
-
-    public Building() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public LineString getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(LineString geom) {
-        this.geom = geom;
-    }
-
-    public static List<Building> getBuildings(int riverId, int kindId) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from Building where river.id =:river_id and kind_id=:kind_id");
-        query.setParameter("kind_id", kindId);
-        query.setParameter("river_id", riverId);
-
-        return query.list();
-    }
-
-    public static List<Building> getBuildings(int riverId, String name) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from Building where river.id =:river_id and name=:name");
-        query.setParameter("river_id", riverId);
-        query.setParameter("name", name);
-
-        return query.list();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/CrossSection.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/CrossSection.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.util.List;
-import java.util.ArrayList;
-
-import java.awt.geom.Point2D;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.JoinColumn;
-
-import java.math.MathContext;
-import java.math.BigDecimal;
-
-import org.hibernate.Session;
-import org.hibernate.SQLQuery;
-import org.hibernate.Query;
-
-import org.hibernate.type.StandardBasicTypes;
-
-import de.intevation.flys.backend.SessionHolder;
-
- at Entity
- at Table(name = "cross_sections")
-public class CrossSection
-implements   Serializable
-{
-    public static final MathContext PRECISION = new MathContext(6);
-
-    public static final String SQL_FAST_CROSS_SECTION_LINES =
-        "SELECT km, x, y, csl.id AS csl_id " +
-        "FROM cross_section_lines csl JOIN cross_section_points csp " +
-        "ON csp.cross_section_line_id = csl.id " +
-        "WHERE csl.cross_section_id = :cs_id AND " +
-        "km between :from_km AND :to_km " +
-        "ORDER BY csl.id, csp.col_pos";
-
-    private Integer                id;
-    private River                  river;
-    private TimeInterval           timeInterval;
-    private String                 description;
-    private List<CrossSectionLine> lines;
-
-    public CrossSection() {
-    }
-
-    public CrossSection(
-        River        river,
-        TimeInterval timeInterval,
-        String       description
-    ) {
-        this.river        = river;
-        this.timeInterval = timeInterval;
-        this.description  = description;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_CROSS_SECTIONS_ID_SEQ",
-        sequenceName   = "CROSS_SECTIONS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_CROSS_SECTIONS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "time_interval_id")
-    public TimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(TimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @OneToMany
-    @OrderBy("km")
-    @JoinColumn(name="cross_section_id")
-    public List<CrossSectionLine> getLines() {
-        return lines;
-    }
-
-    public void setLines(List<CrossSectionLine> lines) {
-        this.lines = lines;
-    }
-
-    public List<CrossSectionLine> getLines(double startKm, double endKm) {
-        Session session = SessionHolder.HOLDER.get();
-        Query query = session.createQuery(
-            "from CrossSectionLine where crossSection=:crossSection " +
-            "and km between :startKm and :endKm order by km");
-        query.setParameter("crossSection", this);
-        query.setParameter("startKm", new BigDecimal(startKm, PRECISION));
-        query.setParameter("endKm", new BigDecimal(endKm, PRECISION));
-
-        return query.list();
-    }
-
-    public List<FastCrossSectionLine> getFastLines(
-        double startKm,
-        double endKm
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        SQLQuery sqlQuery = session.createSQLQuery(SQL_FAST_CROSS_SECTION_LINES)
-            .addScalar("km",     StandardBasicTypes.DOUBLE)
-            .addScalar("x",      StandardBasicTypes.DOUBLE)
-            .addScalar("y",      StandardBasicTypes.DOUBLE)
-            .addScalar("csl_id", StandardBasicTypes.INTEGER);
-
-        sqlQuery
-            .setInteger("cs_id",  getId())
-            .setDouble("from_km", startKm)
-            .setDouble("to_km",   endKm);
-
-        List<Object []> results = sqlQuery.list();
-
-        ArrayList<Point2D> points = new ArrayList<Point2D>(500);
-        ArrayList<FastCrossSectionLine> lines =
-            new ArrayList<FastCrossSectionLine>();
-
-        Integer lastId = null;
-        Double  lastKm = null;
-
-        for (Object [] result: results) {
-            Double  km = (Double)result[0];
-            Double  x  = (Double)result[1];
-            Double  y  = (Double)result[2];
-            Integer id = (Integer)result[3];
-
-            if (lastId != null && !lastId.equals(id)) {
-                points.trimToSize();
-                FastCrossSectionLine line =
-                    new FastCrossSectionLine(lastKm, points);
-                lines.add(line);
-                points = new ArrayList<Point2D>(500);
-            }
-
-            Point2D p = new Point2D.Double(x, y);
-
-            if (CrossSectionLine.isValid(p)) {
-                points.add(p);
-            }
-
-            lastKm = km;
-            lastId = id;
-        }
-
-        if (lastId != null) {
-            points.trimToSize();
-            FastCrossSectionLine line =
-                new FastCrossSectionLine(lastKm, points);
-            lines.add(line);
-        }
-
-        lines.trimToSize();
-
-        return lines;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/CrossSectionLine.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/CrossSectionLine.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,174 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Collections;
-import java.util.Comparator;
-
-import java.awt.geom.Point2D;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.JoinColumn;
-
-import org.apache.log4j.Logger;
-
- at Entity
- at Table(name = "cross_section_lines")
-public class CrossSectionLine
-implements   Serializable
-{
-    private static Logger logger = Logger.getLogger(CrossSectionLine.class);
-
-    public static final double EPSILON   = 1e-4;
-
-    public static final double TOO_SMALL = 0.2;
-    public static final double TOO_BIG   = 2500;
-
-    private Integer                 id;
-    private Double              km;
-    private CrossSection            crossSection;
-
-    private List<CrossSectionPoint> points;
-
-    public static final Comparator<CrossSectionPoint> COL_POS_CMP =
-        new Comparator<CrossSectionPoint>() {
-            @Override
-            public int compare(CrossSectionPoint a, CrossSectionPoint b) {
-                double xa = a.getX().doubleValue();
-                double xb = b.getX().doubleValue();
-                double d = xa - xb;
-                if (d < -EPSILON) return -1;
-                if (d > +EPSILON) return +1;
-                int diff = a.getColPos() - b.getColPos();
-                return diff < 0 ? -1 : diff > 0 ? +1 : 0;
-            }
-        };
-
-
-    public static final boolean isValid(double x) {
-        x = Math.abs(x);
-        return x > TOO_SMALL && x < TOO_BIG;
-    }
-
-    public static final boolean isValid(Point2D p) {
-        return isValid(p.getX()) && isValid(p.getY());
-    }
-
-
-    public CrossSectionLine() {
-    }
-
-    public CrossSectionLine(CrossSection crossSection, Double km) {
-        this.crossSection = crossSection;
-        this.km           = km;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_CROSS_SECTION_LINES_ID_SEQ",
-        sequenceName   = "CROSS_SECTION_LINES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_CROSS_SECTION_LINES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "km")
-    public Double getKm() {
-        return km;
-    }
-
-    public void setKm(Double km) {
-        this.km = km;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "cross_section_id")
-    public CrossSection getCrossSection() {
-        return crossSection;
-    }
-
-    public void setCrossSection(CrossSection CrossSection) {
-        this.crossSection = crossSection;
-    }
-
-    @OneToMany
-    @JoinColumn(name="cross_section_line_id")
-    public List<CrossSectionPoint> getPoints() {
-        return points;
-    }
-
-    public void setPoints(List<CrossSectionPoint> points) {
-        this.points = points;
-    }
-
-
-    public List<Point2D> fetchCrossSectionLinesPoints() {
-
-        List<CrossSectionPoint> linePoints =
-            new ArrayList<CrossSectionPoint>(getPoints());
-
-        Collections.sort(linePoints, COL_POS_CMP);
-
-        List<Point2D> points = new ArrayList<Point2D>(linePoints.size());
-        for (CrossSectionPoint p: linePoints) {
-            double x = p.getX().doubleValue();
-            double y = p.getY().doubleValue();
-            if (isValid(x) && isValid(y)) {
-                points.add(new Point2D.Double(x, y));
-            }
-        }
-
-        return points;
-    }
-
-    public double [][] fetchCrossSectionProfile() {
-        return fetchCrossSectionProfile(fetchCrossSectionLinesPoints());
-    }
-
-    public static double [][] fetchCrossSectionProfile(List<Point2D> points) {
-
-        int P = points.size();
-
-        double [] xs = new double[P];
-        double [] ys = new double[P];
-
-        if (P > 0) {
-            xs[0] = points.get(0).getX();
-            ys[0] = points.get(0).getY();
-
-            for (int i = 1; i < P; i++) {
-                Point2D p = points.get(i);
-                double x = p.getX();
-                double y = p.getY();
-
-                if (x <= xs[i-1]) {
-                    x = xs[i-1] + EPSILON;
-                }
-
-                xs[i] = x;
-                ys[i] = y;
-            }
-        }
-
-        return new double [][] { xs, ys };
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/CrossSectionPoint.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/CrossSectionPoint.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-
-/** Mapped Point of a cross section line. */
- at Entity
- at Table(name = "cross_section_points")
-public class CrossSectionPoint
-implements   Serializable
-{
-    private Integer          id;
-    private CrossSectionLine crossSectionLine;
-    private Integer          colPos;
-    private Double       x;
-    private Double       y;
-
-    public CrossSectionPoint() {
-    }
-
-    public CrossSectionPoint(
-        CrossSectionLine crossSectionLine,
-        Integer          colPos,
-        Double       x,
-        Double       y
-    ) {
-        this.crossSectionLine = crossSectionLine;
-        this.colPos           = colPos;
-        this.x                = x;
-        this.y                = y;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_CROSS_SECTION_POINTS_ID_SEQ",
-        sequenceName   = "CROSS_SECTION_POINTS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_CROSS_SECTION_POINTS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "cross_section_line_id")
-    public CrossSectionLine getCrossSectionLine() {
-        return crossSectionLine;
-    }
-
-    public void setCrossSectionLine(CrossSectionLine crossSectionLine) {
-        this.crossSectionLine = crossSectionLine;
-    }
-
-    @Column(name = "col_pos")
-    public Integer getColPos() {
-        return colPos;
-    }
-
-    public void setColPos(Integer colPos) {
-        this.colPos = colPos;
-    }
-
-    @Column(name = "x")
-    public Double getX() {
-        return x;
-    }
-
-    public void setX(Double x) {
-        this.x = x;
-    }
-
-    @Column(name = "y")
-    public Double getY() {
-        return y;
-    }
-
-    public void setY(Double y) {
-        this.y = y;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/CrossSectionTrack.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/CrossSectionTrack.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,200 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.annotations.Type;
-
-import com.vividsolutions.jts.geom.LineString;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "cross_section_tracks")
-public class CrossSectionTrack
-implements   Serializable
-{
-    private Integer    id;
-    private River      river;
-    private String     name;
-    private LineString geom;
-    private BigDecimal km;
-    private BigDecimal z;
-
-    public CrossSectionTrack() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public LineString getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(LineString geom) {
-        this.geom = geom;
-    }
-
-
-    @Column(name = "km")
-    public BigDecimal getKm() {
-        return km;
-    }
-
-
-    public void setKm(BigDecimal km) {
-        this.km = km;
-    }
-
-
-    @Column(name = "z")
-    public BigDecimal getZ() {
-        return z;
-    }
-
-
-    public void setZ(BigDecimal z) {
-        this.z = z;
-    }
-
-
-    public static List<CrossSectionTrack> getCrossSectionTrack(
-        String river)
-    {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from CrossSectionTrack where river.name =:river");
-        query.setParameter("river", river);
-
-        return query.list();
-    }
-
-
-    public static List<CrossSectionTrack> getCrossSectionTrack(
-        String river,
-        String name
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from CrossSectionTrack as cst " +
-            "    where river.name =:river" +
-            "      and cst.name=:name");
-        query.setParameter("river", river);
-        query.setParameter("name", name);
-
-        return query.list();
-    }
-
-    public static List<CrossSectionTrack> getCrossSectionTrack(
-        String river,
-        int kind_id
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from CrossSectionTrack as cst " +
-            "    where river.name =:river" +
-            "      and kind_id=:kind_id");
-        query.setParameter("river", river);
-        query.setParameter("kind_id", kind_id);
-
-        return query.list();
-    }
-
-    public static List<CrossSectionTrack> getCrossSectionTrack(
-        String river,
-        String name,
-        int kind_id
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from CrossSectionTrack as cst " +
-            "    where river.name =:river" +
-            "      and cst.name=:name" +
-            "      and kind_id=:kind_id");
-        query.setParameter("river", river);
-        query.setParameter("name", name);
-        query.setParameter("kind_id", kind_id);
-
-        return query.list();
-    }
-
-
-    /**
-     * Returns the nearest CrossSectionTrack of <i>river</i> to a given
-     * <i>km</i>.
-     *
-     * @param river The name of a river.
-     * @param km The kilometer value.
-     *
-     * @return the nearest CrossSectionTrack to <i>km</i> of river <i>river</i>.
-     */
-    public static CrossSectionTrack getCrossSectionTrack(
-        String river,
-        double km
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from CrossSectionTrack where river.name =:river " +
-            "and kind_id = 1 " +
-            "order by abs( km - :mykm)");
-        query.setParameter("river", river);
-        query.setParameter("mykm", new BigDecimal(km));
-
-        List<CrossSectionTrack> cst = query.list();
-
-        return cst != null && !cst.isEmpty() ? cst.get(0) : null;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/CrossSectionTrackKind.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/CrossSectionTrackKind.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "cross_section_track_kinds")
-public class CrossSectionTrackKind implements Serializable {
-    private Integer id;
-    private String name;
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    /**
-     * Get name.
-     *
-     * @return The name of the Cross section kind as String.
-     */
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-}
-
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/DGM.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/DGM.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,138 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-import java.math.BigDecimal;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.SequenceGenerator;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "dem")
-public class DGM implements Serializable {
-
-    private Integer      id;
-    private Integer      srid;
-
-    private River        river;
-
-    private Range        range;
-    private TimeInterval time_interval;
-
-    private String       path;
-
-
-    public DGM() {
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_DEM_ID_SEQ",
-        sequenceName   = "DEM_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_DEM_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    @Column(name = "path")
-    public String getPath() {
-        return path;
-    }
-
-    public void setSrid(int srid) {
-        this.srid = srid;
-    }
-
-    @Column(name = "srid")
-    public int getSrid() {
-        return srid;
-    }
-
-    public static DGM getDGM(int id) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from DGM where Id =:id");
-        query.setParameter("id", id);
-
-        List<DGM> result = query.list();
-
-        return result.isEmpty() ? null : result.get(0);
-    }
-
-
-    public static DGM getDGM(String river, double lower, double upper) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from DGM where river.name =:river and " +
-            "range.a <=:lower and range.b >=:lower and " +
-            "range.a <=:upper and range.b >=:upper");
-        query.setParameter("river", river);
-        query.setParameter("lower", new BigDecimal(lower));
-        query.setParameter("upper", new BigDecimal(upper));
-
-        List<DGM> result = query.list();
-
-        return result.isEmpty() ? null : result.get(0);
-    }
-
-    @OneToOne
-    @JoinColumn(name = "range_id")
-    public Range getRange() {
-        return range;
-    }
-
-    public void setRange(Range range) {
-        this.range = range;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "time_interval_id")
-    public TimeInterval getTimeInterval() {
-        return time_interval;
-    }
-
-    public void setTimeInterval(TimeInterval time_interval) {
-        this.time_interval = time_interval;
-    }
-
-
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Depth.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Depth.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
-
- at Entity
- at Table(name = "depths")
-public class Depth implements Serializable {
-
-    private Integer id;
-
-    private BigDecimal lower;
-    private BigDecimal upper;
-
-
-    public Depth() {
-    }
-
-
-    public Depth(BigDecimal lower, BigDecimal upper) {
-        this.lower = lower;
-        this.upper = upper;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_DEPTHS_ID_SEQ",
-        sequenceName   = "DEPTHS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_DEPTHS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "lower")
-    public BigDecimal getLower() {
-        return lower;
-    }
-
-    public void setLower(BigDecimal lower) {
-        this.lower = lower;
-    }
-
-    @Column(name = "upper")
-    public BigDecimal getUpper() {
-        return upper;
-    }
-
-    public void setUpper(BigDecimal upper) {
-        this.upper = upper;
-    }
-
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/DischargeTable.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/DischargeTable.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.Date;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.OrderBy;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "discharge_tables")
-public class DischargeTable
-implements   Serializable, Comparable<DischargeTable>
-{
-    private Integer      id;
-    private Gauge        gauge;
-    private String       description;
-    private String       bfgId;
-    private Integer      kind;
-    private TimeInterval timeInterval;
-
-    private List<DischargeTableValue> dischargeTableValues;
-
-    public DischargeTable() {
-        kind = 0;
-    }
-
-    public DischargeTable(Gauge gauge) {
-        this(gauge, null, null, 0, null);
-    }
-
-    public DischargeTable(
-        Gauge        gauge,
-        String       description,
-        String       bfgId,
-        Integer      kind,
-        TimeInterval timeInterval
-    ) {
-        this.gauge        = gauge;
-        this.description  = description;
-        this.bfgId        = bfgId;
-        this.kind         = kind;
-        this.timeInterval = timeInterval;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_DISCHARGE_TABLES_ID_SEQ",
-        sequenceName   = "DISCHARGE_TABLES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_DISCHARGE_TABLES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "gauge_id" )
-    public Gauge getGauge() {
-        return gauge;
-    }
-
-    public void setGauge(Gauge gauge) {
-        this.gauge = gauge;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @Column(name = "bfg_id")
-    public String getBfgId() {
-        return bfgId;
-    }
-
-    public void setBfgId(String bfgId) {
-        this.bfgId = bfgId;
-    }
-
-    @Column(name = "kind")
-    public Integer getKind() {
-        return kind;
-    }
-
-    public void setKind(Integer kind) {
-        this.kind = kind;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "time_interval_id" )
-    public TimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(TimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    @OneToMany
-    @JoinColumn(name = "table_id")
-    @OrderBy("q")
-    public List<DischargeTableValue> getDischargeTableValues() {
-        return dischargeTableValues;
-    }
-
-    public void setDischargeTableValues(
-        List<DischargeTableValue> dischargeTableValues
-    ) {
-        this.dischargeTableValues = dischargeTableValues;
-    }
-
-    @Override
-    public int compareTo(DischargeTable o) {
-        if (getKind() == 0 && o.getKind() != 0) {
-            return 1;
-        }
-
-        TimeInterval other = o.getTimeInterval();
-        if (other == null && timeInterval == null) {
-            return 1;
-        }
-        else if (other == null) {
-            return -1;
-        }
-        else if (timeInterval == null) {
-            return 1;
-        }
-
-        Date otherStartTime = other.getStartTime();
-        Date thisStartTime  = timeInterval.getStartTime();
-
-        if (otherStartTime == null) {
-            return -1;
-        }
-        else if (thisStartTime == null) {
-            return 1;
-        }
-
-        long otherStart = otherStartTime.getTime();
-        long thisStart  = thisStartTime.getTime();
-
-        if (otherStart < thisStart) {
-            return 1;
-        }
-        else if (otherStart > thisStart) {
-            return -1;
-        }
-
-        Date otherStopTime  = other.getStopTime();
-        Date thisStopTime  = timeInterval.getStopTime();
-
-        if (otherStopTime == null) {
-            return -1;
-        }
-        else if (thisStopTime == null) {
-            return 1;
-        }
-
-        long otherEnd   = otherStopTime.getTime();
-        long thisEnd    = thisStopTime.getTime();
-
-        if (otherEnd < thisEnd) {
-            return 1;
-        }
-        else if (otherEnd > thisEnd) {
-            return -1;
-        }
-        else {
-            return 0;
-        }
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/DischargeTableValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/DischargeTableValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-package de.intevation.flys.model;
-
-import java.math.BigDecimal;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "discharge_table_values")
-public class DischargeTableValue
-implements   Serializable
-{
-    private Integer        id;
-    private DischargeTable dischargeTable;
-    private BigDecimal     q;
-    private BigDecimal     w;
-
-    public DischargeTableValue() {
-    }
-
-    public DischargeTableValue(
-        DischargeTable dischargeTable, BigDecimal q, BigDecimal w)
-    {
-        this.dischargeTable = dischargeTable;
-        this.q              = q;
-        this.w              = w;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_DISCHARGE_TABLE_VALUES_ID_SEQ",
-        sequenceName   = "DISCHARGE_TABLE_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_DISCHARGE_TABLE_VALUES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "table_id" )
-    public DischargeTable getDischargeTable() {
-        return dischargeTable;
-    }
-
-    public void setDischargeTable(DischargeTable dischargeTable) {
-        this.dischargeTable = dischargeTable;
-    }
-
-
-    @Column(name = "q")
-    public BigDecimal getQ() {
-        return q;
-    }
-
-    public void setQ(BigDecimal q) {
-        this.q = q;
-    }
-
-    @Column(name = "w")
-    public BigDecimal getW() {
-        return w;
-    }
-
-    public void setW(BigDecimal w) {
-        this.w = w;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/DischargeZone.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/DischargeZone.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "discharge_zone")
-public class DischargeZone
-implements   Serializable
-{
-    private static Logger logger = Logger.getLogger(DischargeZone.class);
-
-    private Integer id;
-
-    private River river;
-
-    private String gaugeName;
-
-    private BigDecimal value;
-
-    private String lowerDischarge;
-    private String upperDischarge;
-
-    private String type;
-
-    public DischargeZone() {
-    }
-
-
-    public DischargeZone(
-        River       river,
-        String      gaugeName,
-        BigDecimal  value,
-        String      lowerDischarge,
-        String      upperDischarge
-    ) {
-        this.river          = river;
-        this.gaugeName      = gaugeName;
-        this.value          = value;
-        this.lowerDischarge = lowerDischarge;
-        this.upperDischarge = upperDischarge;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_DISCHARGE_ZONE_ID_SEQ",
-        sequenceName   = "DISCHARGE_ZONE_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_DISCHARGE_ZONE_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id" )
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @Column(name = "value")
-    public BigDecimal getValue() {
-        return value;
-    }
-
-    public void setValue(BigDecimal value) {
-        this.value = value;
-    }
-
-    @Column(name = "gauge_name")
-    public String getGaugeName() {
-        return gaugeName;
-    }
-
-    public void setGaugeName(String gaugeName) {
-        this.gaugeName = gaugeName;
-    }
-
-    @Column(name = "lower_discharge")
-    public String getLowerDischarge() {
-        return lowerDischarge;
-    }
-
-    public void setLowerDischarge(String lowerDischarge) {
-        this.lowerDischarge = lowerDischarge;
-    }
-
-    @Column(name = "upper_discharge")
-    public String getUpperDischarge() {
-        return upperDischarge;
-    }
-
-    public void setUpperDischarge(String upperDischarge) {
-        this.upperDischarge = upperDischarge;
-    }
-
-    public void putType(String type) {
-        this.type = type;
-    }
-
-    public String fetchType() {
-        return this.type;
-    }
-
-    public static List<DischargeZone> getDischargeZones(River river) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from DischargeZone where river=:river");
-
-        query.setParameter("river", river);
-
-        return query.list();
-    }
-
-
-    public static DischargeZone getDischargeZoneById(int id) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from DischargeZone where id=:id");
-
-        query.setParameter("id", id);
-
-        List<DischargeZone> zones = query.list();
-
-        return zones.isEmpty() ? null : zones.get(0);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Edge.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Edge.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
- at Entity
- at Table(name = "edges")
-public class Edge
-implements   Serializable
-{
-    private Integer    id;
-    private BigDecimal top;
-    private BigDecimal bottom;
-
-    public Edge() {
-    }
-
-    public Edge(BigDecimal top, BigDecimal bottom) {
-        this.top    = top;
-        this.bottom = bottom;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_EDGES_ID_SEQ",
-        sequenceName   = "EDGES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_EDGES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "top")
-    public BigDecimal getTop() {
-        return top;
-    }
-
-    public void setTop(BigDecimal top) {
-        this.top = top;
-    }
-
-    @Column(name = "bottom")
-    public BigDecimal getBottom() {
-        return bottom;
-    }
-
-    public void setBottom(BigDecimal bottom) {
-        this.bottom = bottom;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/ElevationModel.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/ElevationModel.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-import org.apache.log4j.Logger;
-
-
- at Entity
- at Table(name = "elevation_model")
-public class ElevationModel
-implements   Serializable
-{
-    private static Logger logger = Logger.getLogger(ElevationModel.class);
-
-    protected Integer id;
-
-    protected String name;
-
-    protected Unit unit;
-
-
-    public ElevationModel() {
-    }
-
-
-    public ElevationModel(String name, Unit unit) {
-        this.name = name;
-        this.unit = unit;
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_ELEVATION_MODE_ID_SEQ",
-        sequenceName   = "ELEVATION_MODEL_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_ELEVATION_MODE_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "unit_id")
-    public Unit getUnit() {
-        return unit;
-    }
-
-    public void setUnit(Unit unit) {
-        this.unit = unit;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/FastAnnotations.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/FastAnnotations.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,335 +0,0 @@
-package de.intevation.flys.model;
-
-import java.util.Comparator;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import java.io.Serializable;
-
-import org.hibernate.Session;
-import org.hibernate.SQLQuery;
-
-import org.hibernate.type.StandardBasicTypes;
-
-import de.intevation.flys.backend.SessionHolder;
-
-public class FastAnnotations
-implements   Serializable
-{
-    public static final String SQL_BY_RIVER_NAME =
-        "SELECT r.a AS a, r.b AS b, p.value AS position, " +
-                "at.value AS attribute, ant.name AS name, " +
-                "e.top AS top, e.bottom AS bottom " +
-        "FROM annotations an " +
-            "JOIN ranges r " +
-                "ON an.range_id = r.id " +
-            "JOIN attributes at " +
-                "ON an.attribute_id = at.id " +
-            "JOIN positions p " +
-                "ON an.position_id = p.id " +
-            "JOIN rivers riv " +
-                "ON r.river_id = riv.id " +
-            "LEFT JOIN annotation_types ant " +
-                "ON an.type_id = ant.id " +
-            "LEFT JOIN edges e " +
-                "ON an.edge_id = e.id " +
-            "WHERE riv.name = :river_name " +
-                "ORDER BY r.a";
-
-    public static final String SQL_BY_RIVER_ID =
-        "SELECT r.a AS a, r.b AS b, p.value AS position, " +
-                "at.value AS attribute, ant.name AS name, " +
-                "e.top AS top, e.bottom AS bottom " +
-        "FROM annotations an " +
-            "JOIN ranges r " +
-                "ON an.range_id = r.id " +
-            "JOIN attributes at " +
-                "ON an.attribute_id = at.id " +
-            "JOIN positions p " +
-                "ON an.position_id = p.id " +
-            "LEFT JOIN annotation_types ant " +
-                "ON an.type_id = ant.id " +
-            "LEFT JOIN edges e " +
-                "ON an.edge_id = e.id " +
-            "WHERE r.id = :river_id " +
-                "ORDER BY r.a";
-
-    public static final double EPSILON = 1e-5;
-
-    public static final Comparator<Annotation> KM_CMP =
-        new Comparator<Annotation>() {
-            @Override
-            public int compare(Annotation a, Annotation b) {
-                double diff = a.a - b.a;
-                if (diff < -EPSILON) return -1;
-                if (diff > +EPSILON) return +1;
-                return 0;
-            }
-        };
-
-    public static final class Annotation
-    implements                Serializable
-    {
-        private double a;
-        private double b;
-        private String position;
-        private String attribute;
-        private String name;
-        private double top;
-        private double bottom;
-
-        public Annotation() {
-        }
-
-        public Annotation(double a) {
-            this.a = a;
-        }
-
-        public Annotation(
-            double a,
-            double b,
-            String position,
-            String attribute,
-            String name,
-            double top,
-            double bottom
-        ) {
-            this.a         = a;
-            this.b         = b;
-            this.position  = position;
-            this.attribute = attribute;
-            this.name      = name;
-            this.top       = top;
-            this.bottom    = bottom;
-        }
-
-        public double getA() {
-            return a;
-        }
-
-        public double getB() {
-            return b;
-        }
-
-        public String getPosition() {
-            return position;
-        }
-
-        public String getAttribute() {
-            return attribute;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public double getTop() {
-            return top;
-        }
-
-        public double getBottom() {
-            return bottom;
-        }
-
-        @Override
-        public String toString() {
-            return "[a=" + a + ";b=" + b +
-                ";pos=" + position + ";attr=" + attribute +
-                ";name=" + name + ";top=" + top +
-                ";bot=" + bottom + "]";
-        }
-    } // class Annotation
-
-    public interface Filter {
-
-        boolean accept(Annotation annotation);
-
-    } // interface Filter
-
-    public static class NameFilter implements Filter {
-
-        private String name;
-
-        public NameFilter(String name) {
-            this.name = name;
-        }
-
-        @Override
-        public boolean accept(Annotation annotation) {
-            return annotation.getName().contains(name);
-        }
-    } // class NameFilter
-
-    public static final Filter ALL = new Filter() {
-        @Override
-        public boolean accept(Annotation annotation) {
-            return true;
-        }
-    };
-
-    public static final Filter IS_POINT = new Filter() {
-        @Override
-        public boolean accept(Annotation annotation) {
-            return Double.isNaN(annotation.getB());
-        }
-    };
-
-    public static final Filter IS_RANGE = new Filter() {
-        @Override
-        public boolean accept(Annotation annotation) {
-            return !Double.isNaN(annotation.getB());
-        }
-    };
-
-    private Annotation [] annotations;
-
-    public FastAnnotations() {
-    }
-
-    public FastAnnotations(Annotation [] annotations) {
-        this.annotations = annotations;
-    }
-
-    public FastAnnotations(String riverName) {
-        this(loadByRiverName(riverName));
-    }
-
-    public FastAnnotations(int riverId) {
-        this(loadByRiverId(riverId));
-    }
-
-    public FastAnnotations(Iterator<Annotation> iter) {
-        this(toArray(iter));
-    }
-
-    public int size() {
-        return annotations.length;
-    }
-
-    public Iterator<Annotation> filter(final Filter filter) {
-        return new Iterator<Annotation>() {
-
-            private int idx;
-            private Annotation current = findNext();
-
-            @Override
-            public boolean hasNext() {
-                return current != null;
-            }
-
-            @Override
-            public Annotation next() {
-                if (current == null) {
-                    throw new NoSuchElementException();
-                }
-                Annotation result = current;
-                current = findNext();
-                return result;
-            }
-
-            private Annotation findNext() {
-
-                while (idx < annotations.length) {
-                    Annotation annotation = annotations[idx++];
-                    if (filter.accept(annotation)) {
-                        return annotation;
-                    }
-                }
-
-                return null;
-            }
-
-            @Override
-            public void remove() {
-                throw new UnsupportedOperationException();
-            }
-        };
-    }
-
-    public static Annotation [] toArray(Iterator<Annotation> iter) {
-
-        ArrayList<Annotation> list = new ArrayList<Annotation>();
-
-        while (iter.hasNext()) {
-            list.add(iter.next());
-        }
-
-        return list.toArray(new Annotation[list.size()]);
-    }
-
-    public Annotation findByKm(double km) {
-        Annotation key = new Annotation(km);
-        int idx = Arrays.binarySearch(annotations, key, KM_CMP);
-        return idx < 0 ? null : annotations[idx];
-    }
-
-    private static SQLQuery createQuery(String query) {
-        Session session = SessionHolder.HOLDER.get();
-
-        return session.createSQLQuery(query)
-            .addScalar("a",         StandardBasicTypes.DOUBLE)
-            .addScalar("b",         StandardBasicTypes.DOUBLE)
-            .addScalar("position",  StandardBasicTypes.STRING)
-            .addScalar("attribute", StandardBasicTypes.STRING)
-            .addScalar("name",      StandardBasicTypes.STRING)
-            .addScalar("top",       StandardBasicTypes.DOUBLE)
-            .addScalar("bottom",    StandardBasicTypes.DOUBLE);
-    }
-
-    private static Annotation [] buildAnnotations(List<Object []> list) {
-        Annotation [] anns = new Annotation[list.size()];
-
-        // Names are likely the same because they are a type
-        // like 'Pegel' or 'Hafen'.
-        HashMap<String, String> names = new HashMap<String, String>();
-
-        for (int i = 0; i < anns.length; ++i) {
-            Object [] data   = list.get(i);
-            double a         = ((Double)data[0]);
-            double b         = data[1] != null ? (Double)data[1] : Double.NaN;
-            String position  = (String)data[2];
-            String attribute = (String)data[3];
-            String name      = (String)data[4];
-            double top       = data[5] != null ? (Double)data[5] : Double.NaN;
-            double bottom    = data[6] != null ? (Double)data[6] : Double.NaN;
-
-            if (name != null) {
-                String old = names.get(name);
-                if (old != null) {
-                    name = old;
-                }
-                else {
-                    names.put(name, name);
-                }
-            }
-
-            anns[i] = new Annotation(
-                a, b, position, attribute, name, top, bottom);
-        }
-
-        return anns;
-    }
-
-    public static Annotation [] loadByRiverName(String riverName) {
-
-        SQLQuery query = createQuery(SQL_BY_RIVER_NAME);
-
-        query.setString("river_name", riverName);
-
-        return buildAnnotations(query.list());
-    }
-
-    public static Annotation [] loadByRiverId(int riverId) {
-
-        SQLQuery query = createQuery(SQL_BY_RIVER_ID);
-
-        query.setInteger("river_id", riverId);
-
-        return buildAnnotations(query.list());
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/FastCrossSectionLine.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/FastCrossSectionLine.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-package de.intevation.flys.model;
-
-import java.util.List;
-import java.util.Comparator;
-
-import java.io.Serializable;
-
-import java.awt.geom.Point2D;
-
-public class FastCrossSectionLine
-implements   Serializable
-{
-    public static final double EPSILON = 1e-5;
-
-    public static final Comparator<FastCrossSectionLine> KM_CMP =
-        new Comparator<FastCrossSectionLine>() {
-            public int compare(
-                FastCrossSectionLine a,
-                FastCrossSectionLine b
-            ) {
-                double diff = a.km - b.km;
-                if (diff < -EPSILON) return -1;
-                return diff > +EPSILON ? +1 : 0;
-            }
-        };
-
-    protected double km;
-    protected List<Point2D> points;
-
-    public FastCrossSectionLine() {
-    }
-
-    public FastCrossSectionLine(double km) {
-        this.km = km;
-    }
-
-    public FastCrossSectionLine(double km, List<Point2D> points) {
-        this(km);
-        this.points = points;
-    }
-
-    public FastCrossSectionLine(CrossSectionLine csl) {
-        Double kmBD = csl.getKm();
-        km = kmBD != null ? kmBD.doubleValue() : 0d;
-        points = csl.fetchCrossSectionLinesPoints();
-    }
-
-    public double getKm() {
-        return km;
-    }
-
-    public void setKm(double km) {
-        this.km = km;
-    }
-
-    public List<Point2D> getPoints() {
-        return points;
-    }
-
-    public void setPoints(List<Point2D> points) {
-        this.points = points;
-    }
-
-    public double [][] fetchCrossSectionProfile() {
-        return CrossSectionLine.fetchCrossSectionProfile(points);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/FedState.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/FedState.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "fed_states")
-public class FedState implements Serializable {
-
-    private Integer id;
-    private String name;
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-     /**
-     * Get name.
-     *
-     * @return name of the Federal State as String.
-     */
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Fixpoint.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Fixpoint.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import com.vividsolutions.jts.geom.Point;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "fixpoints")
-public class Fixpoint
-implements   Serializable
-{
-    private Integer    id;
-    private River      river;
-    private Integer    x;
-    private Integer    y;
-    private BigDecimal km;
-    private String     hpgp;
-    private Point      geom;
-
-    public Fixpoint() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "x")
-    public Integer getX() {
-        return x;
-    }
-
-
-    public void setX(Integer x) {
-        this.x = x;
-    }
-
-
-    @Column(name = "y")
-    public Integer getY() {
-        return y;
-    }
-
-
-    public void setY(Integer y) {
-        this.y = y;
-    }
-
-
-    @Column(name = "km")
-    public BigDecimal getKm() {
-        return km;
-    }
-
-
-    public void setKm(BigDecimal km) {
-        this.km = km;
-    }
-
-
-    @Column(name = "hpgp")
-    public String getHpgp() {
-        return hpgp;
-    }
-
-
-    public void setHpgp(String hpgp) {
-        this.hpgp = hpgp;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Point getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(Point geom) {
-        this.geom = geom;
-    }
-
-
-    public static List<Fixpoint> getFixpoints(int riverId) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from Fixpoint where river.id =:river_id");
-        query.setParameter("river_id", riverId);
-
-        return query.list();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Floodmaps.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Floodmaps.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import com.vividsolutions.jts.geom.Geometry;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "floodmaps")
-public class Floodmaps
-implements   Serializable
-{
-    private Integer      id;
-    private River        river;
-    private String       name;
-    private Integer      kind;
-    private Integer      count;
-    private BigDecimal   diff;
-    private BigDecimal   area;
-    private BigDecimal   perimeter;
-    private Geometry     geom;
-
-    public Floodmaps() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-    @Column(name = "kind")
-    public Integer getKind() {
-        return kind;
-    }
-
-
-    public void setKind(Integer kind) {
-        this.kind = kind;
-    }
-
-
-    @Column(name = "count")
-    public Integer getCount() {
-        return count;
-    }
-
-
-    public void setCount(Integer count) {
-        this.count = count;
-    }
-
-
-    @Column(name = "diff")
-    public BigDecimal getDiff() {
-        return diff;
-    }
-
-
-    public void setDiff(BigDecimal diff) {
-        this.diff = diff;
-    }
-
-
-    @Column(name = "area")
-    public BigDecimal getArea() {
-        return area;
-    }
-
-
-    public void setArea(BigDecimal area) {
-        this.area = area;
-    }
-
-
-    @Column(name = "perimeter")
-    public BigDecimal getPerimeter() {
-        return perimeter;
-    }
-
-
-    public void setPerimeter(BigDecimal perimeter) {
-        this.perimeter = perimeter;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Geometry getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(Geometry geom) {
-        this.geom = geom;
-    }
-
-
-    public static List<Floodmaps> getFloodmaps(int riverId, String name) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from Floodmaps where river.id =:river_id AND name =:name");
-        query.setParameter("river_id", riverId);
-        query.setParameter("name", name);
-
-        return query.list();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Floodmark.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Floodmark.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import com.vividsolutions.jts.geom.Point;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "flood_marks")
-public class Floodmark
-implements   Serializable
-{
-    private Integer    id;
-    private River      river;
-    private Integer    z;
-    private Integer    year;
-    private BigDecimal km;
-    private Point      geom;
-
-    public Floodmark() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "z")
-    public Integer getZ() {
-        return z;
-    }
-
-
-    public void setZ(Integer z) {
-        this.z = z;
-    }
-
-
-    @Column(name = "year")
-    public Integer getYear() {
-        return year;
-    }
-
-
-    public void setYear(Integer year) {
-        this.year = year;
-    }
-
-
-    @Column(name = "km")
-    public BigDecimal getKm() {
-        return km;
-    }
-
-
-    public void setKm(BigDecimal km) {
-        this.km = km;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Point getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(Point geom) {
-        this.geom = geom;
-    }
-
-    public static List<Floodmark> getFloodmarks(int riverId) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from Floodmark where river.id =:river_id");
-        query.setParameter("river_id", riverId);
-
-        return query.list();
-    }
-
-    public static List<Floodmark> getFloodmarks(int riverId, int year) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from Floodmark where river.id =:river_id and year = :year");
-        query.setParameter("river_id", riverId);
-        query.setParameter("year", year);
-
-        return query.list();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
-
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Floodplain.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Floodplain.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.annotations.Type;
-import org.hibernate.HibernateException;
-
-import com.vividsolutions.jts.geom.Polygon;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "floodplain")
-public class Floodplain
-implements   Serializable
-{
-    private Integer        id;
-
-    private FloodplainKind kind;
-
-    private River          river;
-
-    private Polygon        geom;
-
-    private String         name;
-
-
-    public Floodplain() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "kind_id")
-    public FloodplainKind getKind() {
-        return kind;
-    }
-
-    public void setKind(FloodplainKind kind) {
-        this.kind = kind;
-    }
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Polygon getGeom() {
-        return geom;
-    }
-
-    public void setGeom(Polygon geom) {
-        this.geom = geom;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public static List<Floodplain> getFloodplains(String river, String name, int kind)
-    throws HibernateException {
-        Session session = SessionHolder.HOLDER.get();
-        Query query = session.createQuery(
-            "from Floodplain as fp where river.name =:river" +
-            " and kind.id =:kind" +
-            " and fp.name=:name");
-        query.setParameter("river", river);
-        query.setParameter("kind", kind);
-        query.setParameter("name", name);
-
-        List<Floodplain> list = query.list();
-        return list.isEmpty() ? null : list;
-    }
-
-    public static List<Floodplain> getFloodplains(String river, int kind)
-    throws HibernateException {
-        Session session = SessionHolder.HOLDER.get();
-        Query query = session.createQuery(
-            "from Floodplain where river.name =:river AND kind.id =:kind");
-        query.setParameter("river", river);
-        query.setParameter("kind", kind);
-
-        List<Floodplain> list = query.list();
-        return list.isEmpty() ? null : list;
-    }
-
-    public static Floodplain getFloodplain(String river) {
-        Session session = SessionHolder.HOLDER.get();
-
-        // kind_id 0 -> Offical
-        // kind_id 1 -> Misc.
-        Query query = session.createQuery(
-            "from Floodplain where river.name =:river and kind_id=1");
-        query.setParameter("river", river);
-
-        List<Floodplain> result = query.list();
-
-        return result.isEmpty() ? null : result.get(0);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/FloodplainKind.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/FloodplainKind.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "floodplain_kinds")
-public class FloodplainKind implements Serializable {
-    private Integer id;
-    private String name;
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    /**
-     * Get name.
-     *
-     * @return The name of the Floodplain Kind as String.
-     */
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-}
-
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/FlowVelocityMeasurement.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/FlowVelocityMeasurement.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-
-import org.apache.log4j.Logger;
-
-
- at Entity
- at Table(name = "flow_velocity_measurements")
-public class FlowVelocityMeasurement
-implements   Serializable
-{
-    private static Logger logger =
-        Logger.getLogger(FlowVelocityMeasurement.class);
-
-    private Integer id;
-
-    private River river;
-
-    private String description;
-
-    private List<FlowVelocityMeasurementValue> values;
-
-
-    public FlowVelocityMeasurement() {
-    }
-
-
-    public FlowVelocityMeasurement(River river, String description) {
-        this.river       = river;
-        this.description = description;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_FV_MEASURE_ID_SEQ",
-        sequenceName   = "FV_MEASURE_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_FV_MEASURE_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id" )
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @OneToMany
-    @JoinColumn(name = "measurements_id")
-    public List<FlowVelocityMeasurementValue> getValues() {
-        return values;
-    }
-
-    public void setValues(List<FlowVelocityMeasurementValue> values) {
-        this.values = values;
-    }
-
-    public void addValue(FlowVelocityMeasurementValue value) {
-        this.values.add(value);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/FlowVelocityMeasurementValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/FlowVelocityMeasurementValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-import org.apache.log4j.Logger;
-
-
-/** Measured Flow Velocities. */
- at Entity
- at Table(name = "flow_velocity_measure_values")
-public class FlowVelocityMeasurementValue
-implements   Serializable
-{
-    private static Logger logger =
-        Logger.getLogger(FlowVelocityMeasurementValue.class);
-
-    private Integer id;
-
-    private FlowVelocityMeasurement measurement;
-
-    private BigDecimal station;
-    private BigDecimal w;
-    private BigDecimal q;
-    private BigDecimal v;
-
-    private Date datetime;
-
-    private String description;
-
-    /** Non-mapped class holding same values. */
-    public static class FastFlowVelocityMeasurementValue {
-        protected double station;
-        protected double w;
-        protected double q;
-        protected double v;
-        protected Date   datetime;
-        protected String description;
-
-        public FastFlowVelocityMeasurementValue(double station,
-            double w, double q, double v, Date datetime, String description) {
-            this.station = station;
-            this.w       = w;
-            this.q       = q;
-            this.v       = v;
-            this.datetime = datetime;
-            this.description = description;
-        }
-
-        public double getStation() {
-            return station;
-        }
-
-        public double getW() {
-            return w;
-        }
-
-        public double getQ() {
-            return q;
-        }
-
-        public double getV() {
-            return v;
-        }
-
-        public Date getDatetime() {
-            return datetime;
-        }
-
-        public String getDescription() {
-            return description;
-        }
-    }
-
-
-    public FlowVelocityMeasurementValue() {
-    }
-
-
-    public FlowVelocityMeasurementValue(
-        FlowVelocityMeasurement measurement,
-        Date                    datetime,
-        BigDecimal              station,
-        BigDecimal              w,
-        BigDecimal              q,
-        BigDecimal              v,
-        String                  description
-    ) {
-        this.measurement = measurement;
-        this.datetime    = datetime;
-        this.station     = station;
-        this.w           = w;
-        this.q           = q;
-        this.v           = v;
-        this.description = description;
-    }
-
-    public static FastFlowVelocityMeasurementValue getUnmapped(
-            double station, double w, double q, double v, Date datetime, String description) {
-         return new FastFlowVelocityMeasurementValue(
-             station, w, q, v, datetime, description);
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_FV_MEASURE_VALUES_ID_SEQ",
-        sequenceName   = "FV_MEASURE_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_FV_MEASURE_VALUES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "measurements_id")
-    public FlowVelocityMeasurement getMeasurement() {
-        return measurement;
-    }
-
-    public void setMeasurement(FlowVelocityMeasurement measurement) {
-        this.measurement = measurement;
-    }
-
-    @Column(name = "station")
-    public BigDecimal getStation() {
-        return station;
-    }
-
-    public void setStation(BigDecimal station) {
-        this.station = station;
-    }
-
-    @Column(name = "datetime")
-    public Date getDatetime() {
-        return datetime;
-    }
-
-    public void setDatetime(Date datetime) {
-        this.datetime = datetime;
-    }
-
-    @Column(name = "w")
-    public BigDecimal getW() {
-        return w;
-    }
-
-    public void setW(BigDecimal w) {
-        this.w = w;
-    }
-
-    @Column(name = "q")
-    public BigDecimal getQ() {
-        return q;
-    }
-
-    public void setQ(BigDecimal q) {
-        this.q = q;
-    }
-
-    @Column(name = "v")
-    public BigDecimal getV() {
-        return v;
-    }
-
-    public void setV(BigDecimal v) {
-        this.v = v;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/FlowVelocityModel.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/FlowVelocityModel.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-package de.intevation.flys.model;
-
-import de.intevation.flys.backend.SessionHolder;
-
-import java.io.Serializable;
-
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-
-
- at Entity
- at Table(name = "flow_velocity_model")
-public class FlowVelocityModel
-implements   Serializable
-{
-    private static Logger logger = Logger.getLogger(FlowVelocityModel.class);
-
-
-    private Integer id;
-
-    private DischargeZone dischargeZone;
-
-    private String description;
-
-
-    public FlowVelocityModel() {
-    }
-
-
-    public FlowVelocityModel(DischargeZone dischargeZone) {
-        this(dischargeZone, null);
-    }
-
-
-    public FlowVelocityModel(
-        DischargeZone dischargeZone,
-        String        description
-    ) {
-        this.dischargeZone = dischargeZone;
-        this.description   = description;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_FLOW_VELOCITY_MODEL_ID_SEQ",
-        sequenceName   = "FLOW_VELOCITY_MODEL_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_FLOW_VELOCITY_MODEL_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "discharge_zone_id")
-    public DischargeZone getDischargeZone() {
-        return dischargeZone;
-    }
-
-    public void setDischargeZone(DischargeZone dischargeZone) {
-        this.dischargeZone = dischargeZone;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-
-    public static List<FlowVelocityModel> getModels(DischargeZone zone) {
-
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from FlowVelocityModel where dischargeZone=:zone");
-
-        query.setParameter("zone", zone);
-
-        return query.list();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/FlowVelocityModelValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/FlowVelocityModelValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import org.apache.log4j.Logger;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "flow_velocity_model_values")
-public class FlowVelocityModelValue
-implements   Serializable
-{
-    private static Logger logger =
-        Logger.getLogger(FlowVelocityModelValue.class);
-
-
-    private Integer id;
-
-    private FlowVelocityModel flowVelocity;
-
-    private BigDecimal station;
-    private BigDecimal q;
-    private BigDecimal totalChannel;
-    private BigDecimal mainChannel;
-    private BigDecimal shearStress;
-
-
-    public FlowVelocityModelValue() {
-    }
-
-
-    public FlowVelocityModelValue(
-        FlowVelocityModel flowVelocity,
-        BigDecimal        station,
-        BigDecimal        q,
-        BigDecimal        totalChannel,
-        BigDecimal        mainChannel,
-        BigDecimal        shearStress
-    ) {
-        this.flowVelocity = flowVelocity;
-        this.station      = station;
-        this.q            = q;
-        this.totalChannel = totalChannel;
-        this.mainChannel  = mainChannel;
-        this.shearStress  = shearStress;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_FLOW_VELOCITY_M_VALUES_ID_SEQ",
-        sequenceName   = "FLOW_VELOCITY_M_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_FLOW_VELOCITY_M_VALUES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "flow_velocity_model_id")
-    public FlowVelocityModel getFlowVelocity() {
-        return flowVelocity;
-    }
-
-    public void setFlowVelocity(FlowVelocityModel flowVelocity) {
-        this.flowVelocity = flowVelocity;
-    }
-
-    @Column(name = "station")
-    public BigDecimal getStation() {
-        return station;
-    }
-
-    public void setStation(BigDecimal station) {
-        this.station = station;
-    }
-
-    @Column(name = "q")
-    public BigDecimal getQ() {
-        return q;
-    }
-
-    public void setQ(BigDecimal q) {
-        this.q = q;
-    }
-
-    @Column(name = "total_channel")
-    public BigDecimal getTotalChannel() {
-        return totalChannel;
-    }
-
-    public void setTotalChannel(BigDecimal totalChannel) {
-        this.totalChannel = totalChannel;
-    }
-
-    @Column(name = "main_channel")
-    public BigDecimal getMainChannel() {
-        return mainChannel;
-    }
-
-    public void setMainChannel(BigDecimal mainChannel) {
-        this.mainChannel = mainChannel;
-    }
-
-    @Column(name = "shear_stress")
-    public BigDecimal getShearStress() {
-        return shearStress;
-    }
-
-    public void setShearStress(BigDecimal shearStress) {
-        this.shearStress = shearStress;
-    }
-
-
-    public static List<FlowVelocityModelValue> getValues(
-        FlowVelocityModel model,
-        double kmLo,
-        double kmHi
-    ) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from FlowVelocityModelValue where " +
-            "   flowVelocity=:model and" +
-            "   station >= :kmLo and " +
-            "   station <= :kmHi");
-
-        query.setParameter("model", model);
-        query.setParameter("kmLo", new BigDecimal(kmLo));
-        query.setParameter("kmHi", new BigDecimal(kmHi));
-
-        return query.list();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Gauge.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Gauge.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,334 +0,0 @@
-package de.intevation.flys.model;
-
-import java.math.BigDecimal;
-
-import java.io.Serializable;
-
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.backend.SessionHolder;
-
-/** Database-mapped Gauge with all info about it. */
- at Entity
- at Table(name = "gauges")
-public class Gauge
-implements   Serializable, Comparable<Gauge>
-{
-    public static final int DEFAULT_SCALE = 100;
-
-    public static final int MASTER_DISCHARGE_TABLE = 0;
-
-    private Integer    id;
-    private String     name;
-    private River      river;
-    private BigDecimal station;
-    private BigDecimal aeo;
-    private BigDecimal datum;
-    private Long       officialNumber;
-    private Range      range;
-
-    private List<DischargeTable> dischargeTables;
-
-    /** MainValues at this Gauge. */
-    protected List<MainValue> mainValues;
-
-    public Gauge() {
-    }
-
-    public Gauge(
-        String     name,
-        River      river,
-        BigDecimal station,
-        BigDecimal aeo,
-        BigDecimal datum,
-        Long       officialNumber,
-        Range      range
-    ) {
-        this.name            = name;
-        this.river           = river;
-        this.station         = station;
-        this.aeo             = aeo;
-        this.datum           = datum;
-        this.officialNumber  = officialNumber;
-        this.range           = range;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_GAUGES_ID_SEQ",
-        sequenceName   = "GAUGES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_GAUGES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id" )
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Column(name = "station") // FIXME: type mapping needed
-    public BigDecimal getStation() {
-        return station;
-    }
-
-    public void setStation(BigDecimal station) {
-        this.station = station;
-    }
-
-    @Column(name = "aeo") // FIXME: type mapping needed
-    public BigDecimal getAeo() {
-        return aeo;
-    }
-
-    public void setAeo(BigDecimal aeo) {
-        this.aeo = aeo;
-    }
-
-    @Column(name = "datum") // FIXME: type mapping needed
-    public BigDecimal getDatum() {
-        return datum;
-    }
-
-    public void setDatum(BigDecimal datum) {
-        this.datum = datum;
-    }
-
-    @Column(name = "official_number")
-    public Long getOfficialNumber() {
-        return officialNumber;
-    }
-
-    public void setOfficialNumber(Long officialNumber) {
-        this.officialNumber = officialNumber;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "range_id" )
-    public Range getRange() {
-        return range;
-    }
-
-    public void setRange(Range range) {
-        this.range = range;
-    }
-
-    @OneToMany
-    @JoinColumn(name = "gauge_id")
-    public List<DischargeTable> getDischargeTables() {
-        return dischargeTables;
-    }
-
-    public void setDischargeTables(List<DischargeTable> dischargeTables) {
-        this.dischargeTables = dischargeTables;
-    }
-
-
-    /**
-     * Returns min and max W values of this gauge based with a DEFAULT_SCALE.
-     *
-     * @return min and max W value of this gauge [min,max].
-     */
-    public double[] determineMinMaxW() {
-        return determineMinMaxW(DEFAULT_SCALE);
-    }
-
-
-    /**
-     * Returns min and max W values of this gauge.
-     *
-     * @return the min and max W value of this gauge [min,max].
-     */
-    public double[] determineMinMaxW(int scale) {
-        Session session = SessionHolder.HOLDER.get();
-
-        List<DischargeTable> tables   = getDischargeTables();
-        DischargeTable dischargeTable = null;
-
-        for (DischargeTable tmp: tables) {
-            if (tmp.getKind() == 0) {
-                dischargeTable = tmp;
-                break;
-            }
-        }
-
-        if (dischargeTable == null) {
-            return null;
-        }
-
-        Query query  = session.createQuery(
-            "select min(w) as min, max(w) as max from DischargeTableValue " +
-            "where table_id =:table");
-        query.setParameter("table", dischargeTable.getId());
-
-        List     results = query.list();
-        Object[] result  = (Object[]) results.get(0);
-
-        return result != null
-            ? new double[] {
-                ((BigDecimal) result[0]).doubleValue() * scale,
-                ((BigDecimal) result[1]).doubleValue() * scale}
-            : null;
-    }
-
-    @OneToMany
-    @JoinColumn(name = "gauge_id")
-    public List<MainValue> getMainValues() {
-        return mainValues;
-    }
-
-    public void setMainValues(List<MainValue> mainValues) {
-        this.mainValues = mainValues;
-    }
-
-
-    public static Gauge getGaugeByOfficialNumber(long number) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from Gauge where officialNumber=:number");
-
-        query.setParameter("number", number);
-
-        List<Gauge> results = query.list();
-
-        return results.isEmpty() ? null : results.get(0);
-    }
-
-
-    public DischargeTable fetchMasterDischargeTable() {
-        for (DischargeTable dt: dischargeTables) {
-            if (dt.getKind() == MASTER_DISCHARGE_TABLE) {
-                return dt;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns an array of [days, qs] necessary to create duration curves.
-     *
-     * @return a 2dim array of [days, qs] where days is an int[] and qs is
-     * an double[].
-     */
-    public Object[] fetchDurationCurveData() {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "select cast(nmv.name as integer) as days, mv.value as q " +
-            "from MainValue as mv " +
-            "join mv.mainValue as nmv " +
-            "join nmv.type mvt " +
-            "where mvt.name = 'D' and mv.gauge.id = :gauge_id " +
-            "order by days");
-
-        query.setParameter("gauge_id", getId());
-
-        List<Object> results = query.list();
-        int[]        days    = new int[results.size()];
-        double[]     qs      = new double[results.size()];
-
-        int idx = 0;
-
-        for (Object obj: results) {
-            Object[] arr = (Object[]) obj;
-
-            try {
-                int  day = ((Integer)    arr[0]).intValue();
-                double q = ((BigDecimal) arr[1]).doubleValue();
-
-                days[idx] = day;
-                qs[idx++] = q;
-            }
-            catch (NumberFormatException nfe) {
-            }
-        }
-
-        return new Object[] { days, qs };
-    }
-
-    /**
-     * Calculates the maximum and minimum W and Q values
-     *
-     * @return the MaxMinWQ object representing the calculated values
-     */
-    public MinMaxWQ fetchMaxMinWQ() {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "select max(mv.value) as max, min(mv.value) as min " +
-            "from MainValue as mv " +
-            "join mv.mainValue as nmv " +
-            "join nmv.type mvt " +
-            "where mvt.name in ('W', 'Q') " +
-            "and mv.gauge.id = :gauge_id " +
-            "group by mvt.name order by mvt.name"
-            );
-
-        query.setParameter("gauge_id", getId());
-
-        List<Object> results = query.list();
-        if (results.isEmpty()) {
-            // No values found
-            return new MinMaxWQ();
-        }
-
-        Object[] arr = (Object[]) results.get(0);
-        BigDecimal maxw = (BigDecimal)arr[0];
-        BigDecimal minw = (BigDecimal)arr[1];
-        BigDecimal maxq = null;
-        BigDecimal minq = null;
-
-
-        if (results.size() > 1) {
-            arr = (Object[]) results.get(1);
-            maxq = (BigDecimal)arr[0];
-            minq = (BigDecimal)arr[1];
-        }
-
-        return new MinMaxWQ(minw, maxw, minq, maxq);
-    }
-
-    @Override
-    public int compareTo(Gauge o) {
-        return getName().compareTo(o.getName());
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/GaugeLocation.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/GaugeLocation.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-package de.intevation.flys.model;
-
-import com.vividsolutions.jts.geom.Point;
-
-import de.intevation.flys.backend.SessionHolder;
-
-import java.io.Serializable;
-
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-
-import org.hibernate.annotations.Type;
-
-
- at Entity
- at Table(name = "gauge_location")
-public class GaugeLocation
-implements   Serializable
-{
-    private Integer    id;
-    private River      river;
-    private String     name;
-    private Point      geom;
-
-
-    public GaugeLocation() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Point getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(Point geom) {
-        this.geom = geom;
-    }
-
-
-    /**
-     * Returns a list of RiverAxisKm objects for a given river.
-     *
-     * @param riverid The ID of a river in the database.
-     *
-     * @return a list of RiverAxisKm objects.
-     */
-    public static List<GaugeLocation> getGaugeLocations(int riverid, String name) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from GaugeLocation where river.id =:riverid and name=:name");
-        query.setParameter("riverid", riverid);
-        query.setParameter("name", name);
-
-        List<GaugeLocation> list = query.list();
-
-        return list;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/GrainFraction.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/GrainFraction.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
-import org.apache.log4j.Logger;
-
-
- at Entity
- at Table(name = "grain_fraction")
-public class GrainFraction
-implements   Serializable
-{
-    public static final String TOTAL              = "total";
-    public static final String COARSE             = "coarse";
-    public static final String FINE_MIDDLE        = "fine_middle";
-    public static final String SAND               = "sand";
-    public static final String SUSP_SAND          = "susp_sand";
-    public static final String SUSP_SAND_BED      = "susp_sand_bed";
-    public static final String SUSPENDED_SEDIMENT = "suspended_sediment";
-
-
-    private static Logger logger = Logger.getLogger(GrainFraction.class);
-
-    private Integer id;
-
-    private String name;
-
-    private Double lower;
-    private Double upper;
-
-
-    public GrainFraction() {
-    }
-
-    public GrainFraction(String name, Double lower, Double upper) {
-        this.name  = name;
-        this.lower = lower;
-        this.upper = upper;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_GRAIN_FRACTION_ID_SEQ",
-        sequenceName   = "GRAIN_FRACTION_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_GRAIN_FRACTION_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "name" )
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Column(name = "lower")
-    public Double getLower() {
-        return lower;
-    }
-
-    public void setLower(Double lower) {
-        this.lower = lower;
-    }
-
-    @Column(name = "upper")
-    public Double getUpper() {
-        return upper;
-    }
-
-    public void setUpper(Double upper) {
-        this.upper = upper;
-    }
-
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HWSKind.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HWSKind.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "hws_kinds")
-public class HWSKind implements Serializable {
-    private Integer id;
-    private String name;
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    /**
-     * Get name.
-     *
-     * @return The name of the Hochwasserschutzanlagenart as String.
-     */
-    @Column(name = "kind")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HWSLine.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HWSLine.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,336 +0,0 @@
-package de.intevation.flys.model;
-
-import com.vividsolutions.jts.geom.Geometry;
-
-import de.intevation.flys.model.HWSKind;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.SequenceGenerator;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import de.intevation.flys.backend.SessionHolder;
-
- at Entity
- at Table(name = "hws_lines")
-public class HWSLine implements Serializable {
-
-    private Integer  id;
-
-    private Integer  ogrFid;
-    private HWSKind  kind;
-    private FedState fedState;
-    private River    river;
-    private Integer  official;
-    private Integer  shoreSide;
-    private String   name;
-    private String   path;
-    private String   agency;
-    private String   range;
-    private String   source;
-    private String   status_date;
-    private String   description;
-    private Geometry geom;
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_HWS_LINES_ID_SEQ",
-        sequenceName   = "HWS_LINES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_HWS_LINES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Geometry getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(Geometry geom) {
-        this.geom = geom;
-    }
-
-    /**
-     * Get ogrFid.
-     *
-     * @return ogrFid as Integer.
-     */
-    @Column(name = "ogr_fid")
-    public Integer getOgrFid() {
-        return ogrFid;
-    }
-
-    /**
-     * Set ogrFid.
-     *
-     * @param ogrFid the value to set.
-     */
-    public void setOgrFid(Integer ogrFid) {
-        this.ogrFid = ogrFid;
-    }
-
-
-    /**
-     * Get official.
-     *
-     * @return official as Integer.
-     */
-    @Column(name = "official")
-    public Integer getofficial() {
-        return official;
-    }
-
-    /**
-     * Set official.
-     *
-     * @param official the value to set.
-     */
-    public void setofficial(Integer official) {
-        this.official = official;
-    }
-
-    /**
-     * Get shoreSide.
-     *
-     * @return shoreSide as Integer.
-     */
-    @Column(name = "shore_side")
-    public Integer getShoreSide() {
-        return shoreSide;
-    }
-
-    /**
-     * Set shoreSide.
-     *
-     * @param shoreSide the value to set.
-     */
-    public void setShoreSide(Integer shoreSide) {
-        this.shoreSide = shoreSide;
-    }
-
-    /**
-     * Get name.
-     *
-     * @return name as String.
-     */
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Get path.
-     *
-     * @return path as String.
-     */
-    @Column(name = "path")
-    public String getPath() {
-        return path;
-    }
-
-    /**
-     * Set path.
-     *
-     * @param path the value to set.
-     */
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    /**
-     * Get agency.
-     *
-     * @return agency as String.
-     */
-    @Column(name = "agency")
-    public String getAgency() {
-        return agency;
-    }
-
-    /**
-     * Set agency.
-     *
-     * @param agency the value to set.
-     */
-    public void setAgency(String agency) {
-        this.agency = agency;
-    }
-
-    /**
-     * Get range.
-     *
-     * @return range as String.
-     */
-    @Column(name = "range")
-    public String getRange() {
-        return range;
-    }
-
-    /**
-     * Set range.
-     *
-     * @param range the value to set.
-     */
-    public void setRange(String range) {
-        this.range = range;
-    }
-
-    /**
-     * Get source.
-     *
-     * @return source as String.
-     */
-    @Column(name = "source")
-    public String getSource() {
-        return source;
-    }
-
-    /**
-     * Set source.
-     *
-     * @param source the value to set.
-     */
-    public void setSource(String source) {
-        this.source = source;
-    }
-
-    /**
-     * Get status_date.
-     *
-     * @return status_date as String.
-     */
-    @Column(name = "status_date")
-    public String getStatusDate() {
-        return status_date;
-    }
-
-    /**
-     * Set status_date.
-     *
-     * @param status_date the value to set.
-     */
-    public void setStatusDate(String status_date) {
-        this.status_date = status_date;
-    }
-
-    /**
-     * Get description.
-     *
-     * @return description as String.
-     */
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * Set description.
-     *
-     * @param description the value to set.
-     */
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    /**
-     * Get kind.
-     *
-     * @return kind as HWSKind.
-     */
-    @OneToOne
-    @JoinColumn(name = "kind_id")
-    public HWSKind getKind() {
-        return kind;
-    }
-
-    /**
-     * Set kind.
-     *
-     * @param kind the value to set.
-     */
-    public void setKind(HWSKind kind) {
-        this.kind = kind;
-    }
-
-    /**
-     * Get fedState.
-     *
-     * @return fedState as FedState.
-     */
-    @OneToOne
-    @JoinColumn(name = "fed_state_id")
-    public FedState getFedState() {
-        return fedState;
-    }
-
-    /**
-     * Set fedState.
-     *
-     * @param fedState the value to set.
-     */
-    public void setFedState(FedState fedState) {
-        this.fedState = fedState;
-    }
-
-    /**
-     * Get river.
-     *
-     * @return river as River.
-     */
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    /**
-     * Set river.
-     *
-     * @param river the value to set.
-     */
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    public static List<HWSLine> getLines(int riverId, String name) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-                    "from HWSLine where river.id =:river_id and name=:name");
-        query.setParameter("river_id", riverId);
-        query.setParameter("name", name);
-
-        return query.list();
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HWSPoint.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HWSPoint.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,457 +0,0 @@
-package de.intevation.flys.model;
-
-import com.vividsolutions.jts.geom.Geometry;
-
-import java.io.Serializable;
-import java.util.List;
-
-import java.math.BigDecimal;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.SequenceGenerator;
-
-import org.hibernate.annotations.Type;
-import org.hibernate.Session;
-import org.hibernate.Query;
-
-import de.intevation.flys.backend.SessionHolder;
-
- at Entity
- at Table(name = "hws_points")
-public class HWSPoint implements Serializable {
-
-    private Integer    id;
-
-    private Integer    ogrFid;
-    private HWSKind    kind;
-    private FedState   fedState;
-    private River      river;
-    private Integer    official;
-    private Integer    shoreSide;
-    private String     name;
-    private String     path;
-    private String     agency;
-    private String     range;
-    private String     source;
-    private String     statusDate;
-    private String     description;
-    private BigDecimal freeboard;
-    private BigDecimal dikeKm;
-    private BigDecimal z;
-    private BigDecimal zTarget;
-    private BigDecimal ratedLevel;
-    private Geometry   geom;
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_HWS_POINTS_ID_SEQ",
-        sequenceName   = "HWS_POINTS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_HWS_POINTS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Geometry getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(Geometry geom) {
-        this.geom = geom;
-    }
-
-    /**
-     * Get ogrFid.
-     *
-     * @return ogrFid as Integer.
-     */
-    @Column(name = "ogr_fid")
-    public Integer getOgrFid() {
-        return ogrFid;
-    }
-
-    /**
-     * Set ogrFid.
-     *
-     * @param ogrFid the value to set.
-     */
-    public void setOgrFid(Integer ogrFid) {
-        this.ogrFid = ogrFid;
-    }
-
-
-    /**
-     * Get official.
-     *
-     * @return official as Integer.
-     */
-    @Column(name = "official")
-    public Integer getofficial() {
-        return official;
-    }
-
-    /**
-     * Set official.
-     *
-     * @param official the value to set.
-     */
-    public void setofficial(Integer official) {
-        this.official = official;
-    }
-
-    /**
-     * Get shoreSide.
-     *
-     * @return shoreSide as Integer.
-     */
-    @Column(name = "shore_side")
-    public Integer getShoreSide() {
-        return shoreSide;
-    }
-
-    /**
-     * Set shoreSide.
-     *
-     * @param shoreSide the value to set.
-     */
-    public void setShoreSide(Integer shoreSide) {
-        this.shoreSide = shoreSide;
-    }
-
-    /**
-     * Get name.
-     *
-     * @return name as String.
-     */
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Get path.
-     *
-     * @return path as String.
-     */
-    @Column(name = "path")
-    public String getPath() {
-        return path;
-    }
-
-    /**
-     * Set path.
-     *
-     * @param path the value to set.
-     */
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    /**
-     * Get agency.
-     *
-     * @return agency as String.
-     */
-    @Column(name = "agency")
-    public String getAgency() {
-        return agency;
-    }
-
-    /**
-     * Set agency.
-     *
-     * @param agency the value to set.
-     */
-    public void setAgency(String agency) {
-        this.agency = agency;
-    }
-
-    /**
-     * Get range.
-     *
-     * @return range as String.
-     */
-    @Column(name = "range")
-    public String getRange() {
-        return range;
-    }
-
-    /**
-     * Set range.
-     *
-     * @param range the value to set.
-     */
-    public void setRange(String range) {
-        this.range = range;
-    }
-
-    /**
-     * Get source.
-     *
-     * @return source as String.
-     */
-    @Column(name = "source")
-    public String getSource() {
-        return source;
-    }
-
-    /**
-     * Set source.
-     *
-     * @param source the value to set.
-     */
-    public void setSource(String source) {
-        this.source = source;
-    }
-
-    /**
-     * Get statusDate.
-     *
-     * @return statusDate as String.
-     */
-    @Column(name = "status_date")
-    public String getStatusDate() {
-        return statusDate;
-    }
-
-    /**
-     * Set statusDate.
-     *
-     * @param statusDate the value to set.
-     */
-    public void setStatusDate(String statusDate)
-    {
-        this.statusDate = statusDate;
-    }
-
-    /**
-     * Get description.
-     *
-     * @return description as String.
-     */
-    @Column(name = "description")
-    public String getDescription()
-    {
-        return description;
-    }
-
-    /**
-     * Set description.
-     *
-     * @param description the value to set.
-     */
-    public void setDescription(String description)
-    {
-        this.description = description;
-    }
-
-    /**
-     * Get freeboard.
-     *
-     * @return freeboard as BigDecimal.
-     */
-    @Column(name = "freeboard")
-    public BigDecimal getFreeboard()
-    {
-        return freeboard;
-    }
-
-    /**
-     * Set freeboard.
-     *
-     * @param freeboard the value to set.
-     */
-    public void setFreeboard(BigDecimal freeboard)
-    {
-        this.freeboard = freeboard;
-    }
-
-    /**
-     * Get dikeKm.
-     *
-     * @return dikeKm as BigDecimal.
-     */
-    @Column(name = "dike_km")
-    public BigDecimal getDikeKm()
-    {
-        return dikeKm;
-    }
-
-    /**
-     * Set dikeKm.
-     *
-     * @param dikeKm the value to set.
-     */
-    public void setDikeKm(BigDecimal dikeKm)
-    {
-        this.dikeKm = dikeKm;
-    }
-
-    /**
-     * Get z.
-     *
-     * @return z as BigDecimal.
-     */
-    @Column(name = "z")
-    public BigDecimal getZ()
-    {
-        return z;
-    }
-
-    /**
-     * Set z.
-     *
-     * @param z the value to set.
-     */
-    public void setZ(BigDecimal z)
-    {
-        this.z = z;
-    }
-
-    /**
-     * Get zTarget.
-     *
-     * @return zTarget as BigDecimal.
-     */
-    @Column(name = "z_target")
-    public BigDecimal getZTarget()
-    {
-        return zTarget;
-    }
-
-    /**
-     * Set zTarget.
-     *
-     * @param zTarget the value to set.
-     */
-    public void setZTarget(BigDecimal zTarget)
-    {
-        this.zTarget = zTarget;
-    }
-
-    /**
-     * Get ratedLevel.
-     *
-     * @return ratedLevel as BigDecimal.
-     */
-    @Column(name = "rated_level")
-    public BigDecimal getRatedLevel()
-    {
-        return ratedLevel;
-    }
-
-    /**
-     * Set ratedLevel.
-     *
-     * @param ratedLevel the value to set.
-     */
-    public void setRatedLevel(BigDecimal ratedLevel)
-    {
-        this.ratedLevel = ratedLevel;
-    }
-
-    /**
-     * Get kind.
-     *
-     * @return kind as HWSKind.
-     */
-    @OneToOne
-    @JoinColumn(name = "kind_id")
-    public HWSKind getKind()
-    {
-        return kind;
-    }
-
-    /**
-     * Set kind.
-     *
-     * @param kind the value to set.
-     */
-    public void setKind(HWSKind kind)
-    {
-        this.kind = kind;
-    }
-
-    /**
-     * Get fedState.
-     *
-     * @return fedState as FedState.
-     */
-    @OneToOne
-    @JoinColumn(name = "fed_state_id")
-    public FedState getFedState()
-    {
-        return fedState;
-    }
-
-    /**
-     * Set fedState.
-     *
-     * @param fedState the value to set.
-     */
-    public void setFedState(FedState fedState)
-    {
-        this.fedState = fedState;
-    }
-
-    /**
-     * Get river.
-     *
-     * @return river as River.
-     */
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver()
-    {
-        return river;
-    }
-
-    /**
-     * Set river.
-     *
-     * @param river the value to set.
-     */
-    public void setRiver(River river)
-    {
-        this.river = river;
-    }
-
-    public static List<HWSPoint> getPoints(int riverId, String name) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-                    "from HWSPoint where river.id =:river_id and name=:name");
-        query.setParameter("river_id", riverId);
-        query.setParameter("name", name);
-
-        return query.list();
-    }
-}
-
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HYK.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HYK.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "hyks")
-public class HYK
-implements   Serializable
-{
-    private Integer id;
-    private River   river;
-    private String  description;
-
-    private List<HYKEntry> entries;
-
-    public HYK() {
-    }
-
-    public HYK(River river, String description) {
-        this.river       = river;
-        this.description = description;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_HYKS_ID_SEQ",
-        sequenceName   = "HYKS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_HYKS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @OneToMany
-    @OrderBy("km")
-    @JoinColumn(name="hyk_id")
-    public List<HYKEntry> getEntries() {
-        return entries;
-    }
-
-    public void setEntries(List<HYKEntry> entries) {
-        this.entries = entries;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HYKEntry.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HYKEntry.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.math.BigDecimal;
-
-import java.util.Date;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "hyk_entries")
-public class HYKEntry
-implements   Serializable
-{
-    private Integer    id;
-    private HYK        hyk;
-    private BigDecimal km;
-    private Date       measure;
-
-    private List<HYKFormation> formations;
-
-    public HYKEntry() {
-    }
-
-    public HYKEntry(HYK hyk, BigDecimal km, Date measure) {
-        this.hyk     = hyk;
-        this.km      = km;
-        this.measure = measure;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_HYK_ENTRIES_ID_SEQ",
-        sequenceName   = "HYK_ENTRIES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_HYK_ENTRIES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "hyk_id")
-    public HYK getHYK() {
-        return hyk;
-    }
-
-    public void setHYK(HYK hyk) {
-        this.hyk = hyk;
-    }
-
-    @Column(name = "km")
-    public BigDecimal getKm() {
-        return km;
-    }
-
-    public void setKm(BigDecimal km) {
-        this.km = km;
-    }
-
-    @Column(name = "measure")
-    public Date getMeasure() {
-        return measure;
-    }
-
-    public void setMeasure(Date measure) {
-        this.measure = measure;
-    }
-
-    @OneToMany
-    @OrderBy("formationNum")
-    @JoinColumn(name="hyk_entry_id")
-    public List<HYKFormation> getFormations() {
-        return formations;
-    }
-
-    public void setFormations(List<HYKFormation> formations) {
-        this.formations = formations;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HYKFlowZone.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HYKFlowZone.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "hyk_flow_zones")
-public class HYKFlowZone
-implements   Serializable
-{
-    private Integer         id;
-    private HYKFormation    formation;
-    private HYKFlowZoneType type;
-    private BigDecimal      a;
-    private BigDecimal      b;
-
-    public HYKFlowZone() {
-    }
-
-    public HYKFlowZone(
-        HYKFormation    formation,
-        HYKFlowZoneType type,
-        BigDecimal      a,
-        BigDecimal      b
-    ) {
-        this.formation = formation;
-        this.type      = type;
-        this.a         = a;
-        this.b         = b;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_HYK_FLOW_ZONES_ID_SEQ",
-        sequenceName   = "HYK_FLOW_ZONES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_HYK_FLOW_ZONES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "formation_id")
-    public HYKFormation getFormation() {
-        return formation;
-    }
-
-    public void setFormation(HYKFormation formation) {
-        this.formation = formation;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "type_id")
-    public HYKFlowZoneType getType() {
-        return type;
-    }
-
-    public void setType(HYKFlowZoneType type) {
-        this.type = type;
-    }
-
-    @Column(name = "a")
-    public BigDecimal getA() {
-        return a;
-    }
-
-    public void setA(BigDecimal a) {
-        this.a = a;
-    }
-
-    @Column(name = "b")
-    public BigDecimal getB() {
-        return b;
-    }
-
-    public void setB(BigDecimal b) {
-        this.b = b;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HYKFlowZoneType.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HYKFlowZoneType.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
- at Entity
- at Table(name = "hyk_flow_zone_types")
-public class HYKFlowZoneType
-implements   Serializable
-{
-    private Integer id;
-    private String  name;
-    private String  description;
-
-    public HYKFlowZoneType() {
-    }
-
-    public HYKFlowZoneType(String name) {
-        this.name = name;
-    }
-
-    public HYKFlowZoneType(String name, String description) {
-        this.name        = name;
-        this.description = description;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_HYK_FLOW_ZONE_TYPES_ID_SEQ",
-        sequenceName   = "HYK_FLOW_ZONE_TYPES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_HYK_FLOW_ZONE_TYPES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HYKFormation.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HYKFormation.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,151 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.util.List;
-
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "hyk_formations")
-public class HYKFormation
-implements   Serializable
-{
-    private Integer    id;
-    private Integer    formationNum;
-    private HYKEntry   entry;
-    private BigDecimal top;
-    private BigDecimal bottom;
-    private BigDecimal distanceVL;
-    private BigDecimal distanceHF;
-    private BigDecimal distanceVR;
-
-    private List<HYKFlowZone> zones;
-
-    public HYKFormation() {
-    }
-
-    public HYKFormation(
-        Integer    formationNum,
-        HYKEntry   entry,
-        BigDecimal top,
-        BigDecimal bottom,
-        BigDecimal distanceVL,
-        BigDecimal distanceHF,
-        BigDecimal distanceVR
-    ) {
-        this.formationNum = formationNum;
-        this.entry        = entry;
-        this.top          = top;
-        this.bottom       = bottom;
-        this.distanceVL   = distanceVL;
-        this.distanceHF   = distanceHF;
-        this.distanceVR   = distanceVR;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_HYK_FORMATIONS_ID_SEQ",
-        sequenceName   = "HYK_FORMATIONS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_HYK_FORMATIONS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "formation_num")
-    public Integer getFormationNum() {
-        return formationNum;
-    }
-
-    public void setFormationNum(Integer formationNum) {
-        this.formationNum = formationNum;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "hyk_entry_id")
-    public HYKEntry getEntry() {
-        return entry;
-    }
-
-    public void setEntry(HYKEntry entry) {
-        this.entry = entry;
-    }
-
-    @Column(name = "top")
-    public BigDecimal getTop() {
-        return top;
-    }
-
-    public void setTop(BigDecimal top) {
-        this.top = top;
-    }
-
-    @Column(name = "bottom")
-    public BigDecimal getBottom() {
-        return bottom;
-    }
-
-    public void setBottom(BigDecimal bottom) {
-        this.bottom = bottom;
-    }
-
-    @Column(name = "distance_vl")
-    public BigDecimal getDistanceVL() {
-        return distanceVL;
-    }
-
-    public void setDistanceVL(BigDecimal distanceVL) {
-        this.distanceVL = distanceVL;
-    }
-
-    @Column(name = "distance_hf")
-    public BigDecimal getDistanceHF() {
-        return distanceHF;
-    }
-
-    public void setDistanceHF(BigDecimal distanceHF) {
-        this.distanceHF = distanceHF;
-    }
-
-    @Column(name = "distance_vr")
-    public BigDecimal getDistanceVR() {
-        return distanceVR;
-    }
-
-    public void setDistanceVR(BigDecimal distanceVR) {
-        this.distanceVR = distanceVR;
-    }
-
-
-    @OneToMany
-    @OrderBy("a")
-    @JoinColumn(name="formation_id")
-    public List<HYKFlowZone> getZones() {
-        return zones;
-    }
-
-    public void setZones(List<HYKFlowZone> zones) {
-        this.zones = zones;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HydrBoundary.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HydrBoundary.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,184 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.SequenceGenerator;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import com.vividsolutions.jts.geom.MultiLineString;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "hydr_boundaries")
-public class HydrBoundary
-implements   Serializable
-{
-    private Integer    id;
-    private SectieKind sectie;
-    private SobekKind  sobek;
-    private String     name;
-    private River      river;
-    private MultiLineString geom;
-    private BoundaryKind kind;
-
-    public HydrBoundary() {
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_HYDR_BOUNDARIES_ID_SEQ",
-        sequenceName   = "HYDR_BOUNDARIES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_HYDR_BOUNDARIES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public MultiLineString getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(MultiLineString geom) {
-        this.geom = geom;
-    }
-
-    public static List<HydrBoundary> getHydrBoundaries(int riverId, String name, int kindId) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from HydrBoundary where river.id =:river_id and name=:name" + 
-            " and kind.id=:kind_id");
-        query.setParameter("river_id", riverId);
-        query.setParameter("name", name);
-        query.setParameter("kind_id", kindId);
-
-        return query.list();
-    }
-
-    public static List<HydrBoundary> getHydrBoundaries(int riverId, String name) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from HydrBoundary where river.id =:river_id and name=:name");
-        query.setParameter("river_id", riverId);
-        query.setParameter("name", name);
-
-        return query.list();
-    }
-
-    /**
-     * Get sectie.
-     *
-     * @return sectie as SectieKind.
-     */
-    @OneToOne
-    @JoinColumn(name = "sectie")
-    public SectieKind getSectie()
-    {
-        return sectie;
-    }
-
-    /**
-     * Set sectie.
-     *
-     * @param sectie the value to set.
-     */
-    public void setSectie(SectieKind sectie)
-    {
-        this.sectie = sectie;
-    }
-
-    /**
-     * Get sobek.
-     *
-     * @return sobek as SobekKind.
-     */
-    @OneToOne
-    @JoinColumn(name = "sobek")
-    public SobekKind getSobek()
-    {
-        return sobek;
-    }
-
-    /**
-     * Set sobek.
-     *
-     * @param sobek the value to set.
-     */
-    public void setSobek(SobekKind sobek)
-    {
-        this.sobek = sobek;
-    }
-
-    /**
-     * Get kind.
-     *
-     * @return kind as BoundaryKind.
-     */
-    @OneToOne
-    @JoinColumn(name = "kind")
-    public BoundaryKind getKind()
-    {
-        return kind;
-    }
-
-    /**
-     * Set kind.
-     *
-     * @param kind the value to set.
-     */
-    public void setKind(BoundaryKind kind)
-    {
-        this.kind = kind;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/HydrBoundaryPoly.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/HydrBoundaryPoly.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,194 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.SequenceGenerator;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import com.vividsolutions.jts.geom.Geometry;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "hydr_boundaries_poly")
-public class HydrBoundaryPoly
-implements   Serializable
-{
-    private Integer    id;
-    private String     name;
-    private River      river;
-    private Geometry   geom;
-    private SectieKind sectie;
-    private SobekKind  sobek;
-    private BoundaryKind kind;
-
-    public HydrBoundaryPoly() {
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_HYDR_BOUNDARIES_POLY_ID_SEQ",
-        sequenceName   = "HYDR_BOUNDARIES_POLY_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_HYDR_BOUNDARIES_POLY_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Geometry getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(Geometry geom) {
-        this.geom = geom;
-    }
-
-
-    public static List<HydrBoundaryPoly> getHydrBoundaries(int riverId, String name) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from HydrBoundaryPoly where river.id =:river_id and name=:name");
-        query.setParameter("river_id", riverId);
-        query.setParameter("name", name);
-
-        return query.list();
-    }
-
-    public static List<HydrBoundaryPoly> getHydrBoundaries(int riverId,
-            int kind, int sectie, int sobek) {
-        Session session = SessionHolder.HOLDER.get();
-
-        String filter = " where river.id =:river_id";
-
-        if (kind != -1) {
-            filter += " and kind = " + kind;
-        }
-        if (sectie != -1) {
-            filter += " and sectie = " + sectie;
-        }
-        if (sobek != -1){
-            filter += " and sobek = " + sobek;
-        }
-
-        Query query = session.createQuery("from HydrBoundaryPoly" + filter);
-        query.setParameter("river_id", riverId);
-        return query.list();
-    }
-
-    /**
-     * Get sectie.
-     *
-     * @return sectie as SectieKind.
-     */
-    @OneToOne
-    @JoinColumn(name = "sectie")
-    public SectieKind getSectie()
-    {
-        return sectie;
-    }
-
-    /**
-     * Set sectie.
-     *
-     * @param sectie the value to set.
-     */
-    public void setSectie(SectieKind sectie)
-    {
-        this.sectie = sectie;
-    }
-
-    /**
-     * Get sobek.
-     *
-     * @return sobek as SobekKind.
-     */
-    @OneToOne
-    @JoinColumn(name = "sobek")
-    public SobekKind getSobek()
-    {
-        return sobek;
-    }
-
-    /**
-     * Set sobek.
-     *
-     * @param sobek the value to set.
-     */
-    public void setSobek(SobekKind sobek)
-    {
-        this.sobek = sobek;
-    }
-
-    /**
-     * Get kind.
-     *
-     * @return kind as BoundaryKind.
-     */
-    @OneToOne
-    @JoinColumn(name = "kind")
-    public BoundaryKind getKind()
-    {
-        return kind;
-    }
-
-    /**
-     * Set kind.
-     *
-     * @param kind the value to set.
-     */
-    public void setKind(BoundaryKind kind)
-    {
-        this.kind = kind;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Jetty.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Jetty.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import com.vividsolutions.jts.geom.Geometry;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import de.intevation.flys.backend.SessionHolder;
-
- at Entity
- at Table(name = "jetties")
-public class Jetty
-implements   Serializable
-{
-    private Integer    id;
-    private River      river;
-    private Geometry   geom;
-
-    public Jetty() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Geometry getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(Geometry geom) {
-        this.geom = geom;
-    }
-
-    public static List<Jetty> getJetties(int riverId, int kindId) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from Jetty where river.id =:river_id and kind_id=:kind_id");
-        query.setParameter("kind_id", kindId);
-        query.setParameter("river_id", riverId);
-
-        return query.list();
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/LocationSystem.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/LocationSystem.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
-
- at Entity
- at Table(name = "location_system")
-public class LocationSystem implements Serializable {
-
-    protected Integer id;
-
-    protected String name;
-    protected String description;
-
-
-    public LocationSystem() {
-    }
-
-
-    public LocationSystem(String name, String description) {
-        this.name        = name;
-        this.description = description;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_LOCATION_SYSTEM_ID_SEQ",
-        sequenceName   = "LOCATION_SYSTEM_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_LOCATION_SYSTEM_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/MainValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/MainValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-import javax.persistence.GenerationType;
-
-import java.math.BigDecimal;
-
-
-/** A Main or Extreme value of a rivers gauge. */
- at Entity
- at Table(name = "main_values")
-public class MainValue
-implements   Serializable
-{
-    private Integer        id;
-
-    private Gauge          gauge;
-
-    private NamedMainValue mainValue;
-
-    private BigDecimal     value;
-
-    private TimeInterval   timeInterval;
-
-    public MainValue() {
-    }
-
-    public MainValue(
-        Gauge          gauge,
-        NamedMainValue mainValue,
-        BigDecimal     value,
-        TimeInterval   timeInterval
-    ) {
-        this.gauge        = gauge;
-        this.mainValue    = mainValue;
-        this.value        = value;
-        this.timeInterval = timeInterval;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_MAIN_VALUES_ID_SEQ",
-        sequenceName   = "MAIN_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_MAIN_VALUES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "gauge_id")
-    public Gauge getGauge() {
-        return gauge;
-    }
-
-    public void setGauge(Gauge gauge) {
-        this.gauge = gauge;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "named_value_id")
-    public NamedMainValue getMainValue() {
-        return mainValue;
-    }
-
-    public void setMainValue(NamedMainValue mainValue) {
-        this.mainValue = mainValue;
-    }
-
-    @Column(name = "value") // FIXME: type mapping needed?
-    public BigDecimal getValue() {
-        return value;
-    }
-
-    public void setValue(BigDecimal value) {
-        this.value = value;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "time_interval_id")
-    public TimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(TimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/MainValueType.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/MainValueType.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
- at Entity
- at Table(name = "main_value_types")
-public class MainValueType
-implements   Serializable
-{
-    private Integer id;
-    private String  name;
-
-    public MainValueType() {
-    }
-
-    public MainValueType(String name) {
-        this.name = name;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_MAIN_VALUE_TYPES_ID_SEQ",
-        sequenceName   = "MAIN_VALUE_TYPES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_MAIN_VALUE_TYPES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "name") // FIXME: Type conversion needed?
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/MeasurementStation.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/MeasurementStation.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-package de.intevation.flys.model;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
-
- at Entity
- at Table(name = "measurement_station")
-public class MeasurementStation {
-
-    private Integer id;
-
-    private String name;
-    private String measurementType;
-    private String riverside;
-    private String operator;
-    private String description;
-
-    private Double station;
-    private Range range;
-
-    private River river;
-
-    private Gauge gauge;
-    private String gaugeName;
-
-    private TimeInterval observationTimerange;
-
-    public MeasurementStation() {
-    }
-
-    public MeasurementStation(River river, String name, String measurementType,
-        String riverside, Double station, Range range, Gauge gauge,
-        String gaugeName, TimeInterval observationTimerange, String operator,
-        String description
-    ) {
-        this.river = river;
-        this.name = name;
-        this.measurementType = measurementType;
-        this.riverside = riverside;
-        this.station = station;
-        this.range = range;
-        this.gauge = gauge;
-        this.gaugeName = gaugeName;
-        this.observationTimerange = observationTimerange;
-        this.operator = operator;
-        this.description = description;
-    }
-
-    @Id
-    @SequenceGenerator(name = "SEQ_MEASUREMENT_STATION_ID_SEQ", sequenceName = "MEASUREMENT_STATION_ID_SEQ", allocationSize = 1)
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_MEASUREMENT_STATION_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Column(name = "measurement_type")
-    public String getMeasurementType() {
-        return measurementType;
-    }
-
-    public void setMeasurementType(String measurementType) {
-        this.measurementType = measurementType;
-    }
-
-    @Column(name = "riverside")
-    public String getRiverside() {
-        return riverside;
-    }
-
-    public void setRiverside(String riverside) {
-        this.riverside = riverside;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "reference_gauge_id")
-    public Gauge getGauge() {
-        return gauge;
-    }
-
-    public void setGauge(Gauge gauge) {
-        this.gauge = gauge;
-    }
-
-    @Column(name = "reference_gauge_name")
-    public String getGaugeName() {
-        return gaugeName;
-    }
-
-    public void setGaugeName(String gaugeName) {
-        this.gaugeName = gaugeName;
-    }
-
-    @Column(name = "station")
-    public Double getStation() {
-        return station;
-    }
-
-    public void setStation(Double station) {
-        this.station = station;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "range_id")
-    public Range getRange() {
-        return range;
-    }
-
-    public void setRange(Range range) {
-        this.range = range;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "observation_timerange_id")
-    public TimeInterval getObservationTimerange() {
-        return observationTimerange;
-    }
-
-    public void setObservationTimerange(TimeInterval observationTimerange) {
-        this.observationTimerange = observationTimerange;
-    }
-
-    @Column(name = "operator")
-    public String getOperator() {
-        return operator;
-    }
-
-    public void setOperator(String operator) {
-        this.operator = operator;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/MinMaxWQ.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/MinMaxWQ.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-/**
- * Represents minmimum and maximum values for W and Q
- */
-public class MinMaxWQ implements Serializable {
-
-    private BigDecimal minw;
-    private BigDecimal maxw;
-    private BigDecimal minq;
-    private BigDecimal maxq;
-
-    /**
-     * Default constuctor to indecate that no min and max w and q values
-     * are available
-     */
-    public MinMaxWQ() {
-    }
-
-    /**
-     * Constructor for a new MinMaxWQ value
-     *
-     * @param minw Mimimim W
-     * @param maxw Maximum W
-     * @param minq Mimimim Q
-     * @param maxq Maximum Q
-     */
-    public MinMaxWQ(
-            BigDecimal minw,
-            BigDecimal maxw,
-            BigDecimal minq,
-            BigDecimal maxq)
-    {
-        this.minw = minw;
-        this.maxw = maxw;
-        this.minq = minq;
-        this.maxq = maxq;
-    }
-
-    public BigDecimal getMinW() {
-        return this.minw;
-    }
-
-    public BigDecimal getMaxW() {
-        return this.maxw;
-    }
-
-    public BigDecimal getMinQ() {
-        return this.minq;
-    }
-
-    public BigDecimal getMaxQ() {
-        return this.maxq;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/MorphologicalWidth.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/MorphologicalWidth.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-
-
- at Entity
- at Table(name = "morphologic_width")
-public class MorphologicalWidth implements Serializable {
-
-    private Integer id;
-
-    private River river;
-
-    private Unit unit;
-
-    private List<MorphologicalWidthValue> values;
-
-
-    public MorphologicalWidth() {
-    }
-
-
-    public MorphologicalWidth(River river, Unit unit) {
-        this.river = river;
-        this.unit  = unit;
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_MORPHOLOGIC_WIDTH_ID_SEQ",
-        sequenceName   = "MORPHOLOGIC_WIDTH_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_MORPHOLOGIC_WIDTH_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "unit_id")
-    public Unit getUnit() {
-        return unit;
-    }
-
-    public void setUnit(Unit unit) {
-        this.unit = unit;
-    }
-
-    @OneToMany
-    @JoinColumn(name = "morphologic_width_id")
-    public List<MorphologicalWidthValue> getValues() {
-        return values;
-    }
-
-    public void setValues(List<MorphologicalWidthValue> values) {
-        this.values = values;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/MorphologicalWidthValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/MorphologicalWidthValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-
- at Entity
- at Table(name = "morphologic_width_values")
-public class MorphologicalWidthValue implements Serializable {
-
-    private Integer id;
-
-    private MorphologicalWidth morphologicalWidth;
-
-    private BigDecimal station;
-    private BigDecimal width;
-
-    private String description;
-
-
-    public MorphologicalWidthValue() {
-    }
-
-
-    public MorphologicalWidthValue(
-        MorphologicalWidth morphologicalWidth,
-        BigDecimal         station,
-        BigDecimal         width,
-        String             description
-    ) {
-        this.morphologicalWidth = morphologicalWidth;
-        this.station            = station;
-        this.width              = width;
-        this.description        = description;
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_MORPH_WIDTH_VALUES_ID_SEQ",
-        sequenceName   = "MORPH_WIDTH_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_MORPH_WIDTH_VALUES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "morphologic_width_id")
-    public MorphologicalWidth getMorphologicalWidth() {
-        return morphologicalWidth;
-    }
-
-    public void setMorphologicalWidth(MorphologicalWidth width) {
-        this.morphologicalWidth = width;
-    }
-
-    @Column(name = "station")
-    public BigDecimal getStation() {
-        return station;
-    }
-
-    public void setStation(BigDecimal station) {
-        this.station = station;
-    }
-
-    @Column(name = "width")
-    public BigDecimal getWidth() {
-        return width;
-    }
-
-    public void setWidth(BigDecimal width) {
-        this.width = width;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/NamedMainValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/NamedMainValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "named_main_values")
-public class NamedMainValue
-implements   Serializable
-{
-    private Integer       id;
-    private String        name;
-    private MainValueType type;
-
-    public NamedMainValue() {
-    }
-
-    public NamedMainValue(String name, MainValueType type) {
-        this.name = name;
-        this.type = type;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_NAMED_MAIN_VALUES_ID_SEQ",
-        sequenceName   = "NAMED_MAIN_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_NAMED_MAIN_VALUES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "type_id" )
-    public MainValueType getType() {
-        return type;
-    }
-
-    public void setType(MainValueType type) {
-        this.type = type;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Position.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Position.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.OneToMany;
-import javax.persistence.JoinColumn;
-import javax.persistence.GenerationType;
-
-import java.util.List;
-
- at Entity
- at Table(name = "positions")
-public class Position
-implements   Serializable
-{
-    private Integer id;
-
-    private String  value;
-
-    private List<Annotation> annotations;
-
-    public Position() {
-    }
-
-    public Position(String value) {
-        this.value = value;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_POSITIONS_ID_SEQ",
-        sequenceName   = "POSITIONS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_POSITIONS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "value")
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    @OneToMany
-    @JoinColumn(name="position_id")
-    public List<Annotation> getAnnotations() {
-        return annotations;
-    }
-
-    public void setAnnotations(List<Annotation> annotations) {
-        this.annotations = annotations;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Range.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Range.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
- at Entity
- at Table(name = "ranges")
-public class Range
-implements   Serializable
-{
-    public static final double EPSILON = 1e-5;
-    private Integer    id;
-    private BigDecimal a;
-    private BigDecimal b;
-
-    private River      river;
-
-    public Range() {
-    }
-
-    public Range(double a, double b, River river) {
-        this(new BigDecimal(a), new BigDecimal(b), river);
-    }
-
-    public Range(BigDecimal a, BigDecimal b, River river) {
-        this.a     = a;
-        this.b     = b;
-        this.river = river;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_RANGES_ID_SEQ",
-        sequenceName   = "RANGES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_RANGES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "a") // FIXME: type mapping needed?
-    public BigDecimal getA() {
-        return a;
-    }
-
-    public void setA(BigDecimal a) {
-        this.a = a;
-    }
-
-    @Column(name = "b") // FIXME: type mapping needed?
-    public BigDecimal getB() {
-        return b;
-    }
-
-    public void setB(BigDecimal b) {
-        this.b = b;
-    }
-
-    public boolean containsTolerant(double x) {
-            return containsTolerant(x, EPSILON);
-    }
-
-    public boolean containsTolerant(double x, double tolerance) {
-        BigDecimal b = this.b != null ? this.b : a;
-        double av = a.doubleValue();
-        double bv = b.doubleValue();
-        if (av > bv) {
-            double t = av;
-            av = bv;
-            bv = t;
-        }
-        return x+tolerance >= av && x-tolerance <= bv;
-    }
-
-    public boolean contains(double x) {
-        BigDecimal b = this.b != null ? this.b : a;
-        double av = a.doubleValue();
-        double bv = b.doubleValue();
-        if (av > bv) {
-            double t = av;
-            av = bv;
-            bv = t;
-        }
-        return x >= av && x <= bv;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    public int code() {
-        int code = 0;
-        if (a != null) code  = 1;
-        if (b != null) code |= 2;
-        return code;
-    }
-
-    public boolean intersects(BigDecimal c) {
-        return !(a.compareTo(c) > 0 || b.compareTo(c) < 0);
-    }
-
-    public boolean intersects(Range other) {
-
-        int code  = code();
-        int ocode = other.code();
-
-        if (code == 0 || ocode == 0) {
-            return false;
-        }
-
-        switch (code) {
-            case 1: // has a
-                switch (ocode) {
-                    case 1: // has a
-                        return a.compareTo(other.a) == 0;
-                    case 2: // has b
-                        return a.compareTo(other.b) == 0;
-                    case 3: // has range
-                        return other.intersects(a);
-                }
-                break;
-            case 2: // has b
-                switch (ocode) {
-                    case 1: // has a
-                        return b.compareTo(other.a) == 0;
-                    case 2: // has b
-                        return b.compareTo(other.b) == 0;
-                    case 3: // has range
-                        return other.intersects(b);
-                }
-                break;
-            case 3: // has range
-                switch (ocode) {
-                    case 1: // has a
-                        return intersects(other.a);
-                    case 2: // has b
-                        return intersects(other.b);
-                    case 3: // has range
-                        return !(other.b.compareTo(a) < 0
-                               ||other.a.compareTo(b) > 0);
-                }
-                break;
-
-        }
-
-        return false;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/River.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/River.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,345 +0,0 @@
-package de.intevation.flys.model;
-
-import de.intevation.flys.backend.SessionHolder;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.OrderBy;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-
-
- at Entity
- at Table(name = "rivers")
-public class River
-implements   Serializable
-{
-    public static final MathContext PRECISION = new MathContext(6);
-
-    public static final double EPSILON = 1e-5;
-
-    public static final Comparator<Double> KM_CMP = new Comparator<Double>() {
-        @Override
-        public int compare(Double a, Double b) {
-            double diff = a - b;
-            if (diff < -EPSILON) return -1;
-            if (diff >  EPSILON) return +1;
-            return 0;
-        }
-    };
-
-    private Integer id;
-
-    private Long    officialNumber;
-
-    private String  name;
-
-    private boolean kmUp;
-
-    private List<Gauge> gauges;
-
-    private List<MeasurementStation> measurementstations;
-
-    private Unit wstUnit;
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_RIVERS_ID_SEQ",
-        sequenceName   = "RIVERS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_RIVERS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "official_number")
-    public Long getOfficialNumber() {
-        return officialNumber;
-    }
-
-    public void setOfficialNumber(Long officialNumber) {
-        this.officialNumber = officialNumber;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Column(name = "km_up")
-    public boolean getKmUp() {
-        return kmUp;
-    }
-
-    public void setKmUp(boolean kmUp) {
-        this.kmUp = kmUp;
-    }
-
-    public River() {
-    }
-
-    public River(String name, Unit wstUnit) {
-        this.name    = name;
-        this.wstUnit = wstUnit;
-    }
-
-    @OneToMany
-    @JoinColumn(name="river_id")
-    public List<Gauge> getGauges() {
-        return gauges;
-    }
-
-    public void setGauges(List<Gauge> gauges) {
-        this.gauges = gauges;
-    }
-
-
-    @OneToMany
-    @OrderBy("station")
-    @JoinColumn(name="river_id")
-    public List<MeasurementStation> getMeasurementStations() {
-        return measurementstations;
-    }
-
-    public void setMeasurementStations(List<MeasurementStation> mstations) {
-        this.measurementstations = mstations;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "wst_unit_id" )
-    public Unit getWstUnit() {
-        return wstUnit;
-    }
-
-    public void setWstUnit(Unit wstUnit) {
-        this.wstUnit = wstUnit;
-    }
-
-
-
-    @Override
-    public String toString() {
-        return name != null ? name : "";
-    }
-
-
-    /**
-     * This method returns the gauges that intersect with <i>a</i> and
-     * <i>b</i>,
-     *
-     * @param a A start point.
-     * @param b An end point.
-     *
-     * @return the intersecting gauges.
-     */
-    public List<Gauge> determineGauges(double a, double b) {
-        Session session = SessionHolder.HOLDER.get();
-
-        if (a > b) { double t = a; a = b; b = t; }
-
-        Query query = session.createQuery(
-            "from Gauge where river=:river " +
-            "and not (range.a > :b or range.b < :a) order by a");
-        query.setParameter("river", this);
-        query.setParameter("a", new BigDecimal(a, PRECISION));
-        query.setParameter("b", new BigDecimal(b, PRECISION));
-
-        return query.list();
-    }
-
-    public Gauge maxOverlap(double a, double b) {
-        List<Gauge> gauges = determineGauges(a, b);
-        if (gauges == null) {
-            return null;
-        }
-
-        if (a > b) { double t = a; a = b; b = t; }
-
-        double max = -Double.MAX_VALUE;
-
-        Gauge result = null;
-
-        for (Gauge gauge: gauges) {
-            Range  r = gauge.getRange();
-            double c = r.getA().doubleValue();
-            double d = r.getB().doubleValue();
-
-            double start = c >= a ? c : a;
-            double stop  = d <= b ? d : b;
-
-            double length = stop - start;
-
-            if (length > max) {
-                max = length;
-                result = gauge;
-            }
-        }
-
-        return result;
-    }
-
-    public Gauge determineGaugeByName(String name) {
-        Session session = SessionHolder.HOLDER.get();
-        Query query = session.createQuery(
-            "from Gauge where river=:river and name=:name");
-        query.setParameter("river", this);
-        query.setParameter("name", name);
-        List<Gauge> gauges = query.list();
-        return gauges.isEmpty() ? null : gauges.get(0);
-    }
-
-    public Gauge determineGaugeByPosition(double p) {
-        Session session = SessionHolder.HOLDER.get();
-        Query query = session.createQuery(
-            "from Gauge g where river=:river "  +
-            "and :p between g.range.a and g.range.b");
-        query.setParameter("river", this);
-        query.setParameter("p", new BigDecimal(p, PRECISION));
-        List<Gauge> gauges = query.list();
-        return gauges.isEmpty() ? null : gauges.get(0);
-    }
-
-    public Gauge determineGaugeByStation(double a, double b) {
-
-        if (a > b) { double t = a; a = b; b = t; }
-
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from Gauge where river.id=:river " +
-            "and station between :a and :b");
-        query.setParameter("river", getId());
-        query.setParameter("a", new BigDecimal(a));
-        query.setParameter("b", new BigDecimal(b));
-
-        List<Gauge> gauges = query.list();
-        return gauges.isEmpty() ? null : gauges.get(0);
-    }
-
-    public double[] determineMinMaxQ() {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "select min(wqr.q) as min, max(wqr.q) as max " +
-            "from Wst as w " +
-            "join w.columns as wc " +
-            "join wc.columnQRanges as wcqr " +
-            "join wcqr.wstQRange as wqr " +
-            "where w.kind = 0 and river_id = :river");
-
-        query.setParameter("river", getId());
-
-        double minmax[] = new double[] { Double.MAX_VALUE, Double.MIN_VALUE };
-
-        List<Object> results = query.list();
-
-        if (!results.isEmpty()) {
-            Object[] arr = (Object[]) results.get(0);
-            BigDecimal minq = (BigDecimal)arr[0];
-            BigDecimal maxq = (BigDecimal)arr[1];
-            minmax[0] = minq.doubleValue();
-            minmax[1] = maxq.doubleValue();
-        }
-
-        return minmax;
-    }
-
-
-    /**
-     * This method returns the first gauge that is intersected by <i>a</i> and
-     * <i>b</i>,
-     *
-     * @param a A start point.
-     * @param b An end point.
-     *
-     * @return the first intersecting gauge.
-     */
-    public Gauge determineGauge(double a, double b) {
-        List<Gauge> gauges = determineGauges(a, b);
-
-        int idx = a < b ? 0 : gauges.size() - 1;
-
-        return gauges.isEmpty() ? null : gauges.get(idx);
-    }
-
-    /**
-     * Returns the min and max distance of this river. The first position in the
-     * resulting array contains the min distance, the second position the max
-     * distance.
-     *
-     * @return the min and max distance of this river.
-     */
-    public double[] determineMinMaxDistance() {
-        List<Gauge> gauges = getGauges();
-
-        if (gauges == null || gauges.isEmpty()) {
-            return null;
-        }
-
-        double minmax[] = new double[] { Double.MAX_VALUE, Double.MIN_VALUE };
-
-        for (Gauge g: gauges) {
-            Range r = g.getRange();
-
-            if (r == null) {
-                continue;
-            }
-
-            double a  = r.getA().doubleValue();
-            minmax[0] = minmax[0] < a ? minmax[0] : a;
-
-            BigDecimal bigB = r.getB();
-            if (bigB != null) {
-                double b  = bigB.doubleValue();
-                minmax[1] = minmax[1] > b ? minmax[1] : b;
-            }
-        }
-
-        return minmax;
-    }
-
-    public Map<Double, Double> queryGaugeDatumsKMs() {
-        List<Gauge> gauges = getGauges();
-        Map result = new TreeMap<Double, Double>(KM_CMP);
-
-        for (Gauge gauge: gauges) {
-            BigDecimal km    = gauge.getStation();
-            BigDecimal datum = gauge.getDatum();
-            if (km != null && datum != null) {
-                result.put(km.doubleValue(), datum.doubleValue());
-            }
-        }
-
-        return result;
-    }
-
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/RiverAxis.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/RiverAxis.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import com.vividsolutions.jts.geom.MultiLineString;
-
-import de.intevation.flys.backend.SessionHolder;
-import de.intevation.flys.model.AxisKind;
-
-
-/**
- * A river has one axis that is used for calculation.
- * Additional axes of a river can be used to be painted int maps etc.
- * which one is the main river axis can be determined over the axis kind.
- */
- at Entity
- at Table(name = "river_axes")
-public class RiverAxis
-implements   Serializable
-{
-    private Integer    id;
-    private AxisKind   kind;
-    private River      river;
-    private String     name;
-    private MultiLineString geom;
-
-    public static final int KIND_UNKOWN = 0;
-    public static final int KIND_CURRENT = 1;
-    public static final int KIND_OTHER = 2;
-
-    public RiverAxis() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Get kind.
-     *
-     * @return kind as AxisKind.
-     */
-    @OneToOne
-    @JoinColumn(name = "kind_id")
-    public AxisKind getKind() {
-        return kind;
-    }
-
-    /**
-     * Set kind.
-     *
-     * @param kind the value to set.
-     */
-    public void setKind(AxisKind kind) {
-        this.kind = kind;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public MultiLineString getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(MultiLineString geom) {
-        this.geom = geom;
-    }
-
-
-    public static List<RiverAxis> getRiverAxis(String river)
-    throws IllegalArgumentException {
-        return getRiverAxis(river, KIND_CURRENT);
-    }
-
-    public static List<RiverAxis> getRiverAxis(String river, String name, int kind)
-    throws HibernateException {
-        Session session = SessionHolder.HOLDER.get();
-        Query query = session.createQuery(
-            "from RiverAxis as ax where river.name =:river" +
-            " and kind.id =:kind" +
-            " and ax.name=:name");
-        query.setParameter("river", river);
-        query.setParameter("kind", kind);
-        query.setParameter("name", name);
-
-        List<RiverAxis> list = query.list();
-        return list.isEmpty() ? null : list;
-    }
-
-    public static List<RiverAxis> getRiverAxis(String river, int kind)
-    throws HibernateException {
-        Session session = SessionHolder.HOLDER.get();
-        Query query = session.createQuery(
-            "from RiverAxis where river.name =:river AND kind.id =:kind");
-        query.setParameter("river", river);
-        query.setParameter("kind", kind);
-
-        List<RiverAxis> list = query.list();
-        return list.isEmpty() ? null : list;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/RiverAxisKm.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/RiverAxisKm.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.Session;
-import org.hibernate.Query;
-import org.hibernate.annotations.Type;
-
-import com.vividsolutions.jts.geom.Point;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "river_axes_km")
-public class RiverAxisKm
-implements   Serializable
-{
-    private Integer    id;
-    private River      river;
-    private BigDecimal km;
-    private Point      geom;
-
-
-    public RiverAxisKm() {
-    }
-
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "km")
-    public BigDecimal getKm() {
-        return km;
-    }
-
-
-    public void setKm(BigDecimal km) {
-        this.km = km;
-    }
-
-
-    @Column(name = "geom")
-    @Type(type = "org.hibernatespatial.GeometryUserType")
-    public Point getGeom() {
-        return geom;
-    }
-
-
-    public void setGeom(Point geom) {
-        this.geom = geom;
-    }
-
-
-    /**
-     * Returns a list of RiverAxisKm objects for a given river.
-     *
-     * @param riverid The ID of a river in the database.
-     *
-     * @return a list of RiverAxisKm objects.
-     */
-    public static List<RiverAxisKm> getRiverAxisKms(int riverid) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-            "from RiverAxisKm where river.id =:riverid");
-        query.setParameter("riverid", riverid);
-
-        List<RiverAxisKm> list = query.list();
-
-        return list;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/SQRelation.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/SQRelation.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-import javax.persistence.GenerationType;
-
-
- at Entity
- at Table(name = "sq_relation")
-public class SQRelation implements Serializable {
-
-    private Integer id;
-
-    private River river;
-
-    private TimeInterval timeInterval;
-
-    private String description;
-
-    private List<SQRelationValue> values;
-
-
-    protected SQRelation() {
-    }
-
-
-    public SQRelation(River river, TimeInterval timeInterval, String desc) {
-        this.river        = river;
-        this.timeInterval = timeInterval;
-        this.description  = desc;
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_SQ_ID_SEQ",
-        sequenceName   = "SQ_RELATION_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_SQ_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "time_interval_id")
-    public TimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(TimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-
-    @OneToMany
-    @JoinColumn(name = "sq_relation_id")
-    public List<SQRelationValue> getValues() {
-        return values;
-    }
-
-    public void setValues(List<SQRelationValue> values) {
-        this.values = values;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/SQRelationValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/SQRelationValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,191 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.JoinColumn;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.OneToOne;
-import javax.persistence.GenerationType;
-
-
- at Entity
- at Table(name = "sq_relation_value")
-public class SQRelationValue implements Serializable {
-
-    private Integer id;
-
-    private SQRelation sqRelation;
-
-    private String parameter;
-
-    private MeasurementStation measurementStation;
-
-    private Double a;
-    private Double b;
-    private Double qMax;
-    private Double rSQ;
-    private Integer nTot;
-    private Integer nOutlier;
-    private Double cFerguson;
-    private Double cDuan;
-
-
-    protected SQRelationValue() {
-    }
-
-
-    public SQRelationValue(
-        SQRelation         sqRelation,
-        String             parameter,
-        MeasurementStation measurementStation,
-        Double             a,
-        Double             b,
-        Double             qMax,
-        Double             rSQ,
-        Integer            nTot,
-        Integer            nOutlier,
-        Double             cFerguson,
-        Double             cDuan
-    ) {
-        this.sqRelation         = sqRelation;
-        this.parameter          = parameter;
-        this.measurementStation = measurementStation;
-        this.a                  = a;
-        this.b                  = b;
-        this.qMax               = qMax;
-        this.rSQ                = rSQ;
-        this.nTot               = nTot;
-        this.nOutlier           = nOutlier;
-        this.cFerguson          = cFerguson;
-        this.cDuan              = cDuan;
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_SQ_VALUE_ID_SEQ",
-        sequenceName   = "SQ_RELATION_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_SQ_VALUE_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @OneToOne
-    @JoinColumn(name = "sq_relation_id")
-    public SQRelation getSqRelation() {
-        return sqRelation;
-    }
-
-    public void setSqRelation(SQRelation sqRelation) {
-        this.sqRelation = sqRelation;
-    }
-
-
-    @Column(name = "parameter")
-    public String getParameter() {
-        return parameter;
-    }
-
-    public void setParameter(String parameter) {
-        this.parameter = parameter;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "measurement_station_id")
-    public MeasurementStation getMeasurementStation() {
-        return measurementStation;
-    }
-
-    public void setMeasurementStation(MeasurementStation measurementStation) {
-        this.measurementStation = measurementStation;
-    }
-
-
-    @Column(name = "a")
-    public Double getA() {
-        return a;
-    }
-
-    public void setA(Double a) {
-        this.a = a;
-    }
-
-
-    @Column(name = "b")
-    public Double getB() {
-        return b;
-    }
-
-    public void setB(Double b) {
-        this.b = b;
-    }
-
-    @Column(name = "qmax")
-    public Double getQMax() {
-        return qMax;
-    }
-
-    public void setQMax(Double qMax) {
-        this.qMax = qMax;
-    }
-
-    @Column(name = "rsq")
-    public Double getRSQ() {
-        return rSQ;
-    }
-
-    public void setRSQ(Double rSQ) {
-        this.rSQ = rSQ;
-    }
-
-    @Column(name = "ntot")
-    public Integer getNTot () {
-        return nTot;
-    }
-
-    public void setNTot(Integer nTot) {
-        this.nTot = nTot;
-    }
-
-    @Column(name = "noutl")
-    public Integer getNOutlier() {
-        return nOutlier;
-    }
-
-    public void setNOutlier(Integer nOutlier) {
-        this.nOutlier = nOutlier;
-    }
-
-    @Column(name = "cferguson")
-    public Double getCFerguson() {
-        return cFerguson;
-    }
-
-    public void setCFerguson(Double cFerguson) {
-        this.cFerguson = cFerguson;
-    }
-
-    @Column(name = "cduan")
-    public Double getCDuan() {
-        return cDuan;
-    }
-
-    public void setCDuan(Double cDuan) {
-        this.cDuan = cDuan;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/SectieKind.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/SectieKind.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "sectie_kinds")
-public class SectieKind implements Serializable {
-    private Integer id;
-    private String name;
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    /**
-     * Get name.
-     *
-     * @return name of the kind of sectie as String.
-     */
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/SedimentDensity.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/SedimentDensity.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-
-
- at Entity
- at Table(name = "sediment_density")
-public class SedimentDensity implements Serializable {
-
-    private Integer id;
-
-    private River river;
-
-    private Depth depth;
-
-    private List<SedimentDensityValue> values;
-
-    private String description;
-
-
-    public SedimentDensity() {
-    }
-
-
-    public SedimentDensity(River river, Depth depth, String desc) {
-        this.river       = river;
-        this.depth       = depth;
-        this.description = desc;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_SEDIMENT_DENSITY_ID_SEQ",
-        sequenceName   = "SEDIMENT_DENSITY_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_SEDIMENT_DENSITY_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id" )
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "depth_id")
-    public Depth getDepth() {
-        return depth;
-    }
-
-    public void setDepth(Depth depth) {
-        this.depth = depth;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @OneToMany
-    @JoinColumn(name="sediment_density_id")
-    public List<SedimentDensityValue> getValues() {
-        return values;
-    }
-
-    public void setValues(List<SedimentDensityValue> values) {
-        this.values = values;
-    }
-
-    public void addValue(SedimentDensityValue value) {
-        this.values.add(value);
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/SedimentDensityValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/SedimentDensityValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,125 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-
- at Entity
- at Table(name = "sediment_density_values")
-public class SedimentDensityValue implements Serializable {
-
-    private Integer id;
-
-    private SedimentDensity sedimentDensity;
-
-    private BigDecimal station;
-    private BigDecimal shoreOffset;
-    private BigDecimal density;
-    private BigDecimal year;
-
-    private String description;
-
-
-    public SedimentDensityValue() {
-    }
-
-
-    public SedimentDensityValue(
-        SedimentDensity sedimentDensity,
-        BigDecimal      station,
-	BigDecimal      shoreOffset,
-        BigDecimal      density,
-        BigDecimal      year,
-        String          desc
-    ) {
-        this.sedimentDensity = sedimentDensity;
-        this.station         = station;
-	this.shoreOffset     = shoreOffset;
-        this.density         = density;
-        this.year            = year;
-        this.description     = desc;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_SEDIMENT_DENSITY_VALUES_ID_SEQ",
-        sequenceName   = "SEDIMENT_DENSITY_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_SEDIMENT_DENSITY_VALUES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "sediment_density_id")
-    public SedimentDensity getSedimentDensity() {
-        return sedimentDensity;
-    }
-
-    public void setSedimentDensity(SedimentDensity sedimentDensity) {
-        this.sedimentDensity = sedimentDensity;
-    }
-
-    @Column(name = "station")
-    public BigDecimal getStation() {
-        return station;
-    }
-
-    public void setStation(BigDecimal station) {
-        this.station = station;
-    }
-
-    @Column(name = "shore_offset")
-    public BigDecimal getShoreOffset() {
-        return shoreOffset;
-    }
-
-    public void setShoreOffset(BigDecimal shoreOffset) {
-        this.shoreOffset = shoreOffset;
-    }
-
-    @Column(name = "density")
-    public BigDecimal getDensity() {
-        return density;
-    }
-
-    public void setDensity(BigDecimal density) {
-        this.density = density;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @Column(name = "year")
-    public BigDecimal getYear() {
-        return year;
-    }
-
-    public void setYear(BigDecimal year) {
-        this.year = year;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/SedimentYield.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/SedimentYield.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-import org.apache.log4j.Logger;
-
-
- at Entity
- at Table(name = "sediment_yield")
-public class SedimentYield
-implements   Serializable
-{
-    private static Logger logger = Logger.getLogger(SedimentYield.class);
-
-    private Integer id;
-
-    private River river;
-
-    private GrainFraction grainFraction;
-
-    private Unit unit;
-
-    private TimeInterval timeInterval;
-
-    private String description;
-
-    private List<SedimentYieldValue> values;
-
-
-    public SedimentYield() {
-        this.values = new ArrayList<SedimentYieldValue>();
-    }
-
-    public SedimentYield(River river, Unit unit, TimeInterval timeInterval) {
-        this();
-
-        this.river        = river;
-        this.unit         = unit;
-        this.timeInterval = timeInterval;
-    }
-
-
-    public SedimentYield(
-        River         river,
-        Unit          unit,
-        TimeInterval  timeInterval,
-        GrainFraction grainFraction
-    ) {
-        this(river, unit, timeInterval);
-
-        this.grainFraction = grainFraction;
-    }
-
-
-    public SedimentYield(
-        River         river,
-        Unit          unit,
-        TimeInterval  timeInterval,
-        GrainFraction grainFraction,
-        String        description
-    ) {
-        this(river, unit, timeInterval, grainFraction);
-
-        this.description = description;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_SEDIMENT_YIELD_ID_SEQ",
-        sequenceName   = "SEDIMENT_YIELD_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_SEDIMENT_YIELD_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id")
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @OneToOne
-    @JoinColumn(name="grain_fraction_id")
-    public GrainFraction getGrainFraction() {
-        return grainFraction;
-    }
-
-    public void setGrainFraction(GrainFraction grainFraction) {
-        this.grainFraction = grainFraction;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "unit_id")
-    public Unit getUnit() {
-        return unit;
-    }
-
-    public void setUnit(Unit unit) {
-        this.unit = unit;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "time_interval_id")
-    public TimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(TimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/SedimentYieldValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/SedimentYieldValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-import org.apache.log4j.Logger;
-
-
- at Entity
- at Table(name = "sediment_yield_values")
-public class SedimentYieldValue
-implements   Serializable
-{
-    private static Logger logger = Logger.getLogger(SedimentYieldValue.class);
-
-    private Integer id;
-
-    private SedimentYield sedimentYield;
-
-    private Double station;
-    private Double value;
-
-    private Unit unit;
-
-
-    public SedimentYieldValue() {
-    }
-
-    public SedimentYieldValue(
-        SedimentYield sedimentYield,
-        Double        station,
-        Double        value
-    ) {
-        this.sedimentYield = sedimentYield;
-        this.station       = station;
-        this.value         = value;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_SEDIMENT_YIELD_VALuES_ID_SEQ",
-        sequenceName   = "SEDIMENT_YIELD_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_SEDIMENT_YIELD_VALuES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "sediment_yield_id" )
-    public SedimentYield getSedimentYield() {
-        return sedimentYield;
-    }
-
-    public void setSedimentYield(SedimentYield sedimentYield) {
-        this.sedimentYield = sedimentYield;
-    }
-
-    @Column(name="station")
-    public Double getStation() {
-        return station;
-    }
-
-    public void setStation(Double station) {
-        this.station = station;
-    }
-
-    @Column(name = "value")
-    public Double getValue() {
-        return value;
-    }
-
-    public void setValue(Double value) {
-        this.value = value;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/SobekKind.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/SobekKind.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "sobek_kinds")
-public class SobekKind implements Serializable {
-
-    private Integer id;
-    private String name;
-
-    @Id
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    /**
-     * Get name.
-     *
-     * @return name of the kind of sobek as String.
-     */
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set name.
-     *
-     * @param name the value to set.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/TimeInterval.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/TimeInterval.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import java.util.Date;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
- at Entity
- at Table(name = "time_intervals")
-public class TimeInterval
-implements   Serializable
-{
-    private Integer id;
-    private Date    startTime;
-    private Date    stopTime;
-
-    public TimeInterval() {
-    }
-
-    public TimeInterval(Date startTime, Date stopTime) {
-        this.startTime = startTime;
-        this.stopTime  = stopTime;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_TIME_INTERVALS_ID_SEQ",
-        sequenceName   = "TIME_INTERVALS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_TIME_INTERVALS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @Column(name = "start_time") // FIXME: type mapping needed?
-    public Date getStartTime() {
-        return startTime;
-    }
-
-    public void setStartTime(Date startTime) {
-        this.startTime = startTime;
-    }
-
-    @Column(name = "stop_time") // FIXME: type mapping needed?
-    public Date getStopTime() {
-        return stopTime;
-    }
-
-    public void setStopTime(Date stopTime) {
-        this.stopTime = stopTime;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Unit.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Unit.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
-
- at Entity
- at Table(name = "units")
-public class Unit
-implements   Serializable
-{
-    protected Integer id;
-    protected String  name;
-
-
-    public Unit() {
-    }
-
-
-    public Unit(String name) {
-        this.name = name;
-    }
-
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_UNITS_ID_SEQ",
-        sequenceName   = "UNITS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_UNITS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-
-    public void setName(String name) {
-        this.name = name;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/Wst.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/Wst.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.Session;
-import org.hibernate.SQLQuery;
-import org.hibernate.Query;
-import org.hibernate.type.StandardBasicTypes;
-
-import de.intevation.flys.backend.SessionHolder;
-
-
- at Entity
- at Table(name = "wsts")
-public class Wst
-implements   Serializable
-{
-    private static Logger logger = Logger.getLogger(Wst.class);
-
-    private Integer id;
-    private River   river;
-    private String  description;
-    private Integer kind;
-
-    private List<WstColumn> columns;
-
-
-    public static final String SQL_SELECT_MINMAX =
-        "select min(q) as minQ, max(q) as maxQ from wst_q_values " +
-        "where wst_id = :wst and not (a > :km or b < :km)";
-
-    public Wst() {
-    }
-
-    public Wst(River river, String description) {
-        this(river, description, 0);
-    }
-
-    public Wst(River river, String description, Integer kind) {
-        this.river       = river;
-        this.description = description;
-        this.kind        = kind;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_WSTS_ID_SEQ",
-        sequenceName   = "WSTS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_WSTS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "river_id" )
-    public River getRiver() {
-        return river;
-    }
-
-    public void setRiver(River river) {
-        this.river = river;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @Column(name = "kind")
-    public Integer getKind() {
-        return kind;
-    }
-
-    public void setKind(Integer kind) {
-        this.kind = kind;
-    }
-
-    @OneToMany
-    @JoinColumn(name="wst_id")
-    public List<WstColumn> getColumns() {
-        return columns;
-    }
-
-    public void setColumns(List<WstColumn> columns) {
-        this.columns = columns;
-    }
-
-
-    /**
-     * Determines the min and max Q values of this WST. The min value is placed
-     * in the first field of the resulting array - the max value is placed in
-     * the second field.
-     *
-     * @return the min and max Q values of this WST.
-     */
-    public double[] determineMinMaxQ() {
-        double[] ab = river.determineMinMaxDistance();
-        return determineMinMaxQ(new Range(ab[0], ab[1], river));
-    }
-
-
-    /**
-     * Determines the min and max Q values of this WST in the given range. The
-     * min value is placed in the first field of the resulting array - the max
-     * value is placed in the second field.
-     *
-     * @param range The range used for querying the Q values.
-     *
-     * @return the min and max Q values of this WST.
-     */
-    public double[] determineMinMaxQ(Range range) {
-        if (range != null) {
-            return determineMinMaxQ(
-                range.getA().doubleValue(),
-                range.getB().doubleValue());
-        }
-
-        return null;
-    }
-
-
-    /**
-     * Determines the min and max Q values of this WST in the given range. The
-     * min value is placed in the first field of the resulting array - the max
-     * value is placed in the second field.
-     *
-     * @param fromKm the lower km value.
-     * @param toKm the upper km value.
-     *
-     * @return the min and max Q values of this WST.
-     */
-    public double[] determineMinMaxQ(double fromKm, double toKm) {
-        Session session = SessionHolder.HOLDER.get();
-
-        Query query = session.createQuery(
-          "select min(q), max(q) from WstQRange where " +
-          " id in " +
-          "  (select wstQRange.id from WstColumnQRange where " +
-          "    wstColumn.id in (select id from WstColumn where wst.id = :wst)) " +
-          " and range.id in " +
-          "  (select id from Range where not (a > :end or b < :start))");
-
-        query.setParameter("wst",   getId());
-        query.setParameter("start", new BigDecimal(fromKm));
-        query.setParameter("end",   new BigDecimal(toKm));
-
-        List<Object []> results = query.list();
-
-        if (results.isEmpty()) {
-            return null;
-        }
-
-        Object [] result = results.get(0);
-
-        return new double [] {
-            ((BigDecimal)result[0]).doubleValue(),
-            ((BigDecimal)result[1]).doubleValue() };
-    }
-
-
-    public double[] determineMinMaxQFree(double km) {
-        Session session = SessionHolder.HOLDER.get();
-
-        SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_MINMAX)
-            .addScalar("minQ", StandardBasicTypes.DOUBLE)
-            .addScalar("maxQ", StandardBasicTypes.DOUBLE);
-
-        sqlQuery.setInteger("wst", getId());
-        sqlQuery.setDouble("km", km);
-
-        List<Object[]> minmaxQ = sqlQuery.list();
-
-
-        if (minmaxQ.isEmpty()) {
-            return null;
-        }
-
-        Object[] mm = minmaxQ.get(0);
-
-        if (mm[0] == null || mm[1] == null) {
-            logger.warn ("No min/max Q for km " + km + " found.");
-            return null;
-        }
-
-        return new double[] { (Double) mm[0], (Double) mm[1] };
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/WstColumn.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/WstColumn.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-package de.intevation.flys.model;
-
-import java.util.List;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.OneToMany;
-
- at Entity
- at Table(name = "wst_columns")
-public class WstColumn
-implements   Serializable
-{
-    private Integer               id;
-    private Wst                   wst;
-    private String                name;
-    private String                description;
-    private Integer               position;
-    private TimeInterval          timeInterval;
-
-    private List<WstColumnQRange> columnQRanges;
-    private List<WstColumnValue>  columnValues;
-
-    public WstColumn() {
-    }
-
-    public WstColumn(
-        Wst          wst,
-        String       name,
-        String       description,
-        Integer      position,
-        TimeInterval timeInterval
-    ) {
-        this.wst          = wst;
-        this.name         = name;
-        this.description  = description;
-        this.position     = position;
-        this.timeInterval = timeInterval;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_WST_COLUMNS_ID_SEQ",
-        sequenceName   = "WST_COLUMNS_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_WST_COLUMNS_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "wst_id" )
-    public Wst getWst() {
-        return wst;
-    }
-
-    public void setWst(Wst wst) {
-        this.wst = wst;
-    }
-
-    @Column(name = "name")
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Column(name = "description")
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @Column(name = "position")
-    public Integer getPosition() {
-        return position;
-    }
-
-    public void setPosition(Integer position) {
-        this.position = position;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "time_interval_id" )
-    public TimeInterval getTimeInterval() {
-        return timeInterval;
-    }
-
-    public void setTimeInterval(TimeInterval timeInterval) {
-        this.timeInterval = timeInterval;
-    }
-
-    @OneToMany
-    @JoinColumn(name="wst_column_id")
-    public List<WstColumnQRange> getColumnQRanges() {
-        return columnQRanges;
-    }
-
-    public void setColumnQRanges(List<WstColumnQRange> columnQRanges) {
-        this.columnQRanges = columnQRanges;
-    }
-
-    @OneToMany
-    @JoinColumn(name="wst_column_id")
-    public List<WstColumnValue> getColumnValues() {
-        return columnValues;
-    }
-
-    public void setColumnValues(List<WstColumnValue> columnValues) {
-        this.columnValues = columnValues;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/WstColumnQRange.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/WstColumnQRange.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-package de.intevation.flys.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "wst_column_q_ranges")
-public class WstColumnQRange
-implements   Serializable
-{
-    private Integer   id;
-    private WstColumn wstColumn;
-    private WstQRange wstQRange;
-
-    public WstColumnQRange() {
-    }
-
-    public WstColumnQRange(
-        WstColumn wstColumn,
-        WstQRange wstQRange
-    ) {
-        this.wstColumn = wstColumn;
-        this.wstQRange = wstQRange;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_WST_Q_RANGES_ID_SEQ",
-        sequenceName   = "WST_Q_RANGES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_WST_Q_RANGES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "wst_column_id" )
-    public WstColumn getWstColumn() {
-        return wstColumn;
-    }
-
-    public void setWstColumn(WstColumn wstColumn) {
-        this.wstColumn = wstColumn;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "wst_q_range_id" )
-    public WstQRange getWstQRange() {
-        return wstQRange;
-    }
-
-    public void setWstQRange(WstQRange wstQRange) {
-        this.wstQRange = wstQRange;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
-
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/WstColumnValue.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/WstColumnValue.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-package de.intevation.flys.model;
-
-import java.math.BigDecimal;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "wst_column_values")
-public class WstColumnValue
-implements   Serializable
-{
-    private Integer    id;
-    private WstColumn  wstColumn;
-    private BigDecimal position;
-    private BigDecimal w;
-
-    public WstColumnValue() {
-    }
-
-    public WstColumnValue(
-        WstColumn  wstColumn,
-        BigDecimal position,
-        BigDecimal w
-    ) {
-        this.wstColumn = wstColumn;
-        this.position  = position;
-        this.w         = w;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_WST_COLUMN_VALUES_ID_SEQ",
-        sequenceName   = "WST_COLUMN_VALUES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_WST_COLUMN_VALUES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "wst_column_id")
-    public WstColumn getWstColumn() {
-        return wstColumn;
-    }
-
-    public void setWstColumn(WstColumn wstColumn) {
-        this.wstColumn = wstColumn;
-    }
-
-    @Column(name = "position") // FIXME: type mapping needed?
-    public BigDecimal getPosition() {
-        return position;
-    }
-
-    public void setPosition(BigDecimal position) {
-        this.position = position;
-    }
-
-    @Column(name = "w") // FIXME: type mapping needed?
-    public BigDecimal getW() {
-        return w;
-    }
-
-    public void setW(BigDecimal w) {
-        this.w = w;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/model/WstQRange.java
--- a/flys-backend/src/main/java/de/intevation/flys/model/WstQRange.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-package de.intevation.flys.model;
-
-import java.math.BigDecimal;
-
-import java.io.Serializable;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Column;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-
- at Entity
- at Table(name = "wst_q_ranges")
-public class WstQRange
-implements   Serializable
-{
-    private Integer    id;
-    private Range      range;
-    private BigDecimal q;
-
-    public WstQRange() {
-    }
-
-    public WstQRange(Range range, BigDecimal q) {
-        this.range = range;
-        this.q     = q;
-    }
-
-    @Id
-    @SequenceGenerator(
-        name           = "SEQUENCE_WST_Q_RANGES_ID_SEQ",
-        sequenceName   = "WST_Q_RANGES_ID_SEQ",
-        allocationSize = 1)
-    @GeneratedValue(
-        strategy  = GenerationType.SEQUENCE,
-        generator = "SEQUENCE_WST_Q_RANGES_ID_SEQ")
-    @Column(name = "id")
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    @OneToOne
-    @JoinColumn(name = "range_id" )
-    public Range getRange() {
-        return range;
-    }
-
-    public void setRange(Range range) {
-        this.range = range;
-    }
-
-    @Column(name = "q") // FIXME: type mapping needed?!
-    public BigDecimal getQ() {
-        return q;
-    }
-
-    public void setQ(BigDecimal q) {
-        this.q = q;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/utils/DBCPConnectionProvider.java
--- a/flys-backend/src/main/java/de/intevation/flys/utils/DBCPConnectionProvider.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,253 +0,0 @@
-/*
- * Copyright 2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.intevation.flys.utils;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.Map;
-import java.util.Collections;
-import java.util.StringTokenizer;
-
-import org.apache.commons.dbcp.BasicDataSource;
-import org.apache.commons.dbcp.BasicDataSourceFactory;
-
-import org.apache.log4j.Logger;
-
-import org.hibernate.HibernateException;
-
-import org.hibernate.connection.ConnectionProviderFactory;
-import org.hibernate.connection.ConnectionProvider;
-
-import org.hibernate.cfg.Environment;
-
-/**
- * <p>A connection provider that uses an Apache commons DBCP connection pool.</p>
- *
- * <p>To use this connection provider set:<br>
- * <code>hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider</code></p>
- *
- * <pre>Supported Hibernate properties:
- *   hibernate.connection.driver_class
- *   hibernate.connection.url
- *   hibernate.connection.username
- *   hibernate.connection.password
- *   hibernate.connection.isolation
- *   hibernate.connection.autocommit
- *   hibernate.connection.pool_size
- *   hibernate.connection (JDBC driver properties)</pre>
- * <br>
- * All DBCP properties are also supported by using the hibernate.dbcp prefix.
- * A complete list can be found on the DBCP configuration page:
- * <a href="http://jakarta.apache.org/commons/dbcp/configuration.html">http://jakarta.apache.org/commons/dbcp/configuration.html</a>.
- * <br>
- * <pre>Example:
- *   hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
- *   hibernate.connection.driver_class org.hsqldb.jdbcDriver
- *   hibernate.connection.username sa
- *   hibernate.connection.password
- *   hibernate.connection.url jdbc:hsqldb:test
- *   hibernate.connection.pool_size 20
- *   hibernate.dbcp.initialSize 10
- *   hibernate.dbcp.maxWait 3000
- *   hibernate.dbcp.validationQuery select 1 from dual</pre>
- *
- * <p>More information about configuring/using DBCP can be found on the
- * <a href="http://jakarta.apache.org/commons/dbcp/">DBCP website</a>.
- * There you will also find the DBCP wiki, mailing lists, issue tracking
- * and other support facilities</p>
- *
- * @see org.hibernate.connection.ConnectionProvider
- * @author Dirk Verbeeck
- */
-public class DBCPConnectionProvider
-implements   ConnectionProvider
-{
-    private static Logger log = Logger.getLogger(DBCPConnectionProvider.class);
-
-    private static final String PREFIX = "hibernate.dbcp.";
-
-    private BasicDataSource ds;
-
-    // Old Environment property for backward-compatibility
-    // (property removed in Hibernate3)
-    private static final String DBCP_PS_MAXACTIVE =
-        "hibernate.dbcp.ps.maxActive";
-
-    // Property doesn't exists in Hibernate2
-    private static final String AUTOCOMMIT =
-        "hibernate.connection.autocommit";
-
-    public void configure(Properties props) throws HibernateException {
-        try {
-            log.debug("Configure DBCPConnectionProvider");
-
-            // DBCP properties used to create the BasicDataSource
-            Properties dbcpProperties = new Properties();
-
-            // DriverClass & url
-            String jdbcDriverClass = props.getProperty(Environment.DRIVER);
-            String jdbcUrl = props.getProperty(Environment.URL);
-            dbcpProperties.put("driverClassName", jdbcDriverClass);
-            dbcpProperties.put("url", jdbcUrl);
-
-            // Username / password
-            String username = props.getProperty(Environment.USER);
-            String password = props.getProperty(Environment.PASS);
-            dbcpProperties.put("username", username);
-            dbcpProperties.put("password", password);
-
-            // Isolation level
-            String isolationLevel = props.getProperty(Environment.ISOLATION);
-            if (isolationLevel != null
-            && (isolationLevel = isolationLevel.trim()).length() > 0) {
-                dbcpProperties.put("defaultTransactionIsolation", isolationLevel);
-            }
-
-            // Turn off autocommit (unless autocommit property is set)
-            String autocommit = props.getProperty(AUTOCOMMIT);
-            if (autocommit != null
-            && (autocommit = autocommit.trim()).length() > 0) {
-                dbcpProperties.put("defaultAutoCommit", autocommit);
-            } else {
-                dbcpProperties.put("defaultAutoCommit", String.valueOf(Boolean.FALSE));
-            }
-
-            // Pool size
-            String poolSize = props.getProperty(Environment.POOL_SIZE);
-            if (poolSize != null
-            && (poolSize = poolSize.trim()).length() > 0
-            && Integer.parseInt(poolSize) > 0)  {
-                dbcpProperties.put("maxActive", poolSize);
-            }
-
-            // Copy all "driver" properties into "connectionProperties"
-            Properties driverProps =
-                ConnectionProviderFactory.getConnectionProperties(props);
-
-            if (driverProps.size() > 0) {
-                StringBuilder connectionProperties = new StringBuilder();
-                for (Iterator iter = driverProps.entrySet().iterator();
-                    iter.hasNext();
-                ) {
-                    Map.Entry entry = (Map.Entry)iter.next();
-                    String    key   = (String)entry.getKey();
-                    String    value = (String)entry.getValue();
-                    connectionProperties
-                        .append(key)
-                        .append('=')
-                        .append(value);
-                    if (iter.hasNext()) {
-                        connectionProperties.append(';');
-                    }
-                }
-                dbcpProperties.put(
-                    "connectionProperties", connectionProperties.toString());
-            }
-
-            // Copy all DBCP properties removing the prefix
-            for (Iterator iter = props.entrySet().iterator() ; iter.hasNext() ;) {
-                Map.Entry entry = (Map.Entry)iter.next();
-                String    key   = (String)entry.getKey();
-                if (key.startsWith(PREFIX)) {
-                    String property = key.substring(PREFIX.length());
-                    String value    = (String)entry.getValue();
-                    dbcpProperties.put(property, value);
-                }
-            }
-
-            // Backward-compatibility
-            if (props.getProperty(DBCP_PS_MAXACTIVE) != null) {
-                dbcpProperties.put(
-                    "poolPreparedStatements",
-                    String.valueOf(Boolean.TRUE));
-                dbcpProperties.put(
-                    "maxOpenPreparedStatements",
-                    props.getProperty(DBCP_PS_MAXACTIVE));
-            }
-
-            // Some debug info
-            /* // commented out, because it leaks the password
-            if (log.isDebugEnabled()) {
-                log.debug("Creating a DBCP BasicDataSource" +
-                          " with the following DBCP factory properties:");
-                StringWriter sw = new StringWriter();
-                dbcpProperties.list(new PrintWriter(sw, true));
-                log.debug(sw.toString());
-            }
-            */
-
-            // Let the factory create the pool
-            ds = (BasicDataSource)BasicDataSourceFactory
-                .createDataSource(dbcpProperties);
-
-            // This needs to be done manually as it is somehow ignored
-            // by the BasicDataSourceFactory if you set it as a dbcpProperty
-            String connectionInitSqls = props.getProperty("connectionInitSqls");
-            if (connectionInitSqls != null) {
-                StringTokenizer tokenizer = new StringTokenizer(connectionInitSqls, ";");
-                ds.setConnectionInitSqls(Collections.list(tokenizer));
-            }
-            // The BasicDataSource has lazy initialization
-            // borrowing a connection will start the DataSource
-            // and make sure it is configured correctly.
-
-            // Connection conn = ds.getConnection();
-            // conn.close();
-        }
-        catch (Exception e) {
-            String message = "Could not create a DBCP pool";
-            log.fatal(message, e);
-            if (ds != null) {
-                BasicDataSource x = ds; ds = null;
-                try {
-                    x.close();
-                }
-                catch (SQLException sqle) {
-                }
-            }
-            throw new HibernateException(message, e);
-        }
-        log.debug("Configure DBCPConnectionProvider complete");
-    }
-
-    public Connection getConnection() throws SQLException {
-        return ds.getConnection();
-    }
-
-    public void closeConnection(Connection conn) throws SQLException {
-        conn.close();
-    }
-
-    public void close() throws HibernateException {
-        try {
-            if (ds != null) {
-                BasicDataSource x = ds; ds = null;
-                x.close();
-            }
-        }
-        catch (SQLException sqle) {
-            throw new HibernateException("Could not close DBCP pool", sqle);
-        }
-    }
-
-    public boolean supportsAggressiveRelease() {
-        return false;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/utils/DateGuesser.java
--- a/flys-backend/src/main/java/de/intevation/flys/utils/DateGuesser.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,258 +0,0 @@
-package de.intevation.flys.utils;
-
-/**
- * Copyright (c) 2006 by Intevation GmbH
- *
- * @author Sascha L. Teichmann (teichmann at intevation.de)
- *
- * This program is free software under the LGPL (>=v2.1)
- * Read the file LGPL coming with FLYS for details.
- */
-
-import java.util.Date;
-import java.util.Calendar;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-
-public final class DateGuesser {
-    public static final String [] MONTH = {
-        "jan", "feb", "mrz", "apr", "mai", "jun",
-        "jul", "aug", "sep", "okt", "nov", "dez"
-    };
-
-    public static final int guessMonth(String s) {
-        s = s.toLowerCase();
-        for (int i = 0; i < MONTH.length; ++i)
-            if (MONTH[i].equals(s)) {
-                return i;
-            }
-        return -1;
-    }
-
-    public static final Pattern YYYY_MM_DD =
-        Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})$");
-
-    public static final Pattern DD_MM_YYYY =
-        Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})$");
-
-    public static final Pattern MMM_YYYY =
-        Pattern.compile("^(\\d{0,2})\\.?(\\w{3})\\.?(\\d{2,4})$");
-
-    public static final Pattern GARBAGE_YYYY =
-        Pattern.compile("^\\D*(\\d{2,4})$");
-
-    public static final Pattern YYYY_MM_DDThh_mm =
-        Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$");
-
-    public static final Pattern YYYY_MM_DDThh_mm_ss =
-        Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})$");
-
-    public static final Pattern DD_MM_YYYYThh_mm =
-        Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})T(\\d{1,2}):(\\d{2})$");
-
-    public static final Pattern DD_MM_YYYYThh_mm_ss =
-        Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})T(\\d{1,2}):(\\d{2}):(\\d{2})$");
-
-    public static final Pattern DDMMYY =
-        Pattern.compile("^(\\d{1,2})(\\d{1,2})(\\d{1,2})$");
-
-    private DateGuesser() {
-    }
-
-    public static final int calendarMonth(String month) {
-        return calendarMonth(Integer.parseInt(month));
-    }
-
-    public static final int calendarMonth(int month) {
-        return Math.max(Math.min(month-1, 11), 0);
-    }
-
-    /**
-     * Guess date by trying all different patterns.
-     * Throws IllegalArgumentException if not able to guess.
-     * @param s The date to be guessed (e.g. 11.02.2001).
-     * @return the parsed Date.
-     */
-    public static Date guessDate(String s) {
-        if (s == null || (s = s.trim()).length() == 0) {
-            throw new IllegalArgumentException();
-        }
-
-        Matcher m;
-
-        m = YYYY_MM_DD.matcher(s);
-
-        if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year  = m.group(1);
-            String month = m.group(2);
-            String day   = m.group(3);
-            cal.set(
-                Integer.parseInt(year),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                12, 0, 0);
-            return cal.getTime();
-        }
-
-        m = DD_MM_YYYY.matcher(s);
-
-        if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year  = m.group(3);
-            String month = m.group(2);
-            String day   = m.group(1);
-            cal.set(
-                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                calendarMonth(month),
-                Integer.parseInt(m.group(1)),
-                12, 0, 0);
-            return cal.getTime();
-        }
-
-        m = MMM_YYYY.matcher(s);
-
-        if (m.matches()) {
-            int month = guessMonth(m.group(2));
-            if (month >= 0) {
-                Calendar cal = Calendar.getInstance();
-                String year = m.group(3);
-                String day  = m.group(1);
-                cal.set(
-                    Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                    month,
-                    day.length() == 0 ? 15 : Integer.parseInt(day),
-                    12, 0, 0);
-                return cal.getTime();
-            }
-        }
-
-        m = YYYY_MM_DDThh_mm.matcher(s);
-
-        if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year = m.group(1);
-            String month = m.group(2);
-            String day = m.group(3);
-            String hour = m.group(4);
-            String minute = m.group(5);
-            cal.set(
-                Integer.parseInt(year),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                Integer.parseInt(hour),
-                Integer.parseInt(minute),
-                0
-            );
-            return cal.getTime();
-        }
-
-        m = YYYY_MM_DDThh_mm_ss.matcher(s);
-
-        if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year = m.group(1);
-            String month = m.group(2);
-            String day = m.group(3);
-            String hour = m.group(4);
-            String minute = m.group(5);
-            String second = m.group(6);
-            cal.set(
-                Integer.parseInt(year),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                Integer.parseInt(hour),
-                Integer.parseInt(minute),
-                Integer.parseInt(second)
-            );
-            return cal.getTime();
-        }
-
-        m = DD_MM_YYYYThh_mm.matcher(s);
-
-        if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year = m.group(3);
-            String month = m.group(2);
-            String day = m.group(1);
-            String hour = m.group(4);
-            String minute = m.group(5);
-            cal.set(
-                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                Integer.parseInt(hour),
-                Integer.parseInt(minute),
-                0
-            );
-            return cal.getTime();
-        }
-
-        m = DD_MM_YYYYThh_mm_ss.matcher(s);
-
-        if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year = m.group(3);
-            String month = m.group(2);
-            String day = m.group(1);
-            String hour = m.group(4);
-            String minute = m.group(5);
-            String second = m.group(6);
-            cal.set(
-                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                calendarMonth(month),
-                Integer.parseInt(day),
-                Integer.parseInt(hour),
-                Integer.parseInt(minute),
-                Integer.parseInt(second)
-            );
-            return cal.getTime();
-        }
-
-        m = DDMMYY.matcher(s);
-
-        if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String day   = m.group(1);
-            String month = m.group(2);
-            String yearS = m.group(3);
-            int year = Integer.parseInt(yearS);
-
-            if (year <= cal.get(Calendar.YEAR) % 100) {
-                year += 2000;
-            }
-            else {
-                year += 1900;
-            }
-            cal.set(
-                year,
-                Integer.parseInt(month),  // month
-                Integer.parseInt(day), // day
-                12, 0, 0);
-            return cal.getTime();
-        }
-
-        m = GARBAGE_YYYY.matcher(s);
-
-        if (m.matches()) {
-            Calendar cal = Calendar.getInstance();
-            String year = m.group(1);
-            cal.set(
-                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
-                5,  // month
-                15, // day
-                12, 0, 0);
-            return cal.getTime();
-        }
-
-        throw new IllegalArgumentException();
-    }
-
-    public static void main(String [] args) {
-        for (int i = 0; i < args.length; ++i) {
-            System.out.println(args[i] + ": " + guessDate(args[i]));
-        }
-    }
-}
-// end of file
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/utils/EpsilonComparator.java
--- a/flys-backend/src/main/java/de/intevation/flys/utils/EpsilonComparator.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-package de.intevation.flys.utils;
-
-import java.util.Comparator;
-
-/** Comparator with some tolerance (epsilon). */
-public class EpsilonComparator implements Comparator<Double>
-{
-    public static final double EPSILON = 1e-4;
-
-    /** Ready-made comparator with 1e-4 tolerance. */
-    public static final EpsilonComparator CMP = new EpsilonComparator(EPSILON);
-
-    private double epsilon;
-
-    public EpsilonComparator(double epsilon) {
-        this.epsilon = epsilon;
-    }
-
-    @Override
-    public int compare(Double a, Double b) {
-        double diff = a - b;
-        if (diff < -epsilon) return -1;
-        if (diff >  epsilon) return +1;
-        return 0;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/de/intevation/flys/utils/StringUtil.java
--- a/flys-backend/src/main/java/de/intevation/flys/utils/StringUtil.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,829 +0,0 @@
-package de.intevation.flys.utils;
-
-/**
- * Copyright (c) 2006 by Intevation GmbH
- *
- * @author Sascha L. Teichmann (teichmann at intevation.de)
- * @author Ludwig Reiter       (ludwig at intevation.de)
- *
- * This program is free software under the LGPL (>=v2.1)
- * Read the file LGPL coming with FLYS for details.
- */
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.Locale;
-
-import java.net.URLEncoder;
-import java.net.URLDecoder;
-
-import java.io.UnsupportedEncodingException;
-import java.io.IOException;
-import java.io.BufferedReader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.PrintWriter;
-
-
-public final class StringUtil {
-    final static String NUMBER_SEPERATOR = ";";
-    final static String LINE_SEPERATOR = ":";
-
-    private StringUtil() {
-    }
-
-    public static final String double2DArrayToString(double[][] values) {
-
-        if (values == null) {
-            throw new IllegalArgumentException("keine double[][]-Werte");
-        }
-
-        StringBuilder strbuf = new StringBuilder();
-
-        for (int i=0; i < values.length; i++) {
-            if (i>0) {
-                strbuf.append(LINE_SEPERATOR);
-            }
-            for (int j=0; j < values[i].length; j++) {
-                if (j > 0) {
-                    strbuf.append(NUMBER_SEPERATOR);
-                }
-                strbuf.append(values[i][j]);
-            }
-        }
-
-        return strbuf.toString();
-    }
-
-    public static final double[][] stringToDouble2DArray(String str) {
-        if (str == null || str.length() == 0) {
-            return null;
-        }
-
-        String[] lineSplit = str.split(LINE_SEPERATOR);
-        double[][] array2D = new double[lineSplit.length][];
-        for (int i=0; i < lineSplit.length; i++) {
-            String[] numberSplit =  lineSplit[i].split(NUMBER_SEPERATOR);
-
-            double[] numbers = new double[numberSplit.length];
-            for (int j=0; j < numberSplit.length; j++) {
-                numbers[j] = Double.valueOf(numberSplit[j]).doubleValue();
-            }
-
-            array2D[i] = numbers;
-        }
-
-        return array2D;
-    }
-
-    /**
-     * Remove first occurrence of "[" and "]" (if both do occur).
-     * @param value String to be stripped of [] (might be null).
-     * @return input string but with [ and ] removed, or input string if no
-     *         brackets were found.
-     */
-    public static final String unbracket(String value) {
-        // null- guard
-        if (value == null) return value;
-
-        int start = value.indexOf("[");
-        int end   = value.indexOf("]");
-
-        if (start < 0 || end < 0) {
-            return value;
-        }
-
-        value = value.substring(start + 1, end);
-
-        return value;
-    }
-
-
-    /**
-     * From "Q=1" make "W(Q=1)".
-     * @return original string wraped in "W()" if it contains a "Q", original
-     *         string otherwise.
-     */
-    public static String wWrap(String wOrQ) {
-        return (wOrQ != null && wOrQ.indexOf("Q") >=0)
-               ? "W(" + wOrQ + ")"
-               : wOrQ;
-        }
-
-
-    public static final String [] splitLines(String s) {
-        if (s == null) {
-            return null;
-        }
-        ArrayList<String> list = new ArrayList<String>();
-
-        BufferedReader in = null;
-
-        try {
-            in =
-                new BufferedReader(
-                new StringReader(s));
-
-            String line;
-
-            while ((line = in.readLine()) != null) {
-                list.add(line);
-            }
-        }
-        catch (IOException ioe) {
-            return null;
-        }
-        finally {
-            if (in != null)
-                try {
-                    in.close();
-                }
-                catch (IOException ioe) {}
-        }
-
-        return list.toArray(new String[list.size()]);
-    }
-
-    public static final String concat(String [] s) {
-        return concat(s, null);
-    }
-
-    public static final String concat(String [] s, String glue) {
-        if (s == null) {
-            return null;
-        }
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < s.length; ++i) {
-            if (i > 0 && glue != null) {
-                sb.append(glue);
-            }
-            sb.append(s[i]);
-        }
-        return sb.toString();
-    }
-
-    public static final String [] splitAfter(String [] src, int N) {
-        if (src == null) {
-            return null;
-        }
-
-        ArrayList<String> list = new ArrayList<String>(src.length);
-        for (int i = 0; i < src.length; ++i) {
-            String s = src[i];
-            int R;
-            if (s == null || (R = s.length()) == 0) {
-                list.add(s);
-            }
-            else {
-                while (R > N) {
-                    list.add(s.substring(0, N));
-                    s = s.substring(N);
-                    R = s.length();
-                }
-                list.add(s);
-            }
-        }
-        return list.toArray(new String[list.size()]);
-    }
-
-    public static final String [] splitQuoted(String s) {
-        return splitQuoted(s, '"');
-    }
-
-    public static final String[] fitArray(String [] src, String [] dst) {
-        if (src == null) {
-            return dst;
-        }
-        if (dst == null) {
-            return src;
-        }
-
-        if (src.length == dst.length) {
-            return src;
-        }
-
-        System.arraycopy(src, 0, dst, 0, Math.min(dst.length, src.length));
-
-        return dst;
-    }
-
-    public static final String [] splitQuoted(String s, char quoteChar) {
-        if (s == null) {
-            return null;
-        }
-        ArrayList<String> l = new ArrayList<String>();
-        int mode = 0, last_mode = 0;
-        StringBuilder sb = new StringBuilder();
-        for (int N = s.length(), i = 0; i < N; ++i) {
-            char c = s.charAt(i);
-            switch (mode) {
-                case 0: // unquoted mode
-                    if (c == quoteChar) {
-                        mode = 1; // to quoted mode
-                        if (sb.length() > 0) {
-                            l.add(sb.toString());
-                            sb.setLength(0);
-                        }
-                    }
-                    else if (c == '\\') {
-                        last_mode = 0;
-                        mode = 2; // escape mode
-                    }
-                    else if (!Character.isWhitespace(c)) {
-                        sb.append(c);
-                    }
-                    else if (sb.length() > 0) {
-                        l.add(sb.toString());
-                        sb.setLength(0);
-                    }
-                    break;
-                case 1: // quote mode
-                    if (c == '\\') {
-                        last_mode = 1;
-                        mode = 2; // escape mode
-                    }
-                    else if (c == quoteChar) { // leave quote mode
-                        l.add(sb.toString());
-                        sb.setLength(0);
-                        mode = 0; // to unquoted mode
-                    }
-                    else {
-                        sb.append(c);
-                    }
-                    break;
-                case 2: // escape mode
-                    sb.append(c);
-                    mode = last_mode;
-                    break;
-            }
-        }
-        if (sb.length() > 0) {
-            l.add(sb.toString());
-        }
-        return l.toArray(new String[l.size()]);
-    }
-
-    public static final String [] splitUnique(String s) {
-        return splitUnique(s, "[\\s,]+");
-    }
-
-    public static final String [] splitUnique(String s, String sep) {
-        return s != null ? unique(s.split(sep)) : null;
-    }
-
-    public static final String [] unique(String [] str) {
-        if (str == null || str.length == 1) {
-            return str;
-        }
-
-        Arrays.sort(str);
-
-        for (int i = 1; i < str.length; ++i)
-            if (str[i].equals(str[i-1])) {
-                ArrayList<String> list = new ArrayList<String>(str.length);
-
-                for (int j = 0; j < i; ++j) {
-                    list.add(str[j]);
-                }
-
-                String last = str[i];
-
-                for (++i; i < str.length; ++i)
-                    if (!last.equals(str[i])) {
-                        list.add(last = str[i]);
-                    }
-
-                return list.toArray(new String[list.size()]);
-            }
-
-        return str;
-    }
-
-    public static final String [] ensureEmptyExistence(String [] str) {
-        if (str == null) {
-            return null;
-        }
-
-        for (int i = 0; i < str.length; ++i)
-            if (str[i].length() == 0) {
-                if (i != 0) { // copy to front
-                    String t = str[0];
-                    str[0] = str[i];
-                    str[i] = t;
-                }
-                return str;
-            }
-
-        String [] n = new String[str.length+1];
-        n[0] = "";
-        System.arraycopy(str, 0, n, 1, str.length);
-        return n;
-    }
-
-    public static final String ensureWidthPadLeft(String s, int width, char pad) {
-        int N = s.length();
-        if (N >= width) {
-            return s;
-        }
-        StringBuilder sb = new StringBuilder(width);
-        for (; N < width; ++N) {
-            sb.append(pad);
-        }
-        sb.append(s);
-        return sb.toString();
-    }
-
-    public static final String [] splitWhiteSpaceWithNAsPad(
-        String s,
-        int    N,
-        String pad
-    ) {
-        if (s == null) {
-            return null;
-        }
-
-        boolean copyChars = true;
-        int     count     = 0; // number of WS
-
-        int S = s.length();
-
-        ArrayList<String> parts = new ArrayList<String>();
-
-        StringBuilder part = new StringBuilder(S);
-
-        for (int i = 0; i < S; ++i) {
-            char c = s.charAt(i);
-            if (copyChars) { // char mode
-                if (Character.isWhitespace(c)) {
-                    if (part.length() > 0) {
-                        parts.add(part.toString());
-                        part.setLength(0);
-                    }
-                    count     = 1;
-                    copyChars = false; // to WS mode
-                }
-                else {
-                    part.append(c);
-                }
-            }
-            else { // counting WS
-                if (Character.isWhitespace(c)) {
-                    ++count;
-                }
-                else {
-                    while (count >= N) {// enough to insert pad?
-                        parts.add(pad);
-                        count -= N;
-                    }
-                    part.append(c);
-                    count     = 0;
-                    copyChars = true; // back to char mode
-                }
-            }
-        } // for all chars
-
-        if (copyChars) {
-            if (part.length() > 0) {
-                parts.add(part.toString());
-            }
-        }
-        else {
-            while (count >= N) { // enough to insert pad?
-                parts.add(pad);
-                count -= N;
-            }
-        }
-
-        return parts.toArray(new String[parts.size()]);
-    }
-
-    public static final String encodeURL(String url) {
-        try {
-            return url != null
-                   ? URLEncoder.encode(url, "UTF-8")
-                   : "";
-        }
-        catch (UnsupportedEncodingException usee) {
-            throw new RuntimeException(usee.getLocalizedMessage());
-        }
-    }
-
-    public static final String decodeURL(String url) {
-        try {
-            return url != null
-                   ? URLDecoder.decode(url, "UTF-8")
-                   : "";
-        }
-        catch (UnsupportedEncodingException usee) {
-            throw new RuntimeException(usee.getLocalizedMessage());
-        }
-    }
-
-    public static final boolean isEmpty(String s) {
-        return s == null || s.length() == 0;
-    }
-
-    public static final String empty(String s) {
-        return s == null ? "" : s;
-    }
-
-
-    public static final String trim(String s) {
-        return s != null ? s.trim() : null;
-    }
-
-    public static final String uniqueWhitespaces(String s) {
-        if (s == null) {
-            return null;
-        }
-
-        boolean wasWS = false;
-        StringBuilder sb = new StringBuilder();
-
-        for (int N = s.length(), i = 0; i < N; ++i) {
-            char c = s.charAt(i);
-            if (Character.isWhitespace(c)) {
-                if (!wasWS) {
-                    sb.append(c);
-                    wasWS = true;
-                }
-            }
-            else {
-                sb.append(c);
-                wasWS = false;
-            }
-        }
-
-        return sb.toString();
-    }
-
-    public static final String replaceNewlines(String s) {
-        return s == null
-               ? null
-               : s.replace('\r', ' ').replace('\n', ' ');
-    }
-
-    /*
-    public static final String quoteReplacement(String s) {
-
-        if (s == null || (s.indexOf('\\') == -1 && s.indexOf('$') == -1))
-            return s;
-
-        StringBuilder sb = new StringBuilder();
-
-        for (int N = s.length(), i = 0; i < N; ++i) {
-            char c = s.charAt(i);
-            if (c == '\\' || c == '$') sb.append('\\');
-            sb.append(c);
-        }
-
-        return sb.toString();
-    }
-    */
-
-    public static final String quoteReplacement(String s) {
-
-        if (s == null) {
-            return null;
-        }
-
-        for (int N = s.length(), i = 0; i < N; ++i) { // plain check loop
-            char c = s.charAt(i);
-            if (c == '$' || c == '\\') { // first special -> StringBuilder
-                StringBuilder sb = new StringBuilder(s.substring(0, i))
-                .append('\\')
-                .append(c);
-                for (++i; i < N; ++i) { // build StringBuilder with rest
-                    if ((c = s.charAt(i)) == '$' || c == '\\') {
-                        sb.append('\\');
-                    }
-                    sb.append(c);
-                }
-                return sb.toString();
-            }
-        }
-
-        return s;
-    }
-
-    public static final String repeat(String what, int times) {
-        return repeat(what, times, new StringBuilder()).toString();
-    }
-
-    public static final StringBuilder repeat(String what, int times, StringBuilder sb) {
-        while (times-- > 0) {
-            sb.append(what);
-        }
-        return sb;
-    }
-
-    /**
-     * Returns the file name without extension.
-     */
-    public static final String cutExtension(String s) {
-        if (s == null) {
-            return null;
-        }
-        int dot = s.lastIndexOf('.');
-        return dot >= 0
-               ? s.substring(0, dot)
-               : s;
-    }
-
-    public static final String extension(String s) {
-        if (s == null) {
-            return null;
-        }
-        int dot = s.lastIndexOf('.');
-        return dot >= 0
-               ? s.substring(dot+1)
-               : s;
-    }
-
-    public static final String [] splitExtension(String x) {
-        if (x == null) {
-            return null;
-        }
-        int i = x.lastIndexOf('.');
-        return i < 0
-               ? new String[] { x, null }
-               : new String[] { x.substring(0, Math.max(0, i)), x.substring(i+1).toLowerCase() };
-    }
-
-    public static String entityEncode(String s) {
-        if (s == null || s.length() == 0) {
-            return s;
-        }
-
-        StringBuilder sb = new StringBuilder();
-        for (int i=0, N =s.length(); i < N; i++) {
-            char c = s.charAt(i);
-            switch (c) {
-                case '<':
-                    sb.append("<");
-                    break;
-                case '>':
-                    sb.append(">");
-                    break;
-                case '&':
-                    sb.append("&");
-                    break;
-                default:
-                    sb.append(c);
-            }
-        }
-        return sb.toString();
-    }
-
-    public static String entityDecode(String s) {
-        if (s == null || s.length() == 0) {
-            return s;
-        }
-
-        boolean amp = false;
-        StringBuilder sb = new StringBuilder();
-        StringBuilder ampbuf = new StringBuilder();
-        for (int i=0, N =s.length(); i < N; i++) {
-            char c = s.charAt(i);
-            if (amp) {
-                if (c == ';') {
-                    amp = false;
-                    String str = ampbuf.toString();
-                    ampbuf.setLength(0);
-                    if (str.equals("lt")) {
-                        sb.append('<');
-                    }
-                    else if (str.equals("gt")) {
-                        sb.append('>');
-                    }
-                    else if (str.equals("amp")) {
-                        sb.append('&');
-                    }
-                    else {
-                        sb.append('&').append(str).append(';');
-                    }
-                }
-                else {
-                    ampbuf.append(c);
-                }
-            }
-            else if (c=='&') {
-                amp = true;
-            }
-            else {
-                sb.append(c);
-            }
-
-        }
-        return sb.toString();
-    }
-
-    public static final String quote(String s) {
-        return quote(s, '"');
-    }
-
-    public static final String quote(String s, char quoteChar) {
-        if (s == null) {
-            return null;
-        }
-
-        int N = s.length();
-
-        if (N == 0)
-            return new StringBuilder(2)
-                   .append(quoteChar)
-                   .append(quoteChar)
-                   .toString();
-
-        StringBuilder sb = null;
-
-        int i = 0;
-
-        for (; i < N; ++i) {
-            char c = s.charAt(i);
-
-            if (Character.isWhitespace(c)) {
-                sb = new StringBuilder()
-                .append(quoteChar)
-                .append(s.substring(0, i+1));
-                break;
-            }
-            else if (c == quoteChar) {
-                sb = new StringBuilder()
-                .append(quoteChar)
-                .append(s.substring(0, i))
-                .append('\\')
-                .append(quoteChar);
-                break;
-            }
-        }
-
-        if (sb == null) {
-            return s;
-        }
-
-        for (++i; i < N; ++i) {
-            char c = s.charAt(i);
-            if (c == quoteChar || c == '\\') {
-                sb.append('\\');
-            }
-
-            sb.append(c);
-        }
-
-        return sb.append(quoteChar).toString();
-    }
-
-    /*
-    public static String sprintf(String format, Object... args) {
-        return sprintf(null, format, args);
-    }
-    */
-
-    public static String sprintf(Locale locale, String format, Object ... args) {
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-        pw.printf(locale, format, args);
-        pw.flush();
-        return sw.toString();
-    }
-
-
-    public static void testQuote() {
-        System.err.println("testing quote:");
-
-        String cases []  = {
-            "",          "''",
-            "test",      "test",
-            "test test", "'test test'",
-            "  test",    "'  test'",
-            "test   ",   "'test   '",
-            " test ",    "' test '",
-            "'test",     "'\\'test'",
-            "'",         "'\\''",
-            " ' ' ",     "' \\' \\' '",
-            "te'st",     "'te\\'st'"
-        };
-
-        int failed = 0;
-
-        for (int i = 0; i < cases.length; i += 2) {
-            String in  = cases[i];
-            String out = cases[i+1];
-
-            String res = quote(in, '\'');
-            if (!res.equals(out)) {
-                ++failed;
-                System.err.println(
-                    "quote failed on: >" + in +
-                    "< result: >" + res +
-                    "< expected: >" + out + "<");
-            }
-        }
-
-        int T = cases.length/2;
-
-        System.err.println("tests total: "  + T);
-        System.err.println("tests failed: " + failed);
-        System.err.println("tests passed: " + (T - failed));
-    }
-
-    public static void testQuoteReplacement() {
-        System.err.println("testing quoteReplacement:");
-
-        String cases []  = {
-            "",          "",
-            "test",      "test",
-            "$",         "\\$",
-            "\\",        "\\\\",
-            "\\$",       "\\\\\\$",
-            "test\\$",   "test\\\\\\$",
-            "\\test",    "\\\\test",
-            "test$",     "test\\$",
-            "test$test", "test\\$test",
-            "$test$",    "\\$test\\$"
-        };
-
-        int failed = 0;
-
-        for (int i = 0; i < cases.length; i += 2) {
-            String in  = cases[i];
-            String out = cases[i+1];
-
-            String res = quoteReplacement(in);
-            if (!res.equals(out)) {
-                ++failed;
-                System.err.println(
-                    "quoteReplacement failed on: '" + in +
-                    "' result: '" + res +
-                    "' expected: '" + out + "'");
-            }
-        }
-
-        int T = cases.length/2;
-
-        System.err.println("tests total: "  + T);
-        System.err.println("tests failed: " + failed);
-        System.err.println("tests passed: " + (T - failed));
-    }
-
-    public static void testStringArray2D() {
-        int total = 0;
-        int fail = 0;
-        int passed = 0;
-
-        System.err.println("testing StringArray2D:");
-
-        double[][] testarray = {{1.0, 2.0, 3.0},
-            {1.1, 2.1, 3.1},
-            {100.2, 200.2}
-        };
-        String str = double2DArrayToString(testarray);
-
-        total += 1;
-        if (str.equals("1.0;2.0;3.0:1.1;2.1;3.1:100.2;200.2")) {
-            passed +=1;
-        }
-        else {
-            fail +=1;
-            System.err.println("Der Ergebnis-String ist nicht richtig:");
-            System.err.println(str);
-        }
-
-
-
-        double[][] testarray2 = stringToDouble2DArray(str);
-        boolean failed = false;
-
-        total +=1;
-        for (int i=0; i < testarray.length; i++)
-            for (int j=0; j < testarray[i].length; j++)
-                if (testarray[i][j] != testarray2[i][j]) {
-                    System.err.println("Test scheitert bei i=" +i +" j=" +j);
-                    System.err.println("alter Wert=" + testarray[i][j] +" neuer Wert=" +testarray2[i][j]);
-                    failed = true;
-                }
-        if (failed) {
-            fail +=1;
-        }
-        else {
-            passed +=1;
-        }
-        System.err.println("tests total: "+ total);
-        System.err.println("tests failed: "+ fail);
-        System.err.println("tests passed: "+ passed);
-    }
-
-    public static void main(String [] args) {
-
-        testQuoteReplacement();
-        testQuote();
-        testStringArray2D();
-    }
-
-    /** Check for occurence of needle in hay, converting both to lowercase
-     * to be ignorant of cases. */
-    public static boolean containsIgnoreCase(String hay, String needle) {
-        return hay.toLowerCase().contains(needle.toLowerCase());
-    }
-}
-// end of file
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/App.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/App.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,30 @@
+package de.intevation.flys;
+
+import de.intevation.flys.backend.SessionFactoryProvider;
+import de.intevation.flys.backend.FLYSCredentials;
+
+import org.hibernate.cfg.Configuration;
+
+import org.hibernate.dialect.resolver.DialectFactory;
+
+public class App
+{
+    public static void dumpSchema(Configuration cfg) {
+        System.out.println("BEGIN;");
+
+        String [] setupScript = cfg.generateSchemaCreationScript(
+            DialectFactory.constructDialect(
+                FLYSCredentials.getDefault().getDialect()));
+
+        for (String line: setupScript) {
+            System.out.println(line + ";");
+        }
+
+        System.out.println("COMMIT;");
+    }
+
+    public static void main(String [] args) {
+        dumpSchema(SessionFactoryProvider.createConfiguration());
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/backend/Credentials.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/backend/Credentials.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,90 @@
+package de.intevation.flys.backend;
+
+public abstract class Credentials
+{
+    protected String   user;
+    protected String   password;
+    protected String   dialect;
+    protected String   driver;
+    protected String   url;
+    protected String   connectionInitSqls;
+    protected Class [] classes;
+
+    public Credentials() {
+    }
+
+    public Credentials(
+        String   user,
+        String   password,
+        String   dialect,
+        String   driver,
+        String   url,
+        String   connectionInitSqls,
+        Class [] classes
+    ) {
+        this.user               = user;
+        this.password           = password;
+        this.dialect            = dialect;
+        this.driver             = driver;
+        this.url                = url;
+        this.connectionInitSqls = connectionInitSqls;
+        this.classes            = classes;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getDialect() {
+        return dialect;
+    }
+
+    public void setDialect(String dialect) {
+        this.dialect = dialect;
+    }
+
+    public String getDriver() {
+        return driver;
+    }
+
+    public void setDriver(String driver) {
+        this.driver = driver;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getConnectionInitSqls() {
+        return connectionInitSqls;
+    }
+
+    public void setConnectionInitSqls(String connectionInitSqls) {
+        this.connectionInitSqls = connectionInitSqls;
+    }
+
+    public Class [] getClasses() {
+        return classes;
+    }
+
+    public void setClasses(Class [] classes) {
+        this.classes = classes;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/backend/FLYSCredentials.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/backend/FLYSCredentials.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,253 @@
+package de.intevation.flys.backend;
+
+import de.intevation.artifacts.common.utils.Config;
+
+import de.intevation.flys.model.Annotation;
+import de.intevation.flys.model.AnnotationType;
+import de.intevation.flys.model.Attribute;
+import de.intevation.flys.model.AxisKind;
+import de.intevation.flys.model.BedHeightEpoch;
+import de.intevation.flys.model.BedHeightEpochValue;
+import de.intevation.flys.model.BedHeightSingle;
+import de.intevation.flys.model.BedHeightSingleValue;
+import de.intevation.flys.model.BedHeightType;
+import de.intevation.flys.model.Building;
+import de.intevation.flys.model.BoundaryKind;
+import de.intevation.flys.model.CrossSection;
+import de.intevation.flys.model.CrossSectionLine;
+import de.intevation.flys.model.CrossSectionPoint;
+import de.intevation.flys.model.CrossSectionTrack;
+import de.intevation.flys.model.CrossSectionTrackKind;
+import de.intevation.flys.model.DGM;
+import de.intevation.flys.model.Depth;
+import de.intevation.flys.model.DischargeTable;
+import de.intevation.flys.model.DischargeTableValue;
+import de.intevation.flys.model.DischargeZone;
+import de.intevation.flys.model.Edge;
+import de.intevation.flys.model.ElevationModel;
+import de.intevation.flys.model.FedState;
+import de.intevation.flys.model.Fixpoint;
+import de.intevation.flys.model.Floodmaps;
+import de.intevation.flys.model.Floodmark;
+import de.intevation.flys.model.Floodplain;
+import de.intevation.flys.model.FloodplainKind;
+import de.intevation.flys.model.FlowVelocityMeasurement;
+import de.intevation.flys.model.FlowVelocityMeasurementValue;
+import de.intevation.flys.model.FlowVelocityModel;
+import de.intevation.flys.model.FlowVelocityModelValue;
+import de.intevation.flys.model.Gauge;
+import de.intevation.flys.model.GaugeLocation;
+import de.intevation.flys.model.GrainFraction;
+import de.intevation.flys.model.HWSKind;
+import de.intevation.flys.model.HWSLine;
+import de.intevation.flys.model.HWSPoint;
+import de.intevation.flys.model.HYK;
+import de.intevation.flys.model.HYKEntry;
+import de.intevation.flys.model.HYKFlowZone;
+import de.intevation.flys.model.HYKFlowZoneType;
+import de.intevation.flys.model.HYKFormation;
+import de.intevation.flys.model.HydrBoundary;
+import de.intevation.flys.model.HydrBoundaryPoly;
+import de.intevation.flys.model.Jetty;
+import de.intevation.flys.model.LocationSystem;
+import de.intevation.flys.model.MainValue;
+import de.intevation.flys.model.MainValueType;
+import de.intevation.flys.model.MeasurementStation;
+import de.intevation.flys.model.MorphologicalWidth;
+import de.intevation.flys.model.MorphologicalWidthValue;
+import de.intevation.flys.model.NamedMainValue;
+import de.intevation.flys.model.Position;
+import de.intevation.flys.model.Range;
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.RiverAxis;
+import de.intevation.flys.model.RiverAxisKm;
+import de.intevation.flys.model.SQRelation;
+import de.intevation.flys.model.SQRelationValue;
+import de.intevation.flys.model.SectieKind;
+import de.intevation.flys.model.SobekKind;
+import de.intevation.flys.model.SedimentDensity;
+import de.intevation.flys.model.SedimentDensityValue;
+import de.intevation.flys.model.SedimentYield;
+import de.intevation.flys.model.SedimentYieldValue;
+import de.intevation.flys.model.TimeInterval;
+import de.intevation.flys.model.Unit;
+import de.intevation.flys.model.Wst;
+import de.intevation.flys.model.WstColumn;
+import de.intevation.flys.model.WstColumnQRange;
+import de.intevation.flys.model.WstColumnValue;
+import de.intevation.flys.model.WstQRange;
+
+public class FLYSCredentials
+extends      Credentials
+{
+    public static final String XPATH_USER =
+        "/artifact-database/backend-database/user/text()";
+
+    public static final String XPATH_PASSWORD =
+        "/artifact-database/backend-database/password/text()";
+
+    public static final String XPATH_DIALECT =
+        "/artifact-database/backend-database/dialect/text()";
+
+    public static final String XPATH_DRIVER =
+        "/artifact-database/backend-database/driver/text()";
+
+    public static final String XPATH_URL =
+        "/artifact-database/backend-database/url/text()";
+
+    public static final String XPATH_CONNECTION_INIT_SQLS =
+        "/artifact-database/backend-database/connection-init-sqls/text()";
+
+    public static final String DEFAULT_USER =
+        System.getProperty("flys.backend.user", "flys");
+
+    public static final String DEFAULT_PASSWORD =
+        System.getProperty("flys.backend.password", "flys");
+
+    public static final String DEFAULT_DIALECT =
+        System.getProperty(
+            "flys.backend.dialect",
+            "org.hibernate.dialect.PostgreSQLDialect");
+
+    public static final String DEFAULT_DRIVER =
+        System.getProperty(
+            "flys.backend.driver",
+            "org.postgresql.Driver");
+
+    public static final String DEFAULT_URL =
+        System.getProperty(
+            "flys.backend.url",
+            "jdbc:postgresql://localhost:5432/flys");
+
+    public static final String DEFAULT_CONNECTION_INIT_SQLS =
+        System.getProperty(
+            "flys.backend.connection.init.sqls");
+
+    public static final Class [] CLASSES = {
+        Annotation.class,
+        AnnotationType.class,
+        Attribute.class,
+        AxisKind.class,
+        BedHeightEpoch.class,
+        BedHeightEpochValue.class,
+        BedHeightSingle.class,
+        BedHeightSingleValue.class,
+        BedHeightType.class,
+        Building.class,
+        BoundaryKind.class,
+        CrossSection.class,
+        CrossSectionLine.class,
+        CrossSectionPoint.class,
+        CrossSectionTrack.class,
+        CrossSectionTrackKind.class,
+        Depth.class,
+        DGM.class,
+        DischargeTable.class,
+        DischargeTableValue.class,
+        DischargeZone.class,
+        Edge.class,
+        ElevationModel.class,
+        FedState.class,
+        Fixpoint.class,
+        Floodmark.class,
+        Floodplain.class,
+        FloodplainKind.class,
+        Floodmaps.class,
+        FlowVelocityMeasurement.class,
+        FlowVelocityMeasurementValue.class,
+        FlowVelocityModel.class,
+        FlowVelocityModelValue.class,
+        Gauge.class,
+        GaugeLocation.class,
+        GrainFraction.class,
+        HWSKind.class,
+        HWSLine.class,
+        HWSPoint.class,
+        HydrBoundary.class,
+        HydrBoundaryPoly.class,
+        HYK.class,
+        HYKEntry.class,
+        HYKFormation.class,
+        HYKFlowZoneType.class,
+        HYKFlowZone.class,
+        Jetty.class,
+        LocationSystem.class,
+        MainValueType.class,
+        MeasurementStation.class,
+        MorphologicalWidth.class,
+        MorphologicalWidthValue.class,
+        NamedMainValue.class,
+        MainValue.class,
+        Position.class,
+        Range.class,
+        River.class,
+        RiverAxis.class,
+        RiverAxisKm.class,
+        SectieKind.class,
+        SobekKind.class,
+        SedimentDensity.class,
+        SedimentDensityValue.class,
+        SedimentYield.class,
+        SedimentYieldValue.class,
+        SQRelation.class,
+        SQRelationValue.class,
+        TimeInterval.class,
+        Unit.class,
+        WstColumn.class,
+        WstColumnQRange.class,
+        WstColumnValue.class,
+        Wst.class,
+        WstQRange.class
+    };
+
+    public FLYSCredentials() {
+    }
+
+    public FLYSCredentials(
+        String user,
+        String password,
+        String dialect,
+        String driver,
+        String url,
+        String connectionInitSqls
+    ) {
+        super(
+            user, password, dialect, driver, url, connectionInitSqls, CLASSES);
+    }
+
+    private static Credentials instance;
+
+    public static synchronized Credentials getInstance() {
+        if (instance == null) {
+            String user =
+                Config.getStringXPath(XPATH_USER, DEFAULT_USER);
+            String password =
+                Config.getStringXPath(XPATH_PASSWORD, DEFAULT_PASSWORD);
+            String dialect =
+                Config.getStringXPath(XPATH_DIALECT, DEFAULT_DIALECT);
+            String driver =
+                Config.getStringXPath(XPATH_DRIVER, DEFAULT_DRIVER);
+            String url =
+                Config.getStringXPath(XPATH_URL, DEFAULT_URL);
+            String connectionInitSqls =
+                Config.getStringXPath(
+                    XPATH_CONNECTION_INIT_SQLS,
+                    DEFAULT_CONNECTION_INIT_SQLS);
+
+            instance = new FLYSCredentials(
+                user, password, dialect, driver, url, connectionInitSqls);
+        }
+        return instance;
+    }
+
+    public static Credentials getDefault() {
+        return new FLYSCredentials(
+            DEFAULT_USER,
+            DEFAULT_PASSWORD,
+            DEFAULT_DIALECT,
+            DEFAULT_DRIVER,
+            DEFAULT_URL,
+            DEFAULT_CONNECTION_INIT_SQLS);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/backend/SedDBCredentials.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/backend/SedDBCredentials.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,209 @@
+package de.intevation.flys.backend;
+
+import de.intevation.artifacts.common.utils.Config;
+
+import de.intevation.seddb.model.Bezugspegel;
+import de.intevation.seddb.model.Bezugspegelgew;
+import de.intevation.seddb.model.BezugspegelgewId;
+import de.intevation.seddb.model.Bild;
+import de.intevation.seddb.model.Gewaesser;
+import de.intevation.seddb.model.Gfaenger;
+import de.intevation.seddb.model.Glotlinks;
+import de.intevation.seddb.model.GlotlinksId;
+import de.intevation.seddb.model.Glotrechte;
+import de.intevation.seddb.model.Gprobe;
+import de.intevation.seddb.model.GprobeId;
+import de.intevation.seddb.model.Gsiebsatz;
+import de.intevation.seddb.model.Gsiebung;
+import de.intevation.seddb.model.Gsiebungsieb;
+import de.intevation.seddb.model.GsiebungsiebId;
+import de.intevation.seddb.model.Hpeilpunkt;
+import de.intevation.seddb.model.HpeilpunktId;
+import de.intevation.seddb.model.Hpeilung;
+import de.intevation.seddb.model.Messung;
+import de.intevation.seddb.model.Messunglotcount;
+import de.intevation.seddb.model.MessunglotcountId;
+import de.intevation.seddb.model.Messungsta;
+import de.intevation.seddb.model.MessungstaId;
+import de.intevation.seddb.model.Messunguferbezug;
+import de.intevation.seddb.model.MessunguferbezugId;
+import de.intevation.seddb.model.Mpeilpunkt;
+import de.intevation.seddb.model.MpeilpunktId;
+import de.intevation.seddb.model.Mpeilung;
+import de.intevation.seddb.model.Probebild;
+import de.intevation.seddb.model.Siebanalyse;
+import de.intevation.seddb.model.Slotlinks;
+import de.intevation.seddb.model.SlotlinksId;
+import de.intevation.seddb.model.Slotrechte;
+import de.intevation.seddb.model.Sohlprobe;
+import de.intevation.seddb.model.Sohltest;
+import de.intevation.seddb.model.Sprobe;
+import de.intevation.seddb.model.SprobeId;
+import de.intevation.seddb.model.Ssiebung;
+import de.intevation.seddb.model.Ssiebungsieb;
+import de.intevation.seddb.model.SsiebungsiebId;
+import de.intevation.seddb.model.Station;
+import de.intevation.seddb.model.Stationgew;
+import de.intevation.seddb.model.StationgewId;
+import de.intevation.seddb.model.TmpGloChanged;
+import de.intevation.seddb.model.TmpMesAchanged;
+import de.intevation.seddb.model.TmpMesGchanged;
+import de.intevation.seddb.model.TmpMesQchanged;
+import de.intevation.seddb.model.TmpMesSchanged;
+import de.intevation.seddb.model.Zzarchiv;
+import de.intevation.seddb.model.Zzprobenahmeart;
+import de.intevation.seddb.model.Zzsondierungart;
+import de.intevation.seddb.model.Zzthema;
+
+public class SedDBCredentials
+extends      Credentials
+{
+    public static final String XPATH_USER =
+        "/artifact-database/seddb-database/user/text()";
+
+    public static final String XPATH_PASSWORD =
+        "/artifact-database/seddb-database/password/text()";
+
+    public static final String XPATH_DIALECT =
+        "/artifact-database/seddb-database/dialect/text()";
+
+    public static final String XPATH_DRIVER =
+        "/artifact-database/seddb-database/driver/text()";
+
+    public static final String XPATH_URL =
+        "/artifact-database/seddb-database/url/text()";
+
+    public static final String XPATH_CONNECTION_INIT_SQLS =
+        "/artifact-database/seddb-database/connection-init-sqls/text()";
+
+    public static final String DEFAULT_USER =
+        System.getProperty("flys.seddb.user", "seddb");
+
+    public static final String DEFAULT_PASSWORD =
+        System.getProperty("flys.seddb.password", "seddb");
+
+    public static final String DEFAULT_DIALECT =
+        System.getProperty(
+            "flys.seddb.dialect",
+            "org.hibernate.dialect.PostgreSQLDialect");
+
+    public static final String DEFAULT_DRIVER =
+        System.getProperty(
+            "flys.seddb.driver",
+            "org.postgresql.Driver");
+
+    public static final String DEFAULT_URL =
+        System.getProperty(
+            "flys.seddb.url",
+            "jdbc:postgresql://localhost:5432/seddb");
+
+    public static final String DEFAULT_CONNECTION_INIT_SQLS =
+        System.getProperty(
+            "flys.seddb.connection.init.sqls");
+
+    public static final Class [] CLASSES = {
+        BezugspegelgewId.class,
+        Bezugspegelgew.class,
+        Bezugspegel.class,
+        Bild.class,
+        Gewaesser.class,
+        Gfaenger.class,
+        GlotlinksId.class,
+        Glotlinks.class,
+        Glotrechte.class,
+        GprobeId.class,
+        Gprobe.class,
+        Gsiebsatz.class,
+        Gsiebung.class,
+        GsiebungsiebId.class,
+        Gsiebungsieb.class,
+        HpeilpunktId.class,
+        Hpeilpunkt.class,
+        Hpeilung.class,
+        Messung.class,
+        MessunglotcountId.class,
+        Messunglotcount.class,
+        MessungstaId.class,
+        Messungsta.class,
+        MessunguferbezugId.class,
+        Messunguferbezug.class,
+        MpeilpunktId.class,
+        Mpeilpunkt.class,
+        Mpeilung.class,
+        Probebild.class,
+        Siebanalyse.class,
+        SlotlinksId.class,
+        Slotlinks.class,
+        Slotrechte.class,
+        Sohlprobe.class,
+        Sohltest.class,
+        SprobeId.class,
+        Sprobe.class,
+        Ssiebung.class,
+        SsiebungsiebId.class,
+        Ssiebungsieb.class,
+        StationgewId.class,
+        Stationgew.class,
+        Station.class,
+        TmpGloChanged.class,
+        TmpMesAchanged.class,
+        TmpMesGchanged.class,
+        TmpMesQchanged.class,
+        TmpMesSchanged.class,
+        Zzarchiv.class,
+        Zzprobenahmeart.class,
+        Zzsondierungart.class,
+        Zzthema.class
+    };
+
+    private static Credentials instance;
+
+    public SedDBCredentials() {
+    }
+
+    public SedDBCredentials(
+        String user,
+        String password,
+        String dialect,
+        String driver,
+        String url,
+        String connectionInitSqls
+    ) {
+        super(
+            user, password, dialect, driver, url, connectionInitSqls, CLASSES);
+    }
+
+    public static synchronized Credentials getInstance() {
+        if (instance == null) {
+            String user =
+                Config.getStringXPath(XPATH_USER, DEFAULT_USER);
+            String password =
+                Config.getStringXPath(XPATH_PASSWORD, DEFAULT_PASSWORD);
+            String dialect =
+                Config.getStringXPath(XPATH_DIALECT, DEFAULT_DIALECT);
+            String driver =
+                Config.getStringXPath(XPATH_DRIVER, DEFAULT_DRIVER);
+            String url =
+                Config.getStringXPath(XPATH_URL, DEFAULT_URL);
+            String connectionInitSqls =
+                Config.getStringXPath(
+                    XPATH_CONNECTION_INIT_SQLS,
+                    DEFAULT_CONNECTION_INIT_SQLS);
+
+            instance = new SedDBCredentials(
+                user, password, dialect, driver, url, connectionInitSqls);
+        }
+        return instance;
+    }
+
+    public static Credentials getDefault() {
+        return new SedDBCredentials(
+            DEFAULT_USER,
+            DEFAULT_PASSWORD,
+            DEFAULT_DIALECT,
+            DEFAULT_DRIVER,
+            DEFAULT_URL,
+            DEFAULT_CONNECTION_INIT_SQLS);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/backend/SedDBSessionHolder.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/backend/SedDBSessionHolder.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,43 @@
+package de.intevation.flys.backend;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+public class SedDBSessionHolder
+{
+    private static Logger log =
+        Logger.getLogger(SedDBSessionHolder.class);
+
+    public static final ThreadLocal<Session> HOLDER =
+        new ThreadLocal<Session>() {
+            @Override
+            protected Session initialValue() {
+                return create();
+            }
+        };
+
+    private SedDBSessionHolder() {
+    }
+
+    public synchronized static Session create() {
+        log.debug("create");
+        SessionFactory sessionFactory =
+            SessionFactoryProvider.getSedDBSessionFactory();
+        return sessionFactory.openSession();
+    }
+
+    public static Session acquire() {
+        log.debug("acquire");
+        Session session = create();
+        HOLDER.set(session);
+        return session;
+    }
+
+    public static void release() {
+        log.debug("release");
+        HOLDER.remove();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/backend/SessionFactoryProvider.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/backend/SessionFactoryProvider.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,170 @@
+package de.intevation.flys.backend;
+
+import java.util.Properties;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.SessionFactory;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+
+import org.hibernate.impl.SessionFactoryImpl;
+
+public final class SessionFactoryProvider
+{
+    private static Logger log = Logger.getLogger(SessionFactoryProvider.class);
+
+    //public static final boolean ENABLE_JMX =
+    //    Boolean.getBoolean("flys.backend.enablejmx");
+
+    private static SessionFactory flysSessionFactory;
+    private static SessionFactory sedDBSessionFactory;
+
+    private SessionFactoryProvider() {
+    }
+
+    public static synchronized SessionFactory getSessionFactory() {
+        if (flysSessionFactory == null) {
+            flysSessionFactory =
+                createSessionFactory(FLYSCredentials.getInstance());
+        }
+        return flysSessionFactory;
+    }
+
+    public static SessionFactory createSessionFactory() {
+        return createSessionFactory(FLYSCredentials.getDefault());
+    }
+
+    public static synchronized SessionFactory getSedDBSessionFactory() {
+        if (sedDBSessionFactory == null) {
+            sedDBSessionFactory =
+                createSessionFactory(SedDBCredentials.getInstance());
+        }
+        return sedDBSessionFactory;
+    }
+
+    public static SessionFactory createSedDBSessionFactory() {
+        return createSessionFactory(SedDBCredentials.getDefault());
+    }
+
+    public static SessionFactory createSessionFactory(
+        Credentials credentials
+    ) {
+        Configuration cfg = createConfiguration(credentials);
+
+        SessionFactory factory = cfg.buildSessionFactory();
+
+        /*
+        if (ENABLE_JMX) {
+            registerAsMBean(factory);
+        }
+        else {
+            log.info("No JMX support for hibernate.");
+        }
+        */
+
+        return factory;
+    }
+
+    /** XXX: Commented out till it is configured correctly.
+    public static void registerAsMBean(SessionFactory factory) {
+
+        // 
+
+        StatisticsService statsMBean = new StatisticsService();
+        statsMBean.setSessionFactory(factory);
+        statsMBean.setStatisticsEnabled(true);
+
+        try {
+            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            mbs.registerMBean(
+                statsMBean,
+                new ObjectName("Hibernate:application=Statistics"));
+
+            log.info("Enabled JMX support for hibernate.");
+        }
+        catch (MalformedObjectNameException mone) {
+            log.warn(mone, mone);
+        }
+        catch (InstanceAlreadyExistsException iaee) {
+            log.warn(iaee, iaee);
+        }
+        catch (MBeanRegistrationException mbre) {
+            log.warn(mbre, mbre);
+        }
+        catch (NotCompliantMBeanException ncmbe) {
+            log.warn(ncmbe, ncmbe);
+        }
+    }
+    */
+
+    public static Configuration createConfiguration() {
+        return createConfiguration(FLYSCredentials.getInstance());
+    }
+
+    public static Configuration createConfiguration(
+        Credentials credentials
+    ) {
+        Configuration cfg = new Configuration();
+
+        for (Class<?> clazz: credentials.getClasses()) {
+            cfg.addAnnotatedClass(clazz);
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug("user: "    + credentials.getUser());
+            log.debug("dialect: " + credentials.getDialect());
+            log.debug("driver: "  + credentials.getDriver());
+            log.debug("url: "     + credentials.getUrl());
+        }
+
+        Properties props = new Properties();
+
+        // We rely on our own connection pool
+        props.setProperty(
+            "hibernate.connection.provider_class",
+            "de.intevation.flys.utils.DBCPConnectionProvider");
+
+        props.setProperty(Environment.DIALECT, credentials.getDialect());
+        props.setProperty(Environment.USER,    credentials.getUser());
+        props.setProperty(Environment.PASS,    credentials.getPassword());
+        props.setProperty(Environment.DRIVER,  credentials.getDriver());
+        props.setProperty(Environment.URL,     credentials.getUrl());
+
+        String connectionInitSqls = credentials.getConnectionInitSqls();
+        if (connectionInitSqls != null) {
+            props.setProperty("connectionInitSqls", connectionInitSqls);
+        }
+
+        cfg.mergeProperties(props);
+
+        return cfg;
+    }
+
+
+    public static String getProperty(SessionFactoryImpl factory, String key) {
+        Properties props = factory.getProperties();
+        return props.getProperty(key);
+    }
+
+    public static String getUser(SessionFactoryImpl factory) {
+        return getProperty(factory, Environment.USER);
+    }
+
+
+    public static String getPass(SessionFactoryImpl factory) {
+        return getProperty(factory, Environment.PASS);
+    }
+
+
+    public static String getURL(SessionFactoryImpl factory) {
+        return getProperty(factory, Environment.URL);
+    }
+
+
+    public static String getDriver(SessionFactoryImpl factory) {
+        return getProperty(factory, Environment.DRIVER);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/backend/SessionHolder.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/backend/SessionHolder.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,44 @@
+package de.intevation.flys.backend;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+
+public class SessionHolder
+{
+    private static Logger log =
+        Logger.getLogger(SessionHolder.class);
+
+    public static final ThreadLocal<Session> HOLDER =
+        new ThreadLocal<Session>() {
+            @Override
+            protected Session initialValue() {
+                return create();
+            }
+        };
+
+    private SessionHolder() {
+    }
+
+    public synchronized static Session create() {
+        log.debug("create");
+        SessionFactory sessionFactory =
+            SessionFactoryProvider.getSessionFactory();
+        return sessionFactory.openSession();
+    }
+
+    public static Session acquire() {
+        log.debug("acquire");
+        Session session = create();
+        HOLDER.set(session);
+        return session;
+    }
+
+    public static void release() {
+        log.debug("release");
+        HOLDER.remove();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/backend/SpatialInfo.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/backend/SpatialInfo.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,176 @@
+package de.intevation.flys.backend;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+import de.intevation.flys.model.Building;
+import de.intevation.flys.model.CrossSectionTrack;
+import de.intevation.flys.model.Fixpoint;
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.RiverAxis;
+import de.intevation.flys.model.HWSLine;
+
+
+public class SpatialInfo {
+
+    private static Logger logger = Logger.getLogger(SpatialInfo.class);
+
+    protected static String RIVERNAME = System.getProperty(
+        "flys.backend.spatial.river", "Saar");
+
+    protected Session session;
+
+
+    public static void main(String[] args) {
+        logger.info("Start SpatialInfo application.");
+
+        SpatialInfo spatial = null;
+
+        try {
+            spatial = new SpatialInfo();
+
+            River river = spatial.getRiver(RIVERNAME);
+            if (river == null) {
+                logger.warn("Could not find river '" + RIVERNAME + "'!");
+                return;
+            }
+
+            logger.info("Spatial information of River '" + RIVERNAME + "'");
+            spatial.doRiverAxisInfo(river);
+            spatial.doCrossSectionTracksInfo(river);
+            spatial.doBuildingsInfo(river);
+            spatial.doFixpointsInfo(river);
+        }
+        finally {
+            if (spatial != null) {
+                spatial.close();
+            }
+        }
+
+        logger.info("Finish SpatialInfo application.");
+    }
+
+
+    public SpatialInfo() {
+        session = SessionFactoryProvider
+            .createSessionFactory()
+            .openSession();
+    }
+
+
+    public void close() {
+        session.close();
+    }
+
+
+    protected River getRiver(String rivername) {
+        Query query = session.createQuery(
+            "from River where name =:name");
+        query.setParameter("name", rivername);
+
+        List<River> list = query.list();
+
+        if (list == null || list.size() == 0) {
+            logger.warn("No river '" + rivername + "' found!");
+            return null;
+        }
+
+        return list.get(0);
+    }
+
+
+    protected void doRiverAxisInfo(River river) {
+        try {
+            List<RiverAxis> axis = RiverAxis.getRiverAxis(river.getName());
+            if (axis != null && axis.size() > 0) {
+                logger.debug("TODO: Compute length and boundary.");
+            }
+            else {
+                logger.warn("River has no RiverAxis.");
+            }
+        }
+        catch(HibernateException iae) {
+            logger.warn("No vaild river axis found for " + river.getName());
+            return;
+        }
+
+    }
+
+
+    protected void doCrossSectionTracksInfo(River river) {
+        Query query = session.createQuery(
+            "from CrossSectionTrack where river =:river");
+        query.setParameter("river", river);
+
+        List<CrossSectionTrack> list = query.list();
+
+        if (list == null || list.size() == 0) {
+            logger.warn("No CrossSectionTracks for '" + river.getName() + "' found!");
+            return;
+        }
+        else {
+            logger.info("River contains " + list.size() + " CrossSectionTracks.");
+        }
+    }
+
+
+    protected void doBuildingsInfo(River river) {
+        Query query = session.createQuery(
+            "from Building where river =:river");
+        query.setParameter("river", river);
+
+        List<Building> list = query.list();
+
+        if (list == null || list.size() == 0) {
+            logger.warn("No Buildings for '" + river.getName() + "' found!");
+            return;
+        }
+        else {
+            logger.info("River contains " + list.size() + " Buildings.");
+        }
+    }
+
+
+    protected void doFixpointsInfo(River river) {
+        Query query = session.createQuery(
+            "from Fixpoint where river =:river");
+        query.setParameter("river", river);
+
+        List<Fixpoint> list = query.list();
+
+        if (list == null || list.size() == 0) {
+            logger.warn("No Fixpoints for '" + river.getName() + "' found!");
+            return;
+        }
+        else {
+            logger.info("River contains " + list.size() + " Fixpoints.");
+        }
+    }
+
+    @Deprecated
+    protected void doLinesInfo(River river) {
+        doHWSLinesInfo(river);
+    }
+
+    protected void doHWSLinesInfo(River river) {
+        Query query = session.createQuery(
+            "from hws_lines where river =:river");
+        query.setParameter("river", river);
+
+        List<HWSLine> list = query.list();
+
+        if (list == null || list.size() == 0) {
+            logger.warn("No Lines for '" + river.getName() + "' found!");
+            return;
+        }
+        else {
+            logger.info("River contains " + list.size() + " Lines.");
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/Config.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/Config.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,224 @@
+package de.intevation.flys.importer;
+
+public class Config
+{
+    public static final String SKIP_DEFAULT =
+        "flys.backend.importer.skip.default";
+
+    public static final String DRY_RUN =
+        "flys.backend.importer.dry.run";
+
+    public static final String INFO_GEW_FILE =
+        "flys.backend.importer.infogew.file";
+
+    public static final String ANNOTATION_TYPES =
+        "flys.backend.importer.annotation.types";
+
+    public static final String SKIP_GAUGES =
+        "flys.backend.importer.skip.gauges";
+
+    public static final String SKIP_BWASTR =
+        "flys.backend.importer.skip.bwastr";
+
+    public static final String SKIP_HISTORICAL_DISCHARGE_TABLES =
+        "flys.backend.importer.skip.historical.discharge.tables";
+
+    public static final String SKIP_ANNOTATIONS =
+        "flys.backend.importer.skip.annotations";
+
+    public static final String SKIP_PRFS =
+        "flys.backend.importer.skip.prfs";
+
+    public static final String SKIP_DA50S =
+        "flys.backend.importer.skip.da50s";
+
+    public static final String SKIP_W80S =
+        "flys.backend.importer.skip.w80s";
+
+    public static final String SKIP_W80_CSVS =
+        "flys.backend.importer.skip.w80.csvs";
+
+    public static final String SKIP_HYKS =
+        "flys.backend.importer.skip.hyks";
+
+    public static final String SKIP_WST =
+        "flys.backend.importer.skip.wst";
+
+    public static final String SKIP_EXTRA_WSTS =
+        "flys.backend.importer.skip.extra.wsts";
+
+    public static final String SKIP_FIXATIONS =
+        "flys.backend.importer.skip.fixations";
+
+    public static final String SKIP_OFFICIAL_LINES =
+        "flys.backend.importer.skip.official.lines";
+
+    public static final String SKIP_FLOOD_WATER =
+        "flys.backend.importer.skip.flood.water";
+
+    public static final String SKIP_FLOOD_PROTECTION =
+        "flys.backend.importer.skip.flood.protection";
+
+    public static final String SKIP_BED_HEIGHT_SINGLE =
+        "flys.backend.importer.skip.bed.height.single";
+
+    public static final String SKIP_DA66S =
+        "flys.backend.importer.skip.da66s";
+
+    public static final String SKIP_BED_HEIGHT_EPOCH =
+        "flys.backend.importer.skip.bed.height.epoch";
+
+    public static final String SKIP_SEDIMENT_DENSITY =
+        "flys.backend.importer.skip.sediment.density";
+
+    public static final String SKIP_MORPHOLOGICAL_WIDTH =
+        "flys.backend.importer.skip.morphological.width";
+
+    public static final String SKIP_FLOW_VELOCITY =
+        "flys.backend.importer.skip.flow.velocity";
+
+    public static final String SKIP_SEDIMENT_YIELD =
+        "flys.backend.importer.skip.sediment.yield";
+
+    public static final String SKIP_WATERLEVELS =
+        "flys.backend.importer.skip.waterlevels";
+
+    public static final String SKIP_WATERLEVEL_DIFFERENCES =
+        "flys.backend.importer.skip.waterlevel.differences";
+
+    public static final String SKIP_MEASUREMENT_STATIONS =
+        "flys.backend.importer.skip.measurement.stations";
+
+    public static final String SKIP_SQ_RELATION =
+        "flys.backend.importer.skip.sq.relation";
+
+
+    public static final Config INSTANCE = new Config();
+
+    private Config () {
+    }
+
+    public static final boolean getFlag(String key) {
+        String flag = System.getProperty(key);
+        return flag != null
+            ? Boolean.valueOf(flag)
+            : Boolean.getBoolean(SKIP_DEFAULT);
+    }
+
+    public boolean dryRun() {
+        return getFlag(DRY_RUN);
+    }
+
+    public String getInfoGewFile() {
+        return System.getProperty(INFO_GEW_FILE);
+    }
+
+    public String getAnnotationTypes() {
+        return System.getProperty(ANNOTATION_TYPES);
+    }
+
+    public boolean skipGauges() {
+        return getFlag(SKIP_GAUGES);
+    }
+
+    public boolean skipHistoricalDischargeTables() {
+        return getFlag(SKIP_HISTORICAL_DISCHARGE_TABLES);
+    }
+
+    public boolean skipBWASTR() {
+        return getFlag(SKIP_BWASTR);
+    }
+
+    public boolean skipAnnotations() {
+        return getFlag(SKIP_ANNOTATIONS);
+    }
+
+    public boolean skipPRFs() {
+        return getFlag(SKIP_PRFS);
+    }
+
+    public boolean skipDA50s() {
+        return getFlag(SKIP_DA50S);
+    }
+
+    public boolean skipW80CSVs() {
+        return getFlag(SKIP_W80_CSVS);
+    }
+
+    public boolean skipW80s() {
+        return getFlag(SKIP_W80S);
+    }
+
+    public boolean skipHYKs() {
+        return getFlag(SKIP_HYKS);
+    }
+
+    public boolean skipWst() {
+        return getFlag(SKIP_WST);
+    }
+
+    public boolean skipExtraWsts() {
+        return getFlag(SKIP_EXTRA_WSTS);
+    }
+
+    public boolean skipFixations() {
+        return getFlag(SKIP_FIXATIONS);
+    }
+
+    public boolean skipOfficialLines() {
+        return getFlag(SKIP_OFFICIAL_LINES);
+    }
+
+    public boolean skipFloodWater() {
+        return getFlag(SKIP_FLOOD_WATER);
+    }
+
+    public boolean skipFloodProtection() {
+        return getFlag(SKIP_FLOOD_PROTECTION);
+    }
+
+    public boolean skipDA66s() {
+        return getFlag(SKIP_DA66S);
+    }
+
+    public boolean skipBedHeightSingle() {
+        return getFlag(SKIP_BED_HEIGHT_SINGLE);
+    }
+
+    public boolean skipBedHeightEpoch() {
+        return getFlag(SKIP_BED_HEIGHT_EPOCH);
+    }
+
+    public boolean skipSedimentDensity() {
+        return getFlag(SKIP_SEDIMENT_DENSITY);
+    }
+
+    public boolean skipMorphologicalWidth() {
+        return getFlag(SKIP_MORPHOLOGICAL_WIDTH);
+    }
+
+    public boolean skipFlowVelocity() {
+        return getFlag(SKIP_FLOW_VELOCITY);
+    }
+
+    public boolean skipSedimentYield() {
+        return getFlag(SKIP_SEDIMENT_YIELD);
+    }
+
+    public boolean skipWaterlevels() {
+        return getFlag(SKIP_WATERLEVELS);
+    }
+
+    public boolean skipWaterlevelDifferences() {
+        return getFlag(SKIP_WATERLEVEL_DIFFERENCES);
+    }
+
+    public boolean skipMeasurementStations() {
+        return getFlag(SKIP_MEASUREMENT_STATIONS);
+    }
+
+    public boolean skipSQRelation() {
+        return getFlag(SKIP_SQ_RELATION);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportAnnotation.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportAnnotation.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,146 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.Annotation;
+import de.intevation.flys.model.AnnotationType;
+import de.intevation.flys.model.Range;
+import de.intevation.flys.model.Position;
+import de.intevation.flys.model.Attribute;
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.Edge;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+public class ImportAnnotation
+implements   Comparable<ImportAnnotation>
+{
+    protected ImportAttribute      attribute;
+    protected ImportPosition       position;
+    protected ImportRange          range;
+    protected ImportEdge           edge;
+    protected ImportAnnotationType type;
+
+    protected Annotation      peer;
+
+    public ImportAnnotation() {
+    }
+
+    public ImportAnnotation(
+        ImportAttribute      attribute,
+        ImportPosition       position,
+        ImportRange          range,
+        ImportEdge           edge,
+        ImportAnnotationType type
+    ) {
+        this.attribute = attribute;
+        this.position  = position;
+        this.range     = range;
+        this.edge      = edge;
+        this.type      = type;
+    }
+
+    public int compareTo(ImportAnnotation other) {
+        int d = attribute.compareTo(other.attribute);
+        if (d != 0) {
+            return d;
+        }
+
+        if ((d = position.compareTo(other.position)) != 0) {
+            return d;
+        }
+
+        if ((d = range.compareTo(other.range)) != 0) {
+            return d;
+        }
+
+        if (edge == null && other.edge != null) return -1;
+        if (edge != null && other.edge == null) return +1;
+        if (edge == null && other.edge == null) return 0;
+
+        if ((d = edge.compareTo(other.edge)) != 0) {
+            return d;
+        }
+
+        if (type == null && other.type != null) return -1;
+        if (type != null && other.type == null) return +1;
+        if (type == null && other.type == null) return 0;
+
+        return type.compareTo(other.type);
+    }
+
+    public ImportAttribute getAttribute() {
+        return attribute;
+    }
+
+    public void setAttribute(ImportAttribute attribute) {
+        this.attribute = attribute;
+    }
+
+    public ImportPosition getPosition() {
+        return position;
+    }
+
+    public void setPosition(ImportPosition position) {
+        this.position = position;
+    }
+
+    public ImportRange getRange() {
+        return range;
+    }
+
+    public void setRange(ImportRange range) {
+        this.range = range;
+    }
+
+    public ImportEdge getEdge() {
+        return edge;
+    }
+
+    public void setEdge(ImportEdge edge) {
+        this.edge = edge;
+    }
+
+    public ImportAnnotationType getType() {
+        return type;
+    }
+
+    public void setType(ImportAnnotationType type) {
+        this.type = type;
+    }
+
+    public Annotation getPeer(River river) {
+        if (peer == null) {
+            Range          r = range.getPeer(river);
+            Attribute      a = attribute.getPeer();
+            Position       p = position.getPeer();
+            Edge           e = edge != null ? edge.getPeer() : null;
+            AnnotationType t = type != null ? type.getPeer() : null;
+
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from Annotation where "    +
+                "range=:range and "         +
+                "attribute=:attribute and " +
+                "position=:position and "   +
+                "edge=:edge and "           +
+                "type=:type");
+            query.setParameter("range",     r);
+            query.setParameter("attribute", a);
+            query.setParameter("position",  p);
+            query.setParameter("edge",      e);
+            query.setParameter("type",      t);
+            List<Annotation> annotations = query.list();
+            if (annotations.isEmpty()) {
+                peer = new Annotation(r, a, p, e, t);
+                session.save(peer);
+            }
+            else {
+                peer = annotations.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportAnnotationType.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportAnnotationType.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,54 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.AnnotationType;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+public class ImportAnnotationType
+implements   Comparable<ImportAnnotationType>
+{
+    protected String         name;
+    protected AnnotationType peer;
+
+    public ImportAnnotationType() {
+    }
+
+    public ImportAnnotationType(String name) {
+        this.name = name;
+    }
+
+    public int compareTo(ImportAnnotationType other) {
+        return name.compareTo(other.name);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    public AnnotationType getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from AnnotationType where name=:name");
+            query.setParameter("name", name);
+            List<AnnotationType> types = query.list();
+            if (types.isEmpty()) {
+                peer = new AnnotationType(name);
+                session.save(peer);
+            }
+            else {
+                peer = types.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportAttribute.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportAttribute.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,65 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.Attribute;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+public class ImportAttribute
+implements   Comparable<ImportAttribute>
+{
+    protected String value;
+
+    protected Attribute peer;
+
+    public ImportAttribute() {
+    }
+
+    public ImportAttribute(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public int compareTo(ImportAttribute other) {
+        return value.compareTo(other.value);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (other == this) return true;
+        if (!(other instanceof ImportAttribute)) return false;
+        return value.equals(((ImportAttribute)other).value);
+    }
+
+    @Override
+    public int hashCode() {
+        return value.hashCode();
+    }
+
+    public Attribute getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery("from Attribute where value=:value");
+            query.setString("value", value);
+            List<Attribute> attributes = query.list();
+            if (attributes.isEmpty()) {
+                peer = new Attribute(value);
+                session.save(peer);
+            }
+            else {
+                peer = attributes.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeight.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeight.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,44 @@
+package de.intevation.flys.importer;
+
+
+import java.sql.SQLException;
+
+import org.hibernate.exception.ConstraintViolationException;
+
+import de.intevation.flys.model.River;
+
+
+public interface ImportBedHeight {
+
+    String getDescription();
+
+    void addValue(ImportBedHeightValue value);
+
+    void storeDependencies(River river)
+    throws SQLException, ConstraintViolationException;
+
+    Object getPeer(River river);
+
+    int getValueCount();
+
+    void setYear(int year);
+
+    void setTimeInterval(ImportTimeInterval timeInterval);
+
+    void setSoundingWidth(int soundingWidth);
+
+    void setDescription(String description);
+
+    void setEvaluationBy(String evaluationBy);
+
+    void setRange(ImportRange range);
+
+    void setType(ImportBedHeightType type);
+
+    void setLocationSystem(ImportLocationSystem locationSystem);
+
+    void setCurElevationModel(ImportElevationModel model);
+
+    void setOldElevationModel(ImportElevationModel model);
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightEpoch.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightEpoch.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,198 @@
+package de.intevation.flys.importer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+import de.intevation.flys.model.BedHeightEpoch;
+import de.intevation.flys.model.ElevationModel;
+import de.intevation.flys.model.Range;
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.TimeInterval;
+
+
+/** Import Bed Height Data, 'epoch' type from csv file. */
+public class ImportBedHeightEpoch implements ImportBedHeight {
+
+    /** Private logger. */
+    private static Logger log = Logger.getLogger(ImportBedHeightEpoch.class);
+
+    protected String evaluationBy;
+
+    /** De facto the file name. */
+    protected String description;
+
+    protected ImportTimeInterval timeInterval;
+    protected ImportRange range;
+    protected ImportElevationModel curElevationModel;
+    protected ImportElevationModel oldElevationModel;
+
+    protected List<ImportBedHeightEpochValue> values;
+
+    protected BedHeightEpoch peer;
+
+    public ImportBedHeightEpoch(String description) {
+        this.description = description;
+        this.values = new ArrayList<ImportBedHeightEpochValue>();
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public int getValueCount() {
+        return values.size();
+    }
+
+    public void setTimeInterval(ImportTimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    public void setEvaluationBy(String evaluationBy) {
+        this.evaluationBy = evaluationBy;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public void setRange(ImportRange range) {
+        this.range = range;
+    }
+
+    public void setCurElevationModel(ImportElevationModel curElevationModel) {
+        this.curElevationModel = curElevationModel;
+    }
+
+    public void setOldElevationModel(ImportElevationModel oldElevationModel) {
+        this.oldElevationModel = oldElevationModel;
+    }
+
+    /** Does nothing. */
+    public void setYear(int year) {
+        // do nothing
+    }
+
+    /** Does nothing. */
+    public void setSoundingWidth(int soundingWidth) {
+        // do nothing
+    }
+
+
+    /** Does nothing. */
+    public void setLocationSystem(ImportLocationSystem locationSystem) {
+        // do nothing
+    }
+
+
+    /** Does nothing. */
+    public void setType(ImportBedHeightType type) {
+        // do nothing
+    }
+
+    @Override
+    public void addValue(ImportBedHeightValue value) {
+        values.add((ImportBedHeightEpochValue) value);
+    }
+
+    @Override
+    public void storeDependencies(River river) {
+        log.info("Store dependencies for epoch: '" + getDescription() + "'");
+
+        BedHeightEpoch peer = getPeer(river);
+
+        if (curElevationModel != null) {
+            curElevationModel.storeDependencies();
+        }
+
+        if (oldElevationModel != null) {
+            oldElevationModel.storeDependencies();
+        }
+
+        if (peer != null) {
+            log.debug("store values now...");
+
+            for (ImportBedHeightEpochValue value : values) {
+                value.storeDependencies(peer);
+            }
+        }
+
+        Session session = ImporterSession.getInstance().getDatabaseSession();
+        session.flush();
+    }
+
+    /**
+     * Asserts all dependent entities (ElevationModel, TimeInterval, Range,
+     * BedHeighEpoch) are in db and returns bound (either newly created or
+     * freshly fetched) BedHeightEpoch.
+     */
+    @Override
+    public BedHeightEpoch getPeer(River river) {
+        if (peer == null) {
+            ElevationModel theCurModel = null;
+            if (curElevationModel != null) {
+                curElevationModel.storeDependencies();
+                theCurModel = curElevationModel.getPeer();
+            }
+
+            if (theCurModel == null) {
+                log.warn("BHE: Skip file - invalid current elevation model.");
+                return null;
+            }
+
+            TimeInterval theTime = null;
+            if (timeInterval != null) {
+                theTime = timeInterval.getPeer();
+            }
+
+            if (theTime == null) {
+                log.warn("BHE: Skip file - invalid time range.");
+                return null;
+            }
+
+            Range theRange = range != null ? range.getPeer(river) : null;
+
+            if (theRange == null) {
+                log.warn("BHE: invalid km range.");
+            }
+
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+
+            Query query = session.createQuery("from BedHeightEpoch where "
+                + "   river=:river and " + "   timeInterval=:timeInterval and "
+                + "   curElevationModel=:curElevationModel and "
+                + "   range=:range and " + "   evaluationBy=:evaluationBy and "
+                + "   description=:description");
+
+            query.setParameter("river", river);
+            query.setParameter("timeInterval", theTime);
+            query.setParameter("curElevationModel", theCurModel);
+            query.setParameter("range", theRange);
+            query.setParameter("evaluationBy", evaluationBy);
+            query.setParameter("description", description);
+
+            List<BedHeightEpoch> bedHeights = query.list();
+
+            if (bedHeights.isEmpty()) {
+                log.info("Create new BedHeightEpoch DB instance.");
+
+                peer = new BedHeightEpoch(river, theTime, theRange,
+                    theCurModel,
+                    oldElevationModel != null ? oldElevationModel.getPeer()
+                        : null, evaluationBy, description);
+
+                session.save(peer);
+            }
+            else {
+                peer = bedHeights.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightEpochValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightEpochValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,75 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import java.math.BigDecimal;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.BedHeightEpoch;
+import de.intevation.flys.model.BedHeightEpochValue;
+
+
+public class ImportBedHeightEpochValue implements ImportBedHeightValue {
+
+    private static final Logger log =
+        Logger.getLogger(ImportBedHeightEpochValue.class);
+
+
+    private BigDecimal station;
+    private BigDecimal height;
+
+    private BedHeightEpochValue peer;
+
+
+    public ImportBedHeightEpochValue() {
+    }
+
+
+    public ImportBedHeightEpochValue(BigDecimal station, BigDecimal height) {
+        this.station = station;
+        this.height  = height;
+    }
+
+
+    public void storeDependencies(BedHeightEpoch bedHeight) {
+        getPeer(bedHeight);
+    }
+
+
+    public BedHeightEpochValue getPeer(BedHeightEpoch bedHeight) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from BedHeightEpochValue where " +
+                "   bedHeight=:bedHeight and " +
+                "   station=:station and " +
+                "   height=:height");
+
+            query.setParameter("bedHeight", bedHeight);
+            query.setParameter("station", station);
+            query.setParameter("height", height);
+
+            List<BedHeightEpochValue> values = query.list();
+
+            if (values.isEmpty()) {
+                peer = new BedHeightEpochValue(
+                    bedHeight,
+                    station,
+                    height
+                );
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightSingle.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightSingle.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,198 @@
+package de.intevation.flys.importer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.BedHeightSingle;
+import de.intevation.flys.model.BedHeightType;
+import de.intevation.flys.model.ElevationModel;
+import de.intevation.flys.model.Range;
+import de.intevation.flys.model.River;
+
+
+public class ImportBedHeightSingle implements ImportBedHeight
+{
+    private static Logger log = Logger.getLogger(ImportBedHeightSingle.class);
+
+    protected Integer year;
+    protected int soundingWidth;
+
+    protected String evaluationBy;
+    protected String description;
+
+    protected ImportRange          range;
+    protected ImportBedHeightType  type;
+    protected ImportLocationSystem locationSystem;
+    protected ImportElevationModel curElevationModel;
+    protected ImportElevationModel oldElevationModel;
+
+    protected List<ImportBedHeightSingleValue> values;
+
+    protected BedHeightSingle peer;
+
+
+    public ImportBedHeightSingle(String description) {
+        this.description = description;
+        this.values      = new ArrayList<ImportBedHeightSingleValue>();
+    }
+
+
+    public String getDescription() {
+        return description;
+    }
+
+    public int getValueCount() {
+        return values.size();
+    }
+
+
+    public void setYear(int year) {
+        this.year = year;
+    }
+
+    public void setTimeInterval(ImportTimeInterval timeInterval) {
+        // do nothing
+    }
+
+    public void setSoundingWidth(int soundingWidth) {
+        this.soundingWidth = soundingWidth;
+    }
+
+    public void setEvaluationBy(String evaluationBy) {
+        this.evaluationBy = evaluationBy;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public void setRange(ImportRange range) {
+        this.range = range;
+    }
+
+    public void setType(ImportBedHeightType type) {
+        this.type = type;
+    }
+
+    public void setLocationSystem(ImportLocationSystem locationSystem) {
+        this.locationSystem = locationSystem;
+    }
+
+    public void setCurElevationModel(ImportElevationModel curElevationModel) {
+        this.curElevationModel = curElevationModel;
+    }
+
+    public void setOldElevationModel(ImportElevationModel oldElevationModel) {
+        this.oldElevationModel = oldElevationModel;
+    }
+
+    @Override
+    public void addValue(ImportBedHeightValue value) {
+        values.add((ImportBedHeightSingleValue) value);
+    }
+
+    @Override
+    public void storeDependencies(River river) {
+        log.info("Store dependencies for single: '" + getDescription() + "'");
+
+        if (type != null) {
+            type.storeDependencies();
+        }
+
+        if (locationSystem != null) {
+            locationSystem.storeDependencies();
+        }
+
+        if (curElevationModel != null) {
+            curElevationModel.storeDependencies();
+        }
+
+        if (oldElevationModel != null) {
+            oldElevationModel.storeDependencies();
+        }
+
+        BedHeightSingle peer = getPeer(river);
+
+        if (peer != null) {
+            for (ImportBedHeightSingleValue value: values) {
+                value.storeDependencies(peer);
+            }
+        }
+
+        Session session = ImporterSession.getInstance().getDatabaseSession();
+        session.flush();
+    }
+
+    @Override
+    public BedHeightSingle getPeer(River river) {
+        if (peer == null) {
+            BedHeightType  theType     = type != null ? type.getPeer() : null;
+            ElevationModel theCurModel = curElevationModel.getPeer();
+            Range          theRange    = range != null ? range.getPeer(river) : null;
+
+            if (theType == null) {
+                log.warn("BHS: No bed height type given. Skip file '" + 
+			 description + "'");
+                return null;
+            }
+
+            if (theCurModel == null) {
+                log.warn("BHS: No elevation model given. Skip file '" + 
+			 description + "'");
+                return null;
+            }
+
+            if (theRange == null) {
+                log.warn("BHS: No km-range given: '" + 
+			 description + "'");
+            }
+
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from BedHeightSingle where " +
+                "river=:river and year=:year and soundingWidth=:soundingWidth " +
+                "and type=:type and locationSystem=:locationSystem and " +
+                "curElevationModel=:curElevationModel and range=:range");
+
+            query.setParameter("river", river);
+            query.setParameter("year", year);
+            query.setParameter("soundingWidth", soundingWidth);
+            query.setParameter("type", theType);
+            query.setParameter("locationSystem", locationSystem.getPeer());
+            query.setParameter("curElevationModel", theCurModel);
+            query.setParameter("range", range.getPeer(river));
+
+            List<BedHeightSingle> bedHeights = query.list();
+            if (bedHeights.isEmpty()) {
+                log.info("Create new BedHeightSingle DB instance.");
+
+                peer = new BedHeightSingle(
+                    river,
+                    year,
+                    soundingWidth,
+                    theType,
+                    locationSystem.getPeer(),
+                    theCurModel,
+                    oldElevationModel != null ? oldElevationModel.getPeer() : null,
+                    range.getPeer(river),
+                    evaluationBy,
+                    description
+                );
+
+                session.save(peer);
+            }
+            else {
+                peer = bedHeights.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightSingleValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightSingleValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,105 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import java.math.BigDecimal;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.BedHeightSingle;
+import de.intevation.flys.model.BedHeightSingleValue;
+
+
+public class ImportBedHeightSingleValue implements ImportBedHeightValue {
+
+    private static final Logger log =
+        Logger.getLogger(ImportBedHeightSingleValue.class);
+
+
+    protected ImportBedHeightSingle bedHeight;
+
+    protected BigDecimal station;
+    protected BigDecimal height;
+    protected BigDecimal uncertainty;
+    protected BigDecimal dataGap;
+    protected BigDecimal soundingWidth;
+    protected BigDecimal width;
+
+    protected BedHeightSingleValue peer;
+
+
+    public ImportBedHeightSingleValue(
+        ImportBedHeightSingle bedHeight,
+        BigDecimal station,
+        BigDecimal height,
+        BigDecimal uncertainty,
+        BigDecimal dataGap,
+        BigDecimal soundingWidth,
+        BigDecimal width
+    ) {
+        this.bedHeight     = bedHeight;
+        this.station       = station;
+        this.height        = height;
+        this.uncertainty   = uncertainty;
+        this.dataGap       = dataGap;
+        this.soundingWidth = soundingWidth;
+        this.width         = width;
+    }
+
+
+    public void storeDependencies(BedHeightSingle bedHeight) {
+        getPeer(bedHeight);
+    }
+
+
+    /**
+     * Add this value to database or return database bound Value, assuring
+     * that the BedHeightSingle exists in db already.
+     */
+    public BedHeightSingleValue getPeer(BedHeightSingle bedHeight) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from BedHeightSingleValue where " +
+                "   bedHeight=:bedHeight and " +
+                "   station=:station and " +
+                "   height=:height and " +
+                "   uncertainty=:uncertainty and " +
+                "   dataGap=:dataGap and " +
+                "   soundingWidth=:soundingWidth and " +
+                "   width=:width");
+
+            query.setParameter("bedHeight", bedHeight);
+            query.setParameter("station", station);
+            query.setParameter("height", height);
+            query.setParameter("uncertainty", uncertainty);
+            query.setParameter("dataGap", dataGap);
+            query.setParameter("soundingWidth", soundingWidth);
+            query.setParameter("width", width);
+
+            List<BedHeightSingleValue> values = query.list();
+            if (values.isEmpty()) {
+                peer = new BedHeightSingleValue(
+                    bedHeight,
+                    station,
+                    height,
+                    uncertainty,
+                    dataGap,
+                    soundingWidth,
+                    width
+                );
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightType.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightType.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,61 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.BedHeightType;
+
+
+public class ImportBedHeightType {
+
+    private static final Logger log =
+        Logger.getLogger(ImportBedHeightType.class);
+
+    protected String name;
+
+    protected BedHeightType peer;
+
+    public ImportBedHeightType(BedHeightType peer)  {
+        this.peer = peer;
+        name = peer.getName();
+    }
+
+
+    public ImportBedHeightType(String name) {
+        this.name        = name;
+    }
+
+
+    public void storeDependencies() {
+        getPeer();
+    }
+
+
+    public BedHeightType getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from BedHeightType where name=:name and description=:description");
+
+            query.setParameter("name", name);
+
+            List<BedHeightType> types = query.list();
+
+            if (types.isEmpty()) {
+                peer = new BedHeightType(name);
+                session.save(peer);
+            }
+            else {
+                peer = types.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,7 @@
+package de.intevation.flys.importer;
+
+
+public interface ImportBedHeightValue {
+
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportCrossSection.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportCrossSection.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,120 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.CrossSection;
+import de.intevation.flys.model.TimeInterval;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+/** CrossSection to be imported, holds list of ImportCrossSectionLines. */
+public class ImportCrossSection
+{
+    private static Logger log = Logger.getLogger(ImportRiver.class);
+
+    protected ImportRiver                  river;
+    protected String                       description;
+    protected ImportTimeInterval           timeInterval;
+    protected List<ImportCrossSectionLine> lines;
+
+    protected CrossSection peer;
+
+    public ImportCrossSection() {
+    }
+
+    public ImportCrossSection(
+        ImportRiver                  river,
+        String                       description,
+        ImportTimeInterval           timeInterval,
+        List<ImportCrossSectionLine> lines
+    ) {
+        this.river        = river;
+        this.description  = description;
+        this.timeInterval = timeInterval;
+        this.lines        = lines;
+        wireWithLines();
+    }
+
+    public void wireWithLines() {
+        for (ImportCrossSectionLine line: lines) {
+            line.setCrossSection(this);
+        }
+    }
+
+    public ImportRiver getRiver() {
+        return river;
+    }
+
+    public void setRiver(ImportRiver river) {
+        this.river = river;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public ImportTimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(ImportTimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    public void storeDependencies() {
+
+        log.info("store cross section '" + description + "'");
+
+        getPeer();
+
+        int i = 1, N = lines.size();
+
+        for (ImportCrossSectionLine line: lines) {
+            line.storeDependencies();
+            log.info("  stored " + i + " lines. remaining: " + (N-i));
+            ++i;
+        }
+    }
+
+    public CrossSection getPeer() {
+
+        if (peer == null) {
+            River r = river.getPeer();
+            TimeInterval t = timeInterval != null
+                ? timeInterval.getPeer()
+                : null;
+
+            Session session =
+                ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from CrossSection where " +
+                "river=:r and "            +
+                "timeInterval=:t and "     +
+                "description=:d");
+
+            query.setParameter("r", r);
+            query.setParameter("t", t);
+            query.setParameter("d", description);
+
+            List<CrossSection> crossSections = query.list();
+            if (crossSections.isEmpty()) {
+                peer = new CrossSection(r, t, description);
+                session.save(peer);
+            }
+            else {
+                peer = crossSections.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportCrossSectionLine.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportCrossSectionLine.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,127 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.CrossSection;
+import de.intevation.flys.model.CrossSectionPoint;
+import de.intevation.flys.model.CrossSectionLine;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * A CrossSectionLine (containing points) ready to be transformed into a mapped
+ * object and written to db (used in importer).
+ */
+public class ImportCrossSectionLine
+{
+    public static final Comparator<CrossSectionPoint> INDEX_CMP =
+        new Comparator<CrossSectionPoint>() {
+            public int compare(CrossSectionPoint a, CrossSectionPoint b) {
+                return a.getColPos().compareTo(b.getColPos());
+            }
+        };
+
+    protected Double km;
+    protected ImportCrossSection crossSection;
+    protected List<XY> points;
+
+    protected CrossSectionLine peer;
+
+    public ImportCrossSectionLine() {
+    }
+
+    public ImportCrossSectionLine(Double km, List<XY> points) {
+        this.km     = km;
+        this.points = points;
+    }
+
+    public ImportCrossSection getCrossSection() {
+        return crossSection;
+    }
+
+    public void setCrossSection(ImportCrossSection crossSection) {
+        this.crossSection = crossSection;
+    }
+
+    public Double getKm() {
+        return km;
+    }
+
+    public void setKm(Double km) {
+        this.km = km;
+    }
+
+    public void storeDependencies() {
+        storePoints();
+    }
+
+
+    /** Write a line and its points. */
+    protected void storePoints() {
+        CrossSectionLine csl = getPeer();
+
+        Map<CrossSectionPoint, CrossSectionPoint> map =
+            new TreeMap<CrossSectionPoint, CrossSectionPoint>(INDEX_CMP);
+
+        // Build index for faster (index) collision lookup.
+        List<CrossSectionPoint> ps = csl.getPoints();
+        if (ps != null) {
+            for (CrossSectionPoint point: ps) {
+                map.put(point, point);
+            }
+        }
+
+        Session session =
+            ImporterSession.getInstance().getDatabaseSession();
+
+        CrossSectionPoint key = new CrossSectionPoint();
+
+        // Somehow it looks as if even with the map it is still possible that
+        // multiple points with same id enter hibernate (and then violate a
+        // constraint). -> TODO
+        for (XY xy: points) {
+            key.setColPos(xy.getIndex());
+            CrossSectionPoint csp = map.get(key);
+            if (csp == null) { // create new
+                csp = new CrossSectionPoint(
+                    csl, key.getColPos(),
+                    Double.valueOf(xy.getX()),
+                    Double.valueOf(xy.getY()));
+            }
+            else { // update old
+                csp.setX(Double.valueOf(xy.getX()));
+                csp.setY(Double.valueOf(xy.getY()));
+            }
+            session.save(csp);
+        }
+    }
+
+    public CrossSectionLine getPeer() {
+        if (peer == null) {
+            CrossSection cs = crossSection.getPeer();
+
+            Session session =
+                ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from CrossSectionLine where crossSection=:cs and km=:km");
+            query.setParameter("cs", cs);
+            query.setParameter("km", km);
+
+            List<CrossSectionLine> lines = query.list();
+            if (lines.isEmpty()) {
+                peer = new CrossSectionLine(cs, km);
+                session.save(peer);
+            }
+            else {
+                peer = lines.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportDepth.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportDepth.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,70 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.Depth;
+
+
+public class ImportDepth {
+
+    private static Logger log = Logger.getLogger(ImportDepth.class);
+
+
+    protected Depth peer;
+
+    protected BigDecimal lower;
+    protected BigDecimal upper;
+
+
+    public ImportDepth(BigDecimal lower, BigDecimal upper) {
+        this.lower = lower;
+        this.upper = upper;
+    }
+
+
+    public void storeDependencies() {
+        log.info("store dependencies");
+
+        getPeer();
+    }
+
+
+    public Depth getPeer() {
+        log.info("get peer");
+
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from Depth where " +
+                "   lower=:lower and " +
+                "   upper=:upper");
+
+            query.setParameter("lower", lower);
+            query.setParameter("upper", upper);
+
+            List<Depth> depths = query.list();
+
+            if (depths.isEmpty()) {
+                log.debug("Create new Depth DB instance.");
+
+                peer = new Depth(lower, upper);
+
+                session.save(peer);
+            }
+            else {
+                peer = depths.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportDischargeTable.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportDischargeTable.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,116 @@
+package de.intevation.flys.importer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.DischargeTable;
+import de.intevation.flys.model.Gauge;
+import de.intevation.flys.model.TimeInterval;
+
+import org.apache.log4j.Logger;
+
+public class ImportDischargeTable
+{
+    private static Logger log = Logger.getLogger(ImportDischargeTable.class);
+
+    protected DischargeTable peer;
+
+    protected String         description;
+
+    protected Integer        kind;
+
+    protected List<ImportDischargeTableValue> dischargeTableValues;
+
+    protected ImportTimeInterval timeInterval;
+
+    public ImportDischargeTable() {
+        this(0, null);
+    }
+
+    public ImportDischargeTable(int kind, String description) {
+        this.kind            = kind;
+        this.description     = description;
+        dischargeTableValues = new ArrayList<ImportDischargeTableValue>();
+    }
+
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+
+    public void addDischargeTableValue(ImportDischargeTableValue value) {
+        dischargeTableValues.add(value);
+    }
+
+
+    public void setDischargeTableValues(List<ImportDischargeTableValue> values){
+        this.dischargeTableValues = values;
+    }
+
+
+    public List<ImportDischargeTableValue> getDischargeTableValues() {
+        return dischargeTableValues;
+    }
+
+    public ImportTimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(ImportTimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+
+    public DischargeTable getPeer(Gauge gauge) {
+        if (peer == null) {
+            TimeInterval ti = timeInterval != null
+                ? timeInterval.getPeer()
+                : null;
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from DischargeTable where " +
+                "gauge.id=:gauge and kind=:kind and " +
+                "description=:description and timeInterval=:interval");
+            query.setParameter("gauge",       gauge.getId());
+            query.setParameter("description", description);
+            query.setParameter("kind",        kind);
+            query.setParameter("interval",    ti);
+
+            List<DischargeTable> dischargeTables = query.list();
+            if (dischargeTables.isEmpty()) {
+                peer = new DischargeTable(gauge, description, null, kind, ti);
+                session.save(peer);
+            }
+            else {
+                peer = dischargeTables.get(0);
+            }
+        }
+
+        return peer;
+    }
+
+
+    public void storeDependencies(Gauge gauge) {
+        log.info("store discharge table '" + description + "'");
+        storeDischargeTableValues(gauge);
+    }
+
+
+    public void storeDischargeTableValues(Gauge gauge) {
+        DischargeTable dischargeTable = getPeer(gauge);
+
+        for (ImportDischargeTableValue value: dischargeTableValues) {
+            value.getPeer(dischargeTable);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportDischargeTableValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportDischargeTableValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,34 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+
+import de.intevation.flys.model.DischargeTable;
+import de.intevation.flys.model.DischargeTableValue;
+
+
+public class ImportDischargeTableValue
+{
+    private BigDecimal q;
+    private BigDecimal w;
+
+    private DischargeTableValue peer;
+
+    public ImportDischargeTableValue() {
+    }
+
+
+    public ImportDischargeTableValue(BigDecimal q, BigDecimal w) {
+        this.q = q;
+        this.w = w;
+    }
+
+
+    public DischargeTableValue getPeer(DischargeTable dischargeTable) {
+        if (peer == null) {
+            peer = ImporterSession.getInstance()
+                .getDischargeTableValue(dischargeTable, q, w);
+        }
+
+        return peer;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportDischargeZone.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportDischargeZone.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,86 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.DischargeZone;
+import de.intevation.flys.model.River;
+
+
+public class ImportDischargeZone {
+
+    private static final Logger log =
+        Logger.getLogger(ImportDischargeZone.class);
+
+
+    private String gaugeName;
+
+    private BigDecimal value;
+
+    private String lowerDischarge;
+    private String upperDischarge;
+
+    private DischargeZone peer;
+
+
+    public ImportDischargeZone(
+        String     gaugeName,
+        BigDecimal value,
+        String     lowerDischarge,
+        String     upperDischarge
+    ) {
+        this.gaugeName      = gaugeName;
+        this.value          = value;
+        this.lowerDischarge = lowerDischarge;
+        this.upperDischarge = upperDischarge;
+    }
+
+
+    public void storeDependencies(River river) {
+        log.debug("store dependencies");
+
+        getPeer(river);
+    }
+
+
+    public DischargeZone getPeer(River river) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from DischargeZone where " +
+                "   river=:river and " +
+                "   gaugeName=:gaugeName and " +
+                "   value=:value"
+            );
+
+            query.setParameter("river", river);
+            query.setParameter("gaugeName", gaugeName);
+            query.setParameter("value", value);
+
+            List<DischargeZone> zone = query.list();
+
+            if (zone.isEmpty()) {
+                peer = new DischargeZone(
+                    river,
+                    gaugeName,
+                    value,
+                    lowerDischarge,
+                    upperDischarge);
+
+                session.save(peer);
+            }
+            else {
+                peer = zone.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportEdge.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportEdge.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,75 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.Edge;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+import java.math.BigDecimal;
+
+public class ImportEdge
+implements   Comparable<ImportEdge>
+{
+    protected BigDecimal top;
+    protected BigDecimal bottom;
+
+    protected Edge peer;
+
+    public ImportEdge() {
+    }
+
+    public ImportEdge(BigDecimal top, BigDecimal bottom) {
+        this.top    = top;
+        this.bottom = bottom;
+    }
+
+    public BigDecimal getTop() {
+        return top;
+    }
+
+    public void setTop(BigDecimal top) {
+        this.top = top;
+    }
+
+    public BigDecimal getBottom() {
+        return bottom;
+    }
+
+    public void setBottom(BigDecimal bottom) {
+        this.bottom = bottom;
+    }
+
+    private static final int compare(BigDecimal a, BigDecimal b) {
+        if (a == null && b != null) return -1;
+        if (a != null && b == null) return +1;
+        if (a == null && b == null) return  0;
+        return a.compareTo(b);
+    }
+
+    public int compareTo(ImportEdge other) {
+        int cmp = compare(top, other.top);
+        return cmp != 0 ? cmp : compare(bottom, other.bottom);
+    }
+
+    public Edge getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from Edge where top=:top and bottom=:bottom");
+            query.setParameter("top", top);
+            query.setParameter("bottom", bottom);
+            List<Edge> edges = query.list();
+            if (edges.isEmpty()) {
+                peer = new Edge(top, bottom);
+                session.save(peer);
+            }
+            else {
+                peer = edges.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportElevationModel.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportElevationModel.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,64 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.ElevationModel;
+
+
+public class ImportElevationModel {
+
+    private static final Logger log =
+        Logger.getLogger(ImportElevationModel.class);
+
+    protected String name;
+
+    protected ImportUnit unit;
+
+    protected ElevationModel peer;
+
+
+    public ImportElevationModel(String name, ImportUnit unit) {
+        this.name = name;
+        this.unit = unit;
+    }
+
+
+    public void storeDependencies() {
+        ElevationModel model = getPeer();
+    }
+
+    public ElevationModel getPeer() {
+        if (unit == null) {
+            log.warn("No elevation model specified.");
+            return null;
+        }
+
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from ElevationModel where " +
+                "name=:name and unit=:unit");
+            query.setParameter("name", name);
+            query.setParameter("unit", unit.getPeer());
+            List<ElevationModel> models = query.list();
+
+            if (models.isEmpty()) {
+                log.info("Create new ElevationModel DB instance.");
+
+                peer = new ElevationModel(name, unit.getPeer());
+                session.save(peer);
+            }
+            else {
+                peer = models.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportFlowVelocityMeasurement.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportFlowVelocityMeasurement.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,82 @@
+package de.intevation.flys.importer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.FlowVelocityMeasurement;
+import de.intevation.flys.model.River;
+
+
+public class ImportFlowVelocityMeasurement {
+
+    private static final Logger log = Logger
+        .getLogger(ImportFlowVelocityMeasurement.class);
+
+    private String description;
+
+    private List<ImportFlowVelocityMeasurementValue> values;
+
+    private FlowVelocityMeasurement peer;
+
+    public ImportFlowVelocityMeasurement() {
+        this(null);
+    }
+
+    public ImportFlowVelocityMeasurement(String description) {
+        this.description = description;
+        this.values = new ArrayList<ImportFlowVelocityMeasurementValue>();
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public void addValue(ImportFlowVelocityMeasurementValue value) {
+        this.values.add(value);
+    }
+
+    public void storeDependencies(River river) {
+        log.debug("store dependencies");
+
+        FlowVelocityMeasurement peer = getPeer(river);
+
+        if (peer != null) {
+            for (ImportFlowVelocityMeasurementValue value : values) {
+                value.storeDependencies(peer);
+            }
+        }
+    }
+
+    public FlowVelocityMeasurement getPeer(River river) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+
+            Query query = session
+                .createQuery("from FlowVelocityMeasurement where "
+                    + "   river=:river and " + "   description=:description");
+
+            query.setParameter("river", river);
+            query.setParameter("description", description);
+
+            List<FlowVelocityMeasurement> measurement = query.list();
+
+            if (measurement.isEmpty()) {
+                peer = new FlowVelocityMeasurement(river, description);
+
+                session.save(peer);
+            }
+            else {
+                peer = measurement.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportFlowVelocityMeasurementValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportFlowVelocityMeasurementValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,97 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+
+import java.util.Date;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.FlowVelocityMeasurement;
+import de.intevation.flys.model.FlowVelocityMeasurementValue;
+
+
+public class ImportFlowVelocityMeasurementValue {
+
+    private static final Logger log =
+        Logger.getLogger(ImportFlowVelocityMeasurementValue.class);
+
+
+    private Date datetime;
+
+    private String description;
+
+    private BigDecimal station;
+    private BigDecimal w;
+    private BigDecimal q;
+    private BigDecimal v;
+
+    private FlowVelocityMeasurementValue peer;
+
+
+    public ImportFlowVelocityMeasurementValue(
+        Date       datetime,
+        BigDecimal station,
+        BigDecimal w,
+        BigDecimal q,
+        BigDecimal v,
+        String     description
+    ) {
+        this.datetime    = datetime;
+        this.station     = station;
+        this.w           = w;
+        this.q           = q;
+        this.v           = v;
+        this.description = description;
+    }
+
+
+
+    public void storeDependencies(FlowVelocityMeasurement measurement) {
+        log.debug("store dependencies");
+
+        getPeer(measurement);
+    }
+
+
+    public FlowVelocityMeasurementValue getPeer(FlowVelocityMeasurement m) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from FlowVelocityMeasurementValue where " +
+                "   measurement=:measurement and " +
+                "   station=:station and " +
+                "   datetime=:datetime"
+            );
+
+            query.setParameter("measurement", m);
+            query.setParameter("station", station);
+            query.setParameter("datetime", datetime);
+
+            List<FlowVelocityMeasurementValue> values = query.list();
+
+            if (values.isEmpty()) {
+                peer = new FlowVelocityMeasurementValue(
+                    m,
+                    datetime,
+                    station,
+                    w,
+                    q,
+                    v,
+                    description);
+
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportFlowVelocityModel.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportFlowVelocityModel.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,109 @@
+package de.intevation.flys.importer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.DischargeZone;
+import de.intevation.flys.model.FlowVelocityModel;
+import de.intevation.flys.model.River;
+
+
+public class ImportFlowVelocityModel {
+
+    private static final Logger log = Logger
+        .getLogger(ImportFlowVelocityModel.class);
+
+    private String description;
+
+    private ImportDischargeZone dischargeZone;
+
+    private List<ImportFlowVelocityModelValue> values;
+
+    private FlowVelocityModel peer;
+
+    public ImportFlowVelocityModel() {
+        values = new ArrayList<ImportFlowVelocityModelValue>();
+    }
+
+    public ImportFlowVelocityModel(String description) {
+        this();
+
+        this.description = description;
+    }
+
+    public ImportFlowVelocityModel(ImportDischargeZone dischargeZone,
+        String description) {
+        this();
+
+        this.dischargeZone = dischargeZone;
+        this.description = description;
+    }
+
+    public void setDischargeZone(ImportDischargeZone dischargeZone) {
+        this.dischargeZone = dischargeZone;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public void addValue(ImportFlowVelocityModelValue value) {
+        this.values.add(value);
+    }
+
+    public void storeDependencies(River river) {
+        log.debug("store dependencies");
+
+        if (dischargeZone == null) {
+            log.warn("skip flow velocity model: No discharge zone specified.");
+            return;
+        }
+
+        dischargeZone.storeDependencies(river);
+
+        FlowVelocityModel peer = getPeer(river);
+
+        if (peer != null) {
+            int i = 0;
+
+            for (ImportFlowVelocityModelValue value : values) {
+                value.storeDependencies(peer);
+                i++;
+            }
+
+            log.info("stored " + i + " flow velocity model values.");
+        }
+    }
+
+    public FlowVelocityModel getPeer(River river) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+
+            DischargeZone zone = dischargeZone.getPeer(river);
+
+            Query query = session.createQuery("from FlowVelocityModel where "
+                + "   dischargeZone=:dischargeZone");
+
+            query.setParameter("dischargeZone", zone);
+
+            List<FlowVelocityModel> model = query.list();
+
+            if (model.isEmpty()) {
+                peer = new FlowVelocityModel(zone, description);
+                session.save(peer);
+            }
+            else {
+                peer = model.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportFlowVelocityModelValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportFlowVelocityModelValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,74 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.FlowVelocityModel;
+import de.intevation.flys.model.FlowVelocityModelValue;
+
+
+public class ImportFlowVelocityModelValue {
+
+    private BigDecimal station;
+    private BigDecimal q;
+    private BigDecimal totalChannel;
+    private BigDecimal mainChannel;
+    private BigDecimal shearStress;
+
+    private FlowVelocityModelValue peer;
+
+
+    public ImportFlowVelocityModelValue(
+        BigDecimal station,
+        BigDecimal q,
+        BigDecimal totalChannel,
+        BigDecimal mainChannel,
+        BigDecimal shearStress
+    ) {
+        this.station      = station;
+        this.q            = q;
+        this.totalChannel = totalChannel;
+        this.mainChannel  = mainChannel;
+        this.shearStress  = shearStress;
+    }
+
+
+    public void storeDependencies(FlowVelocityModel model) {
+        getPeer(model);
+    }
+
+
+    public FlowVelocityModelValue getPeer(FlowVelocityModel model) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from FlowVelocityModelValue where " +
+                "   flowVelocity=:model and " +
+                "   station between :station - 0.00001 and :station + 0.00001"
+            );
+
+            query.setParameter("model", model);
+            query.setParameter("station", station.doubleValue());
+
+            List<FlowVelocityModelValue> values = query.list();
+
+            if (values.isEmpty()) {
+                peer = new FlowVelocityModelValue(
+                    model, station, q, totalChannel, mainChannel, shearStress);
+
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportGauge.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportGauge.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,274 @@
+package de.intevation.flys.importer;
+
+import java.io.File;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import java.math.BigDecimal;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.Gauge;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.parsers.AtFileParser;
+import de.intevation.flys.importer.parsers.StaFileParser;
+
+/** Gauge not in DB. */
+public class ImportGauge
+{
+    private static Logger log = Logger.getLogger(ImportGauge.class);
+
+    public static final String HISTORICAL_DISCHARGE_TABLES =
+        "Histor.Abflusstafeln";
+
+    protected ImportRange range;
+
+    protected File        staFile;
+    protected File        atFile;
+
+    protected String      name;
+    protected BigDecimal  aeo;
+    protected BigDecimal  datum;
+    protected BigDecimal  station;
+    protected Long        officialNumber;
+
+    protected Gauge  peer;
+
+    protected ImportDischargeTable dischargeTable;
+
+    protected List<ImportMainValueType>  mainValueTypes;
+    protected List<ImportNamedMainValue> namedMainValues;
+    protected List<ImportMainValue>      mainValues;
+    protected List<ImportDischargeTable> historicalDischargeTables;
+
+    public ImportGauge() {
+        historicalDischargeTables = new ArrayList<ImportDischargeTable>();
+    }
+
+    public ImportGauge(ImportRange range, File staFile, File atFile) {
+        this();
+        this.range   = range;
+        this.staFile = staFile;
+        this.atFile  = atFile;
+    }
+
+    public void setRange(ImportRange range) {
+        this.range = range;
+    }
+
+    public void setStaFile(File staFile) {
+        this.staFile = staFile;
+    }
+
+    public File getStaFile() {
+        return staFile;
+    }
+
+    public void setAtFile(File atFile) {
+        this.atFile = atFile;
+    }
+
+    public File getAtFile() {
+        return atFile;
+    }
+
+    public BigDecimal getAeo() {
+        return aeo;
+    }
+
+    public void setAeo(BigDecimal aeo) {
+        this.aeo = aeo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public BigDecimal getDatum() {
+        return datum;
+    }
+
+    public void setDatum(BigDecimal datum) {
+        this.datum = datum;
+    }
+
+    public BigDecimal getStation() {
+        return station;
+    }
+
+    public void setStation(BigDecimal station) {
+        this.station = station;
+    }
+
+    public Long getOfficialNumber() {
+        return officialNumber;
+    }
+
+    public void setOfficialNumber(Long officialNumber) {
+        this.officialNumber = officialNumber;
+    }
+
+    public ImportDischargeTable getDischargeTable() {
+        return dischargeTable;
+    }
+
+    public void setDischargeTable(ImportDischargeTable dischargeTable) {
+        this.dischargeTable = dischargeTable;
+    }
+
+    public List<ImportMainValueType> getMainValueTypes() {
+        return mainValueTypes;
+    }
+
+    public void setMainValueTypes(List<ImportMainValueType> mainValueTypes) {
+        this.mainValueTypes = mainValueTypes;
+    }
+
+    public List<ImportNamedMainValue> getNamedMainValues() {
+        return namedMainValues;
+    }
+
+    public void setNamedMainValues(List<ImportNamedMainValue> namedMainValues) {
+        this.namedMainValues = namedMainValues;
+    }
+
+    public List<ImportMainValue> getMainValues() {
+        return mainValues;
+    }
+
+    public void setMainValues(List<ImportMainValue> mainValues) {
+        this.mainValues = mainValues;
+    }
+
+    public void parseDependencies() throws IOException {
+        StaFileParser sfp = new StaFileParser();
+        sfp.parse(this);
+
+        AtFileParser afp = new AtFileParser();
+        setDischargeTable(afp.parse(getAtFile()));
+        parseHistoricalDischargeTables();
+    }
+
+    public void parseHistoricalDischargeTables() throws IOException {
+        if (Config.INSTANCE.skipHistoricalDischargeTables()) {
+            log.info("skip historical discharge tables");
+            return;
+        }
+
+        log.info("parse historical discharge tables");
+
+        File riverDir = atFile.getParentFile().getParentFile();
+
+        File histDischargeDir = FileTools.repair(
+            new File(riverDir, HISTORICAL_DISCHARGE_TABLES));
+
+        if (!histDischargeDir.isDirectory() || !histDischargeDir.canRead()) {
+            log.info("cannot find '" + histDischargeDir + "'");
+            return;
+        }
+
+        histDischargeDir = FileTools.repair(
+            new File(histDischargeDir, getName()));
+
+        if (!histDischargeDir.isDirectory() || !histDischargeDir.canRead()) {
+            log.info("cannot find '" + histDischargeDir + "'");
+            return;
+        }
+
+        File [] files = histDischargeDir.listFiles();
+
+        if (files == null) {
+            log.info("cannot read directory '" + histDischargeDir + "'");
+            return;
+        }
+
+        for (File file: files) {
+            if (!file.isFile() || !file.canRead()) {
+                continue;
+            }
+            String name = file.getName().toLowerCase();
+            if (!name.endsWith(".at")) {
+                continue;
+            }
+            log.info("found at file '" + file.getName() + "'");
+
+            AtFileParser afp = new AtFileParser();
+            historicalDischargeTables.add(
+                afp.parse(file, HISTORICAL_DISCHARGE_TABLES + "/", 1));
+        }
+    }
+
+    public void storeDependencies(River river) {
+
+        Gauge gauge = getPeer(river);
+
+        log.info("store main value types");
+        for (ImportMainValueType mainValueType: mainValueTypes) {
+            mainValueType.getPeer();
+        }
+
+        log.info("store named main values");
+        for (ImportNamedMainValue namedMainValue: namedMainValues) {
+            namedMainValue.getPeer();
+        }
+
+        log.info("store main values");
+        for (ImportMainValue mainValue: mainValues) {
+            mainValue.getPeer(river);
+        }
+
+        storeDischargeTable(gauge);
+        storeHistoricalDischargeTable(gauge);
+    }
+
+    public void storeDischargeTable(Gauge gauge) {
+        log.info("store discharge table");
+        dischargeTable.getPeer(gauge);
+        dischargeTable.storeDependencies(gauge);
+    }
+
+    public void storeHistoricalDischargeTable(Gauge gauge) {
+        log.info("store historical discharge tables");
+        for (ImportDischargeTable hdt: historicalDischargeTables) {
+            hdt.storeDependencies(gauge);
+        }
+    }
+
+    public Gauge getPeer(River river) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from Gauge where name=:name " +
+                "and river.id=:river");
+            query.setString("name", name);
+            query.setParameter("river", river.getId());
+            List<Gauge> gauges = query.list();
+            if (gauges.isEmpty()) {
+                peer = new Gauge(
+                    name, river,
+                    station, aeo, datum,
+                    officialNumber,
+                    range.getPeer(river));
+                session.save(peer);
+            }
+            else {
+                peer = gauges.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportGrainFraction.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportGrainFraction.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,80 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.GrainFraction;
+
+
+public class ImportGrainFraction {
+
+    private static final Logger log =
+        Logger.getLogger(ImportGrainFraction.class);
+
+    private String name;
+
+    private Double lower;
+    private Double upper;
+
+    private GrainFraction peer;
+
+
+    public ImportGrainFraction(String name) {
+        this.name = name;
+    }
+
+
+    public ImportGrainFraction(
+        String     name,
+        Double     lower,
+        Double     upper
+    ) {
+        this.name  = name;
+        this.lower = lower;
+        this.upper = upper;
+    }
+
+
+    public void storeDependencies() {
+        log.debug("store dependencies");
+
+        getPeer();
+    }
+
+
+    public GrainFraction getPeer() {
+        log.debug("get peer");
+
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from GrainFraction where " +
+                "   name=:name and " +
+                "   lower=:lower and " +
+                "   upper=:upper"
+            );
+
+            query.setParameter("name", name);
+            query.setParameter("lower", lower);
+            query.setParameter("upper", upper);
+
+            List<GrainFraction> fractions = query.list();
+            if (fractions.isEmpty()) {
+                log.info("create new GrainFraction");
+
+                peer = new GrainFraction(name, lower, upper);
+                session.save(peer);
+            }
+            else {
+                peer = fractions.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYK.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYK.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,80 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.HYK;
+import de.intevation.flys.model.River;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import org.apache.log4j.Logger;
+
+public class ImportHYK
+{
+    private static Logger log = Logger.getLogger(ImportHYK.class);
+
+    protected ImportRiver river;
+    protected String      description;
+
+    protected List<ImportHYKEntry> entries;
+
+    protected HYK peer;
+
+    public ImportHYK() {
+        entries = new ArrayList<ImportHYKEntry>();
+    }
+
+    public ImportHYK(ImportRiver river, String description) {
+        this();
+        this.river       = river;
+        this.description = description;
+    }
+
+    public ImportRiver getRiver() {
+        return river;
+    }
+
+    public void setRiver(ImportRiver river) {
+        this.river = river;
+    }
+
+    public void addEntry(ImportHYKEntry entry) {
+        entries.add(entry);
+        entry.setHYK(this);
+    }
+
+    public void storeDependencies() {
+        log.info("store HYK '" + description + "'");
+        getPeer();
+        for (int i = 0, N = entries.size(); i < N; ++i) {
+            ImportHYKEntry entry = entries.get(i);
+            log.info("  store km " + entry.getKm() +
+                " (" + (i+1) + " of " + N + ")");
+            entry.storeDependencies();
+        }
+    }
+
+    public HYK getPeer() {
+        if (peer == null) {
+            River r = river.getPeer();
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+            Query query = session.createQuery(
+                "from HYK where river=:river and description=:description");
+            query.setParameter("river", r);
+            query.setParameter("description", description);
+            List<HYK> hyks = query.list();
+            if (hyks.isEmpty()) {
+                peer = new HYK(r, description);
+                session.save(peer);
+            }
+            else {
+                peer = hyks.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYKEntry.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYKEntry.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,93 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.HYKEntry;
+import de.intevation.flys.model.HYK;
+
+import java.util.Date;
+import java.util.List;
+import java.util.ArrayList;
+
+import java.math.BigDecimal;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+public class ImportHYKEntry
+{
+    protected ImportHYK  hyk;
+    protected BigDecimal km;
+    protected Date       measure;
+
+    protected List<ImportHYKFormation> formations;
+
+    protected HYKEntry peer;
+
+    public ImportHYKEntry() {
+        formations = new ArrayList<ImportHYKFormation>();
+    }
+
+    public ImportHYKEntry(
+        ImportHYK  hyk,
+        BigDecimal km,
+        Date       measure
+    ) {
+        this();
+        this.hyk     = hyk;
+        this.km      = km;
+        this.measure = measure;
+    }
+
+    public ImportHYK getHYK() {
+        return hyk;
+    }
+
+    public void setHYK(ImportHYK hyk) {
+        this.hyk = hyk;
+    }
+
+    public BigDecimal getKm() {
+        return km;
+    }
+
+    public void setKm(BigDecimal km) {
+        this.km = km;
+    }
+
+    public void addFormation(ImportHYKFormation formation) {
+        int numFormation = formations.size();
+        formations.add(formation);
+        formation.setFormationNum(numFormation);
+        formation.setEntry(this);
+    }
+
+    public void storeDependencies() {
+        getPeer();
+        for (ImportHYKFormation formation: formations) {
+            formation.storeDependencies();
+        }
+    }
+
+    public HYKEntry getPeer() {
+        if (peer == null) {
+            HYK h = hyk.getPeer();
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+            Query query = session.createQuery(
+                "from HYKEntry where HYK=:hyk " +
+                "and km=:km and measure=:measure");
+            query.setParameter("hyk", h);
+            query.setParameter("km", km);
+            query.setParameter("measure", measure);
+            List<HYKEntry> entries = query.list();
+            if (entries.isEmpty()) {
+                peer = new HYKEntry(h, km, measure);
+                session.save(peer);
+            }
+            else {
+                peer = entries.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYKFlowZone.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYKFlowZone.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,76 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.HYKFormation;
+import de.intevation.flys.model.HYKFlowZone;
+import de.intevation.flys.model.HYKFlowZoneType;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+import java.math.BigDecimal;
+
+public class ImportHYKFlowZone
+{
+    protected ImportHYKFormation    formation;
+    protected ImportHYKFlowZoneType type;
+    protected BigDecimal            a;
+    protected BigDecimal            b;
+
+    protected HYKFlowZone peer;
+
+    public ImportHYKFlowZone() {
+    }
+
+    public ImportHYKFlowZone(
+        ImportHYKFormation    formation,
+        ImportHYKFlowZoneType type,
+        BigDecimal            a,
+        BigDecimal            b
+    ) {
+        this.formation = formation;
+        this.type      = type;
+        this.a         = a;
+        this.b         = b;
+    }
+
+    public ImportHYKFormation getFormation() {
+        return formation;
+    }
+
+    public void setFormation(ImportHYKFormation formation) {
+        this.formation = formation;
+    }
+
+    public void storeDependencies() {
+        getPeer();
+    }
+
+    public HYKFlowZone getPeer() {
+        if (peer == null) {
+            HYKFormation    f = formation.getPeer();
+            HYKFlowZoneType t = type.getPeer();
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+            Query query = session.createQuery(
+                "from HYKFlowZone where formation=:formation " +
+                "and type=:type and a=:a and b=:b");
+            query.setParameter("formation", f);
+            query.setParameter("type", t);
+            query.setParameter("a", a);
+            query.setParameter("b", b);
+            List<HYKFlowZone> zones = query.list();
+            if (zones.isEmpty()) {
+                peer = new HYKFlowZone(f, t, a, b);
+                session.save(peer);
+            }
+            else {
+                peer = zones.get(0);
+            }
+
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYKFlowZoneType.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYKFlowZoneType.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,41 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.HYKFlowZoneType;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+public class ImportHYKFlowZoneType
+{
+    private String          name;
+    private HYKFlowZoneType peer;
+
+    public ImportHYKFlowZoneType() {
+    }
+
+    public ImportHYKFlowZoneType(String name) {
+        this.name = name;
+    }
+
+    public HYKFlowZoneType getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+            Query query = session.createQuery(
+                "from HYKFlowZoneType where name=:name");
+            query.setParameter("name", name);
+            List<HYKFlowZoneType> flowZoneTypes = query.list();
+            if (flowZoneTypes.isEmpty()) {
+                peer = new HYKFlowZoneType(name);
+                session.save(peer);
+            }
+            else {
+                peer = flowZoneTypes.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYKFormation.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportHYKFormation.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,150 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.HYKFormation;
+import de.intevation.flys.model.HYKEntry;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.math.BigDecimal;
+
+public class ImportHYKFormation
+{
+    protected int            formationNum;
+    protected ImportHYKEntry entry;
+    protected BigDecimal     top;
+    protected BigDecimal     bottom;
+    protected BigDecimal     distanceVL;
+    protected BigDecimal     distanceHF;
+    protected BigDecimal     distanceVR;
+
+    protected List<ImportHYKFlowZone> zones;
+
+    protected HYKFormation peer;
+
+    public ImportHYKFormation() {
+        zones = new ArrayList<ImportHYKFlowZone>();
+    }
+
+    public ImportHYKFormation(
+        int            formationNum,
+        ImportHYKEntry entry,
+        BigDecimal     top,
+        BigDecimal     bottom,
+        BigDecimal     distanceVL,
+        BigDecimal     distanceHF,
+        BigDecimal     distanceVR
+    ) {
+        this();
+        this.formationNum = formationNum;
+        this.entry        = entry;
+        this.top          = top;
+        this.bottom       = bottom;
+        this.distanceVL   = distanceVL;
+        this.distanceHF   = distanceHF;
+        this.distanceVR   = distanceVR;
+    }
+
+    public void addFlowZone(ImportHYKFlowZone zone) {
+        zones.add(zone);
+        zone.setFormation(this);
+    }
+
+    public int getFormationNum() {
+        return formationNum;
+    }
+
+    public void setFormationNum(int formationNum) {
+        this.formationNum = formationNum;
+    }
+
+    public ImportHYKEntry getEntry() {
+        return entry;
+    }
+
+    public void setEntry(ImportHYKEntry entry) {
+        this.entry = entry;
+    }
+
+    public BigDecimal getTop() {
+        return top;
+    }
+
+    public void setTop(BigDecimal top) {
+        this.top = top;
+    }
+
+    public BigDecimal getBottom() {
+        return bottom;
+    }
+
+    public void setBottom(BigDecimal bottom) {
+        this.bottom = bottom;
+    }
+
+    public BigDecimal getDistanceVL() {
+        return distanceVL;
+    }
+
+    public void setDistanceVL(BigDecimal distanceVL) {
+        this.distanceVL = distanceVL;
+    }
+
+    public BigDecimal getDistanceHF() {
+        return distanceHF;
+    }
+
+    public void setDistanceHF(BigDecimal distanceHF) {
+        this.distanceHF = distanceHF;
+    }
+
+    public BigDecimal getDistanceVR() {
+        return distanceVR;
+    }
+
+    public void setDistanceVR(BigDecimal distanceVR) {
+        this.distanceVR = distanceVR;
+    }
+
+    public void storeDependencies() {
+        getPeer();
+        for (ImportHYKFlowZone zone: zones) {
+            zone.storeDependencies();
+        }
+    }
+
+    public HYKFormation getPeer() {
+        if (peer == null) {
+            HYKEntry e = entry.getPeer();
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+            Query query = session.createQuery(
+                "from HYKFormation where formationNum=:formationNum " +
+                "and entry=:entry and top=:top and bottom=:bottom " +
+                "and distanceVL=:distanceVL and distanceHF=:distanceHF " +
+                "and distanceVR=:distanceVR");
+            query.setParameter("formationNum", formationNum);
+            query.setParameter("entry", e);
+            query.setParameter("top", top);
+            query.setParameter("bottom", bottom);
+            query.setParameter("distanceVL", distanceVL);
+            query.setParameter("distanceHF", distanceHF);
+            query.setParameter("distanceVR", distanceVR);
+            List<HYKFormation> formations = query.list();
+            if (formations.isEmpty()) {
+                peer = new HYKFormation(
+                    formationNum, e, top, bottom,
+                    distanceVL, distanceHF, distanceVR);
+                session.save(peer);
+            }
+            else {
+                peer = formations.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportLocationSystem.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportLocationSystem.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,60 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.LocationSystem;
+
+
+public class ImportLocationSystem {
+
+    private static final Logger log =
+        Logger.getLogger(ImportLocationSystem.class);
+
+
+    protected String name;
+    protected String description;
+
+    protected LocationSystem peer;
+
+
+    public ImportLocationSystem(String name, String description) {
+        this.name        = name;
+        this.description = description;
+    }
+
+    public void storeDependencies() {
+        log.info("store LocationSystem '" + name + "'");
+        LocationSystem ls = getPeer();
+
+        Session session = ImporterSession.getInstance().getDatabaseSession();
+        session.flush();
+    }
+
+    public LocationSystem getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from LocationSystem where " +
+                "name=:name and description=:description");
+            query.setParameter("name", name);
+            query.setParameter("description", description);
+
+            List<LocationSystem> lss = query.list();
+            if (lss.isEmpty()) {
+                peer = new LocationSystem(name, description);
+                session.save(peer);
+            }
+            else {
+                peer = lss.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportMainValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportMainValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,92 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import java.math.BigDecimal;
+
+import de.intevation.flys.model.MainValue;
+import de.intevation.flys.model.Gauge;
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.NamedMainValue;
+import de.intevation.flys.model.TimeInterval;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+public class ImportMainValue
+{
+    protected ImportGauge          gauge;
+    protected ImportNamedMainValue mainValue;
+    protected BigDecimal           value;
+    protected ImportTimeInterval   timeInterval;
+
+    protected MainValue peer;
+
+    public ImportMainValue() {
+    }
+
+    public ImportMainValue(
+        ImportGauge          gauge,
+        ImportNamedMainValue mainValue,
+        BigDecimal           value,
+        ImportTimeInterval   timeInterval
+    ) {
+        this.gauge        = gauge;
+        this.mainValue    = mainValue;
+        this.value        = value;
+        this.timeInterval = timeInterval;
+    }
+
+    public ImportGauge getGauge() {
+        return gauge;
+    }
+
+    public void setGauge(ImportGauge gauge) {
+        this.gauge = gauge;
+    }
+
+    public ImportNamedMainValue getMainValue() {
+        return mainValue;
+    }
+
+    public void setMainValue(ImportNamedMainValue mainValue) {
+        this.mainValue = mainValue;
+    }
+
+    public BigDecimal getValue() {
+        return value;
+    }
+
+    public void setValue(BigDecimal value) {
+        this.value = value;
+    }
+
+    public MainValue getPeer(River river) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery("from MainValue where "
+                + "gauge.id=:gauge_id and mainValue.id=:name_id "
+                + "and timeInterval = :time "
+                + "and value=:value");
+            Gauge          g = gauge.getPeer(river);
+            NamedMainValue n = mainValue.getPeer();
+            TimeInterval   t = timeInterval != null
+                ? timeInterval.getPeer()
+                : null;
+            query.setParameter("gauge_id", g.getId());
+            query.setParameter("name_id",  n.getId());
+            query.setParameter("value",    value);
+            query.setParameter("time",     t);
+            List<MainValue> values = query.list();
+            if (values.isEmpty()) {
+                peer = new MainValue(g, n, value, null);
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportMainValueType.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportMainValueType.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,65 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.MainValueType;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+public class ImportMainValueType
+implements   Comparable<ImportMainValueType>
+{
+    protected String name;
+
+    protected MainValueType peer;
+
+    public ImportMainValueType() {
+    }
+
+    public ImportMainValueType(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int compareTo(ImportMainValueType other) {
+        return name.compareTo(other.name);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (other == this) return true;
+        if (!(other instanceof ImportMainValueType)) return false;
+        return name.equals(((ImportMainValueType)other).name);
+    }
+
+    @Override
+    public int hashCode() {
+        return name.hashCode();
+    }
+
+    public MainValueType getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery("from MainValueType where name=:name");
+            query.setString("name", name);
+            List<MainValueType> values = query.list();
+            if (values.isEmpty()) {
+                peer = new MainValueType(name);
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportMeasurementStation.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportMeasurementStation.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,113 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.hibernate.Session;
+
+import de.intevation.flys.model.Gauge;
+import de.intevation.flys.model.MeasurementStation;
+import de.intevation.flys.model.Range;
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.TimeInterval;
+
+
+public class ImportMeasurementStation {
+
+    private static final Logger log = Logger
+        .getLogger(ImportMeasurementStation.class);
+
+    private MeasurementStation peer;
+
+    public String name;
+    public Double station;
+    public ImportRange range;
+    public String measurementType;
+    public String riverside;
+    public String gauge;
+    public ImportTimeInterval observationTimerange;
+    public String operator;
+    public String description;
+
+    public ImportMeasurementStation() {
+    }
+
+    private Gauge getGaugeFromDB() {
+        Session session = ImporterSession.getInstance().getDatabaseSession();
+
+        org.hibernate.Query query = session
+            .createQuery("FROM Gauge WHERE name=:name");
+
+        query.setParameter("name", gauge);
+        List<Gauge> gauges = query.list();
+
+        return gauges.isEmpty() ? null : gauges.get(0);
+    }
+
+    public boolean storeDependencies(River river) {
+        getPeer(river);
+
+        return peer != null;
+    }
+
+    public Object getPeer(River river) {
+        if (peer == null) {
+            Gauge gauge = null;
+            try {
+                gauge = getGaugeFromDB();
+                if (gauge == null) {
+                    log.warn("No gauge found for measurement station '" + name
+                        + "'");
+                }
+            }
+            catch (Exception e) {
+                log.error("Exception: " + e.getMessage());
+            }
+
+            Range range = null;
+
+            if (this.range != null) {
+                range = this.range.getPeer(river);
+            }
+
+            if (range == null) {
+                log.warn("No range found for measurement station '" + name + "'");
+            }
+
+            TimeInterval observationTimerange = this.observationTimerange
+                .getPeer();
+            if (observationTimerange == null) {
+                log.warn("No time range found for measurement station '"
+                    + name + "'");
+            }
+
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+
+            org.hibernate.Query query = session
+                .createQuery(
+                    "FROM MeasurementStation " +
+                    "WHERE river=:river" +
+                    "   AND station=:station " +
+                    "   AND measurement_type=:measurement_type ");
+
+            query.setParameter("river", river);
+            query.setParameter("station", station);
+            query.setParameter("measurement_type", measurementType);
+
+            List<MeasurementStation> stations = query.list();
+
+            if (stations.isEmpty()) {
+                log.info("create new measurement station '" + name + "'");
+
+                peer = new MeasurementStation(river, name, measurementType,
+                    riverside, station, range, gauge, this.gauge,
+                    observationTimerange, operator, description);
+
+                session.save(peer);
+            }
+        }
+
+        return peer;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportMorphWidth.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportMorphWidth.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,81 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.MorphologicalWidth;
+import de.intevation.flys.model.River;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+
+public class ImportMorphWidth {
+
+    private static Logger log = Logger.getLogger(ImportMorphWidth.class);
+
+    protected MorphologicalWidth peer;
+
+    protected ImportUnit unit;
+
+    protected List<ImportMorphWidthValue> values;
+
+    public ImportMorphWidth() {
+        this.values = new ArrayList<ImportMorphWidthValue>();
+    }
+
+    public void addValue(ImportMorphWidthValue value) {
+        this.values.add(value);
+    }
+
+    public void setUnit(ImportUnit unit) {
+        this.unit = unit;
+    }
+
+    public void storeDependencies(River river) {
+        log.info("store dependencies");
+
+        MorphologicalWidth peer = getPeer(river);
+
+        if (peer != null) {
+            log.info("store morphological width values");
+
+            for (ImportMorphWidthValue value : values) {
+                value.storeDependencies(peer);
+            }
+        }
+    }
+
+    public MorphologicalWidth getPeer(River river) {
+        log.info("get peer");
+
+        if (peer == null) {
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+
+            Query query = session.createQuery("from MorphologicalWidth where "
+                + "   river=:river and " + "   unit=:unit");
+
+            query.setParameter("river", river);
+            query.setParameter("unit", unit.getPeer());
+
+            List<MorphologicalWidth> widths = query.list();
+
+            if (widths.isEmpty()) {
+                log.debug("Create new MorphologicalWidth DB instance.");
+
+                peer = new MorphologicalWidth(river, unit.getPeer());
+
+                session.save(peer);
+            }
+            else {
+                peer = widths.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportMorphWidthValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportMorphWidthValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,81 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.MorphologicalWidth;
+import de.intevation.flys.model.MorphologicalWidthValue;
+
+
+public class ImportMorphWidthValue {
+
+    private static Logger log = Logger.getLogger(ImportMorphWidthValue.class);
+
+
+    protected MorphologicalWidthValue peer;
+
+    protected BigDecimal station;
+    protected BigDecimal width;
+
+    protected String description;
+
+
+    public ImportMorphWidthValue(
+        BigDecimal station,
+        BigDecimal width,
+        String     description
+    ) {
+        this.station     = station;
+        this.width       = width;
+        this.description = description;
+    }
+
+
+    public void storeDependencies(MorphologicalWidth parent) {
+        getPeer(parent);
+    }
+
+
+    public MorphologicalWidthValue getPeer(MorphologicalWidth parent) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from MorphologicalWidthValue where " +
+                "   morphologicalWidth=:morphologicalWidth and " +
+                "   station=:station and " +
+                "   width=:width and " +
+                "   description=:description");
+
+            query.setParameter("morphologicalWidth", parent);
+            query.setParameter("station", station);
+            query.setParameter("width", width);
+            query.setParameter("description", description);
+
+            List<MorphologicalWidthValue> values = query.list();
+
+            if (values.isEmpty()) {
+                peer = new MorphologicalWidthValue(
+                    parent,
+                    station,
+                    width,
+                    description
+                );
+
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportNamedMainValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportNamedMainValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,66 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import de.intevation.flys.model.NamedMainValue;
+import de.intevation.flys.model.MainValueType;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+public class ImportNamedMainValue
+{
+    protected ImportMainValueType mainValueType;
+    protected String              name;
+
+    protected NamedMainValue      peer;
+
+    public ImportNamedMainValue() {
+    }
+
+    public ImportNamedMainValue(
+        ImportMainValueType mainValueType,
+        String              name
+    ) {
+        this.mainValueType = mainValueType;
+        this.name          = name;
+    }
+
+    public ImportMainValueType getMainValueType() {
+        return mainValueType;
+    }
+
+    public void setMainValueType(ImportMainValueType mainValueType) {
+        this.mainValueType = mainValueType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public NamedMainValue getPeer() {
+        if (peer == null) {
+            MainValueType type = mainValueType.getPeer();
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from NamedMainValue where " +
+                "name=:name and type.id=:id");
+            query.setString("name", name);
+            query.setParameter("id", type.getId());
+            List<NamedMainValue> named = query.list();
+            if (named.isEmpty()) {
+                peer = new NamedMainValue(name, type);
+                session.save(peer);
+            }
+            else {
+                peer = named.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportPosition.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportPosition.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,54 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.Position;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+public class ImportPosition
+implements   Comparable<ImportPosition>
+{
+    protected String value;
+
+    protected Position peer;
+
+    public ImportPosition() {
+    }
+
+    public ImportPosition(String value) {
+        this.value = value;
+    }
+
+    public int compareTo(ImportPosition other) {
+        return value.compareTo(other.value);
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public Position getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery("from Position where value=:value");
+            query.setString("value", value);
+            List<Position> positions = query.list();
+            if (positions.isEmpty()) {
+                peer = new Position(value);
+                session.save(peer);
+            }
+            else {
+                peer = positions.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportRange.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportRange.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,78 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.Range;
+import de.intevation.flys.model.River;
+
+import java.math.BigDecimal;
+
+import org.apache.log4j.Logger;
+
+/** A range that is about to be imported. */
+public class ImportRange
+implements   Comparable<ImportRange>
+{
+    /** Private logger. */
+    private static Logger log = Logger.getLogger(ImportRange.class);
+
+    protected BigDecimal a;
+    protected BigDecimal b;
+
+    protected Range peer;
+
+    public ImportRange() {
+    }
+
+    public ImportRange(BigDecimal a, BigDecimal b) {
+        this.a = a;
+        this.b = b;
+    }
+
+    private static final int compare(BigDecimal a, BigDecimal b) {
+        if (a == null && b == null) {
+            return 0;
+        }
+        if (a == null && b != null) {
+            return -1;
+        }
+        if (a != null && b == null) {
+            return +1;
+        }
+        return a.compareTo(b);
+    }
+
+    public void fixRangesOrder() {
+        if (compare(a, b) > 0) {
+            BigDecimal t = a; a = b; b = t;
+        }
+    }
+
+    public int compareTo(ImportRange other) {
+        int cmp = compare(a, other.a);
+        if (cmp != 0) return cmp;
+        return compare(b, other.b);
+    }
+
+    public BigDecimal getA() {
+        return a;
+    }
+
+    public void setA(BigDecimal a) {
+        this.a = a;
+    }
+
+    public BigDecimal getB() {
+        return b;
+    }
+
+    public void setB(BigDecimal b) {
+        this.b = b;
+    }
+
+    public Range getPeer(River river) {
+        if (peer == null) {
+            peer = ImporterSession.getInstance().getRange(river, a, b);
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,1464 @@
+package de.intevation.flys.importer;
+
+import de.intevation.artifacts.common.utils.FileTools.HashedFile;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.importer.parsers.AnnotationClassifier;
+import de.intevation.flys.importer.parsers.AnnotationsParser;
+import de.intevation.flys.importer.parsers.BedHeightEpochParser;
+import de.intevation.flys.importer.parsers.BedHeightSingleParser;
+import de.intevation.flys.importer.parsers.CrossSectionParser;
+import de.intevation.flys.importer.parsers.DA50Parser;
+import de.intevation.flys.importer.parsers.DA66Parser;
+import de.intevation.flys.importer.parsers.FlowVelocityMeasurementParser;
+import de.intevation.flys.importer.parsers.FlowVelocityModelParser;
+import de.intevation.flys.importer.parsers.HYKParser;
+import de.intevation.flys.importer.parsers.MeasurementStationsParser;
+import de.intevation.flys.importer.parsers.MorphologicalWidthParser;
+import de.intevation.flys.importer.parsers.PRFParser;
+import de.intevation.flys.importer.parsers.PegelGltParser;
+import de.intevation.flys.importer.parsers.SQRelationParser;
+import de.intevation.flys.importer.parsers.SedimentDensityParser;
+import de.intevation.flys.importer.parsers.SedimentYieldParser;
+import de.intevation.flys.importer.parsers.W80Parser;
+import de.intevation.flys.importer.parsers.W80CSVParser;
+import de.intevation.flys.importer.parsers.WaterlevelDifferencesParser;
+import de.intevation.flys.importer.parsers.WaterlevelParser;
+import de.intevation.flys.importer.parsers.WstParser;
+
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.Unit;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+
+/** Import all river-related data (files) that can be found. */
+public class ImportRiver
+{
+    /** Private logger. */
+    private static Logger log = Logger.getLogger(ImportRiver.class);
+
+    public static final String PEGEL_GLT = "PEGEL.GLT";
+
+    public static final String FIXATIONS = "Fixierungen";
+
+    public static final String EXTRA_LONGITUDINALS =
+        "Zus.L\u00e4ngsschnitte";
+
+    public static final String [] OFFICIAL_LINES_FOLDERS = {
+        "Basisdaten",
+        "Fixierungen" };
+
+    public static final String OFFICIAL_LINES =
+        "Amtl_Linien.wst";
+
+    public static final String FLOOD_WATER = "HW-Marken";
+
+    public static final String FLOOD_PROTECTION =
+        "HW-Schutzanlagen";
+
+    public static final String MINFO_DIR = "Morphologie";
+
+    public static final String BED_HEIGHT_DIR = "Sohlhoehen";
+
+    public static final String BED_HEIGHT_SINGLE_DIR = "Einzeljahre";
+
+    public static final String BED_HEIGHT_EPOCH_DIR = "Epochen";
+
+    public static final String SEDIMENT_DENSITY_DIR = "Sedimentdichte";
+
+    public static final String MORPHOLOGICAL_WIDTH_DIR = "morphologische_Breite";
+
+    public static final String FLOW_VELOCITY_DIR = "Geschwindigkeit_Schubspannung";
+
+    public static final String FLOW_VELOCITY_MODEL = "Modellrechnungen";
+
+    public static final String FLOW_VELOCITY_MEASUREMENTS = "v-Messungen";
+
+    public static final String SEDIMENT_YIELD_DIR = "Fracht";
+
+    public static final String SEDIMENT_YIELD_SINGLE_DIR = "Einzeljahre";
+
+    public static final String SEDIMENT_YIELD_EPOCH_DIR = "Epochen";
+
+    public static final String MINFO_FIXATIONS_DIR = "Fixierungsanalyse";
+
+    public static final String MINFO_WATERLEVELS_DIR = "Wasserspiegellagen";
+
+    public static final String MINFO_WATERLEVEL_DIFF_DIR = "Wasserspiegeldifferenzen";
+
+    public static final String MINFO_BASE_DIR = "Basisdaten";
+
+    public static final String MINFO_CORE_DATA_FILE = "Stammdaten_Messstellen.csv";
+
+    public static final String MINFO_SQ_DIR = "Feststofftransport-Abfluss-Beziehung";
+
+    protected String name;
+
+    protected Long officialNumber;
+
+    protected File wstFile;
+
+    protected File bbInfoFile;
+
+    protected List<ImportGauge> gauges;
+
+    protected List<ImportAnnotation> annotations;
+
+    protected List<ImportHYK> hyks;
+
+    protected List<ImportCrossSection> crossSections;
+
+    protected List<ImportWst> extraWsts;
+
+    protected List<ImportWst> fixations;
+
+    protected List<ImportWst> officialLines;
+
+    protected List<ImportWst> floodWater;
+
+    protected List<ImportWst> floodProtection;
+
+    /** Wst-structures from waterlevel-csv files. */
+    protected List<ImportWst> waterlevels;
+
+    /** Wst-structures from waterlevel-difference-csv files. */
+    protected List<ImportWst> waterlevelDifferences;
+
+    protected List<ImportBedHeight> bedHeightSingles;
+
+    protected List<ImportBedHeight> bedHeightEpochs;
+
+    protected List<ImportSedimentDensity> sedimentDensities;
+
+    protected List<ImportMorphWidth> morphologicalWidths;
+
+    protected List<ImportFlowVelocityModel> flowVelocityModels;
+
+    protected List<ImportFlowVelocityMeasurement> flowVelocityMeasurements;
+
+    protected List<ImportSedimentYield> sedimentYields;
+
+    protected List<ImportMeasurementStation> measurementStations;
+
+    protected List<ImportSQRelation> sqRelations;
+
+    protected ImportWst wst;
+
+    protected ImportUnit wstUnit;
+
+    protected AnnotationClassifier annotationClassifier;
+
+    /** Database-mapped River instance. */
+    protected River peer;
+
+
+    /** Callback-implementation for CrossSectionParsers:
+     * Accept files with different md5(?)sums than what has already been parsed,
+     * on successfull parse, add data. */
+    class ImportRiverCrossSectionParserCallback implements CrossSectionParser.Callback {
+        Set<HashedFile> files = new HashSet<HashedFile>();
+        String type;
+
+
+        /**
+         * Create new Callback, given type which is used for logging
+         * purposes only.
+         */
+        public ImportRiverCrossSectionParserCallback (String type) {
+            this.type = type;
+        }
+
+
+        /** Accept file if not duplicate. */
+        public boolean accept(File file) {
+            HashedFile hf = new HashedFile(file);
+            boolean success = files.add(hf);
+            if (!success) {
+                log.warn(type + " file '" + file + "' seems to be a duplicate.");
+            }
+            return success;
+        }
+
+
+        /** Add crosssection. */
+        public void parsed(CrossSectionParser parser) {
+           log.debug("callback from " + type + " parser");
+
+           addCrossSections(parser);
+        }
+    } // ImportRiverCrossSectionParserCallback
+
+
+    public ImportRiver() {
+        hyks                      = new ArrayList<ImportHYK>();
+        crossSections             = new ArrayList<ImportCrossSection>();
+        extraWsts                 = new ArrayList<ImportWst>();
+        fixations                 = new ArrayList<ImportWst>();
+        officialLines             = new ArrayList<ImportWst>();
+        floodWater                = new ArrayList<ImportWst>();
+        waterlevels               = new ArrayList<ImportWst>();
+        waterlevelDifferences     = new ArrayList<ImportWst>();
+        floodProtection           = new ArrayList<ImportWst>();
+        sedimentDensities         = new ArrayList<ImportSedimentDensity>();
+        morphologicalWidths       = new ArrayList<ImportMorphWidth>();
+        flowVelocityModels        = new ArrayList<ImportFlowVelocityModel>();
+        flowVelocityMeasurements  = new ArrayList<ImportFlowVelocityMeasurement>();
+        sedimentYields            = new ArrayList<ImportSedimentYield>();
+        measurementStations       = new ArrayList<ImportMeasurementStation>();
+        sqRelations               = new ArrayList<ImportSQRelation>();
+    }
+
+    public ImportRiver(
+        String               name,
+        File                 wstFile,
+        File                 bbInfoFile,
+        AnnotationClassifier annotationClassifier
+    ) {
+        this();
+        this.name                 = name;
+        this.wstFile              = wstFile;
+        this.bbInfoFile           = bbInfoFile;
+        this.annotationClassifier = annotationClassifier;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getOfficialNumber() {
+        return this.officialNumber;
+    }
+
+    public void setOfficialNumber(Long officialNumber) {
+        this.officialNumber = officialNumber;
+    }
+
+    public File getWstFile() {
+        return wstFile;
+    }
+
+    public void setWstFile(File wstFile) {
+        this.wstFile = wstFile;
+    }
+
+    public File getBBInfo() {
+        return bbInfoFile;
+    }
+
+    public void setBBInfo(File bbInfoFile) {
+        this.bbInfoFile = bbInfoFile;
+    }
+
+    public ImportWst getWst() {
+        return wst;
+    }
+
+    public void setWst(ImportWst wst) {
+        this.wst = wst;
+    }
+
+    public File getMinfoDir() {
+        File riverDir  = wstFile.getParentFile().getParentFile().getParentFile();
+        return new File(riverDir, MINFO_DIR);
+    }
+
+    public void parseDependencies() throws IOException {
+        parseGauges();
+        parseAnnotations();
+        parsePRFs();
+        parseDA66s();
+        parseDA50s();
+        parseW80s();
+        parseW80CSVs();
+        parseHYKs();
+        parseWst();
+        parseExtraWsts();
+        parseFixations();
+        parseOfficialLines();
+        parseFloodWater();
+        parseFloodProtection();
+        parseBedHeight();
+        parseSedimentDensity();
+        parseMorphologicalWidth();
+        parseFlowVelocity();
+        parseSedimentYield();
+        parseWaterlevels();
+        parseWaterlevelDifferences();
+        parseMeasurementStations();
+        parseSQRelation();
+    }
+
+    public void parseFloodProtection() throws IOException {
+        if (Config.INSTANCE.skipFloodProtection()) {
+            log.info("skip parsing flood protection");
+            return;
+        }
+
+        log.info("Parse flood protection wst file");
+
+        File riverDir = wstFile.getParentFile().getParentFile();
+
+        File dir = FileTools.repair(new File(riverDir, FLOOD_PROTECTION));
+
+        if (!dir.isDirectory() || !dir.canRead()) {
+            log.info("no directory '" + dir + "' found");
+            return;
+        }
+
+        File [] files = dir.listFiles();
+
+        if (files == null) {
+            log.warn("cannot read '" + dir + "'");
+            return;
+        }
+
+        for (File file: files) {
+            if (!file.isFile() || !file.canRead()) {
+                continue;
+            }
+            String name = file.getName().toLowerCase();
+            if (!(name.endsWith(".zus") || name.endsWith(".wst"))) {
+                continue;
+            }
+            log.info("found file '" + file.getName() + "'");
+            WstParser wstParser = new WstParser();
+            wstParser.parse(file);
+            ImportWst iw = wstParser.getWst();
+            iw.setKind(5);
+            iw.setDescription(FLOOD_PROTECTION + "/" + iw.getDescription());
+            floodProtection.add(iw);
+        }
+    }
+
+    public void storeOfficialNumber() {
+        if (Config.INSTANCE.skipBWASTR()) {
+            log.info("skip storing official number.");
+            return;
+        }
+        getPeer().setOfficialNumber(officialNumber);
+    }
+
+    public void parseBedHeight() throws IOException {
+        File minfoDir     = getMinfoDir();
+        File bedHeightDir = new File(minfoDir, BED_HEIGHT_DIR);
+        File singlesDir   = new File(bedHeightDir, BED_HEIGHT_SINGLE_DIR);
+        File epochDir     = new File(bedHeightDir, BED_HEIGHT_EPOCH_DIR);
+
+        if (Config.INSTANCE.skipBedHeightSingle()) {
+            log.info("skip parsing bed height single.");
+        }
+        else {
+            log.info("Parse bed height single.");
+            parseBedHeightSingles(singlesDir);
+        }
+
+        if (Config.INSTANCE.skipBedHeightEpoch()) {
+            log.info("skip parsing bed height epochs.");
+        }
+        else {
+            log.info("Parse bed height epochs.");
+            parseBedHeightEpochs(epochDir);
+        }
+    }
+
+
+    protected void parseSedimentDensity() throws IOException {
+        if (Config.INSTANCE.skipSedimentDensity()) {
+            log.info("skip parsing sediment density.");
+            return;
+        }
+
+        log.debug("Parse sediment density");
+
+        File minfoDir = getMinfoDir();
+        File sediment = new File(minfoDir, SEDIMENT_DENSITY_DIR);
+
+        File[] files = sediment.listFiles();
+
+        if (files == null) {
+            log.warn("Cannot read directory '" + sediment + "'");
+            return;
+        }
+
+        SedimentDensityParser parser = new SedimentDensityParser();
+
+        for (File file: files) {
+            parser.parse(file);
+        }
+
+        sedimentDensities = parser.getSedimentDensities();
+
+        log.info("Parsed " + sedimentDensities.size() + " sediment densities.");
+    }
+
+
+    protected void parseMorphologicalWidth() throws IOException {
+        if (Config.INSTANCE.skipMorphologicalWidth()) {
+            log.info("skip parsing morphological width.");
+            return;
+        }
+
+        log.debug("Parse morphological width");
+
+        File minfoDir = getMinfoDir();
+        File morphDir = new File(minfoDir, MORPHOLOGICAL_WIDTH_DIR);
+
+        File[] files = morphDir.listFiles();
+
+        if (files == null) {
+            log.warn("Cannot read directory '" + morphDir + "'");
+            return;
+        }
+
+        MorphologicalWidthParser parser = new MorphologicalWidthParser();
+
+        for (File file: files) {
+            parser.parse(file);
+        }
+
+        morphologicalWidths = parser.getMorphologicalWidths();
+
+        log.info("Parsed " + morphologicalWidths.size() + " morph. widths files.");
+    }
+
+
+    protected void parseFlowVelocity() throws IOException {
+        if (Config.INSTANCE.skipFlowVelocity()) {
+            log.info("skip parsing flow velocity");
+            return;
+        }
+
+        log.debug("Parse flow velocity");
+
+        File minfoDir   = getMinfoDir();
+        File flowDir    = new File(minfoDir, FLOW_VELOCITY_DIR);
+        File modelDir   = new File(flowDir, FLOW_VELOCITY_MODEL);
+        File measureDir = new File(flowDir, FLOW_VELOCITY_MEASUREMENTS);
+
+        File[] modelFiles   = modelDir.listFiles();
+        File[] measureFiles = measureDir.listFiles();
+
+        if (modelFiles == null) {
+            log.warn("Cannot read directory '" + modelDir + "'");
+        }
+        else {
+            FlowVelocityModelParser parser = new FlowVelocityModelParser();
+
+            for (File model: modelFiles) {
+                log.debug("Parse file '" + model + "'");
+                parser.parse(model);
+            }
+
+            flowVelocityModels = parser.getModels();
+        }
+
+        if (measureFiles == null) {
+            log.warn("Cannot read directory '" + measureDir + "'");
+        }
+        else {
+            FlowVelocityMeasurementParser parser =
+                new FlowVelocityMeasurementParser();
+
+            for (File measurement: measureFiles) {
+                log.debug("Parse file '" + measurement + "'");
+                parser.parse(measurement);
+            }
+
+            flowVelocityMeasurements = parser.getMeasurements();
+        }
+    }
+
+
+    protected void parseSedimentYield() throws IOException {
+        if (Config.INSTANCE.skipSedimentYield()) {
+            log.info("skip parsing sediment yield data");
+            return;
+        }
+
+        log.debug("Parse sediment yield data");
+
+        File minfoDir         = getMinfoDir();
+        File sedimentYieldDir = new File(minfoDir, SEDIMENT_YIELD_DIR);
+
+        File singleDir = new File(sedimentYieldDir, SEDIMENT_YIELD_SINGLE_DIR);
+        File epochDir  = new File(sedimentYieldDir, SEDIMENT_YIELD_EPOCH_DIR);
+
+        File[] singles = singleDir.listFiles();
+        File[] epochs  = epochDir.listFiles();
+
+        SedimentYieldParser parser = new SedimentYieldParser();
+
+        if (singles == null || singles.length == 0) {
+            log.warn("Cannot read directory '" + singleDir + "'");
+        }
+        else {
+            for (File file: singles) {
+                if (file.isDirectory()) {
+                    for (File child: file.listFiles()) {
+                        parser.parse(child);
+                    }
+                }
+                else {
+                    parser.parse(file);
+                }
+            }
+        }
+
+        if (epochs == null || epochs.length == 0) {
+            log.warn("Cannot read directory '" + epochDir + "'");
+        }
+        else {
+            for (File file: epochs) {
+                if (file.isDirectory()) {
+                    for (File child: file.listFiles()) {
+                        parser.parse(child);
+                    }
+                }
+                else {
+                    parser.parse(file);
+                }
+            }
+        }
+
+        sedimentYields = parser.getSedimentYields();
+    }
+
+
+    protected void parseWaterlevels() throws IOException {
+        if (Config.INSTANCE.skipWaterlevels()) {
+            log.info("skip parsing waterlevels");
+            return;
+        }
+
+        log.info("Parse waterlevels");
+
+        File minfo  = getMinfoDir();
+        File fixDir = new File(minfo, MINFO_FIXATIONS_DIR);
+        File wspDir = new File(fixDir, MINFO_WATERLEVELS_DIR);
+
+        File[] files = wspDir.listFiles();
+
+        if (files == null) {
+            log.warn("Cannot read directory for wl '" + wspDir + "'");
+            return;
+        }
+
+        WaterlevelParser parser = new WaterlevelParser();
+
+        for (File file: files) {
+            parser.parse(file);
+        }
+
+        // The parsed ImportWaterlevels are converted to
+        // 'fixation'-wsts now.
+        for(ImportWst iw: parser.getWaterlevels()) {
+            iw.setDescription("CSV/" + iw.getDescription());
+            iw.setKind(6);
+            waterlevels.add(iw);
+        }
+    }
+
+    protected void parseMeasurementStations() throws IOException {
+        if (Config.INSTANCE.skipMeasurementStations()) {
+            log.info("skip parsing measurement stations");
+            return;
+        }
+
+        log.info("Parse measurement stations");
+
+        File minfo = getMinfoDir();
+        File minfoBaseDir = new File(minfo, MINFO_BASE_DIR);
+        File coredataFile = new File(minfoBaseDir, MINFO_CORE_DATA_FILE);
+
+        if (coredataFile == null || !coredataFile.exists()) {
+            log.warn("No core data file '" + coredataFile.getAbsolutePath() + "' found");
+            return;
+        }
+
+        MeasurementStationsParser parser = new MeasurementStationsParser();
+        try {
+            parser.parse(coredataFile);
+            measurementStations = parser.getMeasurementStations();
+
+            log.info("Successfully parsed " + measurementStations.size() + " measurement stations.");
+        }
+        catch (IOException ioe) {
+            log.error("unable to parse file '" + coredataFile.getName() +
+                ": " + ioe.getMessage());
+        }
+    }
+
+
+    protected void parseWaterlevelDifferences() throws IOException {
+        if (Config.INSTANCE.skipWaterlevelDifferences()) {
+            log.info("skip parsing waterlevel differences");
+            return;
+        }
+
+        log.info("Parse waterlevel differences");
+
+        File minfo  = getMinfoDir();
+        File fixDir = new File(minfo, MINFO_FIXATIONS_DIR);
+        File diffDir = new File(fixDir, MINFO_WATERLEVEL_DIFF_DIR);
+
+        File[] files = diffDir.listFiles();
+
+        if (files == null) {
+            log.warn("Cannot read directory '" + diffDir + "'");
+            return;
+        }
+
+        WaterlevelDifferencesParser parser = new WaterlevelDifferencesParser();
+
+        for (File file: files) {
+            parser.parse(file);
+        }
+
+        // WaterlevelDifferences become Wsts now.
+        for(ImportWst iw: parser.getDifferences()) {
+            iw.setDescription("CSV/" + iw.getDescription());
+            iw.setKind(7);
+            waterlevelDifferences.add(iw);
+        }
+    }
+
+
+    protected void parseSQRelation() throws IOException {
+        if (Config.INSTANCE.skipSQRelation()) {
+            log.info("skip parsing sq relation");
+            return;
+        }
+
+        log.info("Parse sq relations");
+
+        File minfo = getMinfoDir();
+        File sqDir = new File(minfo, MINFO_SQ_DIR);
+
+        File[] files = sqDir.listFiles();
+
+        if (files == null) {
+            log.warn("Cannot read directory '" + sqDir + "'");
+            return;
+        }
+
+        SQRelationParser parser = new SQRelationParser();
+
+        for (File file: files) {
+            parser.parse(file);
+        }
+
+        sqRelations = parser.getSQRelations();
+
+        log.debug("Parsed " + sqRelations.size() + " SQ relations.");
+    }
+
+
+    protected void parseBedHeightSingles(File dir) throws IOException {
+        log.debug("Parse bed height singles");
+
+        File[] files = dir.listFiles();
+
+        if (files == null) {
+            log.warn("Cannot read directory '" + dir + "'");
+            return;
+        }
+
+        BedHeightSingleParser parser = new BedHeightSingleParser();
+
+        for (File file: files) {
+            parser.parse(file);
+        }
+
+        bedHeightSingles = parser.getBedHeights();
+    }
+
+
+    protected void parseBedHeightEpochs(File dir) throws IOException {
+        log.debug("Parse bed height epochs");
+
+        File[] files = dir.listFiles();
+
+        if (files == null) {
+            log.warn("Cannot read directory '" + dir + "'");
+            return;
+        }
+
+        BedHeightEpochParser parser = new BedHeightEpochParser();
+
+        for (File file: files) {
+            parser.parse(file);
+        }
+
+        bedHeightEpochs = parser.getBedHeights();
+    }
+
+
+    public void parseFloodWater() throws IOException {
+        if (Config.INSTANCE.skipFloodWater()) {
+            log.info("skip parsing flod water");
+            return;
+        }
+
+        log.info("Parse flood water wst file");
+
+        File riverDir = wstFile.getParentFile().getParentFile();
+
+        File dir = FileTools.repair(new File(riverDir, FLOOD_WATER));
+
+        if (!dir.isDirectory() || !dir.canRead()) {
+            log.info("no directory '" + dir + "' found");
+            return;
+        }
+
+        File [] files = dir.listFiles();
+
+        if (files == null) {
+            log.warn("cannot read '" + dir + "'");
+            return;
+        }
+
+        for (File file: files) {
+            if (!file.isFile() || !file.canRead()) {
+                continue;
+            }
+            String name = file.getName().toLowerCase();
+            if (!(name.endsWith(".zus") || name.endsWith(".wst"))) {
+                continue;
+            }
+            log.info("found file '" + file.getName() + "'");
+            WstParser wstParser = new WstParser();
+            wstParser.parse(file);
+            ImportWst iw = wstParser.getWst();
+            iw.setKind(4);
+            iw.setDescription(FLOOD_WATER + "/" + iw.getDescription());
+            floodWater.add(iw);
+        }
+    }
+
+    public void parseOfficialLines() throws IOException {
+        if (Config.INSTANCE.skipOfficialLines()) {
+            log.info("skip parsing official lines");
+            return;
+        }
+
+        log.info("Parse official wst files");
+
+        File riverDir = wstFile.getParentFile().getParentFile();
+
+        for (String folder: OFFICIAL_LINES_FOLDERS) {
+            File dir = FileTools.repair(new File(riverDir, folder));
+
+            if (!dir.isDirectory() || !dir.canRead()) {
+                log.info("no directory '" + folder + "' found");
+                continue;
+            }
+
+            File file = FileTools.repair(new File(dir, OFFICIAL_LINES));
+            if (!file.isFile() || !file.canRead()) {
+                log.warn("no official lines wst file found");
+                continue;
+            }
+            log.debug("Found WST file: " + file);
+
+            WstParser wstParser = new WstParser();
+            wstParser.parse(file);
+            ImportWst iw = wstParser.getWst();
+            iw.setKind(3);
+            iw.setDescription(folder + "/" + iw.getDescription());
+            officialLines.add(iw);
+        } // for all folders
+
+    }
+
+    public void parseFixations() throws IOException {
+        if (Config.INSTANCE.skipFixations()) {
+            log.info("skip parsing fixations");
+            return;
+        }
+
+        log.info("Parse fixation wst files");
+
+        File riverDir = wstFile.getParentFile().getParentFile();
+
+        File fixDir = FileTools.repair(
+            new File(riverDir, FIXATIONS));
+
+        if (!fixDir.isDirectory() || !fixDir.canRead()) {
+            log.info("no fixation wst file directory found");
+            return;
+        }
+
+        File [] files = fixDir.listFiles();
+
+        if (files == null) {
+            log.warn("cannot read fixations wst file directory");
+            return;
+        }
+
+        for (File file: files) {
+            if (!file.isFile() || !file.canRead()) {
+                continue;
+            }
+            String name = file.getName().toLowerCase();
+            if (!name.endsWith(".wst")) {
+                continue;
+            }
+            log.debug("Found WST file: " + file);
+
+            WstParser wstParser = new WstParser();
+            wstParser.parse(file);
+            ImportWst iw = wstParser.getWst();
+            iw.setKind(2);
+            iw.setDescription(FIXATIONS+ "/" + iw.getDescription());
+            fixations.add(iw);
+        }
+    }
+
+    public void parseExtraWsts() throws IOException {
+        if (Config.INSTANCE.skipExtraWsts()) {
+            log.info("skip parsing extra WST files");
+            return;
+        }
+
+        log.info("Parse extra longitudinal wst files");
+
+        File riverDir = wstFile.getParentFile().getParentFile();
+
+        File extraDir = FileTools.repair(
+            new File(riverDir, EXTRA_LONGITUDINALS));
+
+        if (!extraDir.isDirectory() || !extraDir.canRead()) {
+            log.info("no extra longitudinal wst file directory found");
+            return;
+        }
+
+        File [] files = extraDir.listFiles();
+
+        if (files == null) {
+            log.warn("cannot read extra longitudinal wst file directory");
+            return;
+        }
+
+        for (File file: files) {
+            if (!file.isFile() || !file.canRead()) {
+                continue;
+            }
+            String name = file.getName().toLowerCase();
+            if (!(name.endsWith(".zus") || name.endsWith(".wst"))) {
+                continue;
+            }
+            log.debug("Found WST file: " + file);
+
+            WstParser wstParser = new WstParser();
+            wstParser.parse(file);
+            ImportWst iw = wstParser.getWst();
+            iw.setKind(1);
+            iw.setDescription(EXTRA_LONGITUDINALS + "/" + iw.getDescription());
+            extraWsts.add(iw);
+        }
+
+    }
+
+    public void parseWst() throws IOException {
+        if (Config.INSTANCE.skipWst()) {
+            log.info("skip parsing WST file");
+            return;
+        }
+
+        WstParser wstParser = new WstParser();
+        wstParser.parse(wstFile);
+        wst = wstParser.getWst();
+    }
+
+    public void parseGauges() throws IOException {
+        if (Config.INSTANCE.skipGauges()) {
+            log.info("skip parsing gauges");
+            return;
+        }
+
+        File gltFile = new File(wstFile.getParentFile(), PEGEL_GLT);
+        gltFile = FileTools.repair(gltFile);
+
+        if (!gltFile.isFile() || !gltFile.canRead()) {
+            log.warn("cannot read gauges from '" + gltFile + "'");
+            return;
+        }
+
+        PegelGltParser pgltp = new PegelGltParser();
+        pgltp.parse(gltFile);
+
+        gauges = pgltp.getGauges();
+
+        for (ImportGauge gauge: gauges) {
+            gauge.parseDependencies();
+        }
+    }
+
+    public void parseAnnotations() throws IOException {
+        if (Config.INSTANCE.skipAnnotations()) {
+            log.info("skip parsing annotations");
+            return;
+        }
+
+        File riverDir = wstFile.getParentFile().getParentFile();
+        AnnotationsParser aparser =
+            new AnnotationsParser(annotationClassifier);
+        aparser.parse(riverDir);
+
+        annotations = aparser.getAnnotations();
+    }
+
+    public void parseHYKs() {
+        if (Config.INSTANCE.skipHYKs()) {
+            log.info("skip parsing HYK files");
+            return;
+        }
+
+        log.info("looking for HYK files");
+        HYKParser parser = new HYKParser();
+        File riverDir = wstFile
+            .getParentFile()  // Basisdaten
+            .getParentFile()  // Hydrologie
+            .getParentFile(); // <river>
+
+        parser.parseHYKs(riverDir, new HYKParser.Callback() {
+
+            Set<HashedFile> hfs = new HashSet<HashedFile>();
+
+            @Override
+            public boolean hykAccept(File file) {
+                HashedFile hf = new HashedFile(file);
+                boolean success = hfs.add(hf);
+                if (!success) {
+                    log.warn("HYK file '" + file + "' seems to be a duplicate.");
+                }
+                return success;
+            }
+
+            @Override
+            public void hykParsed(HYKParser parser) {
+                log.debug("callback from HYK parser");
+                ImportHYK hyk = parser.getHYK();
+                hyk.setRiver(ImportRiver.this);
+                hyks.add(hyk);
+            }
+        });
+    }
+
+
+    /** Add cross sections with description, years and lines to
+     * store. */
+    private void addCrossSections(CrossSectionParser parser) {
+        String  description = parser.getDescription();
+        Integer year        = parser.getYear();
+        ImportTimeInterval ti = year != null
+            ? new ImportTimeInterval(yearToDate(year))
+            : null;
+
+        Map<Double, List<XY>> data = parser.getData();
+
+        List<ImportCrossSectionLine> lines =
+            new ArrayList<ImportCrossSectionLine>(data.size());
+
+        for (Map.Entry<Double, List<XY>> entry: data.entrySet()) {
+            Double   km     = entry.getKey();
+            List<XY> points = entry.getValue();
+            lines.add(new ImportCrossSectionLine(km, points));
+        }
+
+        crossSections.add(new ImportCrossSection(
+            ImportRiver.this, description, ti, lines));
+    }
+
+    /** Create a W80 Parser and parse w80 files found. */
+    public void parseW80s() {
+        if (Config.INSTANCE.skipW80s()) {
+            log.info("skip parsing W80s");
+            return;
+        }
+        W80Parser parser = new W80Parser();
+        File riverDir = wstFile
+            .getParentFile()  // Basisdaten
+            .getParentFile()  // Hydrologie
+            .getParentFile(); // <river>
+
+        ImportRiverCrossSectionParserCallback w80Callback =
+            new ImportRiverCrossSectionParserCallback("w80");
+        parser.parseW80s(riverDir, w80Callback);
+    }
+
+    /** Create a W80 Parser and parse w80 files found. */
+    public void parseW80CSVs() {
+        if (Config.INSTANCE.skipW80CSVs()) {
+            log.info("skip parsing W80 csvs");
+            return;
+        }
+        W80CSVParser parser = new W80CSVParser();
+        File riverDir = wstFile
+            .getParentFile()  // Basisdaten
+            .getParentFile()  // Hydrologie
+            .getParentFile(); // <river>
+
+        // Construct the Cross-Section-Data path.
+        File csDir = new File(riverDir.getPath()
+            + File.separator + "Geodaesie"
+            + File.separator + "Querprofile"
+            + File.separator + "QP-Daten");
+
+        ImportRiverCrossSectionParserCallback w80CSVCallback =
+            new ImportRiverCrossSectionParserCallback("w80-csv");
+        parser.parseW80CSVs(csDir, w80CSVCallback);
+    }
+
+
+    /**
+     * Create and use a DA50Parser, parse the files found, add the
+     * ross-sections found.
+     */
+    public void parseDA50s() {
+        if (Config.INSTANCE.skipDA50s()) {
+            log.info("skip parsing DA50s");
+            return;
+        }
+        DA50Parser parser = new DA50Parser();
+        File riverDir = wstFile
+            .getParentFile()  // Basisdaten
+            .getParentFile()  // Hydrologie
+            .getParentFile(); // <river>
+
+        ImportRiverCrossSectionParserCallback da50Callback =
+            new ImportRiverCrossSectionParserCallback("da50");
+        parser.parseDA50s(riverDir, da50Callback);
+    }
+
+
+    /** Create a DA66 Parser and parse the da66 files found. */
+    // TODO this is a copy of parsePRFs, extract interfaces (e.g. CrossSectionParser).
+    public void parseDA66s() {
+        if (Config.INSTANCE.skipDA66s()) {
+            log.info("skip parsing DA66s");
+            return;
+        }
+
+        log.info("looking for DA66 files");
+        DA66Parser parser = new DA66Parser();
+        File riverDir = wstFile
+            .getParentFile()  // Basisdaten
+            .getParentFile()  // Hydrologie
+            .getParentFile(); // <river>
+
+        ImportRiverCrossSectionParserCallback da66Callback =
+            new ImportRiverCrossSectionParserCallback("da66");
+        parser.parseDA66s(riverDir, da66Callback);
+    }
+
+    /** Create a PRFParser and let it parse the prf files found. */
+    public void parsePRFs() {
+        if (Config.INSTANCE.skipPRFs()) {
+            log.info("skip parsing PRFs");
+            return;
+        }
+
+        log.info("looking for PRF files");
+        PRFParser parser = new PRFParser();
+        File riverDir = wstFile
+            .getParentFile()  // Basisdaten
+            .getParentFile()  // Hydrologie
+            .getParentFile(); // <river>
+
+        ImportRiverCrossSectionParserCallback prfCallback =
+            new ImportRiverCrossSectionParserCallback("prf");
+        parser.parsePRFs(riverDir, prfCallback);
+    }
+
+    public static Date yearToDate(int year) {
+        Calendar cal = Calendar.getInstance();
+        cal.set(year, 5, 15, 12, 0, 0);
+        long ms = cal.getTimeInMillis();
+        cal.setTimeInMillis(ms - ms%1000);
+        return cal.getTime();
+    }
+
+    public void storeDependencies() {
+        storeWstUnit();
+        storeAnnotations();
+        storeHYKs();
+        storeCrossSections();
+        storeGauges();
+        storeWst();
+        storeExtraWsts();
+        storeFixations();
+        storeOfficialLines();
+        storeFloodWater();
+        storeFloodProtection();
+        storeBedHeight();
+        storeSedimentDensity();
+        storeMorphologicalWidth();
+        storeFlowVelocity();
+        storeSedimentYield();
+        storeWaterlevels();
+        storeWaterlevelDifferences();
+        storeMeasurementStations();
+        storeSQRelations();
+        storeOfficialNumber();
+    }
+
+    public void storeWstUnit() {
+        if (wst == null) {
+            wstUnit = new ImportUnit("NN + m");
+        }
+        else {
+            wstUnit = wst.getUnit();
+        }
+    }
+
+    public void storeHYKs() {
+        if (!Config.INSTANCE.skipHYKs()) {
+            log.info("store HYKs");
+            getPeer();
+            for (ImportHYK hyk: hyks) {
+                hyk.storeDependencies();
+            }
+        }
+    }
+
+    public void storeCrossSections() {
+        if (!Config.INSTANCE.skipPRFs()
+            || !Config.INSTANCE.skipDA66s()
+            || !Config.INSTANCE.skipDA50s()
+            || !Config.INSTANCE.skipW80s()
+            || !Config.INSTANCE.skipW80CSVs()) {
+            log.info("store cross sections");
+            getPeer();
+            for (ImportCrossSection crossSection: crossSections) {
+                crossSection.storeDependencies();
+            }
+        }
+    }
+
+    public void storeWst() {
+        if (!Config.INSTANCE.skipWst()) {
+            River river = getPeer();
+            wst.storeDependencies(river);
+        }
+    }
+
+    public void storeFixations() {
+        if (!Config.INSTANCE.skipFixations()) {
+            log.info("store fixation wsts");
+            River river = getPeer();
+            for (ImportWst fWst: fixations) {
+                log.debug("Fixation name: " + fWst.getDescription());
+                fWst.storeDependencies(river);
+            }
+        }
+    }
+
+
+    /** Store wsts from waterlevel-csv files. */
+    public void storeWaterlevels() {
+        if (!Config.INSTANCE.skipWaterlevels())
+
+        log.info("store waterlevel wsts from csv");
+        River river = getPeer();
+        for (ImportWst wWst: waterlevels) {
+            log.debug("Waterlevel name: " + wWst.getDescription());
+            wWst.storeDependencies(river);
+        }
+    }
+
+
+    /** Store wsts from waterleveldifference-csv files. */
+    public void storeWaterlevelDifferences() {
+        if (!Config.INSTANCE.skipWaterlevelDifferences())
+
+        log.info("store waterleveldifferences wsts from csv");
+        River river = getPeer();
+        for (ImportWst dWst: waterlevelDifferences) {
+            log.debug("water.diff.: name " + dWst.getDescription());
+            dWst.storeDependencies(river);
+        }
+    }
+
+
+    public void storeExtraWsts() {
+        if (!Config.INSTANCE.skipExtraWsts()) {
+            log.info("store extra wsts");
+            River river = getPeer();
+            for (ImportWst wst: extraWsts) {
+                log.debug("name: " + wst.getDescription());
+                wst.storeDependencies(river);
+            }
+        }
+    }
+
+    public void storeOfficialLines() {
+        if (!Config.INSTANCE.skipOfficialLines()) {
+            log.info("store official lines wsts");
+            River river = getPeer();
+            for (ImportWst wst: officialLines) {
+                log.debug("name: " + wst.getDescription());
+                wst.storeDependencies(river);
+            }
+        }
+    }
+
+    public void storeFloodWater() {
+        if (!Config.INSTANCE.skipFloodWater()) {
+            log.info("store flood water wsts");
+            River river = getPeer();
+            for (ImportWst wst: floodWater) {
+                log.debug("name: " + wst.getDescription());
+                wst.storeDependencies(river);
+            }
+        }
+    }
+
+
+    public void storeFloodProtection() {
+        if (!Config.INSTANCE.skipFloodProtection()) {
+            log.info("store flood protection wsts");
+            River river = getPeer();
+            for (ImportWst wst: floodProtection) {
+                log.debug("name: " + wst.getDescription());
+                wst.storeDependencies(river);
+            }
+        }
+    }
+
+
+    public void storeBedHeight() {
+        if (!Config.INSTANCE.skipBedHeightSingle()) {
+            log.info("store bed heights single");
+            storeBedHeightSingle();
+        }
+
+        if (!Config.INSTANCE.skipBedHeightEpoch()) {
+            log.info("store bed height epoch.");
+            storeBedHeightEpoch();
+        }
+    }
+
+
+    private void storeBedHeightSingle() {
+        River river = getPeer();
+
+        if (bedHeightSingles != null) {
+            for (ImportBedHeight tmp: bedHeightSingles) {
+                ImportBedHeightSingle single = (ImportBedHeightSingle) tmp;
+
+                String desc = single.getDescription();
+
+                log.debug("name: " + desc);
+
+		single.storeDependencies(river);
+
+            }
+        }
+        else {
+            log.info("No single bed heights to store.");
+        }
+    }
+
+
+    private void storeBedHeightEpoch() {
+        River river = getPeer();
+
+        if (bedHeightEpochs != null) {
+            for (ImportBedHeight tmp: bedHeightEpochs) {
+                ImportBedHeightEpoch epoch = (ImportBedHeightEpoch) tmp;
+
+                String desc = epoch.getDescription();
+
+                log.debug("name: " + desc);
+
+		epoch.storeDependencies(river);
+
+            }
+        }
+        else {
+            log.info("No epoch bed heights to store.");
+        }
+    }
+
+    public void storeSedimentDensity() {
+        if (!Config.INSTANCE.skipSedimentDensity()) {
+            log.info("store sediment density");
+
+            River river = getPeer();
+
+            for (ImportSedimentDensity density: sedimentDensities) {
+                String desc = density.getDescription();
+
+                log.debug("name: " + desc);
+
+		density.storeDependencies(river);
+
+            }
+        }
+    }
+
+    public void storeMorphologicalWidth() {
+        if (!Config.INSTANCE.skipMorphologicalWidth()) {
+            log.info("store morphological width");
+
+            River river = getPeer();
+
+            for (ImportMorphWidth width: morphologicalWidths) {
+
+		width.storeDependencies(river);
+
+            }
+        }
+    }
+
+    public void storeFlowVelocity() {
+        if (!Config.INSTANCE.skipFlowVelocity()) {
+            log.info("store flow velocity");
+
+            River river = getPeer();
+
+            for (ImportFlowVelocityModel flowVelocityModel: flowVelocityModels){
+
+		flowVelocityModel.storeDependencies(river);
+
+            }
+
+            for (ImportFlowVelocityMeasurement m: flowVelocityMeasurements) {
+
+		m.storeDependencies(river);
+
+            }
+        }
+    }
+
+
+    public void storeSedimentYield() {
+        if (!Config.INSTANCE.skipSedimentYield()) {
+            log.info("store sediment yield data");
+
+            River river = getPeer();
+
+            for (ImportSedimentYield sedimentYield: sedimentYields) {
+
+		sedimentYield.storeDependencies(river);
+
+            }
+        }
+    }
+
+
+    public void storeMeasurementStations() {
+        if (!Config.INSTANCE.skipMeasurementStations()) {
+            log.info("store measurement stations");
+
+            River river = getPeer();
+
+            int count = 0;
+
+            for (ImportMeasurementStation station: measurementStations) {
+
+		boolean success = station.storeDependencies(river);
+		if (success) {
+		    count++;
+		}
+
+            }
+
+            log.info("stored " + count + " measurement stations.");
+        }
+    }
+
+
+    public void storeSQRelations() {
+        if (!Config.INSTANCE.skipSQRelation()) {
+            log.info("store sq relations");
+
+            River river = getPeer();
+
+            int count = 0;
+
+            for (ImportSQRelation sqRelation: sqRelations) {
+
+		sqRelation.storeDependencies(river);
+		count++;
+
+            }
+
+            log.info("stored " + count + " sq relations.");
+        }
+    }
+
+
+    public void storeAnnotations() {
+        if (!Config.INSTANCE.skipAnnotations()) {
+            River river = getPeer();
+            for (ImportAnnotation annotation: annotations) {
+                annotation.getPeer(river);
+            }
+        }
+    }
+
+    public void storeGauges() {
+        if (!Config.INSTANCE.skipGauges()) {
+            log.info("store gauges:");
+            River river = getPeer();
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+            for (ImportGauge gauge: gauges) {
+                log.info("\tgauge: " + gauge.getName());
+                gauge.storeDependencies(river);
+                ImporterSession.getInstance().getDatabaseSession();
+                session.flush();
+            }
+        }
+    }
+
+    public River getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery("from River where name=:name");
+
+            Unit u = null;
+            if (wstUnit != null) {
+                u = wstUnit.getPeer();
+            }
+
+            query.setString("name", name);
+            List<River> rivers = query.list();
+            if (rivers.isEmpty()) {
+                log.info("Store new river '" + name + "'");
+                peer = new River(name, u);
+                if (!Config.INSTANCE.skipBWASTR()) {
+                    peer.setOfficialNumber(officialNumber);
+                }
+                session.save(peer);
+            }
+            else {
+                peer = rivers.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportSQRelation.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportSQRelation.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,109 @@
+package de.intevation.flys.importer;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.exception.ConstraintViolationException;
+
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.SQRelation;
+import de.intevation.flys.model.TimeInterval;
+
+
+public class ImportSQRelation {
+
+    private static Logger log = Logger.getLogger(ImportSQRelation.class);
+
+    private ImportTimeInterval timeInterval;
+
+    private String description;
+
+    private List<ImportSQRelationValue> values;
+
+    private SQRelation peer;
+
+    public ImportSQRelation() {
+        this.values = new ArrayList<ImportSQRelationValue>();
+    }
+
+    public void storeDependencies(River river) {
+        log.info("store dependencies");
+
+        SQRelation peer = getPeer(river);
+
+        if (peer != null) {
+            int count = 0;
+
+            for (ImportSQRelationValue value : values) {
+                try {
+                    value.storeDependencies(peer);
+                    count++;
+                }
+                catch (SQLException sqle) {
+                    log.warn("ISQ: Unable to store sq relation value.", sqle);
+                }
+                catch (ConstraintViolationException cve) {
+                    log.warn("ISQ: Unable to store sq relation value.", cve);
+                }
+            }
+
+            log.info("stored " + count + " sq relation values.");
+        }
+    }
+
+    public SQRelation getPeer(River river) {
+        log.debug("getPeer()");
+
+        if (peer == null) {
+            TimeInterval timeInter = timeInterval.getPeer();
+
+            if (timeInter == null) {
+                log.warn("ISQ: Cannot determine sq relation without time interval");
+                return null;
+            }
+
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+
+            Query query = session
+                .createQuery("FROM SQRelation WHERE river=:river AND timeInterval=:timeInter");
+
+            query.setParameter("river", river);
+            query.setParameter("timeInter", timeInter);
+
+            List<SQRelation> sq = query.list();
+
+            if (sq.isEmpty()) {
+                log.info("create new SQ relation '" + description + "'");
+
+                peer = new SQRelation(river, timeInter, description);
+                session.save(peer);
+            }
+            else {
+                peer = sq.get(0);
+            }
+        }
+
+        return peer;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public void setTimeInterval(ImportTimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    public void addValue(ImportSQRelationValue value) {
+        if (value != null) {
+            this.values.add(value);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportSQRelationValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportSQRelationValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,140 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.exception.ConstraintViolationException;
+
+import de.intevation.flys.model.MeasurementStation;
+import de.intevation.flys.model.SQRelation;
+import de.intevation.flys.model.SQRelationValue;
+
+
+public class ImportSQRelationValue {
+
+    private static Logger log = Logger.getLogger(ImportSQRelationValue.class);
+
+
+    private SQRelationValue peer;
+
+    private String parameter;
+
+    private Double km;
+    private Double a;
+    private Double b;
+    private Double qMax;
+    private Double rSQ;
+    private Integer nTot;
+    private Integer nOutlier;
+    private Double cFerguson;
+    private Double cDuan;
+
+
+    public ImportSQRelationValue(
+        String parameter,
+        Double km,
+        Double a,
+        Double b,
+        Double qMax,
+        Double rSQ,
+        Integer nTot,
+        Integer nOutlier,
+        Double cFerguson,
+        Double cDuan
+    ) {
+        this.parameter = parameter;
+        this.km        = km;
+        this.a         = a;
+        this.b         = b;
+        this.qMax      = qMax;
+        this.rSQ       = rSQ;
+        this.nTot      = nTot;
+        this.nOutlier  = nOutlier;
+        this.cFerguson = cFerguson;
+        this.cDuan     = cDuan;
+    }
+
+
+    public void storeDependencies(SQRelation owner)
+    throws SQLException, ConstraintViolationException
+    {
+        getPeer(owner);
+    }
+
+
+    public SQRelationValue getPeer(SQRelation owner) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from MeasurementStation " +
+                "   where station between :kml and :kmh");
+            query.setDouble("kml", km - 1e-4);
+            query.setDouble("kmh", km + 1e-4);
+
+            List<MeasurementStation> result = query.list();
+
+            if (result.isEmpty()) {
+                log.error("No measurement stations found at km " + km);
+                return null;
+            }
+
+            Query query2 = session.createQuery(
+                "from SQRelationValue " +
+                "   where sqRelation=:owner " +
+                "   and parameter=:parameter" +
+                "   and measurementStation=:measurementStation" +
+                "   and a=:a" +
+                "   and b=:b" +
+                "   and qMax=:qMax" +
+                "   and rSQ=:rSQ" +
+                "   and cFerguson=:cFerguson" +
+                "   and cDuan=:cDuan");
+
+            query2.setParameter("owner", owner);
+            query2.setString("parameter", parameter);
+            query2.setParameter("measurementStation", result.get(0));
+            query2.setBigDecimal("a", toBigDecimal(a));
+            query2.setBigDecimal("b", toBigDecimal(b));
+            query2.setBigDecimal("qMax", toBigDecimal(qMax));
+            query2.setBigDecimal("rSQ", toBigDecimal(rSQ));
+            query2.setBigDecimal("cFerguson", toBigDecimal(cFerguson));
+            query2.setBigDecimal("cDuan", toBigDecimal(cDuan));
+
+            List<SQRelationValue> values = query2.list();
+
+            if (values.isEmpty()) {
+                peer = new SQRelationValue(
+                    owner,
+                    parameter,
+                    result.get(0),
+                    a,
+                    b,
+                    qMax,
+                    rSQ,
+                    nTot,
+                    nOutlier,
+                    cFerguson,
+                    cDuan
+                );
+
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+        return peer;
+    }
+
+    private static final BigDecimal toBigDecimal(Double x) {
+        if (x == null) return null;
+        return new BigDecimal(x);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportSedimentDensity.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportSedimentDensity.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,97 @@
+package de.intevation.flys.importer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.SedimentDensity;
+
+
+public class ImportSedimentDensity {
+
+    private static Logger log = Logger.getLogger(ImportSedimentDensity.class);
+
+    protected SedimentDensity peer;
+
+    protected ImportDepth depth;
+
+    protected String description;
+
+    protected List<ImportSedimentDensityValue> values;
+
+    public ImportSedimentDensity(String description) {
+        this.description = description;
+        this.values = new ArrayList<ImportSedimentDensityValue>();
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDepth(ImportDepth depth) {
+        this.depth = depth;
+    }
+
+    public void addValue(ImportSedimentDensityValue value) {
+        values.add(value);
+    }
+
+    public void storeDependencies(River river) {
+        log.info("store dependencies");
+
+        if (depth != null) {
+            depth.storeDependencies();
+        }
+
+        SedimentDensity peer = getPeer(river);
+
+        if (peer != null) {
+            log.info("store sediment density values.");
+            for (ImportSedimentDensityValue value : values) {
+                value.storeDependencies(peer);
+            }
+        }
+    }
+
+    public SedimentDensity getPeer(River river) {
+        log.info("get peer");
+
+        if (depth == null) {
+            log.warn("cannot store sediment density '" + description
+                + "': no depth");
+            return null;
+        }
+
+        if (peer == null) {
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+
+            Query query = session.createQuery("from SedimentDensity where "
+                + "   river=:river and " + "   depth=:depth");
+
+            query.setParameter("river", river);
+            query.setParameter("depth", depth.getPeer());
+
+            List<SedimentDensity> density = query.list();
+
+            if (density.isEmpty()) {
+                log.debug("Create new SedimentDensity DB instance.");
+
+                peer = new SedimentDensity(river, depth.getPeer(),
+                    description);
+
+                session.save(peer);
+            }
+            else {
+                peer = density.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportSedimentDensityValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportSedimentDensityValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,101 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.SedimentDensity;
+import de.intevation.flys.model.SedimentDensityValue;
+
+
+public class ImportSedimentDensityValue {
+
+    private static final Logger log =
+        Logger.getLogger(ImportSedimentDensityValue.class);
+
+
+    protected SedimentDensityValue peer;
+
+    protected BigDecimal station;
+
+    protected BigDecimal shoreOffset;
+
+    protected BigDecimal density;
+
+    private BigDecimal year;
+
+    protected String description;
+
+
+    public ImportSedimentDensityValue(
+        BigDecimal station,
+        BigDecimal shoreOffset,
+        BigDecimal density,
+        BigDecimal year,
+        String     description
+    ) {
+        this.station     = station;
+        this.shoreOffset = shoreOffset;
+        this.density     = density;
+        this.year        = year;
+        this.description = description;
+    }
+
+
+    public void storeDependencies(SedimentDensity sedimentDensity) {
+        log.info("store dependencies");
+
+        getPeer(sedimentDensity);
+    }
+
+
+    public SedimentDensityValue getPeer(SedimentDensity sedimentDensity) {
+        log.info("get peer");
+
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+
+            Query query = session.createQuery(
+                "from SedimentDensityValue where " +
+                "   sedimentDensity=:sedimentDensity and " +
+                "   station=:station and " +
+                "   shoreOffset=:shoreOffset and " +
+                "   density=:density and " +
+                "   year=:year and " +
+                "   description=:description");
+
+            query.setParameter("sedimentDensity", sedimentDensity);
+            query.setParameter("station", station);
+            query.setParameter("shoreOffset", shoreOffset);
+            query.setParameter("density", density);
+            query.setParameter("year", year);
+            query.setParameter("description", description);
+
+            List<SedimentDensityValue> values = query.list();
+            if (values.isEmpty()) {
+                log.debug("Create new SedimentDensityValue DB instance.");
+
+                peer = new SedimentDensityValue(
+                    sedimentDensity,
+                    station,
+                    shoreOffset,
+                    density,
+                    year,
+                    description);
+
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportSedimentYield.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportSedimentYield.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,121 @@
+package de.intevation.flys.importer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.GrainFraction;
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.SedimentYield;
+import de.intevation.flys.model.TimeInterval;
+import de.intevation.flys.model.Unit;
+
+
+public class ImportSedimentYield {
+
+    private static Logger log = Logger.getLogger(ImportSedimentYield.class);
+
+    private ImportGrainFraction grainFraction;
+
+    private ImportUnit unit;
+
+    private ImportTimeInterval timeInterval;
+
+    private String description;
+
+    private List<ImportSedimentYieldValue> values;
+
+    private SedimentYield peer;
+
+    public ImportSedimentYield(String description) {
+        this.values = new ArrayList<ImportSedimentYieldValue>();
+        this.description = description;
+    }
+
+    public void setTimeInterval(ImportTimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    public void setUnit(ImportUnit unit) {
+        this.unit = unit;
+    }
+
+    public void setGrainFraction(ImportGrainFraction grainFraction) {
+        this.grainFraction = grainFraction;
+    }
+
+    public void addValue(ImportSedimentYieldValue value) {
+        this.values.add(value);
+    }
+
+    public void storeDependencies(River river) {
+        log.debug("store dependencies");
+
+        if (grainFraction != null) {
+            grainFraction.storeDependencies();
+        }
+
+        SedimentYield peer = getPeer(river);
+
+        if (peer != null) {
+            int i = 0;
+
+            for (ImportSedimentYieldValue value : values) {
+                value.storeDependencies(peer);
+                i++;
+            }
+
+            log.info("stored " + i + " sediment yield values.");
+        }
+    }
+
+    public SedimentYield getPeer(River river) {
+        log.debug("get peer");
+
+        GrainFraction gf = grainFraction != null ? grainFraction.getPeer()
+            : null;
+
+        Unit u = unit != null ? unit.getPeer() : null;
+
+        TimeInterval ti = timeInterval != null ? timeInterval.getPeer() : null;
+
+        if (ti == null || u == null) {
+            log.warn("Skip invalid SedimentYield: time interval or unit null!");
+            return null;
+        }
+
+        if (peer == null) {
+            Session session = ImporterSession.getInstance()
+                .getDatabaseSession();
+            Query query = session.createQuery("from SedimentYield where "
+                + "   river=:river and "
+                + "   grainFraction=:grainFraction and " + "   unit=:unit and "
+                + "   timeInterval=:timeInterval and "
+                + "   description=:description");
+
+            query.setParameter("river", river);
+            query.setParameter("grainFraction", gf);
+            query.setParameter("unit", u);
+            query.setParameter("timeInterval", ti);
+            query.setParameter("description", description);
+
+            List<SedimentYield> yields = query.list();
+            if (yields.isEmpty()) {
+                log.debug("create new SedimentYield");
+
+                peer = new SedimentYield(river, u, ti, gf, description);
+                session.save(peer);
+            }
+            else {
+                peer = yields.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportSedimentYieldValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportSedimentYieldValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,58 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.SedimentYield;
+import de.intevation.flys.model.SedimentYieldValue;
+
+
+public class ImportSedimentYieldValue {
+
+    private Double station;
+    private Double value;
+
+    private SedimentYieldValue peer;
+
+
+    public ImportSedimentYieldValue(Double station, Double value) {
+        this.station = station;
+        this.value   = value;
+    }
+
+
+    public void storeDependencies(SedimentYield sedimentYield) {
+        getPeer(sedimentYield);
+    }
+
+
+    public SedimentYieldValue getPeer(SedimentYield sedimentYield) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from SedimentYieldValue where " +
+                "   sedimentYield=:sedimentYield and " +
+                "   station=:station and " +
+                "   value=:value"
+            );
+
+            query.setParameter("sedimentYield", sedimentYield);
+            query.setParameter("station", station);
+            query.setParameter("value", value);
+
+            List<SedimentYieldValue> values = query.list();
+            if (values.isEmpty()) {
+                peer = new SedimentYieldValue(sedimentYield, station, value);
+                session.save(peer);
+            }
+            else {
+                peer = values.get(0);
+            }
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportTimeInterval.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportTimeInterval.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,98 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.TimeInterval;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+import java.util.Date;
+
+import org.apache.log4j.Logger;
+
+public class ImportTimeInterval
+{
+    private static Logger log = Logger.getLogger(ImportTimeInterval.class);
+
+    protected Date startTime;
+    protected Date stopTime;
+
+    protected TimeInterval peer;
+
+    public ImportTimeInterval() {
+    }
+
+    public ImportTimeInterval(Date startTime) {
+        this.startTime = startTime;
+        this.stopTime = null;
+    }
+
+    public ImportTimeInterval(Date startTime, Date stopTime) {
+	Date start;
+	Date stop;
+	if (startTime == null) {
+	    start = stopTime;
+	    stop = null;
+	}
+	else {
+	    start = startTime;
+	    stop = stopTime;
+	}
+
+        if (stop != null && start.after(stop)) {
+            this.stopTime = start;
+            this.startTime = stop;
+        }
+        else {
+            this.startTime = start;
+            this.stopTime  = stop;
+        }
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getStopTime() {
+        return stopTime;
+    }
+
+    public void setStopTime(Date stopTime) {
+        this.stopTime = stopTime;
+    }
+
+    public TimeInterval getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            if (startTime == null) {
+                log.error("Null Start time will be ignored.");
+            }
+            Query query;
+            if (stopTime == null) {
+                query = session.createQuery(
+                    "from TimeInterval where startTime=:a and stopTime is null");
+            }
+            else {
+                query = session.createQuery(
+                    "from TimeInterval where startTime=:a and stopTime=:b");
+                query.setParameter("b", stopTime);
+            }
+            query.setParameter("a", startTime);
+
+            List<TimeInterval> intervals = query.list();
+            if (intervals.isEmpty()) {
+                peer = new TimeInterval(startTime, stopTime);
+                session.save(peer);
+            }
+            else {
+                peer = intervals.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportUnit.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportUnit.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,52 @@
+package de.intevation.flys.importer;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.model.Unit;
+
+
+public class ImportUnit
+{
+    private static final Logger log = Logger.getLogger(ImportUnit.class);
+
+    protected String name;
+
+    protected Unit peer;
+
+
+    public ImportUnit(String name) {
+        this.name = name;
+    }
+
+
+    public String getName() {
+        return name;
+    }
+
+
+    public Unit getPeer() {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery("from Unit where name=:name");
+            query.setParameter("name", name);
+
+            List<Unit> units = query.list();
+            if (units.isEmpty()) {
+                log.info("Store new unit '" + name + "'");
+
+                peer = new Unit(name);
+                session.save(peer);
+            }
+            else {
+                peer = units.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportWst.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportWst.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,130 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.Wst;
+import de.intevation.flys.model.River;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ImportWst
+{
+    private static Logger log = Logger.getLogger(ImportWst.class);
+
+    protected String description;
+
+    protected Integer kind;
+
+    protected List<ImportWstColumn> columns;
+
+    protected ImportUnit unit;
+
+    /** Wst as in db. */
+    protected Wst peer;
+
+    public ImportWst() {
+        kind = 0;
+        columns = new ArrayList<ImportWstColumn>();
+    }
+
+    public ImportWst(String description) {
+        this();
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public Integer getKind() {
+        return kind;
+    }
+
+    public void setKind(Integer kind) {
+        this.kind = kind;
+    }
+
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /** Create columns that can be accessed with getColumn. */
+    public void setNumberColumns(int numColumns) {
+        for (int i = 0; i < numColumns; ++i) {
+            columns.add(new ImportWstColumn(this, null, null, i));
+        }
+    }
+
+    public int getNumberColumns() {
+        return columns.size();
+    }
+
+    public ImportWstColumn getColumn(int index) {
+        return columns.get(index);
+    }
+
+    public List<ImportWstColumn> getColumns() {
+        return columns;
+    }
+
+    /** Adds a column. Assumes that columns wst is this instance. */
+    public void addColumn(ImportWstColumn column) {
+        columns.add(column);
+    }
+
+    public ImportUnit getUnit() {
+        return unit;
+    }
+
+    public void setUnit(ImportUnit unit) {
+        this.unit = unit;
+    }
+
+    public void storeDependencies(River river) {
+
+        log.info("store '" + description + "'");
+        Wst wst = getPeer(river);
+
+        for (ImportWstColumn column: columns) {
+            column.storeDependencies(river);
+        }
+
+        Session session = ImporterSession.getInstance().getDatabaseSession();
+        session.flush();
+    }
+
+    public void fixRangesOrder() {
+        for (ImportWstColumn column: columns) {
+            column.fixRangesOrder();
+        }
+    }
+
+    /** Get corresponding mapped wst (from database). */
+    public Wst getPeer(River river) {
+        if (peer == null) {
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from Wst where " +
+                "river=:river and description=:description and kind=:kind");
+            query.setParameter("river",       river);
+            query.setParameter("description", description);
+            query.setParameter("kind",        kind);
+            List<Wst> wsts = query.list();
+            if (wsts.isEmpty()) {
+                peer = new Wst(river, description, kind);
+                session.save(peer);
+            }
+            else {
+                peer = wsts.get(0);
+            }
+
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportWstColumn.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportWstColumn.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,160 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.Wst;
+import de.intevation.flys.model.WstColumn;
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.TimeInterval;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import java.math.BigDecimal;
+
+import org.apache.log4j.Logger;
+
+
+/** Unmapped column of a WST. */
+public class ImportWstColumn
+{
+    private static Logger log = Logger.getLogger(ImportWstColumn.class);
+
+    protected ImportWst wst;
+    protected String    name;
+    protected String    description;
+    protected Integer   position;
+
+    protected ImportTimeInterval timeInterval;
+
+    protected List<ImportWstColumnQRange> columnQRanges;
+    protected List<ImportWstColumnValue>  columnValues;
+
+    protected WstColumn peer;
+
+    public ImportWstColumn() {
+        columnQRanges = new ArrayList<ImportWstColumnQRange>();
+        columnValues  = new ArrayList<ImportWstColumnValue>();
+    }
+
+    public ImportWstColumn(
+        ImportWst wst,
+        String    name,
+        String    description,
+        Integer   position
+    ) {
+        this();
+        this.wst         = wst;
+        this.name        = name;
+        this.description = description;
+        this.position    = position;
+    }
+
+    public ImportWst getWst() {
+        return wst;
+    }
+
+    public void setWst(ImportWst wst) {
+        this.wst = wst;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Integer getPosition() {
+        return position;
+    }
+
+    public void setPosition(Integer position) {
+        this.position = position;
+    }
+
+    public void addColumnValue(BigDecimal position, BigDecimal w) {
+        columnValues.add(
+            new ImportWstColumnValue(this, position, w));
+    }
+
+    public void addColumnQRange(ImportWstQRange columnQRange) {
+        columnQRanges.add(
+            new ImportWstColumnQRange(this, columnQRange));
+    }
+
+
+    /** Get the Column Values stored in this column. */
+    public List<ImportWstColumnValue> getColumnValues() {
+        return columnValues;
+    }
+
+
+    public void storeDependencies(River river) {
+        log.info("store column '" + name + "'");
+        WstColumn column = getPeer(river);
+
+        for (ImportWstColumnQRange columnQRange: columnQRanges) {
+            columnQRange.getPeer(river);
+        }
+
+        for (ImportWstColumnValue columnValue: columnValues) {
+            columnValue.getPeer(river);
+        }
+    }
+
+    public ImportTimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(ImportTimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    /** Get corresponding mapped wst-column (from database). */
+    public WstColumn getPeer(River river) {
+        if (peer == null) {
+            Wst w = wst.getPeer(river);
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from WstColumn where " +
+                "wst=:wst and name=:name and description=:description" +
+                " and position=:position");
+            query.setParameter("wst",         w);
+            query.setParameter("name",        name);
+            query.setParameter("description", description);
+            query.setParameter("position",    position);
+
+            TimeInterval ti = timeInterval != null
+                ? timeInterval.getPeer()
+                : null;
+
+            List<WstColumn> columns = query.list();
+            if (columns.isEmpty()) {
+                peer = new WstColumn(w, name, description, position, ti);
+                session.save(peer);
+            }
+            else {
+                peer = columns.get(0);
+            }
+        }
+        return peer;
+    }
+
+    public void fixRangesOrder() {
+        for (ImportWstColumnQRange wcqr: columnQRanges) {
+            wcqr.fixRangesOrder();
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportWstColumnQRange.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportWstColumnQRange.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,73 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.WstColumnQRange;
+import de.intevation.flys.model.WstQRange;
+import de.intevation.flys.model.WstColumn;
+import de.intevation.flys.model.River;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+public class ImportWstColumnQRange
+{
+    protected ImportWstColumn wstColumn;
+    protected ImportWstQRange qRange;
+
+    protected WstColumnQRange peer;
+
+    public ImportWstColumnQRange() {
+    }
+
+    public ImportWstColumnQRange(
+        ImportWstColumn wstColumn,
+        ImportWstQRange qRange
+    ) {
+        this.wstColumn = wstColumn;
+        this.qRange    = qRange;
+    }
+
+    public ImportWstColumn getWstColumn() {
+        return wstColumn;
+    }
+
+    public void setWstColumn(ImportWstColumn wstColumn) {
+        this.wstColumn = wstColumn;
+    }
+
+    public ImportWstQRange getQRange() {
+        return qRange;
+    }
+
+    public void setQRange(ImportWstQRange qRange) {
+        this.qRange = qRange;
+    }
+
+    public void fixRangesOrder() {
+        qRange.fixRangesOrder();
+    }
+
+    public WstColumnQRange getPeer(River river) {
+        if (peer == null) {
+            WstColumn c = wstColumn.getPeer(river);
+            WstQRange q = qRange.getPeer(river);
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from WstColumnQRange where " +
+                "wstColumn=:c and wstQRange=:q");
+            query.setParameter("c", c);
+            query.setParameter("q", q);
+            List<WstColumnQRange> cols = query.list();
+            if (cols.isEmpty()) {
+                peer = new WstColumnQRange(c, q);
+                session.save(peer);
+            }
+            else {
+                peer = cols.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportWstColumnValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportWstColumnValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,68 @@
+package de.intevation.flys.importer;
+
+import de.intevation.flys.model.WstColumnValue;
+import de.intevation.flys.model.WstColumn;
+import de.intevation.flys.model.River;
+
+import java.math.BigDecimal;
+
+import org.apache.log4j.Logger;
+
+public class ImportWstColumnValue
+{
+    protected Logger logger = Logger.getLogger(ImportWstColumnValue.class);
+
+    protected BigDecimal      position;
+    protected BigDecimal      w;
+    protected ImportWstColumn wstColumn;
+
+    protected WstColumnValue  peer;
+
+    public ImportWstColumnValue() {
+    }
+
+    public ImportWstColumnValue(
+        ImportWstColumn wstColumn,
+        BigDecimal      position,
+        BigDecimal      w
+    ) {
+        this.wstColumn = wstColumn;
+        this.position  = position;
+        this.w         = w;
+    }
+
+    public BigDecimal getPosition() {
+        return position;
+    }
+
+    public void setPosition(BigDecimal position) {
+        this.position = position;
+    }
+
+    public BigDecimal getW() {
+        return w;
+    }
+
+    public void setW(BigDecimal w) {
+        this.w = w;
+    }
+
+    public ImportWstColumn getWstColumn() {
+        return wstColumn;
+    }
+
+    public void setWstColumn(ImportWstColumn wstColumn) {
+        this.wstColumn = wstColumn;
+    }
+
+    public WstColumnValue getPeer(River river) {
+        if (peer == null) {
+            WstColumn c = wstColumn.getPeer(river);
+            peer = ImporterSession.getInstance().getWstColumnValue(
+                c, position, w);
+        }
+
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImportWstQRange.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImportWstQRange.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,73 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+
+import de.intevation.flys.model.WstQRange;
+import de.intevation.flys.model.River;
+import de.intevation.flys.model.Range;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import java.util.List;
+
+public class ImportWstQRange
+{
+    protected ImportRange range;
+    protected BigDecimal  q;
+
+    protected WstQRange peer;
+
+    public ImportWstQRange() {
+    }
+
+    public ImportWstQRange(
+        ImportRange range,
+        BigDecimal  q
+    ) {
+        this.range = range;
+        this.q     = q;
+    }
+
+    public ImportRange getRange() {
+        return range;
+    }
+
+    public void setRange(ImportRange range) {
+        this.range = range;
+    }
+
+    public BigDecimal getQ() {
+        return q;
+    }
+
+    public void setQ(BigDecimal q) {
+        this.q = q;
+    }
+
+    public void fixRangesOrder() {
+        range.fixRangesOrder();
+    }
+
+    public WstQRange getPeer(River river) {
+        if (peer == null) {
+            Range r = range.getPeer(river);
+            Session session = ImporterSession.getInstance().getDatabaseSession();
+            Query query = session.createQuery(
+                "from WstQRange where " +
+                "range=:range and q=:q");
+            query.setParameter("range", r);
+            query.setParameter("q",     q);
+            List<WstQRange> wstQRanges = query.list();
+            if (wstQRanges.isEmpty()) {
+                peer = new WstQRange(r, q);
+                session.save(peer);
+            }
+            else {
+                peer = wstQRanges.get(0);
+            }
+        }
+        return peer;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/Importer.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/Importer.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,200 @@
+package de.intevation.flys.importer;
+
+import de.intevation.artifacts.common.utils.XMLUtils;
+
+import de.intevation.flys.importer.parsers.AnnotationClassifier;
+import de.intevation.flys.importer.parsers.BundesWasserStrassenParser;
+import de.intevation.flys.importer.parsers.InfoGewParser;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import java.sql.SQLException;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Transaction;
+import org.hibernate.HibernateException;
+
+import org.w3c.dom.Document;
+
+import de.intevation.flys.utils.StringUtil;
+
+/** Data Importer. Further processing happens per-river. */
+public class Importer
+{
+    /** Private logger. */
+    private static Logger log = Logger.getLogger(Importer.class);
+
+    private static String BWASTR_ID_CSV_FILE = "BWASTR_ID.csv";
+
+    protected List<ImportRiver> rivers;
+
+    public Importer() {
+    }
+
+    public Importer(List<ImportRiver> rivers) {
+        this.rivers = rivers;
+    }
+
+    public List<ImportRiver> getRivers() {
+        return rivers;
+    }
+
+    public void setRivers(List<ImportRiver> rivers) {
+        this.rivers = rivers;
+    }
+
+    /** Write rivers and their dependencies/dependants to db. */
+    public void writeRivers() {
+        log.debug("write rivers started");
+
+        for (ImportRiver river: rivers) {
+            log.debug("writing river '" + river.getName() + "'");
+            river.storeDependencies();
+            ImporterSession.getInstance().getDatabaseSession().flush();
+        }
+
+        log.debug("write rivers finished");
+    }
+
+    public void writeToDatabase() {
+
+        Transaction tx = null;
+
+        try {
+            tx = ImporterSession.getInstance()
+                .getDatabaseSession().beginTransaction();
+
+            try {
+                writeRivers();
+            }
+            catch (HibernateException he) {
+                Throwable t = he.getCause();
+                while (t instanceof SQLException) {
+                    SQLException sqle = (SQLException) t;
+                    log.error("SQL exeception chain:", sqle);
+                    t = sqle.getNextException();
+                }
+                throw he;
+            }
+
+            tx.commit();
+        }
+        catch (RuntimeException re) {
+            if (tx != null) {
+                tx.rollback();
+            }
+            throw re;
+        }
+    }
+
+    public static AnnotationClassifier getAnnotationClassifier() {
+        String annotationTypes = Config.INSTANCE.getAnnotationTypes();
+
+        if (annotationTypes == null) {
+            log.info("no annotation types file configured.");
+            return null;
+        }
+
+        File file = new File(annotationTypes);
+
+        log.info("use annotation types file '" + file + "'");
+
+        if (!(file.isFile() && file.canRead())) {
+            log.warn("annotation type file '" + file + "' is not readable.");
+            return null;
+        }
+
+        Document rules = XMLUtils.parseDocument(file);
+
+        if (rules == null) {
+            log.warn("cannot parse annotation types file.");
+            return null;
+        }
+
+        return new AnnotationClassifier(rules);
+    }
+
+
+    /** Starting point for importing river data. */
+    public static void main(String [] args) {
+
+        InfoGewParser infoGewParser = new InfoGewParser(
+            getAnnotationClassifier());
+
+        log.info("Start parsing rivers...");
+
+        File bwastrFile = null;
+
+        for (String gew: args) {
+            log.info("parsing info gew file: " + gew);
+            File gewFile = new File(gew);
+            if (bwastrFile == null) {
+                bwastrFile = new File(gewFile.getParentFile(), BWASTR_ID_CSV_FILE);
+            }
+            try {
+                infoGewParser.parse(gewFile);
+            }
+            catch (IOException ioe) {
+                log.error("error while parsing gew: " + gew, ioe);
+                System.exit(1);
+            }
+        }
+
+        String gew = Config.INSTANCE.getInfoGewFile();
+        if (gew != null && gew.length() > 0) {
+            log.info("parsing info gew file: " + gew);
+            File gewFile = new File(gew);
+            if (bwastrFile == null) {
+                bwastrFile = new File(gewFile.getParentFile(), BWASTR_ID_CSV_FILE);
+            }
+            try {
+                infoGewParser.parse(gewFile);
+            }
+            catch (IOException ioe) {
+                log.error("error while parsing gew: " + gew, ioe);
+                System.exit(1);
+            }
+        }
+
+        // Look for official numbers.
+        BundesWasserStrassenParser bwastrIdParser =
+            new BundesWasserStrassenParser();
+
+        // Read bwastFile (river-dir + BWASTR_ID_CSV_FILE).
+        if (!Config.INSTANCE.skipBWASTR()) {
+            try{
+                bwastrIdParser.parse(bwastrFile);
+                HashMap<String,Long> map = bwastrIdParser.getMap();
+
+                // Now link rivers with official numbers.
+                for(ImportRiver river: infoGewParser.getRivers()) {
+                    for(Map.Entry<String, Long> entry: map.entrySet()) {
+                        if (StringUtil.containsIgnoreCase(entry.getKey(), river.getName())) {
+                            river.setOfficialNumber(entry.getValue());
+                            log.debug(river.getName() + " is mapped to bwastr " + entry.getValue());
+                        }
+                    }
+                }
+            } catch (IOException ioe) {
+                log.warn("BWASTR-file could not be loaded.");
+            }
+        }
+        else {
+            log.debug("skip reading BWASTR_ID.csv");
+        }
+
+        if (!Config.INSTANCE.dryRun()) {
+            new Importer(infoGewParser.getRivers()).writeToDatabase();
+        }
+        else {
+            log.info("Dry run, not writing to database.");
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ImporterSession.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ImporterSession.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,187 @@
+package de.intevation.flys.importer;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
+import java.math.BigDecimal;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.FlushMode;
+
+import de.intevation.flys.backend.SessionFactoryProvider;
+
+import de.intevation.flys.model.WstColumnValue;
+import de.intevation.flys.model.WstColumn;
+import de.intevation.flys.model.DischargeTableValue;
+import de.intevation.flys.model.DischargeTable;
+import de.intevation.flys.model.Range;
+import de.intevation.flys.model.River;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.common.utils.LRUCache;
+
+public class ImporterSession
+{
+    private static Logger log = Logger.getLogger(ImporterSession.class);
+
+    private static final ThreadLocal<ImporterSession> SESSION =
+        new ThreadLocal<ImporterSession>() {
+            @Override
+            protected ImporterSession initialValue() {
+                return new ImporterSession();
+            }
+        };
+
+    protected Session databaseSession;
+
+    protected LRUCache<Integer, Map<ValueKey, WstColumnValue>>
+        wstColumnValues;
+
+    protected LRUCache<Integer, Map<ValueKey, DischargeTableValue>>
+        dischargeTableValues;
+
+    protected LRUCache<Integer, Map<ValueKey, Range>>
+        ranges;
+
+    public static ImporterSession getInstance() {
+        return SESSION.get();
+    }
+
+    public ImporterSession() {
+        SessionFactory sessionFactory =
+            SessionFactoryProvider.createSessionFactory();
+        databaseSession = sessionFactory.openSession();
+        //databaseSession.setFlushMode(FlushMode.MANUAL);
+
+        wstColumnValues =
+            new LRUCache<Integer, Map<ValueKey, WstColumnValue>>();
+
+        dischargeTableValues =
+            new LRUCache<Integer, Map<ValueKey, DischargeTableValue>>();
+
+        ranges = new LRUCache<Integer, Map<ValueKey, Range>>();
+    }
+
+    public Session getDatabaseSession() {
+        return databaseSession;
+    }
+
+    public WstColumnValue getWstColumnValue(
+        WstColumn  column,
+        BigDecimal position,
+        BigDecimal w
+    ) {
+        Integer c = column.getId();
+
+        Map<ValueKey, WstColumnValue> map = wstColumnValues.get(c);
+
+        if (map == null) {
+            map = new TreeMap<ValueKey, WstColumnValue>(
+                ValueKey.EPSILON_COMPARATOR);
+            wstColumnValues.put(c, map);
+            Query query = databaseSession.createQuery(
+                "from WstColumnValue where wstColumn.id=:cid");
+            query.setParameter("cid", c);
+            for (Iterator iter = query.iterate(); iter.hasNext();) {
+                WstColumnValue wcv = (WstColumnValue)iter.next();
+                map.put(new ValueKey(wcv.getPosition(), wcv.getW()), wcv);
+            }
+        }
+
+        ValueKey key = new ValueKey(position, w);
+
+        WstColumnValue wcv = map.get(key);
+
+        if (wcv != null) {
+            return wcv;
+        }
+
+        wcv = new WstColumnValue(column, position, w);
+
+        databaseSession.save(wcv);
+
+        map.put(key, wcv);
+
+        return wcv;
+    }
+
+    public DischargeTableValue getDischargeTableValue(
+        DischargeTable table,
+        BigDecimal     q,
+        BigDecimal     w
+    ) {
+        Integer t = table.getId();
+
+        Map<ValueKey, DischargeTableValue> map =
+            dischargeTableValues.get(t);
+
+        if (map == null) {
+            map = new TreeMap<ValueKey, DischargeTableValue>(
+                ValueKey.EPSILON_COMPARATOR);
+            dischargeTableValues.put(t, map);
+            Query query = databaseSession.createQuery(
+                "from DischargeTableValue where dischargeTable.id=:tid");
+            query.setParameter("tid", t);
+            for (Iterator iter = query.iterate(); iter.hasNext();) {
+                DischargeTableValue dctv = (DischargeTableValue)iter.next();
+                map.put(new ValueKey(dctv.getQ(), dctv.getW()), dctv);
+            }
+        }
+
+        ValueKey key = new ValueKey(q, w);
+
+        DischargeTableValue dctv = map.get(key);
+
+        if (dctv != null) {
+            return dctv;
+        }
+
+        dctv = new DischargeTableValue(table, q, w);
+
+        databaseSession.save(dctv);
+
+        map.put(key, dctv);
+
+        return dctv;
+    }
+
+    public Range getRange(River river, BigDecimal a, BigDecimal b) {
+        Integer r = river.getId();
+
+        Map<ValueKey, Range> map = ranges.get(r);
+
+        if (map == null) {
+            map = new TreeMap<ValueKey, Range>(
+                ValueKey.EPSILON_COMPARATOR);
+            ranges.put(r, map);
+            Query query = databaseSession.createQuery(
+                "from Range where river.id=:rid");
+            query.setParameter("rid", r);
+            for (Iterator iter = query.iterate(); iter.hasNext();) {
+                Range range = (Range)iter.next();
+                map.put(new ValueKey(range.getA(), range.getB()), range);
+            }
+        }
+
+        ValueKey key = new ValueKey(a, b);
+
+        Range range = map.get(key);
+
+        if (range != null) {
+            return range;
+        }
+
+        range = new Range(a, b, river);
+
+        databaseSession.save(range);
+
+        map.put(key, range);
+
+        return range;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/ValueKey.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/ValueKey.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,63 @@
+package de.intevation.flys.importer;
+
+import java.math.BigDecimal;
+
+import java.util.Comparator;
+
+public class ValueKey
+{
+    public static final double EPSILON = 1e-6;
+
+    public static final Comparator<ValueKey> EPSILON_COMPARATOR =
+        new Comparator<ValueKey>()
+    {
+        public int compare(ValueKey x, ValueKey y) {
+            int cmp = ValueKey.compare(x.a, y.a);
+            if (cmp != 0) return cmp;
+            return ValueKey.compare(x.b, y.b);
+        }
+    };
+
+    public static int compare(BigDecimal a, BigDecimal b) {
+        if (a == null && b == null) return  0;
+        if (a != null && b == null) return +1;
+        if (a == null && b != null) return -1;
+
+        double diff = a.doubleValue() - b.doubleValue();
+        if (diff < -EPSILON) return -1;
+        return diff > EPSILON ? +1 : 0;
+    }
+
+    protected BigDecimal a;
+    protected BigDecimal b;
+
+    public ValueKey() {
+    }
+
+    public ValueKey(BigDecimal a, BigDecimal b) {
+        this.a = a;
+        this.b = b;
+    }
+
+    @Override
+    public int hashCode() {
+        return ((a != null ? a.hashCode() : 0) << 16)
+              | (b != null ? b.hashCode() : 0);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof ValueKey)) {
+            return false;
+        }
+        ValueKey o = (ValueKey)other;
+        return !(
+               (a == null && o.a != null)
+            || (a != null && o.a == null)
+            || (a != null && !a.equals(o.a))
+            || (b == null && o.b != null)
+            || (b != null && o.b == null)
+            || (b != null && !b.equals(o.b)));
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/XY.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/XY.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,56 @@
+package de.intevation.flys.importer;
+
+
+/** Two doubles and an int index. */
+public class XY
+implements   Comparable<XY>
+{
+    public static final double X_EPSILON = 1e-4;
+
+    protected double x;
+    protected double y;
+    protected int    index;
+
+    public XY() {
+    }
+
+    public XY(double x, double y, int index) {
+        this.x     = x;
+        this.y     = y;
+        this.index = index;
+    }
+
+    @Override
+    public int compareTo(XY other) {
+        if (x + X_EPSILON < other.x) return -1;
+        if (x > other.x + X_EPSILON) return +1;
+        if (index < other.index)     return -1;
+        if (index > other.index)     return +1;
+        return 0;
+    }
+
+    public double getX() {
+        return x;
+    }
+
+    public void setX(double x) {
+        this.x = x;
+    }
+
+    public double getY() {
+        return y;
+    }
+
+    public void setY(double y) {
+        this.y = y;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/AnnotationClassifier.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/AnnotationClassifier.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,232 @@
+package de.intevation.flys.importer.parsers;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Element;
+
+import javax.xml.xpath.XPathConstants;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.common.utils.XMLUtils;
+
+import de.intevation.flys.importer.ImportAnnotationType;
+import de.intevation.flys.importer.Importer;
+
+public class AnnotationClassifier
+{
+    private static Logger log = Logger.getLogger(Importer.class);
+
+    public static final String TYPES_XPATH =
+        "/annotation/types/type";
+
+    public static final String FILE_PATTERNS_XPATH =
+        "/annotation/patterns/file";
+
+    public static final String DESCRIPTION_PATTERNS_XPATH =
+        "/annotation/patterns/line";
+
+
+    public static class Pair {
+
+        protected Pattern              pattern;
+        protected ImportAnnotationType annType;
+
+        public Pair(Pattern pattern, ImportAnnotationType annType) {
+            this.pattern  = pattern;
+            this.annType = annType;
+        }
+
+        public ImportAnnotationType match(String s) {
+            Matcher m = pattern.matcher(s);
+            return m.matches() ? annType : null;
+        }
+    } // class Pair
+
+
+    protected Map<String, ImportAnnotationType> types;
+    protected List<Pair>                        filePatterns;
+    protected List<Pair>                        descPatterns;
+
+    protected ImportAnnotationType defaultType;
+
+    public AnnotationClassifier() {
+    }
+
+    public AnnotationClassifier(Document rules) {
+        types        = new HashMap<String, ImportAnnotationType>();
+        filePatterns = new ArrayList<Pair>();
+        descPatterns = new ArrayList<Pair>();
+
+        buildRules(rules);
+    }
+
+    protected void buildRules(Document rules) {
+        buildTypes(rules);
+        buildFilePatterns(rules);
+        buildDescriptionPatterns(rules);
+    }
+
+    protected void buildTypes(Document rules) {
+
+        NodeList typeList = (NodeList)XMLUtils.xpath(
+            rules,
+            TYPES_XPATH,
+            XPathConstants.NODESET,
+            null);
+
+        if (typeList == null) {
+            log.info("no rules found.");
+            return;
+        }
+
+        for (int i = 0, N = typeList.getLength(); i < N; ++i) {
+            Element typeElement = (Element)typeList.item(i);
+            String name = typeElement.getAttribute("name");
+            if (name.length() == 0) {
+                log.warn("ANNCLASS: rule has no name");
+                continue;
+            }
+
+            ImportAnnotationType aic = new ImportAnnotationType(name);
+
+            types.put(name, aic);
+
+            if (typeElement.getAttribute("default").equals("true")) {
+                defaultType = aic;
+            }
+        }
+    }
+
+    protected void buildFilePatterns(Document rules) {
+
+        NodeList patternList = (NodeList)XMLUtils.xpath(
+            rules,
+            FILE_PATTERNS_XPATH,
+            XPathConstants.NODESET,
+            null);
+
+        if (patternList == null) {
+            log.info("no file patterns found.");
+            return;
+        }
+
+        for (int i = 0, N = patternList.getLength(); i < N; ++i) {
+            Element element = (Element)patternList.item(i);
+            Pair pair = buildPair(element);
+            if (pair != null) {
+                filePatterns.add(pair);
+            }
+        }
+    }
+
+    protected void buildDescriptionPatterns(Document rules) {
+
+        NodeList patternList = (NodeList)XMLUtils.xpath(
+            rules,
+            DESCRIPTION_PATTERNS_XPATH,
+            XPathConstants.NODESET,
+            null);
+
+        if (patternList == null) {
+            log.info("no line patterns found.");
+            return;
+        }
+
+        for (int i = 0, N = patternList.getLength(); i < N; ++i) {
+            Element element = (Element)patternList.item(i);
+            Pair pair = buildPair(element);
+            if (pair != null) {
+                descPatterns.add(pair);
+            }
+        }
+    }
+
+    protected Pair buildPair(Element element) {
+        String pattern = element.getAttribute("pattern");
+        String type    = element.getAttribute("type");
+
+        if (pattern.length() == 0) {
+            log.warn("ANNCLASS: pattern has no 'pattern' attribute.");
+            return null;
+        }
+
+        if (type.length() == 0) {
+            log.warn("ANNCLASS: pattern has no 'type' attribute.");
+            return null;
+        }
+
+        ImportAnnotationType annType = types.get(type);
+
+        if (annType == null) {
+            log.warn("ANNCLASS: pattern has unknown type '" + type + "'");
+            return null;
+        }
+
+        Pattern p;
+
+        try {
+            p = Pattern.compile(pattern,
+                    Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);
+        }
+        catch (IllegalArgumentException iae) {
+            log.warn("ANNCLASS: pattern '" + pattern + "' is invalid.", iae);
+            return null;
+        }
+
+        return new Pair(p, annType);
+    }
+
+    public ImportAnnotationType getDefaultType() {
+        return defaultType;
+    }
+
+    public ImportAnnotationType classifyFile(String filename) {
+        return classifyFile(filename, null);
+    }
+
+    public ImportAnnotationType classifyFile(
+        String                filename,
+        ImportAnnotationType def
+    ) {
+        if (filename.toLowerCase().endsWith(".km")) {
+            filename = filename.substring(0, filename.length()-3);
+        }
+
+        for (Pair pair: filePatterns) {
+            ImportAnnotationType annType = pair.match(filename);
+            if (annType != null) {
+                return annType;
+            }
+        }
+
+        return def;
+    }
+
+    public ImportAnnotationType classifyDescription(String description) {
+        return classifyDescription(description, null);
+    }
+
+    public ImportAnnotationType classifyDescription(
+        String                description,
+        ImportAnnotationType def
+    ) {
+        for (Pair pair: descPatterns) {
+            ImportAnnotationType annType = pair.match(description);
+            if (annType != null) {
+                return annType;
+            }
+        }
+
+        return def;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/AnnotationsParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/AnnotationsParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,198 @@
+package de.intevation.flys.importer.parsers;
+
+import java.util.HashMap;
+import java.util.TreeSet;
+import java.util.List;
+import java.util.ArrayList;
+
+import java.io.IOException;
+import java.io.File;
+import java.io.LineNumberReader;
+import java.io.InputStreamReader;
+import java.io.FileInputStream;
+
+import java.math.BigDecimal;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.importer.ImportAnnotation;
+import de.intevation.flys.importer.ImportRange;
+import de.intevation.flys.importer.ImportEdge;
+import de.intevation.flys.importer.ImportAnnotationType;
+import de.intevation.flys.importer.ImportAttribute;
+import de.intevation.flys.importer.ImportPosition;
+
+public class AnnotationsParser
+{
+    private static Logger log = Logger.getLogger(AnnotationsParser.class);
+
+    public static final String ENCODING = "ISO-8859-1";
+
+    public static final String [] TO_SCAN = {
+        "Basisdaten",
+        "Streckendaten",
+        ".." + File.separator +
+            "Morphologie" + File.separator + "Streckendaten"
+    };
+
+    protected HashMap<String, ImportAttribute> attributes;
+    protected HashMap<String, ImportPosition>  positions;
+    protected TreeSet<ImportAnnotation>        annotations;
+    protected AnnotationClassifier             classifier;
+
+    public AnnotationsParser() {
+        this(null);
+    }
+
+    public AnnotationsParser(AnnotationClassifier classifier) {
+        attributes  = new HashMap<String, ImportAttribute>();
+        positions   = new HashMap<String, ImportPosition>();
+        annotations = new TreeSet<ImportAnnotation>();
+        this.classifier = classifier;
+    }
+
+    public void parseFile(File file) throws IOException {
+        log.info("parsing km file: '" + file + "'");
+
+        ImportAnnotationType defaultIAT = null;
+
+        if (classifier != null) {
+            defaultIAT = classifier.classifyFile(
+                file.getName(),
+                classifier.getDefaultType());
+        }
+
+        LineNumberReader in = null;
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String line = null;
+            while ((line = in.readLine()) != null) {
+                if ((line = line.trim()).length() == 0
+                || line.startsWith("*")) {
+                    continue;
+                }
+
+                String [] parts = line.split("\\s*;\\s*");
+
+                if (parts.length < 3) {
+                    log.warn("ANN: not enough columns in line "
+                        + in.getLineNumber());
+                    continue;
+                }
+
+                ImportPosition position = positions.get(parts[0]);
+                if (position == null) {
+                    position = new ImportPosition(parts[0]);
+                    positions.put(parts[0], position);
+                }
+
+                ImportAttribute attribute = attributes.get(parts[1]);
+                if (attribute == null) {
+                    attribute = new ImportAttribute(parts[1]);
+                    attributes.put(parts[1], attribute);
+                }
+
+                String [] r = parts[2].replace(",", ".").split("\\s*#\\s*");
+
+                BigDecimal from, to;
+
+                try {
+                    from = new BigDecimal(r[0]);
+                    to   = r.length < 2 ? null : new BigDecimal(r[1]);
+                    if (to != null && from.compareTo(to) > 0) {
+                        BigDecimal t = from; from = to; to = t;
+                    }
+                }
+                catch (NumberFormatException nfe) {
+                    log.warn("ANN: invalid number in line " + in.getLineNumber());
+                    continue;
+                }
+
+                ImportEdge edge = null;
+
+                if (parts.length == 4) { // Only 'Unterkante'
+                    try {
+                        edge = new ImportEdge(
+                            null,
+                            new BigDecimal(parts[3].trim().replace(',', '.')));
+                    }
+                    catch (NumberFormatException nfe) {
+                        log.warn("ANN: cannot parse 'Unterkante' in line " +
+                            in.getLineNumber());
+                    }
+                }
+                else if (parts.length > 4) { // 'Unterkante' and 'Oberkante'
+                    String bottom = parts[3].trim().replace(',', '.');
+                    String top    = parts[4].trim().replace(',', '.');
+                    try {
+                        BigDecimal b = bottom.length() == 0
+                            ? null
+                            : new BigDecimal(bottom);
+                        BigDecimal t = top.length() == 0
+                            ? null
+                            : new BigDecimal(top);
+                        edge = new ImportEdge(t, b);
+                    }
+                    catch (NumberFormatException nfe) {
+                        log.warn(
+                            "ANN: cannot parse 'Unterkante' or 'Oberkante' in line "
+                            + in.getLineNumber());
+                    }
+                }
+
+                ImportRange range = new ImportRange(from, to);
+
+                ImportAnnotationType type = classifier != null
+                    ? classifier.classifyDescription(line, defaultIAT)
+                    : null;
+
+                ImportAnnotation annotation = new ImportAnnotation(
+                    attribute, position, range, edge, type);
+
+                if (!annotations.add(annotation)) {
+                    log.info("ANN: duplicated annotation '" + parts[0] +
+                        "' in line " + in.getLineNumber());
+                }
+            }
+        }
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+
+    public void parse(File root) throws IOException {
+
+        for (String toScan: TO_SCAN) {
+            File directory = FileTools.repair(new File(root, toScan));
+            if (!directory.isDirectory()) {
+                log.warn("ANN: '" + directory + "' is not a directory.");
+                continue;
+            }
+            File [] files = directory.listFiles();
+            if (files == null) {
+                log.warn("ANN: cannot list directory '" + directory + "'");
+                continue;
+            }
+
+            for (File file: files) {
+                if (file.isFile() && file.canRead()
+                && file.getName().toLowerCase().endsWith(".km")) {
+                    parseFile(file);
+                }
+            }
+        } // for all directories to scan
+    }
+
+    public List<ImportAnnotation> getAnnotations() {
+        return new ArrayList<ImportAnnotation>(annotations);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/AtFileParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/AtFileParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,222 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.math.BigDecimal;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportDischargeTable;
+import de.intevation.flys.importer.ImportDischargeTableValue;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+import java.util.Date;
+import java.util.Calendar;
+
+import de.intevation.flys.importer.ImportTimeInterval;
+
+/** Parse *.at (Abflusstafeln?) files. */
+public class AtFileParser {
+
+    public static final String ENCODING = "ISO-8859-1";
+
+    private static Logger logger = Logger.getLogger(AtFileParser.class);
+
+    // regular expression from hell to find out time range
+    public static final Pattern DATE_LINE = Pattern.compile(
+        "^\\*\\s*Abflu[^t]+tafel?\\s*([^\\d]+)"  +
+        "(\\d{1,2})?\\.?(\\d{1,2})?\\.?(\\d{2,4})\\s*(?:(?:bis)|-)?\\s*" +
+        "(?:(\\d{1,2})?\\.?(\\d{1,2})?\\.?(\\d{2,4}))?\\s*.*$");
+
+    public AtFileParser() {
+    }
+
+
+    public ImportDischargeTable parse(File file) throws IOException {
+        return parse(file, "", 0);
+    }
+
+    public ImportDischargeTable parse(
+        File   file,
+        String prefix,
+        int    kind
+    )
+    throws IOException {
+
+        logger.info("parsing AT file: " + file);
+
+        BufferedReader br = null;
+
+        String line       = null;
+
+        boolean beginning = true;
+
+        ImportDischargeTable dischargeTable =
+            new ImportDischargeTable(kind, prefix + file.getName());
+
+        Date from = null;
+        Date to   = null;
+
+        try {
+            br = new BufferedReader(
+                 new InputStreamReader(
+                 new FileInputStream(file), ENCODING));
+
+            while ((line = br.readLine()) != null) {
+
+                String tmp = line.trim();
+
+                if (tmp.length() == 0) {
+                    continue;
+                }
+
+                Matcher m = DATE_LINE.matcher(tmp);
+                if (m.matches()) {
+                    from = guessDate(m.group(2), m.group(3), m.group(4));
+                    to   = guessDate(m.group(5), m.group(6), m.group(7));
+                    if (from == null) {
+                        Date t = from; from = to; to = t;
+                    }
+                    continue;
+                }
+
+                if (tmp.startsWith("#! name=")) {
+                    // XXX Skip the name,  because we don't know where to save
+                    // it at the moment
+
+                    //String name = tmp.substring(8);
+                    continue;
+                }
+
+                if (tmp.startsWith("#") || tmp.startsWith("*")) {
+                    continue;
+                }
+
+                String[] splits = tmp.replace(',', '.').split("\\s+");
+
+                if ((splits.length < 2) || (splits.length > 11)) {
+                    logger.warn("Found an invalid row in the AT file.");
+                    continue;
+                }
+
+                String strW = splits[0].trim();
+                double W    = Double.parseDouble(strW);
+
+                /* shift is used to differenciate between lines with
+                 * exactly 10 Qs and lines with less than 10 Qs. The shift
+                 * is only modified when it is the first line.
+                 */
+                int shift = -1;
+
+                if (splits.length != 11 && beginning) {
+                    shift = 10 - splits.length;
+                }
+
+
+                for (int i = 1; i < splits.length; i++) {
+                    double iW = W + shift + i;
+                    double iQ = Double.parseDouble(splits[i].trim());
+
+                    dischargeTable.addDischargeTableValue(
+                        new ImportDischargeTableValue(
+                            new BigDecimal(iQ/100.0),
+                            new BigDecimal(iW/100.0)));
+                }
+
+                beginning = false;
+            }
+        }
+        catch (NumberFormatException pe) {
+            logger.warn("AT: invalid number " + pe.getMessage());
+        }
+        finally {
+            if (br != null) {
+                br.close();
+            }
+        }
+
+        if (from != null) {
+            if (to != null && from.compareTo(to) > 0) {
+                Date t = from; from = to; to = t;
+            }
+            logger.info("from: " + from + " to: " + to);
+            ImportTimeInterval interval = new ImportTimeInterval(from, to);
+            dischargeTable.setTimeInterval(interval);
+        }
+
+        logger.info("Finished parsing AT file: " + file);
+
+        return dischargeTable;
+    }
+
+    public static Date guessDate(String day, String month, String year) {
+        // TODO evaluate whether DateGuesser class can do that.
+        if (day == null && month == null && year == null) {
+            return null;
+        }
+
+        logger.debug("day: " + day + " month: " + month + " year: " + year);
+
+        int dayI = 15;
+        if (day != null) {
+            try {
+                dayI = Integer.parseInt(day.trim());
+            }
+            catch (NumberFormatException nfe) {
+            }
+        }
+
+        int monthI = 6;
+        if (month != null) {
+            try {
+                monthI = Integer.parseInt(month.trim());
+            }
+            catch (NumberFormatException nfe) {
+            }
+        }
+
+        int yearI = 1900;
+        if (year != null) {
+            try {
+                yearI = Integer.parseInt(year.trim());
+                if (yearI < 100) {
+                    if (yearI < 20) {
+                        yearI += 2000;
+                    }
+                    else {
+                        yearI += 1900;
+                    }
+                }
+            }
+            catch (NumberFormatException nfe) {
+            }
+        }
+
+        Calendar cal = Calendar.getInstance();
+        cal.set(yearI, monthI-1, dayI, 12, 0, 0);
+        long ms = cal.getTimeInMillis();
+        cal.setTimeInMillis(ms - ms%1000);
+        return cal.getTime();
+    }
+
+
+    /** Parse one or more files, (useful for debugging), */
+    public static void main(String [] args) {
+
+        AtFileParser parser = new AtFileParser();
+
+        try {
+            for (String arg: args) {
+                parser.parse(new File(arg));
+            }
+        } catch(Exception e) {
+            logger.error("Exception caught " + e);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightEpochParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightEpochParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,77 @@
+package de.intevation.flys.importer.parsers;
+
+import java.math.BigDecimal;
+
+import java.text.ParseException;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportBedHeight;
+import de.intevation.flys.importer.ImportBedHeightEpoch;
+import de.intevation.flys.importer.ImportBedHeightEpochValue;
+
+
+/** Parses BedHeightEpochs from csv file. */
+public class BedHeightEpochParser extends BedHeightParser {
+
+    /** Our own logger. */
+    private static final Logger log =
+        Logger.getLogger(BedHeightEpochParser.class);
+
+
+    @Override
+    protected ImportBedHeight newImportBedHeight(String description) {
+        return new ImportBedHeightEpoch(description);
+    }
+
+
+    /**
+     * Handle a non-comment, none-Metadata line of csv file, adding
+     * ImportBedHeightEpochValues to the given ImportBedHeight object.
+     */
+    @Override
+    protected void handleDataLine(ImportBedHeight obj, String line) {
+        String[] values = line.split(SEPERATOR_CHAR);
+
+        if (values == null || values.length == 0 || values[0].length() == 0) {
+            // There might be quite some ";" found.
+            //log.warn("Skip invalid data line: " + line);
+            return;
+        }
+
+        BigDecimal km;
+
+        try {
+            km = new BigDecimal(nf.parse(values[0]).doubleValue());
+        }
+        catch (ParseException e) {
+            log.warn("Unparseable number in data row: " + line);
+            return;
+        }
+
+
+        // Handle "gap" lines like '255,0;'
+        if (values.length < 2) {
+            ImportBedHeightEpochValue value = new ImportBedHeightEpochValue(
+                km,
+                null
+            );
+
+            obj.addValue(value);
+            return;
+        }
+
+        try {
+            ImportBedHeightEpochValue value = new ImportBedHeightEpochValue(
+                km,
+                new BigDecimal(nf.parse(values[1]).doubleValue())
+            );
+
+            obj.addValue(value);
+        }
+        catch (ParseException e) {
+            log.warn("Unparseable number in data row: " + line);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,411 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+
+import java.math.BigDecimal;
+
+import java.text.NumberFormat;
+import java.text.ParseException;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportBedHeight;
+import de.intevation.flys.importer.ImportBedHeightType;
+import de.intevation.flys.importer.ImportElevationModel;
+import de.intevation.flys.importer.ImportLocationSystem;
+import de.intevation.flys.importer.ImportRange;
+import de.intevation.flys.importer.ImportTimeInterval;
+import de.intevation.flys.importer.ImportUnit;
+import de.intevation.flys.model.BedHeightType;
+import de.intevation.flys.importer.ImporterSession;
+
+public abstract class BedHeightParser {
+
+    private static final Logger log =
+        Logger.getLogger(BedHeightParser.class);
+
+    public static final String ENCODING = "ISO-8859-1";
+
+    public static final Locale DEFAULT_LOCALE = Locale.GERMAN;
+
+    public static final String START_META_CHAR = "#";
+    public static final String SEPERATOR_CHAR  = ";";
+
+    public static final Pattern META_YEAR =
+        Pattern.compile("^Jahr: [^0-9]*(\\d*).*");
+
+    public static final Pattern META_TIMEINTERVAL =
+        Pattern.compile("^Zeitraum: Epoche (\\d*)-(\\d*).*");
+
+    public static final Pattern META_TYPE =
+        Pattern.compile("^Aufnahmeart: (.*).*");
+
+    public static final Pattern META_LOCATION_SYSTEM =
+        Pattern.compile("^Lagesystem: (.*).*");
+
+    public static final Pattern META_CUR_ELEVATION_SYSTEM =
+        Pattern.compile("^H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*");
+
+    public static final Pattern META_OLD_ELEVATION_SYSTEM =
+        Pattern.compile("^urspr.ngliches H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*");
+
+    public static final Pattern META_SOUNDING_WIDTH =
+        Pattern.compile("^ausgewertete Peilbreite: (\\d*).*");
+
+    public static final Pattern META_RANGE =
+        Pattern.compile("^Strecke:\\D*(\\d++.?\\d*) ?- ?(\\d++.?\\d*).*");
+
+    public static final Pattern META_EVALUATION_BY =
+        Pattern.compile("^Auswerter: (.*).*");
+
+    public static final Pattern META_COMMENTS =
+        Pattern.compile("^Weitere Bemerkungen: (.*).*");
+
+
+    protected static NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
+
+
+    protected List<ImportBedHeight> bedHeights;
+
+
+    protected abstract ImportBedHeight newImportBedHeight(String description);
+
+    /** Handle a line of file that contains data (in contrast to comments, meta). */
+    protected abstract void handleDataLine(
+        ImportBedHeight importBedHeight,
+        String          line
+    );
+
+
+
+    public BedHeightParser() {
+        this.bedHeights = new ArrayList<ImportBedHeight>();
+    }
+
+
+    public List<ImportBedHeight> getBedHeights() {
+        return bedHeights;
+    }
+
+
+    public void parse(File file) throws IOException {
+        log.info("Parsing bed height single file '" + file + "'");
+
+        ImportBedHeight obj = newImportBedHeight(file.getName());
+
+        LineNumberReader in = null;
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String line = null;
+            while ((line = in.readLine()) != null) {
+                if ((line = line.trim()).length() == 0) {
+                    continue;
+                }
+
+                if (line.startsWith(START_META_CHAR)) {
+                    handleMetaLine(obj, line);
+                }
+                else {
+                    handleDataLine(obj, line);
+                }
+            }
+
+            log.info("File contained " + obj.getValueCount() + " values.");
+            bedHeights.add(obj);
+        }
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+
+
+    protected static String stripMetaLine(String line) {
+        String tmp = line.substring(1, line.length());
+
+        if (tmp.startsWith(" ")) {
+            return tmp.substring(1, tmp.length());
+        }
+        else {
+            return tmp;
+        }
+    }
+
+
+    public static Date getDateFromYear(int year) {
+        Calendar cal = Calendar.getInstance();
+        cal.set(year, 0, 1);
+
+        return cal.getTime();
+    }
+
+
+    protected void handleMetaLine(ImportBedHeight obj, String line) {
+        String meta = stripMetaLine(line);
+
+        if (handleMetaYear(obj, meta)) {
+            return;
+        }
+        else if (handleMetaTimeInterval(obj, meta)) {
+            return;
+        }
+        else if (handleMetaSoundingWidth(obj, meta)) {
+            return;
+        }
+        else if (handleMetaComment(obj, meta)) {
+            return;
+        }
+        else if (handleMetaEvaluationBy(obj, meta)) {
+            return;
+        }
+        else if (handleMetaRange(obj, meta)) {
+            return;
+        }
+        else if (handleMetaType(obj, meta)) {
+            return;
+        }
+        else if (handleMetaLocationSystem(obj, meta)) {
+            return;
+        }
+        else if (handleMetaCurElevationModel(obj, meta)) {
+            return;
+        }
+        else if (handleMetaOldElevationModel(obj, meta)) {
+            return;
+        }
+        else {
+            log.warn("BHP: Meta line did not match any known type: " + line);
+        }
+    }
+
+
+    protected boolean handleMetaYear(ImportBedHeight obj, String line) {
+        Matcher m = META_YEAR.matcher(line);
+
+        if (m.matches()) {
+            String tmp = m.group(1);
+            if (tmp.length() > 0) {
+                obj.setYear(Integer.parseInt(tmp));
+            }
+            else {
+                log.warn("BHP: No year given.");
+            }
+            return true;
+        }
+
+        return false;
+    }
+
+
+    protected boolean handleMetaTimeInterval(ImportBedHeight obj, String line) {
+        Matcher m = META_TIMEINTERVAL.matcher(line);
+
+        if (m.matches()) {
+            String lo = m.group(1);
+            String up = m.group(2);
+
+            log.debug("Found time interval: " + lo + " - " + up);
+
+            try {
+                int lower = Integer.valueOf(lo);
+                int upper = Integer.valueOf(up);
+
+                Date fromYear = getDateFromYear(lower);
+                Date toYear   = getDateFromYear(upper);
+
+                obj.setTimeInterval(new ImportTimeInterval(fromYear, toYear));
+            }
+            catch (NumberFormatException e) {
+                log.warn("BHP: could not parse timeinterval", e);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    protected boolean handleMetaSoundingWidth(ImportBedHeight obj, String line) {
+        Matcher m = META_SOUNDING_WIDTH.matcher(line);
+
+        if (m.matches()) {
+            String tmp = m.group(1);
+
+            try {
+                obj.setSoundingWidth(Integer.valueOf(tmp));
+                return true;
+            }
+            catch (NumberFormatException e) {
+                log.warn("BHP: Could not parse sounding width: " + line, e);
+                log.warn("-> Set default value '0'");
+            }
+            obj.setSoundingWidth(0);
+        }
+
+        return false;
+    }
+
+
+    protected boolean handleMetaComment(ImportBedHeight obj, String line) {
+        Matcher m = META_COMMENTS.matcher(line);
+
+        if (m.matches()) {
+            String tmp = m.group(1);
+
+            obj.setDescription(tmp);
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    protected boolean handleMetaEvaluationBy(
+        ImportBedHeight obj,
+        String                line
+    ) {
+        Matcher m = META_EVALUATION_BY.matcher(line);
+
+        if (m.matches()) {
+            String tmp = m.group(1);
+            tmp = tmp.replace(";", "");
+
+            obj.setEvaluationBy(tmp);
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    protected boolean handleMetaRange(ImportBedHeight obj, String line) {
+        Matcher m = META_RANGE.matcher(line);
+
+        if (m.matches() && m.groupCount() >= 2) {
+            String a = m.group(1).replace(";", "");
+            String b = m.group(2).replace(";", "");
+
+            try {
+                BigDecimal lower = new BigDecimal(nf.parse(a).doubleValue());
+                BigDecimal upper = new BigDecimal(nf.parse(b).doubleValue());
+
+                obj.setRange(new ImportRange(lower, upper));
+
+                return true;
+            }
+            catch (ParseException e) {
+                log.warn("BHP: could not parse range", e);
+            }
+        }
+
+        return false;
+    }
+
+
+    protected boolean handleMetaType(ImportBedHeight obj, String line) {
+        Matcher m = META_TYPE.matcher(line);
+
+        if (m.matches()) {
+            String tmp = m.group(1).replace(";", "");
+
+            BedHeightType bht = BedHeightType.fetchBedHeightTypeForType(
+		tmp, ImporterSession.getInstance().getDatabaseSession());
+
+            if (bht != null) {
+                obj.setType(new ImportBedHeightType(bht));
+                return true;
+            }
+
+            log.warn("Unknown bed height type: '" + tmp + "'");
+        }
+
+        return false;
+    }
+
+
+    protected boolean handleMetaLocationSystem(
+        ImportBedHeight obj,
+        String          line
+    ) {
+        Matcher m = META_LOCATION_SYSTEM.matcher(line);
+
+        if (m.matches()) {
+            String tmp = m.group(1).replace(";", "");
+
+            obj.setLocationSystem(new ImportLocationSystem(tmp, tmp));
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    protected boolean handleMetaCurElevationModel(
+        ImportBedHeight obj,
+        String          line
+    ) {
+        Matcher m = META_CUR_ELEVATION_SYSTEM.matcher(line);
+
+        if (m.matches()) {
+            String name = m.group(1);
+            String num  = m.group(2);
+            String unit = m.group(3);
+
+            obj.setCurElevationModel(new ImportElevationModel(
+                name + " " + num,
+                new ImportUnit(unit)
+            ));
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    protected boolean handleMetaOldElevationModel(
+        ImportBedHeight obj,
+        String          line
+    ) {
+        Matcher m = META_OLD_ELEVATION_SYSTEM.matcher(line);
+
+        if (m.matches()) {
+            String name = m.group(1);
+            String num  = m.group(2);
+            String unit = m.group(3);
+
+            obj.setOldElevationModel(new ImportElevationModel(
+                name + " " + num,
+                new ImportUnit(unit)
+            ));
+
+            return true;
+        }
+
+        return false;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightSingleParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightSingleParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,105 @@
+package de.intevation.flys.importer.parsers;
+
+import java.math.BigDecimal;
+
+import java.text.ParseException;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportBedHeight;
+import de.intevation.flys.importer.ImportBedHeightSingle;
+import de.intevation.flys.importer.ImportBedHeightSingleValue;
+
+
+public class BedHeightSingleParser extends BedHeightParser {
+
+    private static final Logger log =
+        Logger.getLogger(BedHeightSingleParser.class);
+
+
+
+    @Override
+    protected ImportBedHeight newImportBedHeight(String description) {
+        return new ImportBedHeightSingle(description);
+    }
+
+
+
+    /**
+     * Create ImportBedHeightSingleValue from a line of csv file, add
+     * it to the ImportBedHeight.
+     */
+    @Override
+    protected void handleDataLine(ImportBedHeight obj, String line) {
+        String[] values = line.split(SEPERATOR_CHAR);
+
+        if (values == null || (values.length != 1 && values.length < 6)) {
+            //log.warn("BSP: Error while parsing data line: '" + line + "'");
+            return;
+        }
+
+        BigDecimal km;
+
+        try {
+            km = new BigDecimal(nf.parse(values[0]).doubleValue());
+        }
+        catch (ParseException e) {
+            // We expect a lot of ";;;;;;" lines.
+            //log.warn("BSP: Error while parsing km of data row.", e);
+            return;
+        }
+
+        // Handle gaps like "10,0;;;;;".
+        if (values.length == 1) {
+            ImportBedHeightSingleValue value = new ImportBedHeightSingleValue(
+                (ImportBedHeightSingle) obj,
+                km,
+                null, null, null, null, null);
+            obj.addValue(value);
+            return;
+        }
+
+        // Because we cannot enforce consistency of values with complete data
+        // via null constraints in the database (as there are "gap" values),
+        // do this checks manually.
+        if (values[3].length() == 0 || values[4].length() == 0
+            || values[5].length() == 0) {
+            //log.warn("BSP: Error while parsing data row (manual null constraint violated).");
+            return;
+        }
+
+        try {
+            ImportBedHeightSingleValue value = new ImportBedHeightSingleValue(
+                (ImportBedHeightSingle) obj,
+                km,
+                new BigDecimal(nf.parse(values[1]).doubleValue()),
+                new BigDecimal(nf.parse(values[2]).doubleValue()),
+                new BigDecimal(nf.parse(values[3]).doubleValue()),
+                parseBigDecimal(values[4], line),
+                new BigDecimal(nf.parse(values[5]).doubleValue())
+            );
+
+            obj.addValue(value);
+        }
+        catch (ParseException e) {
+            log.warn("BSP: unparseable value in data row.", e);
+        }
+    }
+    
+    private BigDecimal parseBigDecimal(String value, String line) {
+        BigDecimal result = null;
+        try {
+            Double dValue = Double.valueOf(value.replace(",", "."));
+            result = new BigDecimal(dValue.doubleValue());
+        }
+        catch (NumberFormatException nfe) {
+            log.warn(
+                "Could not parse " +
+                value +
+                " in bed heigt single row: "
+                + line);
+        }
+        return result;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/BundesWasserStrassenParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/BundesWasserStrassenParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,76 @@
+package de.intevation.flys.importer.parsers;
+
+import java.util.HashMap;
+
+import org.apache.log4j.Logger;
+
+/** Parse CSV file that contains official numbers for rivers. */
+public class BundesWasserStrassenParser extends LineParser {
+
+    /** Private logger. */
+    private static final Logger logger =
+        Logger.getLogger(BundesWasserStrassenParser.class);
+
+    /** Map from rivernames to Official numbers. */
+    private HashMap<String,Long> numberMap;
+
+
+    public BundesWasserStrassenParser() {
+        numberMap = new HashMap<String,Long>();
+    }
+
+
+    /** No need to reset. */
+    @Override
+    protected void reset() {
+    }
+
+
+    /** No action needed on eof. */
+    @Override
+    protected void finish() {
+    }
+
+
+    /** Handle a line of the bwastr-id file. */
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        String[] vals = line.split(",");
+        // Try both "," and ";" as separator.
+        if (vals.length != 2) {
+            vals = line.split(";");
+            if (vals.length != 2) {
+                logger.warn("Invalid bwastr-id line:\n" + line);
+                return;
+            }
+        }
+        try {
+            String name = unwrap(vals[0].toLowerCase());
+            String numberStr = unwrap(vals[1]);
+            Long number = Long.valueOf(numberStr);
+            numberMap.put(name, number);
+        }
+        catch (NumberFormatException e) {
+            logger.warn("Invalid number in bwastr-id line:\n" + line);
+        }
+    }
+
+
+    /** Get river -> official number mapping. */
+    public HashMap<String,Long> getMap() {
+        return numberMap;
+    }
+
+
+    /** Remove leading and trailing quotes. */
+    protected String unwrap(String input) {
+        if (input.startsWith("\"")) {
+            input = input.substring(1);
+        }
+        if (input.endsWith("\"")) {
+            input = input.substring(0, input.length() - 1);
+        }
+        return input;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/CrossSectionParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/CrossSectionParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,22 @@
+package de.intevation.flys.importer.parsers;
+
+import de.intevation.flys.importer.XY;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+public interface CrossSectionParser {
+
+    public String getDescription();
+
+    public Integer getYear();
+
+    public Map<Double,List<XY>> getData();
+
+    public interface Callback {
+        boolean accept(File file);
+        void    parsed(CrossSectionParser parser);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/DA50Parser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/DA50Parser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,145 @@
+package de.intevation.flys.importer.parsers;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.List;
+import java.util.TreeMap;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.XY;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.utils.EpsilonComparator;
+
+
+/**
+ * To create cross-sections, generate: Map<double,list<xy>> from files
+ * in da50 format.
+ */
+public class DA50Parser extends LineParser implements CrossSectionParser
+{
+    /** Private logger. */
+    private static Logger logger = Logger.getLogger(DA50Parser.class);
+
+    /** The current line to which add points. */
+    private List<XY> currentLine;
+
+    /** Data collected so far, last element will be currentLine. */
+    protected Map<Double, List<XY>> data;
+
+
+    /** Trivial constructor. */
+    public DA50Parser() {
+        data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP);
+    }
+
+
+    /** Get the description of the cross section parsed. */
+    @Override
+    public String getDescription() {
+        return FileTools.removeExtension(getFileName());
+    }
+
+
+    /** Get the year of this cross sections measurement. */
+    @Override
+    public Integer getYear() {
+        return null;
+    }
+
+
+    /**
+     * Return the data parsed.
+     * @return map of stations (km) to list of points.
+     */
+    @Override
+    public Map<Double, List<XY>> getData() {
+        return data;
+    }
+
+
+    /** Walk a directory tree and attempt parsing all *.d50 files. */
+    public void parseDA50s(File root, final Callback callback) {
+
+        FileTools.walkTree(root, new FileTools.FileVisitor() {
+            @Override
+            public boolean visit(File file) {
+                // TODO check presence of TIM file.
+                if (file.isFile() && file.canRead()
+                && file.getName().toLowerCase().endsWith(".d50")
+                && (callback == null || callback.accept(file))) {
+                    reset();
+                    try {
+                        parse(file);
+                        logger.info("parsing done");
+                        if (callback != null) {
+                            callback.parsed(DA50Parser.this);
+                        }
+                    }
+                    catch (IOException ioe) {
+                        logger.error("IOException while parsing file");
+                        return false;
+                    }
+                }
+                return true;
+            }
+        });
+    }
+
+
+    /** Called before consuming first line of file. */
+    public void reset() {
+        data.clear();
+        currentLine = new ArrayList<XY>();
+    }
+
+
+    /**
+     * Called for each line. Try to extract info from a da50 line.
+     */
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        String pointId  = line.substring(0,2);
+        String streetId = line.substring(2,9);
+        String station  = line.substring(9,18);
+        String free     = line.substring(18,20);
+        String gkLRight = line.substring(20,30);
+        String gkLHigh  = line.substring(30,40);
+        String gkRRight = line.substring(40,50);
+        String gkRHigh  = line.substring(50,60);
+        String distance = line.substring(60,70);
+
+        // TODO Intersect/Correlate these with e.g. TIM files.
+        // TODO note that as-is these points are really useless.
+        currentLine = new ArrayList<XY>();
+        currentLine.add(new XY(0, 10,0));
+        currentLine.add(new XY(Double.parseDouble(distance), 10, 1));
+    }
+
+
+    /** Called when file is fully consumed. */
+    @Override
+    protected void finish() {
+        logger.info("Parsed " + data.size() + " lines");
+    }
+
+
+    /** Parses files given as arguments. */
+    public static void main(String [] args) {
+
+        DA50Parser parser = new DA50Parser();
+
+        logger.warn("Start parsing files.");
+        for (String arg: args) {
+            parser.parseDA50s(new File(arg), null);
+            logger.warn("Parsing a file.");
+        }
+        logger.error("Finished parsing files.");
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/DA66Parser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/DA66Parser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,459 @@
+package de.intevation.flys.importer.parsers;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.importer.XY;
+
+import de.intevation.flys.utils.EpsilonComparator;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * To create cross-sections, generate: Map<double,list<xy>> from files
+ * in da66 format.
+ */
+public class DA66Parser extends LineParser implements CrossSectionParser
+{
+    /** Private logger. */
+    private static Logger logger = Logger.getLogger(DA66Parser.class);
+
+    private static String HEAD_HEAD = "00";
+    private static String HEAD_GEOM = "66"; // "Values"
+    private static String HEAD_ENDG = "88"; // Probably never used.
+
+    /** Regex to match lines of files in da66 format. */
+    private static final Pattern LINE_PATTERN =
+        Pattern.compile("^([0-9 -]{2})" + // Type (00|66|88)
+                        "([0-9 -]{5})" + // unset
+                        "([0-9 -]{2})" + // id
+                        "([0-9 -]{9})" + // station
+                        "([0-9 -]{2})" + // running number
+                        "([0-9 -]{1})?" + // point id
+                        /*
+                        Would be great if we could express the pattern as this:
+                        ([0-9 -]{1})([0-9 -JKMLMNOPQR]{7})([0-9 -]{7})+
+                        */
+                        "([0-9 -JKMLMNOPQR]{7})?" + // y
+                        "([0-9 -]{7})?" + // z
+                        "([0-9 -]{1})?" + // point id
+                        "([0-9 -JKMLMNOPQR]{7})?" + // y
+                        "([0-9 -]{7})?" + // z
+                        "([0-9 -]{1})?" + // point id
+                        "([0-9 -JKMLMNOPQR]{7})?" + // y
+                        "([0-9 -]{7})?" + // z
+                        "([0-9 -]{1})?" + // point id
+                        "([0-9 -JKMLMNOPQR]{7})?" + // y
+                        "([0-9 -]{7})?" // z
+                        );
+
+
+    /** Indices to match group of main regex. */
+    private static enum FIELD {
+        HEAD      ( 1),
+        UNSET     ( 2),
+        ID        ( 3),
+        STATION   ( 4),
+        RUNNR     ( 5),
+        POINT_1_ID( 6),
+        POINT_1_Y ( 7),
+        POINT_1_Z ( 8),
+        POINT_2_ID( 9),
+        POINT_2_Y (10),
+        POINT_2_Z (11),
+        POINT_3_ID(12),
+        POINT_3_Y (13),
+        POINT_3_Z (14),
+        POINT_4_ID(15),
+        POINT_4_Y (16),
+        POINT_4_Z (17);
+
+        private int idx;
+        FIELD(int idx) {
+            this.idx = idx;
+        }
+        int getIdx() {
+            return idx;
+        }
+    }
+
+
+    /** Header lines of da66 can define a type. */
+    private static enum Type {
+        DATE                     ( 0),
+        HEKTOSTONE_LEFT          ( 1), //grm. "Standlinie"
+        HEKTOSTONE_RIGHT         ( 2),
+        CHANNEL_LEFT             ( 3), //grm. "Fahrrinne"
+        CHANNEL_RIGHT            ( 4),
+        CHANNEL_2_LEFT           ( 5),
+        CHANNEL_2_RIGHT          ( 6),
+        GIW_1972                 ( 7),
+        GROIN_DIST_LEFT          ( 8), //grm. "Buhnenkopfabstand links"
+        GROIN_HEIGHT_LEFT        ( 9),
+        GROIN_SLOPE_LEFT         (10),
+        GROIN_DIST_RIGHT         (11),
+        GROIN_HEIGHT_RIGHT       (12),
+        GROIN_SLOPE_RIGHT        (13),
+        STRIKE_LEFT              (14), //grm. "Streichlinie links"
+        AXIS                     (15),
+        STRIKE_RIGHT             (16),
+        GROIN_BACK_SLOPE_LEFT    (17), //grm. "Buhnenrueckenneigung"
+        GROIN_BACK_SLOPE_RIGHT   (18),
+        GIW_1932                 (19),
+        GIW_1982                 (20),
+        STAND_ISLAND_1           (21),
+        STAND_ISLAND_2           (22),
+        STAND_ISLAND_3           (23),
+        STAND_ISLAND_4           (24),
+        UNSPECIFIED_1            (25),
+        UNSPECIFIED_2            (26),
+        HHW                      (27),
+        OLD_PROFILE_NULL         (28),
+        AW_1978                  (29),
+        SIGN_LEFT                (30),
+        SIGN_RIGHT               (31),
+        DIST_SIGNAL_CHANNEL_LEFT (32),
+        DIST_SIGNAL_CHANNEL_RIGHT(33),
+        UNSPECIFIED_3            (34),
+        UNSPECIFIED_4            (35),
+        UNSPECIFIED_5            (36),
+        UNSPECIFIED_6            (37),
+        SHORE_LEFT               (38),
+        SHORE_RIGHT              (39),
+        UNSPECIFIED_7            (40);
+
+        private final int id;
+        Type(int id) {
+            this.id = id;
+        }
+        public int getId() {
+            return id;
+        }
+    }
+
+
+    /** Available types. */
+    private static HashMap<Integer, Type> typeMap;
+
+
+    /** Types we can deal with. */
+    private static List<Type> implementedTypes;
+
+
+    static {
+        typeMap = new HashMap<Integer, Type>();
+        for (Type t: Type.values()) {
+            typeMap.put(new Integer(t.getId()), t);
+        }
+        // TODO populate and respect header type.
+        implementedTypes = new ArrayList<Type>();
+        //implementedTypes.add(..);
+    }
+
+
+    /** The current line to which add points. */
+    private List<XY> currentLine;
+
+
+    /** Data collected so far, last element will be currentLine. */
+    protected Map<Double, List<XY>> data;
+
+
+    /** Trivial constructor. */
+    public DA66Parser() {
+        data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP);
+    }
+
+
+    /** Get the description of the cross section parsed. */
+    @Override
+    public String getDescription() {
+        return FileTools.removeExtension(getFileName());
+    }
+
+
+    /** Get the year of this cross sections measurement. */
+    @Override
+    public Integer getYear() {
+        return null;
+    }
+
+
+    /**
+     * Return the data parsed.
+     * @return map of stations (km) to list of points.
+     */
+    @Override
+    public Map<Double, List<XY>> getData() {
+        return data;
+    }
+
+
+    /**
+     * Walk a directory tree, parse its *.da66 files and store the
+     * data found.
+     */
+    public void parseDA66s(File root, final Callback callback) {
+
+        FileTools.walkTree(root, new FileTools.FileVisitor() {
+            @Override
+            public boolean visit(File file) {
+                if (file.isFile() && file.canRead()
+                && file.getName().toLowerCase().endsWith(".d66")
+                && (callback == null || callback.accept(file))) {
+                    reset();
+                    try {
+                        parse(file);
+                        logger.info("parsing done");
+                        if (callback != null) {
+                            callback.parsed(DA66Parser.this);
+                        }
+                    }
+                    catch (IOException ioe) {
+                        logger.error("IOException while parsing file");
+                        return false;
+                    }
+                }
+                return true;
+            }
+        });
+    }
+
+
+    /**
+     * Get the Index of the last cross-section lines point.
+     * @return last points index, -1 if not available.
+     */
+    private int lastPointIdx() {
+        if (currentLine == null || currentLine.isEmpty()) {
+            return -1;
+        }
+        XY lastPoint = this.currentLine.get(currentLine.size()-1);
+        return lastPoint.getIndex();
+    }
+
+
+    /** Returns station, deciding if it could in cm, in which case convert. */
+    private double stationInKm(double station) {
+        if (station > 10000) {
+            return station/100000d;
+        }
+        else {
+            return station;
+        }
+    }
+
+
+    /** Apply the convention how to deal with numbers < -99.999 .*/
+    private String applyLetterConvention(String orig) {
+        if (orig.endsWith("-")) {
+            return "-" + orig.replace("-","");
+        }
+        else if (orig.endsWith("J")) {
+            return "-" + orig.replace("J","1");
+        }
+        else if (orig.endsWith("K")) {
+            return "-" + orig.replace("K","2");
+        }
+        else if (orig.endsWith("L")) {
+            return "-" + orig.replace("L","3");
+        }
+        else if (orig.endsWith("M")) {
+            return "-" + orig.replace("M","4");
+        }
+        else if (orig.endsWith("N")) {
+            return "-" + orig.replace("N","5");
+        }
+        else if (orig.endsWith("O")) {
+            return "-" + orig.replace("O","6");
+        }
+        else if (orig.endsWith("P")) {
+            return "-" + orig.replace("P","7");
+        }
+        else if (orig.endsWith("Q")) {
+            return "-" + orig.replace("Q","8");
+        }
+        else if (orig.endsWith("R")) {
+            return "-" + orig.replace("R","9");
+        }
+        else {
+            return orig;
+        }
+    }
+
+    /**
+     * Add a Point (YZ,Index) to the current cross section line.
+     * @param y The y coordinate of new point.
+     * @param z The z coordinate of new point.
+     * @param idx Ignored, the parameter of new point.
+     * @return true if point could been added, false otherwise (e.g. not
+     *         parsable y or z values.
+     */
+    private boolean addPoint(String y, String z, String idx) {
+        if (z == null || y == null || idx == null) {
+            logger.error("Incomplete point definition");
+            return false;
+        }
+
+        double iy;
+        double iz;
+        // Handle letter convention.
+        y = applyLetterConvention(y);
+        try {
+            iy = Double.parseDouble(y) / 1000d;
+            iz = Double.parseDouble(z) / 1000d;
+        }
+        catch(java.lang.NumberFormatException nfe) {
+            logger.error("Could not parse Number: " + nfe.getMessage());
+            return false;
+        }
+
+        // We ignore idx, and increment instead.
+        int index;
+        int lastPointIdx = lastPointIdx();
+        if (lastPointIdx <= 0) {
+            index = 1;
+        } else {
+            index = lastPointIdx + 1;
+        }
+
+        currentLine.add(new XY(iy, iz, index));
+        return true;
+    }
+
+
+    /** Called before consuming first line of file. */
+    public void reset() {
+        data.clear();
+        currentLine = new ArrayList<XY>();
+    }
+
+
+    /**
+     * Called for each line. Try to extract info from a da66 line.
+     */
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        String head = line.substring(0,2);
+        if (HEAD_HEAD.equals(head)) {
+                //logger.debug("New station");
+                Matcher m = LINE_PATTERN.matcher(line);
+                if (m.find()) {
+                    // Actually matches!
+                    // TODO 'move' last line to match river axis
+                    // TODO find river axis intersection
+                    currentLine = new ArrayList<XY>();
+                    double station = stationInKm(Double.parseDouble(m.group(FIELD.STATION.getIdx())));
+                    data.put(station, currentLine);
+                }
+                else {
+                    logger.error("HEAD line bad.");
+                }
+        }
+        else if (HEAD_GEOM.equals(head)) {
+            Matcher m = LINE_PATTERN.matcher(line);
+            if (m.find()) {
+                //logger.info("Station: " + m.group(FIELD.STATION.getIdx()));
+                // TODO if last station differs, error and abort
+                if (m.group(FIELD.POINT_1_ID.getIdx()) != null) {
+                    // Point 1
+                    if(addPoint(
+                        m.group(FIELD.POINT_1_Y.getIdx()),
+                        m.group(FIELD.POINT_1_Z.getIdx()),
+                        m.group(FIELD.POINT_1_ID.getIdx()))) {
+                        // Point added.
+                    }
+                    else {
+                        // Problematic point.
+                        logger.error("A point could not be added");
+                    }
+                }
+                if (m.group(FIELD.POINT_2_ID.getIdx()) != null) {
+                    // Point 2
+                    if(addPoint(
+                        m.group(FIELD.POINT_2_Y.getIdx()),
+                        m.group(FIELD.POINT_2_Z.getIdx()),
+                        m.group(FIELD.POINT_2_ID.getIdx()))) {
+                        // Point added.
+                    }
+                    else {
+                        // Problematic point.
+                        logger.error("A point could not be added");
+                    }
+                }
+                if (m.group(FIELD.POINT_3_ID.getIdx()) != null) {
+                    // Point 3
+                    if(addPoint(
+                        m.group(FIELD.POINT_3_Y.getIdx()),
+                        m.group(FIELD.POINT_3_Z.getIdx()),
+                        m.group(FIELD.POINT_3_ID.getIdx()))) {
+                        // Point added.
+                    }
+                    else {
+                        // Problematic point.
+                        logger.error("A point could not be added");
+                    }
+                }
+                if (m.group(FIELD.POINT_4_ID.getIdx()) != null) {
+                    // Point 4
+                    if(addPoint(
+                        m.group(FIELD.POINT_4_Y.getIdx()),
+                        m.group(FIELD.POINT_4_Z.getIdx()),
+                        m.group(FIELD.POINT_4_ID.getIdx()))) {
+                        // Point added.
+                    }
+                    else {
+                        // Problematic point.
+                        logger.error("A point could not be added");
+                    }
+                }
+            }
+            else {
+                logger.warn("Line could not be parsed: ");
+                logger.warn(line);
+            }
+        }
+        else if (HEAD_GEOM.equals(head)) {
+            logger.debug("Hit a 88");
+        }
+        else {
+            logger.error("Do not know how to treat da66 line:");
+            logger.error(line);
+        }
+    }
+
+
+    /** Called when file is fully consumed. */
+    @Override
+    protected void finish() {
+        // TODO 'move' last line to match river axis
+        logger.info("Parsed " + data.size() + " lines");
+    }
+
+
+    /** Parses files given as arguments. */
+    public static void main(String [] args) {
+
+        DA66Parser parser = new DA66Parser();
+
+        logger.warn("Start parsing files.");
+        for (String arg: args) {
+            parser.parseDA66s(new File(arg), null);
+            logger.warn("Parsing a file.");
+        }
+        logger.error("Finished parsing files.");
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/FlowVelocityMeasurementParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/FlowVelocityMeasurementParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,102 @@
+package de.intevation.flys.importer.parsers;
+
+import de.intevation.flys.importer.ImportFlowVelocityMeasurement;
+import de.intevation.flys.importer.ImportFlowVelocityMeasurementValue;
+
+import java.math.BigDecimal;
+
+import java.text.DateFormat;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+public class FlowVelocityMeasurementParser extends LineParser {
+
+    private static final Logger log =
+        Logger.getLogger(FlowVelocityMeasurementParser.class);
+
+    private static final NumberFormat nf =
+        NumberFormat.getInstance(DEFAULT_LOCALE);
+
+    private static final DateFormat df =
+        new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
+
+
+    private List<ImportFlowVelocityMeasurement> measurements;
+
+    private ImportFlowVelocityMeasurement current;
+
+
+    public FlowVelocityMeasurementParser() {
+        measurements = new ArrayList<ImportFlowVelocityMeasurement>();
+    }
+
+
+    public List<ImportFlowVelocityMeasurement> getMeasurements() {
+        return measurements;
+    }
+
+    @Override
+    protected void reset() {
+        current = new ImportFlowVelocityMeasurement();
+    }
+
+
+    @Override
+    protected void finish() {
+        current.setDescription(fileName);
+        measurements.add(current);
+    }
+
+
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        if (line.startsWith(START_META_CHAR)) {
+            handleMetaLine(stripMetaLine(line));
+        }
+        else {
+            handleDataLine(line);
+        }
+    }
+
+
+    public void handleMetaLine(String line) {
+    }
+
+
+    public void handleDataLine(String line) {
+        String[] cols = line.split(SEPERATOR_CHAR);
+
+        if (cols.length < 8) {
+            log.warn("skip invalid data line: '" + line + "'");
+            return;
+        }
+
+        try {
+            double km     = nf.parse(cols[1]).doubleValue();
+            double w      = nf.parse(cols[5]).doubleValue();
+            double q      = nf.parse(cols[6]).doubleValue();
+            double v      = nf.parse(cols[7]).doubleValue();
+
+            String timestr     = cols[3] + " " + cols[4];
+            String description = cols.length > 8 ? cols[8] : null;
+
+            current.addValue(new ImportFlowVelocityMeasurementValue(
+                df.parse(timestr),
+                new BigDecimal(km),
+                new BigDecimal(w),
+                new BigDecimal(q),
+                new BigDecimal(v),
+                description
+            ));
+        }
+        catch (ParseException pe) {
+            log.warn("Unparseable flow velocity values:", pe);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/FlowVelocityModelParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/FlowVelocityModelParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,269 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.math.BigDecimal;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportDischargeZone;
+import de.intevation.flys.importer.ImportFlowVelocityModel;
+import de.intevation.flys.importer.ImportFlowVelocityModelValue;
+import de.intevation.flys.utils.EpsilonComparator;
+
+
+public class FlowVelocityModelParser extends LineParser {
+
+    private static final Logger log =
+        Logger.getLogger(FlowVelocityModelParser.class);
+
+    private static final Pattern META_REGEX =
+        Pattern.compile(".*Rechnung (.*) \\(Pegel (.*)\\).*");
+
+    private static final Pattern META_GAUGE =
+        Pattern.compile("(.*) Q=(\\w*)m3/s");
+
+    private static final Pattern META_MAINVALUE_A =
+        Pattern.compile("([a-zA-Z]+)+(\\d+)*");
+
+    private static final Pattern META_MAINVALUE_B =
+        Pattern.compile("(([a-zA-Z]+)+(\\d+)*)\\s*-\\s*(([a-zA-Z]+)+(\\d+)*)");
+
+    private static final Pattern META_MAINVALUE_C =
+        Pattern.compile("([0-9]++)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)");
+
+    private static final Pattern META_MAINVALUE_D =
+        Pattern.compile("(([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)) bis (([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*))");
+
+    private static final Pattern META_MAINVALUE_E =
+        Pattern.compile("(([a-zA-Z]+)+(\\d+)*) bis (([a-zA-Z]+)+(\\d+)*)");
+
+    private static final NumberFormat nf =
+        NumberFormat.getInstance(DEFAULT_LOCALE);
+
+
+    private List<ImportFlowVelocityModel> models;
+
+    private ImportFlowVelocityModel current;
+
+    protected String description;
+
+    protected TreeSet<Double> kmExists;
+
+
+    public FlowVelocityModelParser() {
+        models = new ArrayList<ImportFlowVelocityModel>();
+        kmExists = new TreeSet<Double>(EpsilonComparator.CMP);
+    }
+
+
+    public List<ImportFlowVelocityModel> getModels() {
+        return models;
+    }
+
+    @Override
+    public void parse(File file) throws IOException {
+        description = file.getName();
+
+        super.parse(file);
+    }
+
+    @Override
+    protected void reset() {
+        current = new ImportFlowVelocityModel(description);
+        kmExists.clear();
+    }
+
+
+    @Override
+    protected void finish() {
+        models.add(current);
+
+	//	description = null;
+    }
+
+
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        if (line.startsWith(START_META_CHAR)) {
+            handleMetaLine(stripMetaLine(line));
+        }
+        else {
+            handleDataLine(line);
+        }
+    }
+
+
+    protected void handleMetaLine(String line) {
+        Matcher m = META_REGEX.matcher(line);
+
+        if (m.matches()) {
+            String mainValueStr = m.group(1);
+            String gaugeStr     = m.group(2);
+
+            Object[] valueData = handleMainValueString(mainValueStr);
+            Object[] gaugeData = handleGaugeString(gaugeStr);
+
+            if (valueData == null || valueData.length < 2) {
+                log.warn("skip invalid MainValue part: '" + line + "'");
+                return;
+            }
+
+            if (gaugeData == null || gaugeData.length < 2) {
+                log.warn("skip invalid gauge part: '" + line + "'");
+                return;
+            }
+
+            if (log.isDebugEnabled()) {
+                log.debug("Found meta information:");
+                log.debug("   Gauge: " + gaugeData[0]);
+                log.debug("   Value: " + gaugeData[1]);
+                log.debug("   Lower: " + valueData[0]);
+                log.debug("   upper: " + valueData[1]);
+            }
+
+            current.setDischargeZone(new ImportDischargeZone(
+                (String) gaugeData[0],
+                (BigDecimal) gaugeData[1],
+                (String) valueData[0],
+                (String) valueData[1]
+            ));
+        }
+    }
+
+
+    protected Object[] handleMainValueString(String mainValueStr) {
+        Matcher mA = META_MAINVALUE_A.matcher(mainValueStr);
+        if (mA.matches()) {
+            String name = mA.group(0);
+
+            return new Object[] { name, name };
+        }
+
+        Matcher mB = META_MAINVALUE_B.matcher(mainValueStr);
+        if (mB.matches()) {
+            String lower = mB.group(1);
+            String upper = mB.group(4);
+
+            return new Object[] { lower, upper };
+        }
+
+        Matcher mC = META_MAINVALUE_C.matcher(mainValueStr);
+        if (mC.matches()) {
+            String facA  = mC.group(1);
+            String nameA = mC.group(2);
+            String facB  = mC.group(3);
+            String nameB = mC.group(4);
+
+            String fac  = facA  != null ? facA  : facB;
+            String name = nameA != null ? nameA : nameB;
+
+            String mainValue = fac + " " + name;
+
+            return new Object[] { mainValue, mainValue };
+        }
+
+        Matcher mD = META_MAINVALUE_D.matcher(mainValueStr);
+        if (mD.matches()) {
+            String loFacA  = mD.group(2);
+            String loNameA = mD.group(3);
+            String loFacB  = mD.group(4);
+            String loNameB = mD.group(5);
+
+            String upFacA  = mD.group(7);
+            String upNameA = mD.group(8);
+            String upFacB  = mD.group(9);
+            String upNameB = mD.group(10);
+
+            String loFac  = loFacA  != null ? loFacA  : loFacB;
+            String loName = loNameA != null ? loNameA : loNameB;
+
+            String upFac  = upFacA  != null ? upFacA  : upFacB;
+            String upName = upNameA != null ? upNameA : upNameB;
+
+            String loMainValue = loFac + " " + loName;
+            String upMainValue = upFac + " " + upName;
+
+            return new Object[] { loMainValue, upMainValue };
+        }
+
+        Matcher mE = META_MAINVALUE_E.matcher(mainValueStr);
+        if (mE.matches()) {
+            String lower = mE.group(1);
+            String upper = mE.group(4);
+
+            return new Object[] { lower, upper };
+        }
+
+        return null;
+    }
+
+
+    protected Object[] handleGaugeString(String gaugeStr) {
+        Matcher m = META_GAUGE.matcher(gaugeStr);
+
+        if (m.matches()) {
+            String name = m.group(1);
+            String qStr = m.group(2);
+
+            try {
+                return new Object[] {
+                    name,
+                    new BigDecimal(nf.parse(qStr).doubleValue()) };
+            }
+            catch (ParseException pe) {
+                log.warn("Could not parse Q value: '" + qStr + "'");
+            }
+        }
+
+        return null;
+    }
+
+
+    protected void handleDataLine(String line) {
+        String[] cols = line.split(SEPERATOR_CHAR);
+
+        if (cols.length < 5) {
+            log.warn("skip invalid data line: '" + line + "'");
+            return;
+        }
+
+        try {
+            double km = nf.parse(cols[0]).doubleValue();
+
+            Double key = Double.valueOf(km);
+
+            if (kmExists.contains(key)) {
+                log.warn("duplicate stattion '" + km + "': -> ignored");
+                return;
+            }
+
+            double q      = nf.parse(cols[1]).doubleValue();
+            double total  = nf.parse(cols[2]).doubleValue();
+            double main   = nf.parse(cols[3]).doubleValue();
+            double stress = nf.parse(cols[4]).doubleValue();
+
+            current.addValue(new ImportFlowVelocityModelValue(
+                new BigDecimal(km),
+                new BigDecimal(q),
+                new BigDecimal(total),
+                new BigDecimal(main),
+                new BigDecimal(stress)
+            ));
+
+            kmExists.add(key);
+        }
+        catch (ParseException pe) {
+            log.warn("Unparseable flow velocity values:", pe);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/HYKParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/HYKParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,344 @@
+package de.intevation.flys.importer.parsers;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.importer.ImportHYK;
+import de.intevation.flys.importer.ImportHYKEntry;
+import de.intevation.flys.importer.ImportHYKFormation;
+import de.intevation.flys.importer.ImportHYKFlowZone;
+import de.intevation.flys.importer.ImportHYKFlowZoneType;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Date;
+import java.util.Calendar;
+
+import java.math.BigDecimal;
+
+import org.apache.log4j.Logger;
+
+public class HYKParser
+{
+    private static Logger log = Logger.getLogger(HYKParser.class);
+
+    public interface Callback {
+        boolean hykAccept(File file);
+        void    hykParsed(HYKParser parser);
+    } // interface Callback
+
+    public static enum State {
+        LINE_1, LINE_2, LINE_3, LINE_4, LINE_5, LINE_6
+    };
+
+    private static final String ENCODING = "ISO-8859-1";
+
+    protected Map<String, ImportHYKFlowZoneType> flowZoneTypes;
+
+    protected ImportHYK hyk;
+
+    public HYKParser() {
+        flowZoneTypes = new HashMap<String, ImportHYKFlowZoneType>();
+    }
+
+    public ImportHYK getHYK() {
+        return hyk;
+    }
+
+    private static Date yearToDate(Integer year) {
+        if (year == null) {
+            return null;
+        }
+        Calendar cal = Calendar.getInstance();
+        cal.set(year, 0, 1, 12, 0, 0);
+        long ms = cal.getTimeInMillis();
+        cal.setTimeInMillis(ms - ms%1000);
+        return cal.getTime();
+    }
+
+    public boolean parse(File file) {
+
+        boolean debug = log.isDebugEnabled();
+
+        log.info("Parsing HYK file '" + file + "'");
+
+        LineNumberReader in = null;
+
+        String description =
+            file.getParentFile().getName() + "/" + file.getName();
+
+        hyk = new ImportHYK(null, description);
+
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String line;
+
+            State state = State.LINE_1;
+
+            int numFormations = 0;
+
+            BigDecimal km         = null;
+            BigDecimal top        = null;
+            BigDecimal bottom     = null;
+            BigDecimal distanceVL = null;
+            BigDecimal distanceHF = null;
+            BigDecimal distanceVR = null;
+
+            Integer    year       = null;
+            int        numZones   = 0;
+
+            ImportHYKFlowZoneType [] fzts     = null;
+            BigDecimal            [] coords   = null;
+            int                      coordPos = 0;
+
+            ImportHYKEntry     entry     = null;
+            ImportHYKFormation formation = null;
+
+            while ((line = in.readLine()) != null) {
+
+                if (line.startsWith("*") || line.startsWith("----")) {
+                    continue;
+                }
+
+                line = line.trim();
+
+                if (state != State.LINE_5 && line.length() == 0) {
+                    continue;
+                }
+
+                String [] parts = line.split("\\s+");
+
+                if (debug) {
+                    log.debug("'" + line + "': " + state);
+                }
+
+                switch (state) {
+                    case LINE_1:
+                        if (parts.length < 2) {
+                            log.error("HYK 1: not enough elements in line " +
+                                in.getLineNumber());
+                            return false;
+                        }
+
+                        if (parts.length == 2) {
+                            // no year given
+                            year = null;
+                        }
+                        else {
+                            try {
+                                year = Integer.valueOf(parts[1]);
+                            }
+                            catch (NumberFormatException nfe) {
+                                log.error(
+                                    "year is not an integer in line " +
+                                    in.getLineNumber());
+                                return false;
+                            }
+                        }
+                        try {
+                            km = new BigDecimal(parts[0]);
+                            numFormations = Integer.parseInt(
+                                parts[parts.length > 2 ? 2 : 1]);
+                        }
+                        catch (NumberFormatException nfe) {
+                            log.error(
+                                "parsing number of formations " +
+                                "or km failed in line " + in.getLineNumber());
+                            return false;
+                        }
+                        entry = new ImportHYKEntry(hyk, km, yearToDate(year));
+                        hyk.addEntry(entry);
+
+                        state = State.LINE_2;
+                        break;
+
+                    case LINE_2:
+                        if (parts.length < 3) {
+                            log.error("HYK 2: not enough elements in line " +
+                                in.getLineNumber());
+                            return false;
+                        }
+                        try {
+                            numZones = Integer.parseInt(parts[0]);
+                            bottom   = new BigDecimal(parts[1]);
+                            top      = new BigDecimal(parts[2]);
+                        }
+                        catch (NumberFormatException nfe) {
+                            log.error(
+                                "HYK: parsing num zones, bottom or top height " +
+                                "failed in line " + in.getLineNumber());
+                            return false;
+                        }
+                        formation = new ImportHYKFormation();
+                        formation.setBottom(bottom);
+                        formation.setTop(top);
+                        entry.addFormation(formation);
+
+                        state = State.LINE_3;
+                        break;
+
+                    case LINE_3:
+                        if (parts.length != numZones) {
+                            log.error(
+                                "HYK: number of flow zones mismatches " +
+                                "in line " + in.getLineNumber());
+                            return false;
+                        }
+
+                        fzts = new ImportHYKFlowZoneType[parts.length];
+                        for (int i = 0; i < fzts.length; ++i) {
+                            fzts[i] = getFlowZoneType(parts[i]);
+                        }
+                        coords = new BigDecimal[numZones];
+                        state = State.LINE_4;
+                        break;
+
+                    case LINE_4:
+                        try {
+                            int N = Math.min(parts.length, coords.length);
+                            for (coordPos = 0; coordPos < N; ++coordPos) {
+                                coords[coordPos] =
+                                    new BigDecimal(parts[coordPos]);
+                            }
+                        }
+                        catch (NumberFormatException nfe) {
+                            log.error("HYK: cannot parse number in line " +
+                                in.getLineNumber());
+                            return false;
+                        }
+                        state = State.LINE_5;
+                        break;
+
+                    case LINE_5:
+                        if (parts.length + coordPos < coords.length) {
+                            log.error("HYK 5: not enough elements in line " +
+                                in.getLineNumber());
+                            return false;
+                        }
+                        try {
+                            for (int i = 0;
+                                i < parts.length && coordPos < coords.length;
+                                ++i, ++coordPos
+                            ) {
+                                coords[coordPos] = new BigDecimal(parts[i]);
+                            }
+                        }
+                        catch (NumberFormatException nfe) {
+                            log.error("HYK: cannot parse number in line " +
+                                in.getLineNumber());
+                            return false;
+                        }
+                        for (int i = 0; i < coords.length; ++i) {
+                            BigDecimal a = coords[i];
+                            BigDecimal b = coords[i == coords.length-1 ? i : i+1];
+                            if (a.compareTo(b) > 0) {
+                                log.warn("HYK: zone coordinates swapped in line " +
+                                    in.getLineNumber());
+                                BigDecimal c = a; a = b; b = c;
+                            }
+                            ImportHYKFlowZone zone = new ImportHYKFlowZone(
+                                formation, fzts[i], a, b);
+                            formation.addFlowZone(zone);
+                        }
+                        state = State.LINE_6;
+                        break;
+
+                    case LINE_6:
+                        if (parts.length < 3) {
+                            log.error("HYK 6: not enough elements in line " +
+                                in.getLineNumber());
+                            return false;
+                        }
+                        try {
+                            distanceVL = new BigDecimal(parts[0]);
+                            distanceHF = new BigDecimal(parts[1]);
+                            distanceVR = new BigDecimal(parts[2]);
+                        }
+                        catch (NumberFormatException nfe) {
+                            log.error("HYK: cannot parse number in line " +
+                                in.getLineNumber());
+                            return false;
+                        }
+                        formation.setDistanceVL(distanceVL);
+                        formation.setDistanceHF(distanceHF);
+                        formation.setDistanceVR(distanceVR);
+
+                        // continue with next formation.
+                        state = --numFormations > 0 // formations left?
+                            ? State.LINE_2
+                            : State.LINE_1;
+                        break;
+                }
+            }
+        }
+        catch (IOException ioe) {
+            log.error("HYK: Error reading file.", ioe);
+            return false;
+        }
+        finally {
+            if (in != null) {
+                try {
+                    in.close();
+                }
+                catch (IOException ioe) {
+                    log.error("HYK: Error closing file.", ioe);
+                }
+            }
+        }
+        return true;
+    }
+
+    protected ImportHYKFlowZoneType getFlowZoneType(String name) {
+        name = name.toUpperCase();
+        ImportHYKFlowZoneType fzt = flowZoneTypes.get(name);
+        if (fzt == null) {
+            log.info("New flow zone type: " + name);
+            fzt = new ImportHYKFlowZoneType(name);
+            flowZoneTypes.put(name, fzt);
+        }
+        return fzt;
+    }
+
+    protected void reset() {
+        hyk = null;
+    }
+
+    public void parseHYKs(File root, final Callback callback) {
+
+        FileTools.walkTree(root, new FileTools.FileVisitor() {
+            @Override
+            public boolean visit(File file) {
+                if (file.isFile() && file.canRead()
+                && file.getName().toLowerCase().endsWith(".hyk")
+                && (callback == null || callback.hykAccept(file))) {
+                    reset();
+                    boolean success = parse(file);
+                    log.info("parsing " + (success ? "succeeded" : "failed"));
+                    if (success && callback != null) {
+                        callback.hykParsed(HYKParser.this);
+                    }
+                }
+                return true;
+            }
+        });
+    }
+
+    public static void main(String [] args) {
+
+        HYKParser parser = new HYKParser();
+
+        for (String arg: args) {
+            parser.parseHYKs(new File(arg), null);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/InfoGewParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/InfoGewParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,138 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.importer.ImportRiver;
+
+
+/** Processes files mentioned in an info file for a river. */
+public class InfoGewParser
+{
+    private static Logger log = Logger.getLogger(InfoGewParser.class);
+
+    public static final String ENCODING = "ISO-8859-1";
+
+    public static final Pattern GEWAESSER =
+        Pattern.compile("^\\s*Gew\u00e4sser\\s*:\\s*(.+)");
+
+    public static final Pattern WST_DATEI =
+        Pattern.compile("^\\s*WSTDatei\\s*:\\s*(.+)");
+
+    public static final Pattern BB_INFO =
+        Pattern.compile("^\\s*B\\+B-Info\\s*:\\s*(.+)");
+
+    protected ArrayList<ImportRiver> rivers;
+
+    protected AnnotationClassifier annotationClassifier;
+
+    public InfoGewParser() {
+        this(null);
+    }
+
+    public InfoGewParser(AnnotationClassifier annotationClassifier) {
+        rivers = new ArrayList<ImportRiver>();
+        this.annotationClassifier = annotationClassifier;
+    }
+
+    public List<ImportRiver> getRivers() {
+        return rivers;
+    }
+
+    public static final String normalize(String f) {
+        return f.replace("\\", "/").replace("/", File.separator);
+    }
+
+    /** Handle a gew, wst, or bb_info file. */
+    public void parse(File file) throws IOException {
+
+        LineNumberReader in = null;
+
+        File root = file.getParentFile();
+
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String line = null;
+
+            String riverName  = null;
+            File   wstFile    = null;
+            File   bbInfoFile = null;
+
+            while ((line = in.readLine()) != null) {
+                if ((line = line.trim()).length() == 0) {
+                    continue;
+                }
+                Matcher m = GEWAESSER.matcher(line);
+
+                if (m.matches()) {
+                    String river = m.group(1);
+                    log.info("Found river '" + river + "'");
+                    if (riverName != null) {
+                        rivers.add(new ImportRiver(
+                            riverName,
+                            wstFile,
+                            bbInfoFile,
+                            annotationClassifier));
+                    }
+                    riverName  = river;
+                    wstFile    = null;
+                    bbInfoFile = null;
+                }
+                else if ((m = WST_DATEI.matcher(line)).matches()) {
+                    String wstFilename = m.group(1);
+                    File wst = new File(wstFilename = normalize(wstFilename));
+                    if (!wst.isAbsolute()) {
+                        wst = new File(root, wstFilename);
+                    }
+                    wst = FileTools.repair(wst);
+                    log.info("Found wst file '" + wst + "'");
+                    if (!wst.isFile() || !wst.canRead()) {
+                        log.warn("cannot access WST file '" + wstFilename + "'");
+                        continue;
+                    }
+                    wstFile = wst;
+                }
+                else if ((m = BB_INFO.matcher(line)).matches()) {
+                    //TODO: Make it relative to the wst file.
+                    String bbInfo = m.group(1);
+                    bbInfoFile = new File(normalize(bbInfo));
+                }
+            }
+            if (riverName != null) {
+                rivers.add(new ImportRiver(
+                    riverName,
+                    wstFile,
+                    bbInfoFile,
+                    annotationClassifier));
+            }
+        }
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+
+        for (ImportRiver river: rivers) {
+            river.parseDependencies();
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/LineParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/LineParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,139 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+
+import java.text.DateFormat;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * Base-Class for prasers for line-based file formats.
+ * Calls reset(), then read line by line, calling handleLine() for each,
+ * then calls finish().
+ */
+public abstract class LineParser {
+
+    /** Private logger. */
+    private static final Logger log = Logger.getLogger(LineParser.class);
+
+    public static final String ENCODING = "ISO-8859-1";
+
+    public static final Locale DEFAULT_LOCALE = Locale.GERMAN;
+
+    public static final String START_META_CHAR = "#";
+    public static final String SEPERATOR_CHAR  = ";";
+
+
+    protected abstract void handleLine(int lineNum, String line);
+
+    protected abstract void reset();
+
+    protected abstract void finish();
+
+    /** Name of file parsed. */
+    protected String fileName;
+
+    protected File inputFile;
+
+
+    /**
+     * This method reads each line of <i>file</i>. At the beginning,
+     * <i>reset()</i> is called; afterwards for each line <i>handleLine()</i> is
+     * called; at the end <i>finish</i> is called.
+     *
+     * @param file The file which should be parsed.
+     */
+    public void parse(File file) throws IOException {
+        log.info("Parsing file '" + file + "'");
+
+        inputFile = file;
+
+        fileName = file.getName();
+
+        reset();
+
+        LineNumberReader in = null;
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String line    = null;
+            int    lineNum = 1;
+            while ((line = in.readLine()) != null) {
+                if ((line = line.trim()).length() == 0) {
+                    lineNum++;
+                    continue;
+                }
+
+                handleLine(lineNum++, line);
+            }
+        }
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+
+        finish();
+    }
+
+
+    /** Returns the name of the file parsed. */
+    protected String getFileName() {
+        return fileName;
+    }
+
+    /** Returns the file currently parsed. */
+    protected File getInputFile() {
+        return inputFile;
+    }
+
+
+    protected static String stripMetaLine(String line) {
+        String tmp = line.substring(1, line.length());
+
+        if (tmp.startsWith(" ")) {
+            return tmp.substring(1, tmp.length());
+        }
+        else {
+            return tmp;
+        }
+    }
+
+    public static double getDouble(String doubleString) throws ParseException {
+        NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
+        Number value = nf.parse(doubleString);
+
+        return value.doubleValue();
+    }
+
+    public static Date getDate(String dateString) throws ParseException {
+        DateFormat df = SimpleDateFormat.getDateInstance(
+            SimpleDateFormat.MEDIUM, DEFAULT_LOCALE);
+
+        return df.parse(dateString);
+    }
+
+
+    public static Date getDateFromYear(int year) {
+        Calendar cal = Calendar.getInstance();
+        cal.set(year, 0, 1);
+
+        return cal.getTime();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/MeasurementStationsParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/MeasurementStationsParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,187 @@
+package de.intevation.flys.importer.parsers;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportMeasurementStation;
+import de.intevation.flys.importer.ImportRange;
+import de.intevation.flys.importer.ImportTimeInterval;
+
+
+public class MeasurementStationsParser extends LineParser {
+
+    public static class MeasurementStationParserException extends Exception {
+
+        private static final long serialVersionUID = 1L;
+
+        public MeasurementStationParserException(String msg) {
+            super(msg);
+        }
+    }
+
+    public static final int MIN_COLUMNS = 10;
+
+    private static final Logger log = Logger
+        .getLogger(MeasurementStationsParser.class);
+
+    private List<ImportMeasurementStation> measurementStations;
+    private ImportMeasurementStation current;
+
+    @Override
+    protected void reset() {
+        this.measurementStations = new ArrayList<ImportMeasurementStation>();
+    }
+
+    @Override
+    protected void finish() {
+    }
+
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        if (line == null || line.startsWith(START_META_CHAR)) {
+            log.info("skip meta information at line " + lineNum);
+            return;
+        }
+
+        try {
+            current = new ImportMeasurementStation();
+            handleDataLine(line);
+            measurementStations.add(current);
+        }
+        catch (MeasurementStationParserException e) {
+            log.warn("Problem in line " + lineNum + ": " + e.getMessage());
+        }
+    }
+
+    public List<ImportMeasurementStation> getMeasurementStations() {
+        return measurementStations;
+    }
+
+    protected void handleDataLine(String line)
+        throws MeasurementStationParserException {
+        String[] cols = line.split(SEPERATOR_CHAR);
+
+        if (cols == null || cols.length < MIN_COLUMNS) {
+            int num = cols != null ? cols.length : 0;
+            throw new MeasurementStationParserException("Not enough columns: "
+                + num);
+        }
+
+        current.name = getName(cols);
+        current.station = getStation(cols);
+        current.range = getRange(cols);
+        current.measurementType = getMeasurementType(cols);
+        current.riverside = getRiverside(cols);
+        current.gauge = getGauge(cols);
+        current.observationTimerange = getObservationTimerange(cols);
+        current.operator = getOperator(cols);
+        current.description = getDescription(cols);
+
+        log.debug("Found new measurement station '" + current.name + "' at km "
+            + current.station);
+    }
+
+    protected String getName(String[] cols)
+        throws MeasurementStationParserException {
+        if (cols[0] == null || cols[0].length() == 0) {
+            throw new MeasurementStationParserException("invalid name '"
+                + cols[0] + "'");
+        }
+
+        return cols[0];
+    }
+
+    protected double getStation(String[] cols)
+        throws MeasurementStationParserException {
+        if (cols[1] == null || cols[1].length() == 0) {
+            throw new MeasurementStationParserException("invalid station '"
+                + cols[1] + "'");
+        }
+
+        try {
+            return getDouble(cols[1]);
+        }
+        catch (ParseException e) {
+            throw new MeasurementStationParserException(
+                "unable to parse station: " + e.getMessage());
+        }
+    }
+
+    protected ImportRange getRange(String[] cols) {
+        if (cols[4] == null || cols[4].length() == 0) {
+            log.warn("No upper value for range found in '" + cols[4] + "'");
+            return null;
+        }
+
+        if (cols[5] == null || cols[5].length() == 0) {
+            log.warn("No upper value for range found in '" + cols[5] + "'");
+            return null;
+        }
+
+        try {
+            double lower = getDouble(cols[4]);
+            double upper = getDouble(cols[5]);
+
+            return new ImportRange(new BigDecimal(lower), new BigDecimal(upper));
+        }
+        catch (ParseException e) {
+            log.warn("unable to parse range: " + e.getMessage());
+            return null;
+        }
+    }
+
+    protected String getMeasurementType(String[] cols)
+        throws MeasurementStationParserException {
+        if (cols[2] == null || cols[2].length() == 0) {
+            throw new MeasurementStationParserException(
+                "invalid measurement type '" + cols[2] + "'");
+        }
+
+        return cols[2];
+    }
+
+    protected String getRiverside(String[] cols) {
+        return cols[3];
+    }
+
+    protected String getGauge(String[] cols) {
+        if (cols[6] == null || cols[6].length() == 0) {
+            log.warn("invalid gauge found: '" + cols[6] + "'");
+        }
+
+        return cols[6];
+    }
+
+    protected ImportTimeInterval getObservationTimerange(String[] cols) {
+        if (cols[8] == null || cols[8].length() == 0) {
+                log.warn("Found invalid observation time '" + cols[8] + "'");
+        }
+
+        try {
+            Date date = getDate(cols[8]);
+
+            if (date != null) {
+                return new ImportTimeInterval(date);
+            }
+            log.warn("Observation time date invalid: '" + cols[8] + "'");
+        }
+        catch (ParseException pe) {
+            log.warn("Observation time date not parseable: '" + cols[8] + "'");
+            return null;
+        }
+        return null;
+    }
+
+    protected String getOperator(String[] cols) {
+        return cols[9];
+    }
+
+    protected String getDescription(String[] cols) {
+        return cols.length > 10 ? cols[10] : null;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/MorphologicalWidthParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/MorphologicalWidthParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,120 @@
+package de.intevation.flys.importer.parsers;
+
+import java.math.BigDecimal;
+
+import java.text.NumberFormat;
+import java.text.ParseException;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportMorphWidth;
+import de.intevation.flys.importer.ImportMorphWidthValue;
+import de.intevation.flys.importer.ImportUnit;
+
+
+public class MorphologicalWidthParser extends LineParser {
+
+    private static final Logger log =
+        Logger.getLogger(MorphologicalWidthParser.class);
+
+    public static final NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
+
+    public static final Pattern META_UNIT =
+        Pattern.compile("^Einheit: \\[(.*)\\].*");
+
+    protected List<ImportMorphWidth> morphWidths;
+
+    protected ImportMorphWidth current;
+
+
+    public MorphologicalWidthParser() {
+        morphWidths = new ArrayList<ImportMorphWidth>();
+    }
+
+
+    @Override
+    protected void reset() {
+        current = new ImportMorphWidth();
+    }
+
+
+    @Override
+    protected void finish() {
+        if (current != null) {
+            morphWidths.add(current);
+        }
+    }
+
+
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        if (line.startsWith(START_META_CHAR)) {
+            handleMetaLine(stripMetaLine(line));
+        }
+        else {
+            handleDataLine(line);
+        }
+    }
+
+
+    protected void handleMetaLine(String line) {
+        if (handleMetaUnit(line)) {
+            return;
+        }
+        else {
+            log.warn("MWP: Unknown meta line: '" + line + "'");
+        }
+    }
+
+
+    protected boolean handleMetaUnit(String line) {
+        Matcher m = META_UNIT.matcher(line);
+
+        if (m.matches()) {
+            String unit = m.group(1);
+
+            current.setUnit(new ImportUnit(unit));
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    protected void handleDataLine(String line) {
+        String[] vals = line.split(SEPERATOR_CHAR);
+
+        if (vals == null || vals.length < 2) {
+            log.warn("MWP: skip invalid data line: '" + line + "'");
+            return;
+        }
+
+        try {
+            BigDecimal km    = new BigDecimal(nf.parse(vals[0]).doubleValue());
+            BigDecimal width = new BigDecimal(nf.parse(vals[1]).doubleValue());
+
+            String desc = vals.length > 2 ? vals[2] : null;
+
+            current.addValue(new ImportMorphWidthValue(
+                km,
+                width,
+                desc
+            ));
+        }
+        catch (ParseException pe) {
+            log.warn("MWP: unparseable number in data row: " + line);
+        }
+    }
+
+
+    public List<ImportMorphWidth> getMorphologicalWidths() {
+        return morphWidths;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/PRFParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/PRFParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,419 @@
+package de.intevation.flys.importer.parsers;
+
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.XY;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+
+/**
+ * Parse files in .prf format and generate a mapping of double
+ * (km) to List of Points (XY).
+ */
+public class PRFParser implements CrossSectionParser
+{
+    private static Logger log = Logger.getLogger(PRFParser.class);
+
+    public static final String ENCODING =
+        System.getProperty("flys.backend.prf.encoding", "ISO-8859-1");
+
+    public static final Pattern DATA_PATTERN =
+        Pattern.compile(
+            "\\((\\d+)x\\s*,\\s*(\\d+)\\(" +
+            "\\s*f(\\d+)\\.(\\d+)\\s*,\\s*f(\\d+)\\.(\\d+)\\s*\\)?\\)?");
+
+    public static final Pattern KM_PATTERN =
+        Pattern.compile("\\((\\d+)x\\s*,\\s*f(\\d+)\\.(\\d+)\\s*\\)?");
+
+    public static final Pattern YEAR_PATTERN =
+        Pattern.compile("(\\d{4})");
+
+    public static final int MIN_YEAR = 1800;
+    public static final int MAX_YEAR = 2100;
+
+    public static class DataFormat {
+
+        protected int deleteChars;
+        protected int maxRepetitions;
+        protected int firstIntegerPlaces;
+        protected int firstFractionPlaces;
+        protected int secondIntegerPlaces;
+        protected int secondFractionPlaces;
+
+        protected double firstShift;
+        protected double secondShift;
+
+        public DataFormat() {
+        }
+
+        public DataFormat(Matcher m) {
+            deleteChars          = Integer.parseInt(m.group(1));
+            maxRepetitions       = Integer.parseInt(m.group(2));
+            firstIntegerPlaces   = Integer.parseInt(m.group(3));
+            firstFractionPlaces  = Integer.parseInt(m.group(4));
+            secondIntegerPlaces  = Integer.parseInt(m.group(5));
+            secondFractionPlaces = Integer.parseInt(m.group(6));
+
+            firstShift  = Math.pow(10, firstFractionPlaces);
+            secondShift = Math.pow(10, secondFractionPlaces);
+        }
+
+        public int extractData(String line, List<XY> kmData) {
+            int L = line.length();
+            if (L <= deleteChars) {
+                return -1;
+            }
+
+            int pos = deleteChars;
+
+            boolean debug = log.isDebugEnabled();
+
+
+            int rep = 0;
+            for (;rep < maxRepetitions; ++rep) {
+                if (pos >= L || pos + firstIntegerPlaces >= L) {
+                    break;
+                }
+                String first = line.substring(
+                    pos, pos + firstIntegerPlaces);
+
+                String second = line.substring(
+                    pos + firstIntegerPlaces,
+                    Math.min(L, pos+firstIntegerPlaces+secondIntegerPlaces));
+
+                double x, y;
+                try {
+                    x = Double.parseDouble(first);
+                    y = Double.parseDouble(second);
+                }
+                catch (NumberFormatException nfe) {
+                    // broken line -> substract from dataset skip
+                    return -1;
+                }
+
+                if (first.indexOf('.') < 0) {
+                    x /= firstShift;
+                }
+
+                if (firstFractionPlaces > 0) {
+                    x = (int)(x*firstShift)/firstShift;
+                }
+
+                if (second.indexOf('.') < 0) {
+                    y /= secondShift;
+                }
+
+                if (secondFractionPlaces > 0) {
+                    y = (int)(y*secondShift)/secondShift;
+                }
+
+                kmData.add(new XY(x, y, kmData.size()));
+
+                pos += firstIntegerPlaces + secondIntegerPlaces;
+            }
+
+            return rep == maxRepetitions ? 1 : 0;
+        }
+    } // class DataFormat
+
+    public static class KMFormat {
+
+        protected int deleteChars;
+        protected int integerPlaces;
+        protected int fractionPlaces;
+
+        protected double shift;
+
+        public KMFormat() {
+        }
+
+        public KMFormat(Matcher m) {
+            deleteChars    = Integer.parseInt(m.group(1));
+            integerPlaces  = Integer.parseInt(m.group(2));
+            fractionPlaces = Integer.parseInt(m.group(3));
+
+            shift = Math.pow(10, fractionPlaces);
+        }
+
+        public double extractKm(String line) throws NumberFormatException {
+
+            if (line.length() <= deleteChars) {
+                throw new NumberFormatException("line too short");
+            }
+
+            String kmS =
+                line.substring(deleteChars, deleteChars+integerPlaces);
+
+            double km = Double.parseDouble(kmS.trim());
+
+            if (kmS.indexOf('.') < 0) {
+                km /= shift;
+            }
+
+            return fractionPlaces > 0
+                ? ((int)(km*shift))/shift
+                : km;
+        }
+    } // class KMFormat
+
+    protected Map<Double, List<XY>> data;
+
+    protected Integer year;
+
+    protected String description;
+
+
+    public PRFParser() {
+        data = new TreeMap<Double, List<XY>>();
+    }
+
+    @Override
+    public Integer getYear() {
+        return year;
+    }
+
+    public void setYear(Integer year) {
+        this.year = year;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public Map<Double, List<XY>> getData() {
+        return data;
+    }
+
+    public void setData(Map<Double, List<XY>> data) {
+        this.data = data;
+    }
+
+    protected void sortLists() {
+        for (List<XY> xy: data.values()) {
+            Collections.sort(xy);
+        }
+    }
+
+    public static final Integer findYear(String s) {
+        Matcher m = YEAR_PATTERN.matcher(s);
+        while (m.find()) {
+            int year = Integer.parseInt(m.group(1));
+            if (year >= MIN_YEAR && year <= MAX_YEAR) {
+                return Integer.valueOf(year);
+            }
+        }
+        return null;
+    }
+
+    public boolean parse(File file) {
+
+        if (!(file.isFile() && file.canRead())) {
+            log.warn("PRF: cannot open file '" + file + "'");
+            return false;
+        }
+
+        log.info("parsing PRF file: '" + file + "'");
+
+        description = FileTools.removeExtension(file.getName());
+
+        year = findYear(file.getName());
+
+        if (year == null) {
+            File parent = file.getParentFile();
+            if (parent != null) {
+                description = parent.getName() + "/" + description;
+                year = findYear(parent.getName());
+            }
+        }
+
+        if (year != null) {
+            log.info("year of sounding: " + year);
+        }
+
+        LineNumberReader in = null;
+
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String line = in.readLine();
+
+            if (line == null || (line = line.trim()).length() == 0) {
+                log.warn("PRF: file is empty.");
+                return false;
+            }
+
+            Matcher m = DATA_PATTERN.matcher(line);
+
+            if (!m.matches()) {
+                log.warn("PRF: First line does not look like a PRF data pattern.");
+                return false;
+            }
+
+            DataFormat dataFormat = new DataFormat(m);
+
+            if ((line = in.readLine()) == null
+            || (line = line.trim()).length() == 0) {
+                log.warn("PRF: premature EOF. Expected integer in line 2");
+                return false;
+            }
+
+            try {
+                if (Integer.parseInt(line) != dataFormat.maxRepetitions) {
+                    log.warn("PRF: Expected " +
+                        dataFormat.maxRepetitions + " in line 2");
+                    return false;
+                }
+            }
+            catch (NumberFormatException nfe) {
+                log.warn("PRF: invalid integer in line 2", nfe);
+                return false;
+            }
+
+            if ((line = in.readLine()) == null) {
+                log.warn(
+                    "PRF: premature EOF. Expected pattern for km extraction");
+                return false;
+            }
+
+            m = KM_PATTERN.matcher(line);
+
+            if (!m.matches()) {
+                log.warn(
+                    "PRF: line 4 does not look like a PRF km extraction pattern.");
+                return false;
+            }
+
+            KMFormat kmFormat = new KMFormat(m);
+
+            if ((line = in.readLine()) == null
+            || (line = line.trim()).length() == 0) {
+                log.warn("PRF: premature EOF. Expected skip row count.");
+                return false;
+            }
+
+            int lineSkipCount;
+            try {
+                if ((lineSkipCount = Integer.parseInt(line)) < 0) {
+                    throw new IllegalArgumentException(lineSkipCount + " < 0");
+                }
+            }
+            catch (NumberFormatException nfe) {
+                log.warn(
+                    "PRF: line 5 is not an positive integer.");
+                return false;
+            }
+
+            int skip = lineSkipCount;
+
+            while ((line = in.readLine()) != null) {
+                if (skip > 0) {
+                    --skip;
+                    continue;
+                }
+                double km;
+                try {
+                    km = kmFormat.extractKm(line);
+                }
+                catch (NumberFormatException iae) {
+                    log.warn("PRF: cannot extract km in line " + in.getLineNumber());
+                    return false;
+                }
+
+                Double station = Double.valueOf(km);
+
+                List<XY> kmData = data.get(station);
+
+                if (kmData == null) {
+                    //log.debug("found new km: " + station);
+                    kmData = new ArrayList<XY>();
+                    data.put(station, kmData);
+                }
+
+                int c = dataFormat.extractData(line, kmData);
+                if (c < 1) {
+                    skip = lineSkipCount + c;
+                }
+            }
+
+            // sort all the lists by x and index
+            sortLists();
+        }
+        catch (IOException ioe) {
+            log.error("Error reading PRF file.", ioe);
+            return false;
+        }
+        finally {
+            if (in != null) {
+                try {
+                    in.close();
+                }
+                catch (IOException ioe) {
+                    log.error("Error closing PRF file.", ioe);
+                }
+            }
+        }
+
+        return true;
+    }
+
+    public void reset() {
+        data.clear();
+        year        = null;
+        description = null;
+    }
+
+    public void parsePRFs(File root, final CrossSectionParser.Callback callback) {
+
+        FileTools.walkTree(root, new FileTools.FileVisitor() {
+            @Override
+            public boolean visit(File file) {
+                if (file.isFile() && file.canRead()
+                && file.getName().toLowerCase().endsWith(".prf")
+                && (callback == null || callback.accept(file))) {
+                    reset();
+                    boolean success = parse(file);
+                    log.info("parsing " + (success ? "succeeded" : "failed"));
+                    if (success && callback != null) {
+                        callback.parsed(PRFParser.this);
+                    }
+                }
+                return true;
+            }
+        });
+    }
+
+    public static void main(String [] args) {
+
+        PRFParser parser = new PRFParser();
+
+        for (String arg: args) {
+            parser.parsePRFs(new File(arg), null);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/PegelGltParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/PegelGltParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,102 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import java.math.BigDecimal;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.importer.ImportGauge;
+import de.intevation.flys.importer.ImportRange;
+
+public class PegelGltParser
+{
+    private static Logger log = Logger.getLogger(PegelGltParser.class);
+
+    public static final String ENCODING = "ISO-8859-1";
+
+    public static final String KM = "km:";
+
+    protected List<ImportGauge> gauges;
+
+    public PegelGltParser() {
+        gauges = new ArrayList<ImportGauge>();
+    }
+
+    public List<ImportGauge> getGauges() {
+        return gauges;
+    }
+
+    public void parse(File file) throws IOException {
+
+        File parent = file.getParentFile();
+
+        log.info("parsing GLT file '" + file + "'");
+        LineNumberReader in = null;
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String line = null;
+            while ((line = in.readLine()) != null) {
+                if ((line = line.trim()).length() == 0) {
+                    continue;
+                }
+
+                int kmPos = line.indexOf(KM);
+                if (kmPos < 0) {
+                    log.warn("GLT: no gauge found in line " + in.getLineNumber());
+                    continue;
+                }
+
+                String gaugeName = line.substring(0, kmPos).trim();
+                log.info("Found gauge '" + gaugeName + "'");
+
+                line = line.substring(kmPos + KM.length()).trim();
+
+                String [] parts = line.split("\\s+");
+                if (parts.length < 4) {
+                    log.warn("GLT: line " + in.getLineNumber()
+                        + " has not enough columns.");
+                    continue;
+                }
+
+                BigDecimal from = new BigDecimal(parts[0].replace(",", "."));
+                BigDecimal to   = new BigDecimal(parts[1].replace(",", "."));
+                if (from.compareTo(from) > 0) {
+                    BigDecimal t = from; from = to; to = t;
+                }
+                ImportRange range = new ImportRange(from, to);
+                File staFile = FileTools.repair(new File(parent, parts[2]));
+                File atFile  = FileTools.repair(new File(parent, parts[3]));
+
+                if (log.isDebugEnabled()) {
+                    log.debug("\tfrom: " + from);
+                    log.debug("\tto: " + to);
+                    log.debug("\tsta: " + staFile);
+                    log.debug("\tat: " + atFile);
+                }
+
+                gauges.add(new ImportGauge(range, staFile, atFile));
+            }
+        }
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/SQRelationParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/SQRelationParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,170 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportSQRelation;
+import de.intevation.flys.importer.ImportSQRelationValue;
+import de.intevation.flys.importer.ImportTimeInterval;
+
+
+public class SQRelationParser extends LineParser {
+
+    private static final Logger log =
+        Logger.getLogger(SQRelationParser.class);
+
+    private static final Pattern TIMERANGE_REGEX =
+        Pattern.compile(".*Zeitraum.*\\s(\\w*)-(\\w*).*");
+
+    private static final NumberFormat nf =
+        NumberFormat.getInstance(DEFAULT_LOCALE);
+
+
+    private List<ImportSQRelation> relations;
+
+    private ImportSQRelation current;
+
+    private String currentDescription;
+
+
+    public SQRelationParser() {
+        relations = new ArrayList<ImportSQRelation>();
+    }
+
+
+    public List<ImportSQRelation> getSQRelations() {
+        return relations;
+    }
+
+    @Override
+    public void parse(File file) throws IOException {
+        this.currentDescription = file.getName();
+        super.parse(file);
+    }
+
+
+    @Override
+    protected void reset() {
+        current = new ImportSQRelation();
+    }
+
+
+    @Override
+    protected void finish() {
+        if (current != null) {
+            current.setDescription(currentDescription);
+            relations.add(current);
+        }
+    }
+
+
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        if (line.startsWith(START_META_CHAR)) {
+            handleMetaLine(stripMetaLine(line));
+        }
+        else {
+            handleDataLine(line);
+        }
+    }
+
+
+    protected void handleMetaLine(String line) {
+        Matcher m = TIMERANGE_REGEX.matcher(line);
+
+        if (m.matches()) {
+            String lo = m.group(1);
+            String hi = m.group(2);
+
+            log.debug("Found timerange " + lo + " - " + hi);
+
+            try {
+                int low  = nf.parse(lo).intValue();
+                int high = nf.parse(hi).intValue();
+
+                current.setTimeInterval(new ImportTimeInterval(
+                    getDateFromYear(low),
+                    getDateFromYear(high)
+                ));
+            }
+            catch (ParseException nfe) {
+                log.warn("Cannot parse time range.", nfe);
+            }
+        }
+    }
+
+
+    protected void handleDataLine(String line) {
+        String[] cols = line.split(SEPERATOR_CHAR);
+
+        if (cols.length < 14) {
+            log.warn("skip invalid data line: '" + line + "'");
+            return;
+        }
+
+        Double km = parseDouble(cols[3], line);
+        Double a = parseDouble(cols[6], line);
+        Double b = parseDouble(cols[7], line);
+        Double qMax = parseDouble(cols[8], line);
+        Double rSq = parseDouble(cols[9], line);
+        Integer nTot = parseInteger(cols[10], line);
+        Integer nOutlier = parseInteger(cols[11], line);
+        Double cFer = parseDouble(cols[12], line);
+        Double cDuan = parseDouble(cols[13], line);
+        if (km == null || a == null || b == null || 
+	    qMax == null || cols[1].length() == 0) {
+	    if (km == null) {
+		log.error("No km for measurement station: Can not reference measurement station: "
+		    + line);
+	    }
+	    if ( a == null || b == null || 
+		qMax == null || cols[1].length() == 0) {
+		log.error("Incomplete SQ-relation row (missing a, b, Qmax or parameter): "
+		    + line);
+	    }
+	    return;
+        }
+        current.addValue(new ImportSQRelationValue(
+            cols[1],
+            km,
+            a,
+            b,
+            qMax,
+            rSq,
+            nTot,
+            nOutlier,
+            cFer,
+            cDuan));
+    }
+
+    private Double parseDouble(String value, String line) {
+        Double result = null;
+        try {
+            result = Double.valueOf(value.replace(",", "."));
+        }
+        catch (NumberFormatException nfe) {
+            log.warn("Unparseable " + value + " in sq relation row: " + line);
+        }
+        return result;
+    }
+
+    private Integer parseInteger(String value, String line) {
+        Integer result = null;
+        try {
+            result = Integer.valueOf(value);
+        }
+        catch (NumberFormatException nfe) {
+            log.warn("Unparseable " + value + " in sq relation row: " + line);
+        }
+        return result;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentDensityParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentDensityParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,162 @@
+package de.intevation.flys.importer.parsers;
+
+import de.intevation.flys.importer.ImportDepth;
+import de.intevation.flys.importer.ImportSedimentDensity;
+import de.intevation.flys.importer.ImportSedimentDensityValue;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.math.BigDecimal;
+
+import java.text.NumberFormat;
+import java.text.ParseException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
+
+public class SedimentDensityParser extends LineParser {
+
+    private static final Logger log =
+        Logger.getLogger(SedimentDensityParser.class);
+
+    public static final NumberFormat nf =
+        NumberFormat.getInstance(DEFAULT_LOCALE);
+
+    public static final Pattern META_DEPTH =
+        Pattern.compile("^Tiefe: (\\w++)-(\\w++)( (\\w++))?.*");
+
+    protected List<ImportSedimentDensity> sedimentDensities;
+
+    protected ImportSedimentDensity current;
+
+    protected String currentDescription;
+
+
+    public SedimentDensityParser() {
+        sedimentDensities = new ArrayList<ImportSedimentDensity>();
+    }
+
+
+    @Override
+    public void parse(File file) throws IOException {
+        currentDescription = file.getName();
+
+        super.parse(file);
+    }
+
+
+    @Override
+    protected void reset() {
+        current = new ImportSedimentDensity(currentDescription);
+    }
+
+
+    @Override
+    protected void finish() {
+        if (current != null) {
+            sedimentDensities.add(current);
+        }
+    }
+
+
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        if (line.startsWith(START_META_CHAR)) {
+            handleMetaLine(stripMetaLine(line));
+        }
+        else {
+            handleDataLine(line);
+        }
+    }
+
+
+    protected void handleMetaLine(String line) {
+        if (handleMetaDepth(line)) {
+            return;
+        }
+        else {
+            log.warn("Unknown meta line: '" + line + "'");
+        }
+    }
+
+
+    protected boolean handleMetaDepth(String line) {
+        Matcher m = META_DEPTH.matcher(line);
+
+        if (m.matches()) {
+            String lo   = m.group(1);
+            String up   = m.group(2);
+
+            log.info("Found sediment density depth: " + lo + " - " + up + " cm");
+
+            try {
+                ImportDepth depth = new ImportDepth(
+                    new BigDecimal(nf.parse(lo).doubleValue()),
+                    new BigDecimal(nf.parse(up).doubleValue())
+                );
+
+                current.setDepth(depth);
+
+                return true;
+            }
+            catch (ParseException pe) {
+                log.warn("Unparseable numbers in: '" + line + "'");
+            }
+        }
+        else {
+            log.debug("Meta line doesn't contain depth information: " + line);
+        }
+
+        return false;
+    }
+
+
+    protected void handleDataLine(String line) {
+        String[] vals = line.split(SEPERATOR_CHAR);
+
+        if (vals == null || vals.length < 3) {
+            log.warn("skip invalid data line: '" + line + "'");
+            return;
+        }
+
+        BigDecimal km = null;
+        BigDecimal shoreOffset = null;
+        BigDecimal density = null;
+        try {
+            km          = new BigDecimal(nf.parse(vals[0]).doubleValue());
+            density     = new BigDecimal(nf.parse(vals[2]).doubleValue());
+            if (!vals[1].isEmpty()) {
+                shoreOffset = new BigDecimal(nf.parse(vals[1]).doubleValue());
+            }
+        }
+        catch (ParseException pe) {
+            log.warn("Unparseable numbers in '" + line + "'");
+        }
+
+        if (km == null || density == null) {
+            log.warn("SDP: No km nor density given. Skip line");
+            return;
+        }
+
+        BigDecimal year = null;
+
+        current.addValue(new ImportSedimentDensityValue(
+            km,
+            shoreOffset,
+            density,
+            year,
+            currentDescription));
+    }
+
+
+    public List<ImportSedimentDensity> getSedimentDensities() {
+        return sedimentDensities;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentYieldParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentYieldParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,393 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.text.NumberFormat;
+import java.text.ParseException;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportGrainFraction;
+import de.intevation.flys.importer.ImportSedimentYield;
+import de.intevation.flys.importer.ImportSedimentYieldValue;
+import de.intevation.flys.importer.ImportTimeInterval;
+import de.intevation.flys.importer.ImportUnit;
+import de.intevation.flys.model.GrainFraction;
+
+
+public class SedimentYieldParser extends LineParser {
+
+    private static final Logger log =
+        Logger.getLogger(SedimentYieldParser.class);
+
+
+    public static final NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
+
+
+    public static final String FRAKTION_START = "Fraktion:";
+
+    public static final String FRACTION_COARSE_STR =
+        ".*Grobkorn.*";
+
+    public static final String FRACTION_FINE_MIDDLE_STR =
+        ".*Fein-Mittel-Kies.*";
+
+    public static final String FRACTION_SAND =
+        ".*Sand.*";
+
+    public static final String FRACTION_SUSP_SAND =
+        ".*susp_Sand.*";
+
+    public static final String FRACTION_SUSP_SAND_BED =
+        ".*bettbild_Anteil_susp_Sand.*";
+
+    public static final String FRACTION_SUSP_SAND_BED_EPOCH =
+        ".*susp_Sand_bettbildAnteil.*";
+
+    public static final String FRACTION_SUSPENDED_SEDIMENT =
+        ".*Schwebstoff.*";
+
+    public static final String FRACTION_TOTAL =
+        ".*gesamt.*";
+
+
+    public static final Pattern TIMEINTERVAL_SINGLE =
+        Pattern.compile("\\D*([0-9]+?)\\D*");
+
+    public static final Pattern TIMEINTERVAL_EPOCH =
+        Pattern.compile("\\D*([0-9]+?)\\s*-\\s*([0-9]+?)\\D*");
+
+    public static final Pattern META_FRACTION =
+        Pattern.compile("^Fraktion: (.*)");
+
+    public static final Pattern META_UNIT =
+        Pattern.compile("^Einheit: \\[(.*)\\].*");
+
+    public static final Pattern META_COLUMN_NAMES =
+        Pattern.compile("^Fluss-km.*");
+
+    public static final Pattern META_GRAIN_FRACTION_A =
+        Pattern.compile("\\D*(([0-9]+?,[0-9]+?)\\s*-|([0-9]++)\\s*-)(([0-9]+?,[0-9]+?)|([0-9]++))\\s*([a-zA-Z]+?)\\W*\\D*");
+
+    public static final Pattern META_GRAIN_FRACTION_B =
+        Pattern.compile("(<|>){1}\\s*(\\w++)\\s*(([0-9]+?,[0-9]+?)\\s*-|([0-9]++)\\s*-)(([0-9]+?,[0-9]+?)|([0-9]++))\\s*([a-zA-Z]+?)");
+
+    public static final Pattern META_GRAIN_FRACTION_C =
+        Pattern.compile("(<|>){1}\\s*((([0-9]+?,[0-9]+?)|([0-9]++))\\s*(\\w+))");
+
+
+    protected List<ImportSedimentYield> sedimentYields;
+
+    protected ImportSedimentYield[] current;
+
+    protected ImportGrainFraction grainFraction;
+
+    protected ImportUnit unit;
+
+    protected String description;
+
+    protected String[] columnNames;
+
+
+    public SedimentYieldParser() {
+        sedimentYields = new ArrayList<ImportSedimentYield>();
+    }
+
+
+    @Override
+    public void parse(File file) throws IOException {
+        description = file.getName();
+
+        super.parse(file);
+    }
+
+
+    @Override
+    protected void reset() {
+        current       = null;
+        grainFraction = null;
+        unit          = null;
+    }
+
+
+    @Override
+    protected void finish() {
+        if (current != null) {
+            for (ImportSedimentYield isy: current) {
+                sedimentYields.add(isy);
+            }
+        }
+
+        description = null;
+    }
+
+
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        if (line.startsWith(START_META_CHAR)) {
+            handleMetaLine(stripMetaLine(line));
+        }
+        else {
+            handleDataLine(line);
+        }
+    }
+
+
+    protected void handleMetaLine(String line) {
+        if (handleMetaUnit(line)) {
+            return;
+        }
+        else if (handleMetaFraction(line)) {
+            return;
+        }
+        else if (handleColumnNames(line)) {
+            return;
+        }
+        else {
+            log.warn("SYP: Unknown meta line: '" + line + "'");
+        }
+    }
+
+
+    protected boolean handleMetaUnit(String line) {
+        Matcher m = META_UNIT.matcher(line);
+
+        if (m.matches()) {
+            unit = new ImportUnit(m.group(1));
+            return true;
+        }
+
+        return false;
+    }
+
+
+    public boolean handleMetaFraction(String line) {
+        Matcher m = META_FRACTION.matcher(line);
+
+        if (m.matches()) {
+            String tmp = m.group(1);
+
+            this.grainFraction = buildGrainFraction(tmp);
+
+            return true;
+        }
+        else if (line.startsWith(FRAKTION_START)) {
+            String newLine = line.replace(FRAKTION_START, "").trim();
+            if (newLine.length() == 0) {
+                log.debug("Found total grain fraction.");
+                this.grainFraction = new ImportGrainFraction(GrainFraction.TOTAL);
+
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+    public boolean handleColumnNames(String line) {
+        Matcher m = META_COLUMN_NAMES.matcher(line);
+
+        if (m.matches()) {
+            columnNames = line.split(SEPERATOR_CHAR);
+
+            initializeSedimentYields();
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    protected void handleDataLine(String line) {
+        String[] vals = line.split(SEPERATOR_CHAR);
+
+        if (vals == null || vals.length < columnNames.length-1) {
+            log.warn("SYP: skip invalid data line: '" + line + "'");
+            return;
+        }
+
+        try {
+            Double km = nf.parse(vals[0]).doubleValue();
+
+            for (int i = 1, n = columnNames.length-1; i < n; i++) {
+                String curVal = vals[i];
+
+                if (curVal != null && curVal.length() > 0) {
+                    current[i-1].addValue(new ImportSedimentYieldValue(
+                        km, nf.parse(vals[i]).doubleValue()
+                    ));
+                }
+            }
+        }
+        catch (ParseException pe) {
+            log.warn("SYP: unparseable number in data row '" + line + "':", pe);
+        }
+    }
+
+
+    private void initializeSedimentYields() {
+        // skip first column (Fluss-km) and last column (Hinweise)
+        current = new ImportSedimentYield[columnNames.length-2];
+
+        for (int i = 0, n = columnNames.length; i < n-2; i++) {
+            current[i] = new ImportSedimentYield(this.description);
+            current[i].setTimeInterval(getTimeInterval(columnNames[i+1]));
+            current[i].setUnit(unit);
+            current[i].setGrainFraction(grainFraction);
+        }
+    }
+
+
+    private ImportTimeInterval getTimeInterval(String column) {
+        try {
+            Matcher a = TIMEINTERVAL_EPOCH.matcher(column);
+            if (a.matches()) {
+                int yearA = nf.parse(a.group(1)).intValue();
+                int yearB = nf.parse(a.group(2)).intValue();
+
+                return new ImportTimeInterval(
+                    getDateFromYear(yearA),
+                    getDateFromYear(yearB)
+                );
+            }
+
+            Matcher b = TIMEINTERVAL_SINGLE.matcher(column);
+            if (b.matches()) {
+                int year = nf.parse(b.group(1)).intValue();
+
+                return new ImportTimeInterval(getDateFromYear(year));
+            }
+
+            log.warn("SYP: Unknown time interval string: '" + column + "'");
+        }
+        catch (ParseException pe) {
+            log.warn("SYP: Could not parse years: " + column, pe);
+        }
+
+        return null;
+    }
+
+
+    private ImportGrainFraction buildGrainFraction(String gfStr) {
+        Matcher a = META_GRAIN_FRACTION_A.matcher(gfStr);
+        if (a.matches()) {
+            String lowerA = a.group(2);
+            String lowerB = a.group(3);
+
+            String upperA = a.group(4);
+            String upperB = a.group(5);
+
+            String lower = lowerA != null ? lowerA : lowerB;
+            String upper = upperA != null ? upperA : upperB;
+
+            try {
+                return new ImportGrainFraction(
+                    getGrainFractionTypeName(this.description),
+                    nf.parse(lower).doubleValue(),
+                    nf.parse(upper).doubleValue()
+                );
+            }
+            catch (ParseException pe) {
+                log.warn("SYP: Could not parse ranges of: '" + gfStr + "'");
+            }
+        }
+
+        Matcher b = META_GRAIN_FRACTION_B.matcher(gfStr);
+        if (b.matches()) {
+            String lowerA  = b.group(4);
+            String lowerB  = b.group(5);
+            String upperA  = b.group(6);
+            String upperB  = b.group(7);
+
+            String lower = lowerA != null ? lowerA : lowerB;
+            String upper = upperA != null ? upperA : upperB;
+
+            try {
+                return new ImportGrainFraction(
+                    getGrainFractionTypeName(this.description),
+                    nf.parse(lower).doubleValue(),
+                    nf.parse(upper).doubleValue()
+                );
+            }
+            catch (ParseException pe) {
+                log.warn("SYP: Could not parse ranges of: '" + gfStr + "'");
+            }
+        }
+
+        Matcher c = META_GRAIN_FRACTION_C.matcher(gfStr);
+        if (c.matches()) {
+            String oper     = c.group(1);
+            String valueStr = c.group(3);
+
+            try {
+                Double value = nf.parse(valueStr).doubleValue();
+
+                if (oper.equals(">")) {
+                    return new ImportGrainFraction(
+                        getGrainFractionTypeName(this.description),
+                        value,
+                        null
+                    );
+                }
+                else {
+                    return new ImportGrainFraction(
+                        getGrainFractionTypeName(this.description),
+                        null,
+                        value
+                    );
+                }
+            }
+            catch (ParseException pe) {
+                log.warn("SYP: Could not parse ranges of: '" + gfStr + "'");    
+            }
+        }
+
+        log.warn("SYP: Unknown grain fraction: '" + gfStr + "'");
+
+        return null;
+    }
+
+
+    public static String getGrainFractionTypeName(String filename) {
+        if (Pattern.matches(FRACTION_COARSE_STR, filename)) {
+	    return GrainFraction.COARSE;
+        }
+        else if (Pattern.matches(FRACTION_FINE_MIDDLE_STR, filename)) {
+            return GrainFraction.FINE_MIDDLE;
+        }
+        else if (Pattern.matches(FRACTION_SUSP_SAND_BED, filename) ||
+            Pattern.matches(FRACTION_SUSP_SAND_BED_EPOCH, filename)) {
+            return GrainFraction.SUSP_SAND_BED;
+        }
+        else if (Pattern.matches(FRACTION_SUSP_SAND, filename)) {
+            return GrainFraction.SUSP_SAND;
+        }
+	else if (Pattern.matches(FRACTION_SAND, filename)) {
+            return GrainFraction.SAND;
+        }
+        else if (Pattern.matches(FRACTION_SUSPENDED_SEDIMENT, filename)) {
+            return GrainFraction.SUSPENDED_SEDIMENT;
+        }
+        else if (Pattern.matches(FRACTION_TOTAL, filename)) {
+            return GrainFraction.TOTAL;
+        }
+        else {
+            log.warn("SYP: Unknown grain fraction '" + filename + "'");
+            return "unknown";
+        }
+    }
+
+
+    public List<ImportSedimentYield> getSedimentYields() {
+        return sedimentYields;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/StaFileParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/StaFileParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,338 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import java.math.BigDecimal;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportMainValueType;
+import de.intevation.flys.importer.ImportMainValue;
+import de.intevation.flys.importer.ImportNamedMainValue;
+import de.intevation.flys.importer.ImportGauge;
+import de.intevation.flys.importer.ImportTimeInterval;
+import de.intevation.flys.utils.DateGuesser;
+
+public class StaFileParser
+{
+    private static Logger log = Logger.getLogger(StaFileParser.class);
+
+    public static final String ENCODING = "ISO-8859-1";
+
+    public static final String TYPES =
+        System.getProperty("flys.backend.main.value.types", "QWTD");
+
+    public static final boolean NOT_PARSE_GAUGE_NUMBERS =
+        Boolean.getBoolean("flys.backend.sta.not.parse.gauge.numbers");
+
+    public static final Pattern QWTD_ =
+        Pattern.compile("\\s*([^\\s]+)\\s+([^\\s]+)\\s+([" +
+            Pattern.quote(TYPES) + "]).*");
+
+    public static final class NameAndTimeInterval {
+        private String             name;
+        private ImportTimeInterval timeInterval;
+
+        public NameAndTimeInterval(String name) {
+            this(name, null);
+        }
+
+        public NameAndTimeInterval(String name, ImportTimeInterval timeInterval) {
+            this.name         = name;
+            this.timeInterval = timeInterval;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public ImportTimeInterval getTimeInterval() {
+            return timeInterval;
+        }
+    } // class NameAndTimeInterval
+
+    public StaFileParser() {
+    }
+
+    public boolean parse(ImportGauge gauge) throws IOException {
+
+        File file = gauge.getStaFile();
+
+        log.info("parsing STA file: " + file);
+        LineNumberReader in = null;
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String line = in.readLine();
+
+            if (line == null) {
+                log.warn("STA file is empty.");
+                return false;
+            }
+
+            if (line.length() < 37) {
+                log.warn("First line in STA file is too short.");
+                return false;
+            }
+
+            String gaugeName = line.substring(16, 28).trim();
+
+            Long gaugeNumber = null;
+
+            if (!NOT_PARSE_GAUGE_NUMBERS) {
+                String gaugeNumberString = line.substring(8, 16).trim();
+
+                try {
+                    gaugeNumber = Long.parseLong(gaugeNumberString);
+                }
+                catch (NumberFormatException nfe) {
+                    log.warn("STA: '" + gaugeNumberString +
+                        "' is not a valid long number.");
+                }
+            }
+
+            gauge.setName(gaugeName);
+            gauge.setOfficialNumber(gaugeNumber);
+
+            if (log.isDebugEnabled()) {
+                log.debug(
+                    "name/number: '" + gaugeName + "' '" + gaugeNumber + "'");
+            }
+
+            String [] values = line.substring(38).trim().split("\\s+", 2);
+
+            if (values.length < 2) {
+                log.warn("STA: Not enough columns for aeo and datum.");
+            }
+            try {
+                gauge.setAeo(new BigDecimal(values[0].replace(",", ".")));
+                gauge.setDatum(new BigDecimal(values[1].replace(",", ".")));
+            }
+            catch (NumberFormatException nfe) {
+                log.warn("STA: cannot parse aeo or datum.");
+                return false;
+            }
+
+            line = in.readLine();
+
+            if (line == null) {
+                log.warn("STA file has not enough lines");
+                return false;
+            }
+
+            if (line.length() < 36) {
+                log.warn("STA: second line is too short");
+                return false;
+            }
+
+            try {
+                gauge.setStation(
+                    new BigDecimal(line.substring(29, 36).trim()));
+            }
+            catch (NumberFormatException nfe) {
+                log.warn("STA: parsing of the datum of the gauge failed");
+                return false;
+            }
+
+            // overread the next six lines
+            for (int i = 0; i < 6; ++i) {
+                if ((line = in.readLine()) == null) {
+                    log.warn("STA file is too short");
+                    return false;
+                }
+            }
+
+            HashMap<String, ImportMainValueType> types =
+                new HashMap<String, ImportMainValueType>();
+
+            ArrayList<ImportNamedMainValue> namedMainValues =
+                new ArrayList<ImportNamedMainValue>();
+
+            ArrayList<ImportMainValue> mainValues =
+                new ArrayList<ImportMainValue>();
+
+            while ((line = in.readLine()) != null) {
+                Matcher m = QWTD_.matcher(line);
+                if (m.matches()) {
+                    BigDecimal value;
+                    try {
+                        value = new BigDecimal(m.group(2).replace(",", "."));
+                    }
+                    catch (NumberFormatException nfe) {
+                        log.warn("STA: value not parseable in line "
+                            + in.getLineNumber());
+                        continue;
+                    }
+                    String typeString = m.group(3);
+                    log.debug("\t type: " + typeString);
+                    ImportMainValueType type = types.get(typeString);
+                    if (type == null) {
+                        type = new ImportMainValueType(typeString);
+                        types.put(typeString, type);
+                    }
+                    String name = m.group(1);
+                    NameAndTimeInterval nat = parseName(name);
+                    ImportNamedMainValue namedMainValue =
+                        new ImportNamedMainValue(type, nat.getName());
+                    namedMainValues.add(namedMainValue);
+
+                    ImportMainValue mainValue = new ImportMainValue(
+                        gauge,
+                        namedMainValue,
+                        value,
+                        nat.getTimeInterval());
+
+                    mainValues.add(mainValue);
+                }
+                else {
+                    // TODO: treat as a comment
+                }
+            }
+            gauge.setMainValueTypes(
+                new ArrayList<ImportMainValueType>(types.values()));
+            gauge.setNamedMainValues(namedMainValues);
+            gauge.setMainValues(mainValues);
+        }
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+        log.info("finished parsing STA file: " + file);
+        return true;
+    }
+
+    protected NameAndTimeInterval parseName(String name) {
+        List<String> result = new ArrayList<String>();
+
+        unbracket(name, 0, result);
+
+        int length = result.size();
+
+        if (length < 1) { // Should not happen.
+            return new NameAndTimeInterval(name);
+        }
+
+        if (length == 1) { // No date at all -> use first part.
+            return new NameAndTimeInterval(result.get(0).trim());
+        }
+
+        if (length == 2) { // e.g. W(1994) or W(1994 - 1999)
+            String type = result.get(0).trim();
+
+            ImportTimeInterval timeInterval = getTimeInterval(
+                result.get(1).trim());
+
+            if (timeInterval == null) { // No date at all.
+                type = name;
+            }
+
+            return new NameAndTimeInterval(type, timeInterval);
+        }
+
+        if (length == 3) { // e.g W(Q(1994)) or W(Q(1994 - 1999))
+
+            String type =
+                result.get(0).trim() + "(" + 
+                result.get(1).trim() + ")";
+
+            ImportTimeInterval timeInterval = getTimeInterval(
+                result.get(2).trim());
+
+            if (timeInterval == null) { // No date at all.
+                type = name;
+            }
+
+            return new NameAndTimeInterval(type, timeInterval);
+        }
+
+        // more than 3 elements return unmodified.
+
+        return new NameAndTimeInterval(name);
+    }
+
+    private static ImportTimeInterval getTimeInterval(String datePart) {
+
+        int minus = datePart.indexOf('-');
+
+        if (minus < 0) { // '-' not found
+
+            Date date = null;
+            try {
+                date = DateGuesser.guessDate(datePart);
+            }
+            catch (IllegalArgumentException iae) {
+                log.warn("STA: Invalid date '" + datePart + "'");
+                return null;
+            }
+
+            return new ImportTimeInterval(date);
+        }
+
+        // Found '-' so we have <from> - <to>
+        String startPart = datePart.substring(0, minus).trim();
+        String endPart   = datePart.substring(minus).trim();
+
+        Date startDate = null;
+        Date endDate   = null;
+
+        try {
+            startDate = DateGuesser.guessDate(startPart);
+        }
+        catch (IllegalArgumentException iae) {
+            log.warn("STA: Invalid start date '" + startPart + "'");
+        }
+
+        try {
+            endDate = DateGuesser.guessDate(endPart);
+        }
+        catch (IllegalArgumentException iae) {
+            log.warn("STA: Invalid end date '" + endPart + "'");
+        }
+
+        if (startDate == null) {
+            log.warn("STA: Need start date.");
+            return null;
+        }
+
+        return new ImportTimeInterval(startDate, endDate);
+    }
+
+    private static int unbracket(String s, int index, List<String> result) {
+        StringBuilder sb = new StringBuilder();
+        int length = s.length();
+        while (index < length) {
+            char c = s.charAt(index);
+            switch (c) {
+                case '(':
+                    index = unbracket(s, index+1, result);
+                    break;
+                case ')':
+                    result.add(0, sb.toString());
+                    return index+1;
+                default:
+                    sb.append(c);
+                    ++index;
+            }
+        }
+        result.add(0, sb.toString());
+
+        return index;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/W80CSVParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/W80CSVParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,291 @@
+package de.intevation.flys.importer.parsers;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.importer.XY;
+
+import de.intevation.flys.importer.parsers.tim.Coordinate;
+
+import de.intevation.flys.utils.DateGuesser;
+import de.intevation.flys.utils.EpsilonComparator;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * To create cross-sections, generate: Map<double,list<xy>> from files
+ * in w80/csv format.
+ */
+public class W80CSVParser extends LineParser implements CrossSectionParser
+{
+    /** Private logger. */
+    private static Logger logger = Logger.getLogger(W80CSVParser.class);
+
+
+    /** The current line to which add points. */
+    private List<XY> currentLine;
+
+
+    /** Data collected so far, last element will be currentLine. */
+    protected Map<Double, List<XY>> data;
+
+
+    /** Anchor to project to. */
+    private static class Anchor extends Coordinate {
+
+        private static final double EPSILON = 1e-5;
+
+        private double station;
+
+        public Anchor(double x, double y, double z, double station) {
+            super(x, y, z);
+            this.station = station;
+        }
+
+        public boolean sameStation(double station) {
+            return Math.abs(this.station - station) < EPSILON;
+        }
+    }
+
+
+    /** Reference point for simple projection. */
+    private Anchor anchor;
+
+
+    /**
+     * Reference point for distance calculations, introduced to
+     * deal with bends in the lines.
+     * Array has two entrys: first is GK-Right, second GK-High.
+     */
+    private double[] lastPointGK;
+
+
+    /** Measurement date of anchor as listed in w80 file. */
+    private Date anchorDate;
+
+
+    private double distanceToLastPoint(double gkr, double gkh) {
+        double dx = gkr - lastPointGK[0];
+        double dy = gkh - lastPointGK[1];
+        double d  = dx*dx + dy*dy;
+
+        return Math.sqrt(d);
+    }
+
+
+    /** Trivial constructor. */
+    public W80CSVParser() {
+        data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP);
+    }
+
+
+    /**
+     * Get the description of the cross section parsed -
+     * directory name of current file.
+     */
+    @Override
+    public String getDescription() {
+        return getInputFile().getParentFile().getName();
+    }
+
+
+    /** Get the year of this cross sections measurement. */
+    @Override
+    public Integer getYear() {
+        if (anchorDate == null) {
+            return null;
+        }
+        Calendar dateCalendar = Calendar.getInstance();
+        dateCalendar.setTime(anchorDate);
+        return dateCalendar.get(Calendar.YEAR);
+    }
+
+
+    /**
+     * Return the data parsed.
+     * @return map of stations (km) to list of points.
+     */
+    @Override
+    public Map<Double, List<XY>> getData() {
+        return data;
+    }
+
+
+    /** Recursively descend root, ask the callback for every file
+     * found and parse it if callback acks. When done, notify callback. */
+    public void parseW80CSVs(File root, final Callback callback) {
+
+        FileTools.walkTree(root, new FileTools.FileVisitor() {
+            @Override
+            public boolean visit(File file) {
+                if (file.isFile() && file.canRead()
+                && file.getName().toLowerCase().endsWith(".csv")
+                && (callback == null || callback.accept(file))) {
+                    reset();
+                    try {
+                        parse(file);
+                        logger.info("parsing done");
+                        if (callback != null) {
+                            callback.parsed(W80CSVParser.this);
+                        }
+                    }
+                    catch (IOException ioe) {
+                        logger.error("IOException while parsing file");
+                        return false;
+                    }
+                }
+                return true;
+            }
+        });
+    }
+
+
+    /** Called before consuming first line of file. */
+    public void reset() {
+        data.clear();
+        currentLine = new ArrayList<XY>();
+        anchor = null;
+        anchorDate = null;
+        lastPointGK = new double[] {0d,0d};
+    }
+
+
+    /**
+     * Get the Index of the last cross-section lines point.
+     * @return last points index, -1 if not available.
+     */
+    private int getLastPointIdx() {
+        if (currentLine == null || currentLine.isEmpty()) {
+            return -1;
+        }
+        XY lastPoint = this.currentLine.get(currentLine.size()-1);
+        return lastPoint.getIndex();
+    }
+
+
+    private double getLastPointX() {
+        if (currentLine == null || currentLine.isEmpty()) {
+            return 0d;
+        }
+        XY lastPoint = this.currentLine.get(currentLine.size()-1);
+        return lastPoint.getX();
+    }
+
+
+    /**
+     * Add a Point (YZ,Index) to the current cross section line.
+     * @param y The y coordinate of new point.
+     * @param z The z coordinate of new point.
+     * @param idx Ignored, the parameter of new point.
+     * @return true if point could been added, false otherwise (e.g. not
+     *         parsable y or z values.
+     */
+    private boolean addPoint(double gkr, double gkh, double height, String idx) {
+        // Calculate distance between this and lst point (add distances).
+        double d = distanceToLastPoint(gkr, gkh);
+        double totalX = getLastPointX() + d;
+
+        // We ignore idx, and increment instead.
+        int index;
+        int lastPointIdx = getLastPointIdx();
+        if (lastPointIdx <= 0) {
+            index = 1;
+        } else {
+            index = lastPointIdx + 1;
+        }
+
+        this.lastPointGK[0] = gkr;
+        this.lastPointGK[1] = gkh;
+        currentLine.add(new XY(totalX, height/1000d, index));
+        return true;
+    }
+
+    // As per documentation:
+    // BW;WPA;ST;UF;PN;LS;BL-LS;Y;X;Z;DL;LZK;SY;SX;SZ;BML;HS;BL-HS;H;DH;HZK;SH;WVA;BMH;BMP;DST;DB;LDS;LKZ;
+
+
+    /**
+     * Called for each line. Try to extract info from a w80 line.
+     * @param lineNum Number of line (starting with 1).
+     */
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        // First two lines are 'comment'-like.
+        if (lineNum == 1 || lineNum == 2) {
+            return;
+        }
+        // The 'shore' field shows which side of the river the shore is measured.
+        // Therefore, the points have to be added in the correct order (also
+        // because later distances are calculated which cannot be
+        // negative.
+        String[] fields = line.split(";");
+        String station = fields[2];
+        String shore   = fields[3];
+        // TODO: There is 'station' and a 'shore'-code behind.
+        // 1 = left, 2 = right. none = middle
+        String pointIndex = line.substring(16,21);
+        // For GK, first seven digits are of interest.
+        String gkRight = fields[7];
+        String gkHigh  = fields[8];
+        String date    = fields[10];
+        String height  = fields[18];
+        String dateH   = line.substring(54,60);
+        String dateDec = line.substring(64,70);
+
+        double stationKm = Double.parseDouble(station) / 1000d;
+        double gkRightKm = Double.parseDouble(gkRight.replace(",","."));//.substring(0,7));
+        double gkHighKm  = Double.parseDouble(gkHigh.replace(",","."));//.substring(0,7));
+        double heightM   = Double.parseDouble(height.replace(",","."));
+
+        // New (or first) line.
+        if (anchor == null || !anchor.sameStation(stationKm)) {
+            anchor = new Anchor(gkRightKm, gkHighKm, heightM, stationKm);
+            lastPointGK[0] = gkRightKm;
+            lastPointGK[1] = gkHighKm;
+            currentLine = new ArrayList<XY>();
+            data.put(stationKm, currentLine);
+            currentLine.add(new XY(0d, heightM, 0));
+            try {
+                anchorDate = DateGuesser.guessDate(date);
+            }
+            catch (IllegalArgumentException iae) {
+                logger.warn("W80CSV: Invalid date '" + date + "'.");
+            }
+        }
+        else {
+            addPoint(gkRightKm, gkHighKm, heightM, pointIndex);
+        }
+    }
+
+
+    /** Called when file is fully consumed. */
+    @Override
+    protected void finish() {
+        logger.info("Parsed " + data.size() + " lines");
+    }
+
+
+    /** Parses files given as arguments. */
+    public static void main(String [] args) {
+
+        W80CSVParser parser = new W80CSVParser();
+
+        logger.warn("Start parsing files.");
+        for (String arg: args) {
+            logger.warn("Parsing a file.");
+            parser.parseW80CSVs(new File(arg), null);
+        }
+        logger.error("Finished parsing files.");
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/W80Parser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/W80Parser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,289 @@
+package de.intevation.flys.importer.parsers;
+
+import de.intevation.artifacts.common.utils.FileTools;
+
+import de.intevation.flys.importer.XY;
+
+import de.intevation.flys.importer.parsers.tim.Coordinate;
+
+import de.intevation.flys.utils.DateGuesser;
+import de.intevation.flys.utils.EpsilonComparator;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * To create cross-sections, generate: Map<double,list<xy>> from files
+ * in w80 format.
+ */
+public class W80Parser extends LineParser implements CrossSectionParser
+{
+    /** Private logger. */
+    private static Logger logger = Logger.getLogger(W80Parser.class);
+
+
+    /** The current line to which add points. */
+    private List<XY> currentLine;
+
+
+    /** Data collected so far, last element will be currentLine. */
+    protected Map<Double, List<XY>> data;
+
+
+    /** Anchor to project to. */
+    private static class Anchor extends Coordinate {
+
+        private static final double EPSILON = 1e-5;
+
+        private double station;
+
+        public Anchor(double x, double y, double z, double station) {
+            super(x, y, z);
+            this.station = station;
+        }
+
+        public boolean sameStation(double station) {
+            return Math.abs(this.station - station) < EPSILON;
+        }
+    }
+
+
+    /** Reference point for simple projection. */
+    private Anchor anchor;
+
+
+    /**
+     * Reference point for distance calculations, introduced to
+     * deal with bends in the lines.
+     * Array has two entrys: first is GK-Right, second GK-High.
+     */
+    private double[] lastPointGK;
+
+
+    /** Measurement date of anchor as listed in w80 file. */
+    private Date anchorDate;
+
+
+    private double distanceToLastPoint(double gkr, double gkh) {
+        double dx = gkr - lastPointGK[0];
+        double dy = gkh - lastPointGK[1];
+        double d  = dx*dx + dy*dy;
+
+        return Math.sqrt(d);
+    }
+
+
+    /** Trivial constructor. */
+    public W80Parser() {
+        data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP);
+    }
+
+
+    /** Get the description of the cross section parsed. */
+    @Override
+    public String getDescription() {
+        return FileTools.removeExtension(getFileName());
+    }
+
+
+    /** Get the year of this cross sections measurement. */
+    @Override
+    public Integer getYear() {
+        if (anchorDate == null) {
+            return null;
+        }
+        Calendar dateCalendar = Calendar.getInstance();
+        dateCalendar.setTime(anchorDate);
+        return dateCalendar.get(Calendar.YEAR);
+    }
+
+
+    /**
+     * Return the data parsed.
+     * @return map of stations (km) to list of points.
+     */
+    @Override
+    public Map<Double, List<XY>> getData() {
+        return data;
+    }
+
+
+    public void parseW80s(File root, final Callback callback) {
+
+        FileTools.walkTree(root, new FileTools.FileVisitor() {
+            @Override
+            public boolean visit(File file) {
+                if (file.isFile() && file.canRead()
+                && file.getName().toLowerCase().endsWith(".w80")
+                && (callback == null || callback.accept(file))) {
+                    reset();
+                    try {
+                        parse(file);
+                        logger.info("parsing done");
+                        if (callback != null) {
+                            callback.parsed(W80Parser.this);
+                        }
+                    }
+                    catch (IOException ioe) {
+                        logger.error("IOException while parsing file");
+                        return false;
+                    }
+                }
+                return true;
+            }
+        });
+    }
+
+
+    /** Called before consuming first line of file. */
+    public void reset() {
+        data.clear();
+        currentLine = new ArrayList<XY>();
+        anchor = null;
+        anchorDate = null;
+        lastPointGK = new double[] {0d,0d};
+    }
+
+
+    /**
+     * Get the Index of the last cross-section lines point.
+     * @return last points index, -1 if not available.
+     */
+    private int getLastPointIdx() {
+        if (currentLine == null || currentLine.isEmpty()) {
+            return -1;
+        }
+        XY lastPoint = this.currentLine.get(currentLine.size()-1);
+        return lastPoint.getIndex();
+    }
+
+
+    private double getLastPointX() {
+        if (currentLine == null || currentLine.isEmpty()) {
+            return 0d;
+        }
+        XY lastPoint = this.currentLine.get(currentLine.size()-1);
+        return lastPoint.getX();
+    }
+
+
+    /**
+     * Add a Point (YZ,Index) to the current cross section line.
+     * @param y The y coordinate of new point.
+     * @param z The z coordinate of new point.
+     * @param idx Ignored, the parameter of new point.
+     * @return true if point could been added, false otherwise (e.g. not
+     *         parsable y or z values.
+     */
+    private boolean addPoint(double gkr, double gkh, double height, String idx) {
+        // Calculate distance between this and lst point (add distances).
+        double d = distanceToLastPoint(gkr, gkh);
+        double totalX = getLastPointX() + d;
+
+        // We ignore idx, and increment instead.
+        int index;
+        int lastPointIdx = getLastPointIdx();
+        if (lastPointIdx <= 0) {
+            index = 1;
+        } else {
+            index = lastPointIdx + 1;
+        }
+
+        this.lastPointGK[0] = gkr;
+        this.lastPointGK[1] = gkh;
+        currentLine.add(new XY(totalX, height/1000d, index));
+        return true;
+    }
+
+
+    /**
+     * Called for each line. Try to extract info from a w80 line.
+     */
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        // The 'shore' field shows which side of the river the shore is measured.
+        // Therefore, the points have to be added in the correct order (also
+        // because later distances are calculated which cannot be
+        // negative.
+        String pointId = line.substring(0,20);
+        String station = line.substring(9,15);
+        String shore   = line.substring(15,16);
+        // TODO: There is 'station' and a 'shore'-code behind.
+        // 1 = left, 2 = right. none = middle
+        String pointIndex = line.substring(16,21);
+        // For GK, first seven digits are of interest.
+        String gkRight = line.substring(20,30);
+        String gkHigh  = line.substring(30,40);
+        String date    = line.substring(40,46);
+        /* Fields not (yet?) of interest for FLYS
+        String locType = line.substring(46,47);
+        */
+        String height  = line.substring(47,54);
+        String dateH   = line.substring(54,60);
+        /* Fields not (yet?) of interest for FLYS
+        String typeH   = line.substring(60,61);
+        String kindH   = line.substring(61,64);
+        */
+        String dateDec = line.substring(64,70);
+        /* Fields not (yet?) of interest for FLYS
+        String note    = line.substring(70,78);
+        String actual  = line.substring(78);
+        */
+
+        double stationKm = Double.parseDouble(station) / 1000d;
+        double gkRightKm = Double.parseDouble(gkRight.substring(0,7));
+        double gkHighKm  = Double.parseDouble(gkHigh.substring(0,7));
+        double heightM   = Double.parseDouble(height);
+
+        // New (or first) line.
+        if (anchor == null || !anchor.sameStation(stationKm)) {
+            anchor = new Anchor(gkRightKm, gkHighKm, heightM, stationKm);
+            lastPointGK[0] = gkRightKm;
+            lastPointGK[1] = gkHighKm;
+            currentLine = new ArrayList<XY>();
+            data.put(stationKm, currentLine);
+            currentLine.add(new XY(0d, heightM, 0));
+            try {
+                anchorDate = DateGuesser.guessDate(date);
+            }
+            catch (IllegalArgumentException iae) {
+                logger.warn("W80: Invalid date '" + date + "'.");
+            }
+        }
+        else {
+            addPoint(gkRightKm, gkHighKm, heightM, pointIndex);
+        }
+    }
+
+
+    /** Called when file is fully consumed. */
+    @Override
+    protected void finish() {
+        logger.info("Parsed " + data.size() + " lines");
+    }
+
+
+    /** Parses files given as arguments. */
+    public static void main(String [] args) {
+
+        W80Parser parser = new W80Parser();
+
+        logger.warn("Start parsing files.");
+        for (String arg: args) {
+            logger.warn("Parsing a file.");
+            parser.parseW80s(new File(arg), null);
+        }
+        logger.error("Finished parsing files.");
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/WaterlevelDifferencesParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/WaterlevelDifferencesParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,197 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportUnit;
+
+import de.intevation.flys.importer.ImportWst;
+import de.intevation.flys.importer.ImportWstColumn;
+
+
+/**
+ * Parse WaterlevelDifferences CSV file.
+ */
+public class WaterlevelDifferencesParser extends LineParser {
+
+    private static final Logger log =
+        Logger.getLogger(WaterlevelDifferencesParser.class);
+
+    private static final NumberFormat nf =
+        NumberFormat.getInstance(DEFAULT_LOCALE);
+
+    public static final Pattern META_UNIT =
+        Pattern.compile("^Einheit: \\[(.*)\\].*");
+
+    /** List of parsed differences as ImportWst s. */
+    private List<ImportWst> differences;
+
+    private ImportWstColumn[] columns;
+
+    /** The currently processed dataset. */
+    private ImportWst current;
+
+
+    public WaterlevelDifferencesParser() {
+        differences = new ArrayList<ImportWst>();
+    }
+
+
+    /** Get the differences as wst parsed so far. */
+    public List<ImportWst> getDifferences() {
+        return differences;
+    }
+
+
+    /**
+     * Parse a csv waterleveldifferenceparser and create a ImportWst object
+     * from it.
+     */
+    @Override
+    public void parse(File file) throws IOException {
+        current = new ImportWst(file.getName());
+        current.setKind(7);
+
+        super.parse(file);
+    }
+
+
+    /** No rewind implemented. */
+    @Override
+    protected void reset() {
+    }
+
+
+    @Override
+    protected void finish() {
+        if (columns != null && current != null) {
+            // TODO figure out if its needed, as the columns
+            //      are registered at their construction time.
+            for (ImportWstColumn col: columns) {
+                // TODO place a current.addColumn(col); here?
+            }
+
+            differences.add(current);
+        }
+
+        current = null;
+        columns = null;
+    }
+
+
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        if (line.startsWith(START_META_CHAR)) {
+            handleMetaLine(stripMetaLine(line));
+        }
+        else {
+            handleDataLine(line);
+        }
+    }
+
+
+    private void handleMetaLine(String meta) {
+        if (handleMetaUnit(meta)) {
+            return;
+        }
+        else {
+            handleMetaColumnNames(meta);
+        }
+    }
+
+
+    private boolean handleMetaUnit(String meta) {
+        Matcher m = META_UNIT.matcher(meta);
+
+        if (m.matches()) {
+            String unit = m.group(1);
+            log.debug("Found unit: '" + unit + "'");
+
+            current.setUnit(new ImportUnit(unit));
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    private boolean handleMetaColumnNames(String meta) {
+        Pattern META_COLUMN_NAMES = Pattern.compile("Fluss-km;(.*)");
+        Matcher m = META_COLUMN_NAMES.matcher(meta);
+
+        if (m.matches()) {
+            String colStr = m.group(1);
+            String[] cols = colStr.split(SEPERATOR_CHAR);
+
+            log.debug("Found " + cols.length + " columns.");
+
+            initColumns(cols);
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    private void initColumns(String[] cols) {
+        current.setNumberColumns(cols.length);
+        columns = current.getColumns().toArray(new ImportWstColumn[cols.length]);
+
+        for (int i = 0; i < cols.length; i++) {
+            String name = cols[i].replace("\"", "");
+
+            log.debug("Create new column '" + name + "'");
+            current.getColumn(i).setName(name);
+            current.getColumn(i).setDescription(name);
+        }
+    }
+
+
+    private void handleDataLine(String line) {
+        String[] cols = line.split(SEPERATOR_CHAR);
+
+        if (cols == null || cols.length < 2) {
+            log.warn("skip invalid waterlevel-diff line: '" + line + "'");
+            return;
+        }
+
+        try {
+            Double station = nf.parse(cols[0]).doubleValue();
+
+            for (int i = 0; i < columns.length; i++) {
+                int idx = i+1;
+
+                if (idx >= cols.length) {
+                    log.warn("Insufficient column numbers: " + line);
+                    continue;
+                }
+
+                String value = cols[idx];
+
+                try {
+                    columns[i].addColumnValue(
+                        new BigDecimal(station),
+                        new BigDecimal(nf.parse(value).doubleValue()));
+                }
+                catch (ParseException pe) {
+                    log.warn("Could not parse value: '" + value + "'");
+                }
+            }
+        }
+        catch (ParseException pe) {
+            log.warn("Could not parse station: '" + line + "'");
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/WaterlevelParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/WaterlevelParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,191 @@
+package de.intevation.flys.importer.parsers;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.importer.ImportUnit;
+
+import de.intevation.flys.importer.ImportRange;
+import de.intevation.flys.importer.ImportWst;
+import de.intevation.flys.importer.ImportWstColumn;
+import de.intevation.flys.importer.ImportWstColumnValue;
+import de.intevation.flys.importer.ImportWstQRange;
+
+
+/**
+ * Parse CSV Waterlevel files.
+ * As these waterlevels are probably used in fixation analysis
+ * only, functionality to export them to "fixation"-wsts
+ * has been added (the ImportWaterlevel*- stuff is actually
+ * not needed to do so.)
+ */
+public class WaterlevelParser extends LineParser {
+
+    private static final Logger log = Logger.getLogger(WaterlevelParser.class);
+
+    private static final NumberFormat nf =
+        NumberFormat.getInstance(DEFAULT_LOCALE);
+
+    private static final Pattern META_Q_RANGE =
+        Pattern.compile("Abfluss\\s\\[(.*)\\];(.*)");
+
+    public static final Pattern META_UNIT =
+        Pattern.compile("^Einheit: \\[(.*)\\].*");
+
+    private List<ImportWst> waterlevels;
+
+    private ImportWst current;
+
+    /** The Waterlevel-Wst s will always have but one column. */
+    private ImportWstColumn column;
+
+    /** The current (incomplete) Q Range. */
+    private ImportWstQRange currentQRange;
+
+    /** The current (incomplete) km range for Q Range. */
+    private ImportRange currentRange;
+
+    private String currentDescription;
+
+
+    public WaterlevelParser() {
+        waterlevels = new ArrayList<ImportWst>();
+    }
+
+
+    public List<ImportWst> getWaterlevels() {
+        return waterlevels;
+    }
+
+
+    @Override
+    public void parse(File file) throws IOException {
+        currentDescription = file.getName();
+
+        super.parse(file);
+    }
+
+
+    @Override
+    protected void reset() {
+        currentQRange = null;
+        current       = new ImportWst(currentDescription);
+        current.setNumberColumns(1);
+        column        = current.getColumn(0);
+        column.setName(currentDescription);
+        column.setDescription(currentDescription);
+        current.setKind(6);
+    }
+
+
+    @Override
+    protected void finish() {
+        if (current != null) {
+            if (currentQRange != null) {
+                List<ImportWstColumnValue> cValues = column.getColumnValues();
+                // Set end of range to last station.
+                currentRange.setB(cValues.get(cValues.size() -1).getPosition());
+                currentQRange.setRange(currentRange);
+                column.addColumnQRange(currentQRange);
+            }
+
+            waterlevels.add(current);
+        }
+    }
+
+    @Override
+    protected void handleLine(int lineNum, String line) {
+        if (line.startsWith(START_META_CHAR)) {
+            handleMetaLine(stripMetaLine(line));
+            return;
+        }
+        else if (handleQRange(line)) {
+            return;
+        }
+        else {
+            handleDataLine(line);
+            return;
+        }
+    }
+
+
+    private void handleMetaLine(String meta) {
+        Matcher m = META_UNIT.matcher(meta);
+
+        if (m.matches()) {
+            String unit = m.group(1);
+            log.debug("Found unit: '" + unit + "'");
+
+            current.setUnit(new ImportUnit(unit));
+        }
+    }
+
+
+    private boolean handleQRange(String line) {
+        Matcher m = META_Q_RANGE.matcher(line);
+
+        if (m.matches()) {
+            String unitStr  = m.group(1);
+            String valueStr = m.group(2);
+            try {
+                if (currentQRange != null) {
+                    // Finish off the last one.
+                    List<ImportWstColumnValue> cValues = column.getColumnValues();
+                    // Set end of range to last station.
+                    currentRange.setB(cValues.get(cValues.size() -1).getPosition());
+                    currentQRange.setRange(currentRange);
+                    column.addColumnQRange(currentQRange);
+                }
+                currentQRange = new ImportWstQRange(null,
+                    new BigDecimal(nf.parse(valueStr).doubleValue()));
+                currentRange = new ImportRange();
+
+                log.debug("Found new Q range: Q=" + valueStr);
+
+                return true;
+            }
+            catch (ParseException pe) {
+                log.warn("Unparseable Q range: '" + line + "'");
+            }
+        }
+
+        return false;
+    }
+
+
+    private void handleDataLine(String line) {
+        String[] cols = line.split(SEPERATOR_CHAR);
+
+        if (cols == null || cols.length < 2) {
+            log.warn("skip invalid waterlevel line: '" + line + "'");
+            return;
+        }
+
+        try {
+            // Store the value and remember the position for QRange, if needed.
+            Double station = nf.parse(cols[0]).doubleValue();
+            Double value   = nf.parse(cols[1]).doubleValue();
+
+            BigDecimal stationBD = new BigDecimal(station);
+
+            column.addColumnValue(stationBD, new BigDecimal(value));
+
+            if (currentRange.getA() == null) {
+                currentRange.setA(stationBD);
+            }
+        }
+        catch (ParseException pe) {
+            log.warn("Unparseable number in data row: " + line);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/WstParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/WstParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,464 @@
+package de.intevation.flys.importer.parsers;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.InputStreamReader;
+import java.io.FileInputStream;
+
+import java.text.NumberFormat;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.utils.StringUtil;
+import de.intevation.flys.utils.DateGuesser;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+import java.math.BigDecimal;
+
+import de.intevation.flys.importer.ImportWstQRange;
+import de.intevation.flys.importer.ImportWstColumn;
+import de.intevation.flys.importer.ImportTimeInterval;
+import de.intevation.flys.importer.ImportRange;
+import de.intevation.flys.importer.ImportUnit;
+import de.intevation.flys.importer.ImportWst;
+
+public class WstParser
+{
+    private static Logger log = Logger.getLogger(WstParser.class);
+
+    public static final String COLUMN_BEZ_TEXT   = "column-bez-text";
+    public static final String COLUMN_BEZ_BREITE = "column-bez-breite";
+    public static final String COLUMN_QUELLE     = "column-quelle";
+    public static final String COLUMN_DATUM      = "column-datum";
+
+    public static final BigDecimal UNDEFINED_ZERO =
+        new BigDecimal(0.0);
+    public static final BigDecimal MIN_RANGE =
+        new BigDecimal(-Double.MAX_VALUE);
+    public static final BigDecimal MAX_RANGE =
+        new BigDecimal(Double.MAX_VALUE);
+
+    public static final String ENCODING = "ISO-8859-1";
+
+    public static final Pattern UNIT_COMMENT =
+        Pattern.compile("\\*\\s*[kK][mM]\\s+(.+)");
+
+    public static final Pattern UNIT =
+        Pattern.compile("[^\\[]*\\[([^]]+)\\].*");
+
+    public static final double INTERVAL_GAP = 0.00001d;
+
+    protected ImportWst wst;
+
+    protected ImportRange lastRange;
+
+    public WstParser() {
+    }
+
+    public ImportWst getWst() {
+        return wst;
+    }
+
+    public void setWst(ImportWst wst) {
+        this.wst = wst;
+    }
+
+    public ImportTimeInterval guessDate(String string) {
+        try {
+            return new ImportTimeInterval(
+                DateGuesser.guessDate(string));
+        }
+        catch (IllegalArgumentException iae) {
+        }
+        return null;
+    }
+
+    public void parse(File file) throws IOException {
+
+        log.info("Parsing WST file '" + file + "'");
+
+        wst = new ImportWst(file.getName());
+
+        LineNumberReader in = null;
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String input;
+            boolean first = true;
+            int columnCount = 0;
+
+            String [] lsBezeichner   = null;
+            String [] langBezeichner = null;
+            int    [] colNaWidths    = null;
+            String [] quellen        = null;
+            String [] daten          = null;
+
+            BigDecimal [] aktAbfluesse   = null;
+            BigDecimal [] firstAbfluesse = null;
+
+            BigDecimal minKm   = MAX_RANGE;
+            BigDecimal maxKm   = MIN_RANGE;
+            BigDecimal kmHist1 = null;
+            BigDecimal kmHist2 = null;
+
+            boolean columnHeaderChecked = false;
+
+            String einheit = "Wasserstand [NN + m]";
+
+            HashSet<BigDecimal> kms = new HashSet<BigDecimal>();
+
+            while ((input = in.readLine()) != null) {
+                String line = input;
+                if (first) { // fetch number of columns
+                    if ((line = line.trim()).length() == 0) {
+                        continue;
+                    }
+                    try {
+                        columnCount = Integer.parseInt(line);
+                        if (columnCount <= 0) {
+                            throw new NumberFormatException(
+                                "number columns <= 0");
+                        }
+                        log.debug("Number of columns: " + columnCount);
+                        wst.setNumberColumns(columnCount);
+                        lsBezeichner = new String[columnCount];
+                    }
+                    catch (NumberFormatException nfe) {
+                        log.warn("WST: invalid number.", nfe);
+                        continue;
+                    }
+                    first = false;
+                    continue;
+                }
+
+                line = line.replace(',', '.');
+
+                if (line.startsWith("*\u001f")) {
+                    BigDecimal [] data =
+                        parseLineAsDouble(line, columnCount, false, true);
+
+                    if (aktAbfluesse != null) {
+                        if (kmHist1 != null && kmHist2 != null
+                        && kmHist1.compareTo(kmHist2) < 0) {
+                            BigDecimal t = minKm; minKm = maxKm; maxKm = t;
+                        }
+                        addInterval(minKm, maxKm, aktAbfluesse);
+                        minKm = MAX_RANGE;
+                        maxKm = MIN_RANGE;
+                    }
+
+                    aktAbfluesse = new BigDecimal[columnCount];
+                    log.debug("new q range: " + columnCount);
+                    for (int i = 0; i < Math.min(columnCount, data.length); ++i) {
+                        if (data[i] != null) {
+                            log.debug("  column: " + data[i]);
+                            aktAbfluesse[i] = data[i];
+                        }
+                    }
+
+                    if (firstAbfluesse == null) {
+                        firstAbfluesse = (BigDecimal [])aktAbfluesse.clone();
+                    }
+                    continue;
+                }
+
+                if (line.startsWith("*!")) {
+                    String spezial = line.substring(2).trim();
+
+                    if (spezial.length() == 0) {
+                        continue;
+                    }
+
+                    if (spezial.startsWith(COLUMN_BEZ_TEXT)) {
+                        spezial = spezial.substring(COLUMN_BEZ_TEXT.length()).trim();
+                        if (spezial.length() == 0) {
+                            continue;
+                        }
+                        langBezeichner = StringUtil.splitQuoted(spezial, '"');
+                    }
+                    else if (spezial.startsWith(COLUMN_BEZ_BREITE)) {
+                        spezial = spezial.substring(COLUMN_BEZ_BREITE.length()).trim();
+
+                        if (spezial.length() == 0) {
+                            continue;
+                        }
+
+                        String[] split = spezial.split("\\s+");
+
+                        colNaWidths = new int[split.length];
+                        for (int i=0; i < split.length; i++) {
+                            colNaWidths[i] = Integer.parseInt(split[i]);
+                        }
+                    }
+                    else if (spezial.startsWith(COLUMN_QUELLE)) {
+                        if (spezial.length() == 0) {
+                            continue;
+                        }
+                        quellen = StringUtil.splitQuoted(spezial, '"');
+                    }
+                    else if (spezial.startsWith(COLUMN_DATUM)) {
+                        spezial = spezial.substring(COLUMN_DATUM.length()).trim();
+                        if (spezial.length() == 0) {
+                            continue;
+                        }
+                        daten = StringUtil.splitQuoted(spezial, '"');
+                    }
+                    continue;
+                }
+
+                if (line.length() < 11) {
+                    continue;
+                }
+
+                if (line.startsWith("*")) {
+                    Matcher m = UNIT_COMMENT.matcher(line);
+                    if (m.matches()) {
+                        log.debug("unit comment found");
+                        // XXX: This hack is needed because desktop
+                        // FLYS is broken figuring out the unit
+                        String [] units = m.group(1).split("\\s{2,}");
+                        m = UNIT.matcher(units[0]);
+                        einheit = m.matches() ? m.group(1) : units[0];
+                        log.debug("unit: " + einheit);
+                    }
+                    continue;
+                }
+
+                if (firstAbfluesse != null) {
+                    if (!columnHeaderChecked) {
+                        int unknownCount = 0;
+                        HashSet<String> uniqueColumnNames =
+                            new HashSet<String>();
+                        for (int i = 0; i < lsBezeichner.length; ++i) {
+                            if (lsBezeichner[i] == null
+                            || lsBezeichner[i].length() == 0) {
+                                double q = firstAbfluesse[i].doubleValue();
+                                if (q < 0.001) {
+                                    lsBezeichner[i] =
+                                        "<unbekannt #" + unknownCount + ">";
+                                    ++unknownCount;
+                                }
+                                else {
+                                    lsBezeichner[i] = "Q="+format(q);
+                                }
+                            }
+                            String candidate = lsBezeichner[i];
+                            int collision = 1;
+                            while (!uniqueColumnNames.add(candidate)) {
+                                candidate = lsBezeichner[i] +
+                                    " (" + collision + ")";
+                                ++collision;
+                            }
+                            ImportWstColumn iwc = wst.getColumn(i);
+                            iwc.setName(candidate);
+                            String potentialDate = daten != null && i < daten.length
+                                ? daten[i]
+                                : candidate;
+                            iwc.setTimeInterval(guessDate(potentialDate));
+                        }
+                        columnHeaderChecked = true;
+                    }
+
+                    BigDecimal [] data =
+                        parseLineAsDouble(line, columnCount, true, false);
+
+                    BigDecimal kaem = data[0];
+
+                    if (!kms.add(kaem)) {
+                        log.warn(
+                            "WST: km " + kaem +
+                            " (line " + in.getLineNumber() +
+                            ") found more than once. -> ignored");
+                        continue;
+                    }
+
+                    kmHist2 = kmHist1;
+                    kmHist1 = kaem;
+
+                    if (kaem.compareTo(minKm) < 0) {
+                        minKm = kaem;
+                    }
+                    if (kaem.compareTo(maxKm) > 0) {
+                        maxKm = kaem;
+                    }
+
+                    // extract values
+                    for (int i = 0; i < columnCount; ++i) {
+                        addValue(kaem, data[i+1], i);
+                    }
+
+                }
+                else { // firstAbfluesse == null
+                    if (langBezeichner != null) {
+                        lsBezeichner = StringUtil.fitArray(
+                            langBezeichner, lsBezeichner);
+                    }
+                    else if (colNaWidths != null) {
+                        for (int j = 0, i = 0, N = input.length();
+                             j < colNaWidths.length && i < N;
+                             i += colNaWidths[j++]
+                        ) {
+                            lsBezeichner[j] = input.substring(
+                                i, i+colNaWidths[j]).trim();
+                        }
+                    }
+                    else {
+                        // first column begins at position 8 in line
+                        for (int i = 8, col = 0; i < input.length(); i += 9) {
+                            if ((i + 9) > input.length()) {
+                                i = input.length() - 10;
+                            }
+                            // one column header is 9 chars wide
+                            lsBezeichner[col++] =
+                                input.substring(i, i + 9).trim();
+
+                            if (col == lsBezeichner.length) {
+                                break;
+                            }
+                        }
+                    }
+                }
+
+            } // for all lines in WST file
+
+            wst.setUnit(new ImportUnit(einheit));
+
+            if (kmHist1 != null && kmHist2 != null
+            && kmHist1.compareTo(kmHist2) < 0) {
+                BigDecimal t = minKm; minKm = maxKm; maxKm = t;
+            }
+            addInterval(minKm, maxKm, aktAbfluesse);
+
+            fixRangesOrder();
+        }
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+
+    protected void fixRangesOrder() {
+        wst.fixRangesOrder();
+    }
+
+    protected void addValue(BigDecimal km, BigDecimal w, int index) {
+        if (w != null) {
+            ImportWstColumn column = wst.getColumn(index);
+            column.addColumnValue(km, w);
+        }
+    }
+
+    private static final NumberFormat NF = getNumberFormat();
+
+    private static final NumberFormat getNumberFormat() {
+        NumberFormat nf = NumberFormat.getInstance();
+        nf.setMinimumFractionDigits(2);
+        nf.setMaximumFractionDigits(2);
+        return nf;
+    }
+
+    protected static String format(double value) {
+        return NF.format(value);
+    }
+
+    protected void addInterval(
+        BigDecimal    from,
+        BigDecimal    to,
+        BigDecimal [] values
+    ) {
+        log.debug("addInterval: " + from + " " + to);
+
+        if (values == null || from == MAX_RANGE || from == MIN_RANGE) {
+            return;
+        }
+
+        ImportRange range = new ImportRange(from, to);
+
+        // little workaround to make the q ranges tightly fit.
+        // Leave a very small gap to ensure that the range queries
+        // still work.
+
+        if (lastRange != null) {
+            double a1 = lastRange.getA().doubleValue();
+            double b1 = lastRange.getB().doubleValue();
+            double a2 = range.getA().doubleValue();
+
+            if (a1 < b1) {
+                lastRange.setB(new BigDecimal(a2 - INTERVAL_GAP));
+            }
+            else { // a1 >= b1
+                lastRange.setB(new BigDecimal(a2 + INTERVAL_GAP));
+            }
+        }
+
+        for (int i = 0; i < values.length; ++i) {
+            ImportWstColumn column = wst.getColumn(i);
+            ImportWstQRange wstQRange = new ImportWstQRange(range, values[i]);
+            column.addColumnQRange(wstQRange);
+        }
+
+        lastRange = range;
+    }
+
+    private static final BigDecimal [] parseLineAsDouble(
+        String  line,
+        int     count,
+        boolean bStation,
+        boolean bParseEmptyAsZero
+    ) {
+        String [] tokens = parseLine(line, count, bStation);
+
+        BigDecimal [] doubles = new BigDecimal[tokens.length];
+
+        for (int i = 0; i < doubles.length; ++i) {
+            String token = tokens[i].trim();
+            if (token.length() != 0) {
+                doubles[i] = new BigDecimal(token);
+            }
+            else if (bParseEmptyAsZero) {
+                doubles[i] = UNDEFINED_ZERO;
+            }
+        }
+
+        return doubles;
+    }
+
+    private static String [] parseLine(
+        String  line,
+        int     tokenCount,
+        boolean bParseStation
+    ) {
+        ArrayList<String> strings = new ArrayList<String>();
+
+        if (bParseStation) {
+            if (line.length() < 8) {
+                throw new IllegalArgumentException("station too short");
+            }
+            strings.add(line.substring(0, 8));
+        }
+
+        int pos = 9;
+        for (int i = 0; i < tokenCount; ++i) {
+            if (line.length() >= pos + 8) {
+                strings.add(line.substring(pos, pos + 8));
+            }
+            else {
+                strings.add("");
+            }
+            pos += 9;
+        }
+
+        return strings.toArray(new String[strings.size()]);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/tim/Coordinate.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/tim/Coordinate.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,45 @@
+package de.intevation.flys.importer.parsers.tim;
+
+/** X,Y,Z- triple. */
+public class Coordinate
+{
+    public double x;
+    public double y;
+    public double z;
+
+    public Coordinate() {
+    }
+
+    public Coordinate(Coordinate c) {
+        this(c.x, c.y, c.z);
+    }
+
+    public Coordinate(double x, double y) {
+        this(x, y, 0d);
+    }
+
+    public Coordinate(double x, double y, double z) {
+        this.x = x;
+        this.y = y;
+        this.z = z;
+    }
+
+    public double getX() {
+        return this.x;
+    }
+
+    public double getY() {
+        return this.y;
+    }
+
+    public final double distanceSqr(double ox, double oy) {
+        double dx = x - ox;
+        double dy = y - oy;
+        return dx*dx + dy*dy;
+    }
+
+    public final double distance(double xo, double yo) {
+        return Math.sqrt(distanceSqr(xo, yo));
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/tim/LexiComparator.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/tim/LexiComparator.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,18 @@
+package de.intevation.flys.importer.parsers.tim;
+
+import java.util.Comparator;
+
+public class LexiComparator implements Comparator<Coordinate> {
+
+    public static final LexiComparator CMP = new LexiComparator();
+
+    @Override
+    public int compare(Coordinate a, Coordinate b) {
+        if (a.x < b.x) return -1;
+        if (a.x > b.x) return +1;
+        if (a.y < b.y) return -1;
+        if (a.y > b.y) return +1;
+        return 0;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/tim/Line.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/tim/Line.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,34 @@
+package de.intevation.flys.importer.parsers.tim;
+
+/** Two coordinates and a helper. */
+public class Line {
+
+    public Coordinate a;
+    public Coordinate b;
+
+    public Line() {
+    }
+
+    public Line(Coordinate a, Coordinate b) {
+        this.a = a;
+        this.b = b;
+    }
+
+    /** Project coordinate to line. */
+    public double distanceToFirst(Coordinate c) {
+
+        double nx = b.x - a.x;
+        double ny = b.y - a.y;
+
+        double len = Math.sqrt(nx*nx + ny*ny);
+
+        nx /= len;
+        ny /= len;
+
+        double px = c.x - a.x;
+        double py = c.y - a.y;
+
+        return nx*px + ny*py;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/importer/parsers/tim/TIMParser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/tim/TIMParser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,93 @@
+package de.intevation.flys.importer.parsers.tim;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.utils.EpsilonComparator;
+
+/** Parser for single .tim files. */
+public class TIMParser
+{
+    /** Private logger. */
+    private static Logger logger = Logger.getLogger(TIMParser.class);
+
+    /** Proper encoding. */
+    public static final String ENCODING =
+        System.getProperty("tim.encoding", "ISO-8859-1");
+
+    /** Map of stations (km) to points (xyz). */
+    protected Map<Double, List<Coordinate>> lines;
+
+    public TIMParser() {
+        lines = new TreeMap<Double, List<Coordinate>>(EpsilonComparator.CMP);
+    }
+
+    /** Access map of stations (km) to coordinates (xyz). */
+    public Map<Double, List<Coordinate>> getLines() {
+        return lines;
+    }
+
+    /** Get number of lines (data). */
+    public int numLines() {
+        return lines.size();
+    }
+
+    /** Parse single .tim file. */
+    public void load(String filename) throws IOException {
+        BufferedReader reader =
+            new BufferedReader(
+            new InputStreamReader(
+            new FileInputStream(filename), ENCODING));
+        try {
+            String row;
+            while ((row = reader.readLine()) != null) {
+                if (row.length() < 54) {
+                    logger.warn("row too short");
+                    continue;
+                }
+                double station, x, y, z;
+                try {
+                    station = Double.parseDouble(row.substring( 9, 16))/1000d;
+                    x       = Double.parseDouble(row.substring(20, 30))/1000d;
+                    y       = Double.parseDouble(row.substring(30, 40))/1000d;
+                    z       = Double.parseDouble(row.substring(47, 54))/10000d;
+                } catch (NumberFormatException nfe) {
+                    logger.warn("Invalid row");
+                    continue;
+                }
+
+                Double km = station;
+
+                List<Coordinate> line = lines.get(km);
+                if (line == null) {
+                    line = new ArrayList<Coordinate>();
+                    lines.put(km, line);
+                }
+
+                line.add(new Coordinate(x, y, z));
+            }
+            // Bring coords in lexicographical order.
+            sortCoordinates();
+        } finally {
+            reader.close();
+        }
+    }
+
+    /** Sort coordinates of lines lexicographically. */
+    protected void sortCoordinates() {
+        for (List<Coordinate> line: lines.values()) {
+            Collections.sort(line, LexiComparator.CMP);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Annotation.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Annotation.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,111 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "annotations")
+public class Annotation
+implements   Serializable
+{
+    private Integer        id;
+    private Range          range;
+    private Attribute      attribute;
+    private Position       position;
+    private Edge           edge;
+    private AnnotationType type;
+
+    public Annotation() {
+    }
+
+    public Annotation(
+        Range          range,
+        Attribute      attribute,
+        Position       position,
+        Edge           edge,
+        AnnotationType type
+    ) {
+        this.range     = range;
+        this.attribute = attribute;
+        this.position  = position;
+        this.edge      = edge;
+        this.type      = type;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_ANNOTATIONS_ID_SEQ",
+        sequenceName   = "ANNOTATIONS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_ANNOTATIONS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "range_id")
+    public Range getRange() {
+        return range;
+    }
+
+    public void setRange(Range range) {
+        this.range = range;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "attribute_id")
+    public Attribute getAttribute() {
+        return attribute;
+    }
+
+    public void setAttribute(Attribute attribute) {
+        this.attribute = attribute;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "position_id")
+    public Position getPosition() {
+        return position;
+    }
+
+    public void setPosition(Position position) {
+        this.position = position;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "edge_id")
+    public Edge getEdge() {
+        return edge;
+    }
+
+    public void setEdge(Edge edge) {
+        this.edge = edge;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "type_id")
+    public AnnotationType getType() {
+        return type;
+    }
+
+    public void setType(AnnotationType type) {
+        this.type = type;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/AnnotationType.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/AnnotationType.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,54 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+ at Entity
+ at Table(name = "annotation_types")
+public class AnnotationType
+implements   Serializable
+{
+    private Integer id;
+    private String  name;
+
+    public AnnotationType() {
+    }
+
+    public AnnotationType(String name) {
+        this.name = name;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_ANNOTATION_TYPES_ID_SEQ",
+        sequenceName   = "ANNOTATION_TYPES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_ANNOTATION_TYPES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Attribute.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Attribute.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,55 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+ at Entity
+ at Table(name = "attributes")
+public class Attribute
+implements   Serializable
+{
+    private Integer id;
+
+    private String  value;
+
+    public Attribute() {
+    }
+
+    public Attribute(String value) {
+        this.value = value;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_ATTRIBUTES_ID_SEQ",
+        sequenceName   = "ATTRIBUTES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_ATTRIBUTES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "value")
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/AxisKind.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/AxisKind.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,44 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "axis_kinds")
+public class AxisKind implements Serializable {
+    private Integer id;
+    private String name;
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return The display Name of the kind as String.
+     */
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/BedHeightEpoch.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/BedHeightEpoch.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,211 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "bed_height_epoch")
+public class BedHeightEpoch implements Serializable {
+
+    private Integer id;
+
+    private River river;
+
+    private TimeInterval timeInterval;
+
+    private ElevationModel curElevationModel;
+    private ElevationModel oldElevationModel;
+
+    private Range range;
+
+    private String evaluationBy;
+    private String description;
+
+    private List<BedHeightEpochValue> values;
+
+
+    public BedHeightEpoch() {
+    }
+
+
+    public BedHeightEpoch(
+        River          river,
+        TimeInterval   timeInterval,
+        Range          range,
+        ElevationModel curElevationModel,
+        ElevationModel oldElevationModel,
+        String         evaluationBy,
+        String         description
+    ) {
+        this.river             = river;
+        this.timeInterval      = timeInterval;
+        this.range             = range;
+        this.curElevationModel = curElevationModel;
+        this.oldElevationModel = oldElevationModel;
+        this.evaluationBy      = evaluationBy;
+        this.description       = description;
+        this.values            = new ArrayList<BedHeightEpochValue>();
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_BED_HEIGHT_EPOCH_ID_SEQ",
+        sequenceName   = "BED_HEIGHT_EPOCH_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_BED_HEIGHT_EPOCH_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id" )
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "time_interval_id")
+    public TimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(TimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "cur_elevation_model_id")
+    public ElevationModel getCurElevationModel() {
+        return curElevationModel;
+    }
+
+    public void setCurElevationModel(ElevationModel curElevationModel) {
+        this.curElevationModel = curElevationModel;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "old_elevation_model_id")
+    public ElevationModel getOldElevationModel() {
+        return oldElevationModel;
+    }
+
+    public void setOldElevationModel(ElevationModel oldElevationModel) {
+        this.oldElevationModel = oldElevationModel;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "range_id")
+    public Range getRange() {
+        return range;
+    }
+
+    public void setRange(Range range) {
+        this.range = range;
+    }
+
+    @Column(name = "evaluation_by")
+    public String getEvaluationBy() {
+        return evaluationBy;
+    }
+
+    public void setEvaluationBy(String evaluationBy) {
+        this.evaluationBy = evaluationBy;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @OneToMany
+    @JoinColumn(name = "bed_height_epoch_id")
+    public List<BedHeightEpochValue> getValues() {
+        return values;
+    }
+
+    public void setValues(List<BedHeightEpochValue> values) {
+        this.values = values;
+    }
+
+
+    public static List<BedHeightEpoch> getBedHeightEpochs(
+        River  river,
+        double kmLo,
+        double kmHi
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from BedHeightEpoch where river=:river");
+
+        query.setParameter("river", river);
+
+        // TODO Do km range filtering in SQL statement
+
+        List<BedHeightEpoch> epochs = query.list();
+        List<BedHeightEpoch> good   = new ArrayList<BedHeightEpoch>();
+
+        OUTER: for (BedHeightEpoch e: epochs) {
+            for (BedHeightEpochValue value: e.getValues()) {
+                double station = value.getStation().doubleValue();
+
+                if (station >= kmLo && station <= kmHi) {
+                    good.add(e);
+                    continue OUTER;
+                }
+            }
+        }
+
+        return good;
+    }
+
+
+    public static BedHeightEpoch getBedHeightEpochById(int id) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from BedHeightEpoch where id=:id");
+
+        query.setParameter("id", id);
+
+        List<BedHeightEpoch> singles = query.list();
+
+        return singles != null ? singles.get(0) : null;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/BedHeightEpochValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/BedHeightEpochValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,119 @@
+package de.intevation.flys.model;
+
+import java.util.List;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "bed_height_epoch_values")
+public class BedHeightEpochValue
+implements   Serializable
+{
+    private static Logger logger =
+        Logger.getLogger(BedHeightEpochValue.class);
+
+    private Integer id;
+
+    private BedHeightEpoch bedHeight;
+
+    private BigDecimal station;
+    private BigDecimal height;
+
+
+    public BedHeightEpochValue() {
+    }
+
+    public BedHeightEpochValue(
+        BedHeightEpoch bedHeight,
+        BigDecimal station,
+        BigDecimal height
+    ) {
+        this.bedHeight = bedHeight;
+        this.station   = station;
+        this.height    = height;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_BED_EPOCH_VALUE_ID_SEQ",
+        sequenceName   = "BED_EPOCH_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_BED_EPOCH_VALUE_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "bed_height_epoch_id" )
+    public BedHeightEpoch getBedHeight() {
+        return bedHeight;
+    }
+
+    public void setBedHeight(BedHeightEpoch bedHeight) {
+        this.bedHeight = bedHeight;
+    }
+
+    @Column(name = "station")
+    public BigDecimal getStation() {
+        return station;
+    }
+
+    public void setStation(BigDecimal station) {
+        this.station = station;
+    }
+
+    @Column(name = "height")
+    public BigDecimal getHeight() {
+        return height;
+    }
+
+    public void setHeight(BigDecimal height) {
+        this.height = height;
+    }
+
+
+    public static List<BedHeightEpochValue> getBedHeightEpochValues(
+        BedHeightEpoch epoch,
+        double kmLo,
+        double kmHi
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from BedHeightEpochValue where bedHeight=:epoch " +
+            "   and station >= :kmLo and station <= :kmHi");
+
+        query.setParameter("epoch", epoch);
+        query.setParameter("kmLo", new BigDecimal(kmLo));
+        query.setParameter("kmHi", new BigDecimal(kmHi));
+
+        return query.list();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/BedHeightSingle.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/BedHeightSingle.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,272 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "bed_height_single")
+public class BedHeightSingle implements Serializable {
+
+    private Integer id;
+    private Integer year;
+    private Integer soundingWidth;
+
+    private String evaluationBy;
+    private String description;
+
+    private River river;
+
+    private BedHeightType  type;
+
+    private LocationSystem locationSystem;
+
+    private ElevationModel curElevationModel;
+
+    private ElevationModel oldElevationModel;
+
+    private Range range;
+
+    private List<BedHeightSingleValue> values;
+
+
+    public BedHeightSingle() {
+    }
+
+
+    public BedHeightSingle(
+        River          river,
+        Integer        year,
+        Integer        soundingWidth,
+        BedHeightType  type,
+        LocationSystem locationSystem,
+        ElevationModel curElevationModel,
+        Range          range
+    ) {
+        this(
+            river,
+            year,
+            soundingWidth,
+            type,
+            locationSystem,
+            curElevationModel,
+            null,
+            range,
+            null,
+            null);
+    }
+
+
+    public BedHeightSingle(
+        River          river,
+        Integer        year,
+        Integer        soundingWidth,
+        BedHeightType  type,
+        LocationSystem locationSystem,
+        ElevationModel curElevationModel,
+        ElevationModel oldElevationModel,
+        Range          range,
+        String         evaluationBy,
+        String         description
+    ) {
+        this.river             = river;
+        this.year              = year;
+        this.soundingWidth     = soundingWidth;
+        this.type              = type;
+        this.locationSystem    = locationSystem;
+        this.curElevationModel = curElevationModel;
+        this.oldElevationModel = oldElevationModel;
+        this.range             = range;
+        this.evaluationBy      = evaluationBy;
+        this.description       = description;
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_BED_HEIGHT_SINGLE_ID_SEQ",
+        sequenceName   = "BED_HEIGHT_SINGLE_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_BED_HEIGHT_SINGLE_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id" )
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @Column(name = "year")
+    public Integer getYear() {
+        return year;
+    }
+
+    public void setYear(Integer year) {
+        this.year = year;
+    }
+
+    @Column(name = "sounding_width")
+    public Integer getSoundingWidth() {
+        return soundingWidth;
+    }
+
+    public void setSoundingWidth(Integer soundingWidth) {
+        this.soundingWidth = soundingWidth;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "type_id")
+    public BedHeightType getType() {
+        return type;
+    }
+
+    public void setType(BedHeightType type) {
+        this.type = type;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "location_system_id")
+    public LocationSystem getLocationSystem() {
+        return locationSystem;
+    }
+
+    public void setLocationSystem(LocationSystem locationSystem) {
+        this.locationSystem = locationSystem;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "cur_elevation_model_id")
+    public ElevationModel getCurElevationModel() {
+        return curElevationModel;
+    }
+
+    public void setCurElevationModel(ElevationModel curElevationModel) {
+        this.curElevationModel = curElevationModel;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "old_elevation_model_id")
+    public ElevationModel getOldElevationModel() {
+        return oldElevationModel;
+    }
+
+    public void setOldElevationModel(ElevationModel oldElevationModel) {
+        this.oldElevationModel = oldElevationModel;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "range_id")
+    public Range getRange() {
+        return range;
+    }
+
+    public void setRange(Range range) {
+        this.range = range;
+    }
+
+    @Column(name = "evaluation_by")
+    public String getEvaluationBy() {
+        return evaluationBy;
+    }
+
+    public void setEvaluationBy(String evaluationBy) {
+        this.evaluationBy = evaluationBy;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @OneToMany
+    @JoinColumn(name = "bed_height_single_id")
+    public List<BedHeightSingleValue> getValues() {
+        return values;
+    }
+
+    public void setValues(List<BedHeightSingleValue> values) {
+        this.values = values;
+    }
+
+
+    public static List<BedHeightSingle> getBedHeightSingles(
+        River  river,
+        double kmLo,
+        double kmHi
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from BedHeightSingle where river=:river");
+
+        query.setParameter("river", river);
+
+        // TODO Do km range filtering in SQL statement
+
+        List<BedHeightSingle> singles = query.list();
+        List<BedHeightSingle> good    = new ArrayList<BedHeightSingle>();
+
+        for (BedHeightSingle s: singles) {
+            for (BedHeightSingleValue value: s.getValues()) {
+                double station = value.getStation().doubleValue();
+
+                if (station >= kmLo && station <= kmHi) {
+                    good.add(s);
+                    break;
+                }
+            }
+        }
+
+        return good;
+    }
+
+
+    public static BedHeightSingle getBedHeightSingleById(int id) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from BedHeightSingle where id=:id");
+
+        query.setParameter("id", id);
+
+        List<BedHeightSingle> singles = query.list();
+
+        return singles != null ? singles.get(0) : null;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/BedHeightSingleValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/BedHeightSingleValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,167 @@
+package de.intevation.flys.model;
+
+import java.util.List;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "bed_height_single_values")
+public class BedHeightSingleValue
+implements   Serializable
+{
+    private static Logger logger =
+        Logger.getLogger(BedHeightSingleValue.class);
+
+    private Integer id;
+
+    private BedHeightSingle bedHeight;
+
+    private BigDecimal station;
+    private BigDecimal height;
+    private BigDecimal uncertainty;
+    private BigDecimal dataGap;
+    private BigDecimal soundingWidth;
+    private BigDecimal width;
+
+
+    public BedHeightSingleValue() {
+    }
+
+    public BedHeightSingleValue(
+        BedHeightSingle bedHeight,
+        BigDecimal station,
+        BigDecimal height,
+        BigDecimal uncertainty,
+        BigDecimal dataGap,
+        BigDecimal soundingWidth,
+        BigDecimal width
+    ) {
+        this.bedHeight     = bedHeight;
+        this.station       = station;
+        this.height        = height;
+        this.uncertainty   = uncertainty;
+        this.dataGap       = dataGap;
+        this.soundingWidth = soundingWidth;
+        this.width         = width;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_BED_SINGLE_VALUE_ID_SEQ",
+        sequenceName   = "BED_SINGLE_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_BED_SINGLE_VALUE_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "bed_height_single_id" )
+    public BedHeightSingle getBedHeight() {
+        return bedHeight;
+    }
+
+    public void setBedHeight(BedHeightSingle bedHeight) {
+        this.bedHeight = bedHeight;
+    }
+
+    @Column(name = "station")
+    public BigDecimal getStation() {
+        return station;
+    }
+
+    public void setStation(BigDecimal station) {
+        this.station = station;
+    }
+
+    @Column(name = "height")
+    public BigDecimal getHeight() {
+        return height;
+    }
+
+    public void setHeight(BigDecimal height) {
+        this.height = height;
+    }
+
+    @Column(name="uncertainty")
+    public BigDecimal getUncertainty() {
+        return uncertainty;
+    }
+
+    public void setUncertainty(BigDecimal uncertainty) {
+        this.uncertainty = uncertainty;
+    }
+
+    @Column(name="data_gap")
+    public BigDecimal getDataGap() {
+        return dataGap;
+    }
+
+    public void setDataGap(BigDecimal dataGap) {
+        this.dataGap = dataGap;
+    }
+
+    @Column(name="sounding_width")
+    public BigDecimal getSoundingWidth() {
+        return soundingWidth;
+    }
+
+    public void setSoundingWidth(BigDecimal soundingWidth) {
+        this.soundingWidth = soundingWidth;
+    }
+
+    @Column(name="width")
+    public BigDecimal getWidth() {
+        return width;
+    }
+
+    public void setWidth(BigDecimal width) {
+        this.width = width;
+    }
+
+
+    public static List<BedHeightSingleValue> getBedHeightSingleValues(
+        BedHeightSingle single,
+        double kmLo,
+        double kmHi
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from BedHeightSingleValue where bedHeight=:single " +
+            "   and station >= :kmLo and station <= :kmHi");
+
+        query.setParameter("single", single);
+        query.setParameter("kmLo", new BigDecimal(kmLo));
+        query.setParameter("kmHi", new BigDecimal(kmHi));
+
+        return query.list();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/BedHeightType.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/BedHeightType.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,86 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+import de.intevation.flys.backend.SessionHolder;
+
+ at Entity
+ at Table(name = "bed_height_type")
+public class BedHeightType
+implements   Serializable
+{
+    private static Logger log = Logger.getLogger(BedHeightType.class);
+
+    private Integer id;
+    private String  name;
+
+
+    public BedHeightType() {
+    }
+
+    public BedHeightType(String name) {
+        this.name = name;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_BED_HEIGHT_TYPE_ID_SEQ",
+        sequenceName   = "BED_HEIGHT_TYPE_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_BED_HEIGHT_TYPE_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public static BedHeightType fetchBedHeightTypeForType(String type) {
+	return fetchBedHeightTypeForType(type, null);
+    }
+
+    public static BedHeightType fetchBedHeightTypeForType(String name, Session session) {
+
+	if (session == null) {
+	    session = SessionHolder.HOLDER.get();
+	}
+
+        Query query = session.createQuery(
+            "from BedHeightType where name=:name");
+
+        query.setParameter("name", name);
+
+        List<Object> results = query.list();
+
+        return results.isEmpty() ? null : (BedHeightType)results.get(0);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/BoundaryKind.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/BoundaryKind.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,45 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "boundary_kinds")
+public class BoundaryKind implements Serializable {
+
+    private Integer id;
+    private String name;
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return name of the kind of boundary as String.
+     */
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Building.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Building.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,104 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import com.vividsolutions.jts.geom.LineString;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "buildings")
+public class Building
+implements   Serializable
+{
+    private Integer    id;
+    private River      river;
+    private String     name;
+    private LineString geom;
+
+    public Building() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public LineString getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(LineString geom) {
+        this.geom = geom;
+    }
+
+    public static List<Building> getBuildings(int riverId, int kindId) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from Building where river.id =:river_id and kind_id=:kind_id");
+        query.setParameter("kind_id", kindId);
+        query.setParameter("river_id", riverId);
+
+        return query.list();
+    }
+
+    public static List<Building> getBuildings(int riverId, String name) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from Building where river.id =:river_id and name=:name");
+        query.setParameter("river_id", riverId);
+        query.setParameter("name", name);
+
+        return query.list();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/CrossSection.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/CrossSection.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,198 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import java.awt.geom.Point2D;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.JoinColumn;
+
+import java.math.MathContext;
+import java.math.BigDecimal;
+
+import org.hibernate.Session;
+import org.hibernate.SQLQuery;
+import org.hibernate.Query;
+
+import org.hibernate.type.StandardBasicTypes;
+
+import de.intevation.flys.backend.SessionHolder;
+
+ at Entity
+ at Table(name = "cross_sections")
+public class CrossSection
+implements   Serializable
+{
+    public static final MathContext PRECISION = new MathContext(6);
+
+    public static final String SQL_FAST_CROSS_SECTION_LINES =
+        "SELECT km, x, y, csl.id AS csl_id " +
+        "FROM cross_section_lines csl JOIN cross_section_points csp " +
+        "ON csp.cross_section_line_id = csl.id " +
+        "WHERE csl.cross_section_id = :cs_id AND " +
+        "km between :from_km AND :to_km " +
+        "ORDER BY csl.id, csp.col_pos";
+
+    private Integer                id;
+    private River                  river;
+    private TimeInterval           timeInterval;
+    private String                 description;
+    private List<CrossSectionLine> lines;
+
+    public CrossSection() {
+    }
+
+    public CrossSection(
+        River        river,
+        TimeInterval timeInterval,
+        String       description
+    ) {
+        this.river        = river;
+        this.timeInterval = timeInterval;
+        this.description  = description;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_CROSS_SECTIONS_ID_SEQ",
+        sequenceName   = "CROSS_SECTIONS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_CROSS_SECTIONS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "time_interval_id")
+    public TimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(TimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @OneToMany
+    @OrderBy("km")
+    @JoinColumn(name="cross_section_id")
+    public List<CrossSectionLine> getLines() {
+        return lines;
+    }
+
+    public void setLines(List<CrossSectionLine> lines) {
+        this.lines = lines;
+    }
+
+    public List<CrossSectionLine> getLines(double startKm, double endKm) {
+        Session session = SessionHolder.HOLDER.get();
+        Query query = session.createQuery(
+            "from CrossSectionLine where crossSection=:crossSection " +
+            "and km between :startKm and :endKm order by km");
+        query.setParameter("crossSection", this);
+        query.setParameter("startKm", new BigDecimal(startKm, PRECISION));
+        query.setParameter("endKm", new BigDecimal(endKm, PRECISION));
+
+        return query.list();
+    }
+
+    public List<FastCrossSectionLine> getFastLines(
+        double startKm,
+        double endKm
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        SQLQuery sqlQuery = session.createSQLQuery(SQL_FAST_CROSS_SECTION_LINES)
+            .addScalar("km",     StandardBasicTypes.DOUBLE)
+            .addScalar("x",      StandardBasicTypes.DOUBLE)
+            .addScalar("y",      StandardBasicTypes.DOUBLE)
+            .addScalar("csl_id", StandardBasicTypes.INTEGER);
+
+        sqlQuery
+            .setInteger("cs_id",  getId())
+            .setDouble("from_km", startKm)
+            .setDouble("to_km",   endKm);
+
+        List<Object []> results = sqlQuery.list();
+
+        ArrayList<Point2D> points = new ArrayList<Point2D>(500);
+        ArrayList<FastCrossSectionLine> lines =
+            new ArrayList<FastCrossSectionLine>();
+
+        Integer lastId = null;
+        Double  lastKm = null;
+
+        for (Object [] result: results) {
+            Double  km = (Double)result[0];
+            Double  x  = (Double)result[1];
+            Double  y  = (Double)result[2];
+            Integer id = (Integer)result[3];
+
+            if (lastId != null && !lastId.equals(id)) {
+                points.trimToSize();
+                FastCrossSectionLine line =
+                    new FastCrossSectionLine(lastKm, points);
+                lines.add(line);
+                points = new ArrayList<Point2D>(500);
+            }
+
+            Point2D p = new Point2D.Double(x, y);
+
+            if (CrossSectionLine.isValid(p)) {
+                points.add(p);
+            }
+
+            lastKm = km;
+            lastId = id;
+        }
+
+        if (lastId != null) {
+            points.trimToSize();
+            FastCrossSectionLine line =
+                new FastCrossSectionLine(lastKm, points);
+            lines.add(line);
+        }
+
+        lines.trimToSize();
+
+        return lines;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/CrossSectionLine.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/CrossSectionLine.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,174 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+import java.util.Comparator;
+
+import java.awt.geom.Point2D;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.JoinColumn;
+
+import org.apache.log4j.Logger;
+
+ at Entity
+ at Table(name = "cross_section_lines")
+public class CrossSectionLine
+implements   Serializable
+{
+    private static Logger logger = Logger.getLogger(CrossSectionLine.class);
+
+    public static final double EPSILON   = 1e-4;
+
+    public static final double TOO_SMALL = 0.2;
+    public static final double TOO_BIG   = 2500;
+
+    private Integer                 id;
+    private Double              km;
+    private CrossSection            crossSection;
+
+    private List<CrossSectionPoint> points;
+
+    public static final Comparator<CrossSectionPoint> COL_POS_CMP =
+        new Comparator<CrossSectionPoint>() {
+            @Override
+            public int compare(CrossSectionPoint a, CrossSectionPoint b) {
+                double xa = a.getX().doubleValue();
+                double xb = b.getX().doubleValue();
+                double d = xa - xb;
+                if (d < -EPSILON) return -1;
+                if (d > +EPSILON) return +1;
+                int diff = a.getColPos() - b.getColPos();
+                return diff < 0 ? -1 : diff > 0 ? +1 : 0;
+            }
+        };
+
+
+    public static final boolean isValid(double x) {
+        x = Math.abs(x);
+        return x > TOO_SMALL && x < TOO_BIG;
+    }
+
+    public static final boolean isValid(Point2D p) {
+        return isValid(p.getX()) && isValid(p.getY());
+    }
+
+
+    public CrossSectionLine() {
+    }
+
+    public CrossSectionLine(CrossSection crossSection, Double km) {
+        this.crossSection = crossSection;
+        this.km           = km;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_CROSS_SECTION_LINES_ID_SEQ",
+        sequenceName   = "CROSS_SECTION_LINES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_CROSS_SECTION_LINES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "km")
+    public Double getKm() {
+        return km;
+    }
+
+    public void setKm(Double km) {
+        this.km = km;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "cross_section_id")
+    public CrossSection getCrossSection() {
+        return crossSection;
+    }
+
+    public void setCrossSection(CrossSection CrossSection) {
+        this.crossSection = crossSection;
+    }
+
+    @OneToMany
+    @JoinColumn(name="cross_section_line_id")
+    public List<CrossSectionPoint> getPoints() {
+        return points;
+    }
+
+    public void setPoints(List<CrossSectionPoint> points) {
+        this.points = points;
+    }
+
+
+    public List<Point2D> fetchCrossSectionLinesPoints() {
+
+        List<CrossSectionPoint> linePoints =
+            new ArrayList<CrossSectionPoint>(getPoints());
+
+        Collections.sort(linePoints, COL_POS_CMP);
+
+        List<Point2D> points = new ArrayList<Point2D>(linePoints.size());
+        for (CrossSectionPoint p: linePoints) {
+            double x = p.getX().doubleValue();
+            double y = p.getY().doubleValue();
+            if (isValid(x) && isValid(y)) {
+                points.add(new Point2D.Double(x, y));
+            }
+        }
+
+        return points;
+    }
+
+    public double [][] fetchCrossSectionProfile() {
+        return fetchCrossSectionProfile(fetchCrossSectionLinesPoints());
+    }
+
+    public static double [][] fetchCrossSectionProfile(List<Point2D> points) {
+
+        int P = points.size();
+
+        double [] xs = new double[P];
+        double [] ys = new double[P];
+
+        if (P > 0) {
+            xs[0] = points.get(0).getX();
+            ys[0] = points.get(0).getY();
+
+            for (int i = 1; i < P; i++) {
+                Point2D p = points.get(i);
+                double x = p.getX();
+                double y = p.getY();
+
+                if (x <= xs[i-1]) {
+                    x = xs[i-1] + EPSILON;
+                }
+
+                xs[i] = x;
+                ys[i] = y;
+            }
+        }
+
+        return new double [][] { xs, ys };
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/CrossSectionPoint.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/CrossSectionPoint.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,96 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+
+/** Mapped Point of a cross section line. */
+ at Entity
+ at Table(name = "cross_section_points")
+public class CrossSectionPoint
+implements   Serializable
+{
+    private Integer          id;
+    private CrossSectionLine crossSectionLine;
+    private Integer          colPos;
+    private Double       x;
+    private Double       y;
+
+    public CrossSectionPoint() {
+    }
+
+    public CrossSectionPoint(
+        CrossSectionLine crossSectionLine,
+        Integer          colPos,
+        Double       x,
+        Double       y
+    ) {
+        this.crossSectionLine = crossSectionLine;
+        this.colPos           = colPos;
+        this.x                = x;
+        this.y                = y;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_CROSS_SECTION_POINTS_ID_SEQ",
+        sequenceName   = "CROSS_SECTION_POINTS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_CROSS_SECTION_POINTS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "cross_section_line_id")
+    public CrossSectionLine getCrossSectionLine() {
+        return crossSectionLine;
+    }
+
+    public void setCrossSectionLine(CrossSectionLine crossSectionLine) {
+        this.crossSectionLine = crossSectionLine;
+    }
+
+    @Column(name = "col_pos")
+    public Integer getColPos() {
+        return colPos;
+    }
+
+    public void setColPos(Integer colPos) {
+        this.colPos = colPos;
+    }
+
+    @Column(name = "x")
+    public Double getX() {
+        return x;
+    }
+
+    public void setX(Double x) {
+        this.x = x;
+    }
+
+    @Column(name = "y")
+    public Double getY() {
+        return y;
+    }
+
+    public void setY(Double y) {
+        this.y = y;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/CrossSectionTrack.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/CrossSectionTrack.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,200 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.annotations.Type;
+
+import com.vividsolutions.jts.geom.LineString;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "cross_section_tracks")
+public class CrossSectionTrack
+implements   Serializable
+{
+    private Integer    id;
+    private River      river;
+    private String     name;
+    private LineString geom;
+    private BigDecimal km;
+    private BigDecimal z;
+
+    public CrossSectionTrack() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public LineString getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(LineString geom) {
+        this.geom = geom;
+    }
+
+
+    @Column(name = "km")
+    public BigDecimal getKm() {
+        return km;
+    }
+
+
+    public void setKm(BigDecimal km) {
+        this.km = km;
+    }
+
+
+    @Column(name = "z")
+    public BigDecimal getZ() {
+        return z;
+    }
+
+
+    public void setZ(BigDecimal z) {
+        this.z = z;
+    }
+
+
+    public static List<CrossSectionTrack> getCrossSectionTrack(
+        String river)
+    {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from CrossSectionTrack where river.name =:river");
+        query.setParameter("river", river);
+
+        return query.list();
+    }
+
+
+    public static List<CrossSectionTrack> getCrossSectionTrack(
+        String river,
+        String name
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from CrossSectionTrack as cst " +
+            "    where river.name =:river" +
+            "      and cst.name=:name");
+        query.setParameter("river", river);
+        query.setParameter("name", name);
+
+        return query.list();
+    }
+
+    public static List<CrossSectionTrack> getCrossSectionTrack(
+        String river,
+        int kind_id
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from CrossSectionTrack as cst " +
+            "    where river.name =:river" +
+            "      and kind_id=:kind_id");
+        query.setParameter("river", river);
+        query.setParameter("kind_id", kind_id);
+
+        return query.list();
+    }
+
+    public static List<CrossSectionTrack> getCrossSectionTrack(
+        String river,
+        String name,
+        int kind_id
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from CrossSectionTrack as cst " +
+            "    where river.name =:river" +
+            "      and cst.name=:name" +
+            "      and kind_id=:kind_id");
+        query.setParameter("river", river);
+        query.setParameter("name", name);
+        query.setParameter("kind_id", kind_id);
+
+        return query.list();
+    }
+
+
+    /**
+     * Returns the nearest CrossSectionTrack of <i>river</i> to a given
+     * <i>km</i>.
+     *
+     * @param river The name of a river.
+     * @param km The kilometer value.
+     *
+     * @return the nearest CrossSectionTrack to <i>km</i> of river <i>river</i>.
+     */
+    public static CrossSectionTrack getCrossSectionTrack(
+        String river,
+        double km
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from CrossSectionTrack where river.name =:river " +
+            "and kind_id = 1 " +
+            "order by abs( km - :mykm)");
+        query.setParameter("river", river);
+        query.setParameter("mykm", new BigDecimal(km));
+
+        List<CrossSectionTrack> cst = query.list();
+
+        return cst != null && !cst.isEmpty() ? cst.get(0) : null;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/CrossSectionTrackKind.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/CrossSectionTrackKind.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,45 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "cross_section_track_kinds")
+public class CrossSectionTrackKind implements Serializable {
+    private Integer id;
+    private String name;
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return The name of the Cross section kind as String.
+     */
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}
+
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/DGM.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/DGM.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,138 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+import java.math.BigDecimal;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.SequenceGenerator;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "dem")
+public class DGM implements Serializable {
+
+    private Integer      id;
+    private Integer      srid;
+
+    private River        river;
+
+    private Range        range;
+    private TimeInterval time_interval;
+
+    private String       path;
+
+
+    public DGM() {
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_DEM_ID_SEQ",
+        sequenceName   = "DEM_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_DEM_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    @Column(name = "path")
+    public String getPath() {
+        return path;
+    }
+
+    public void setSrid(int srid) {
+        this.srid = srid;
+    }
+
+    @Column(name = "srid")
+    public int getSrid() {
+        return srid;
+    }
+
+    public static DGM getDGM(int id) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from DGM where Id =:id");
+        query.setParameter("id", id);
+
+        List<DGM> result = query.list();
+
+        return result.isEmpty() ? null : result.get(0);
+    }
+
+
+    public static DGM getDGM(String river, double lower, double upper) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from DGM where river.name =:river and " +
+            "range.a <=:lower and range.b >=:lower and " +
+            "range.a <=:upper and range.b >=:upper");
+        query.setParameter("river", river);
+        query.setParameter("lower", new BigDecimal(lower));
+        query.setParameter("upper", new BigDecimal(upper));
+
+        List<DGM> result = query.list();
+
+        return result.isEmpty() ? null : result.get(0);
+    }
+
+    @OneToOne
+    @JoinColumn(name = "range_id")
+    public Range getRange() {
+        return range;
+    }
+
+    public void setRange(Range range) {
+        this.range = range;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "time_interval_id")
+    public TimeInterval getTimeInterval() {
+        return time_interval;
+    }
+
+    public void setTimeInterval(TimeInterval time_interval) {
+        this.time_interval = time_interval;
+    }
+
+
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Depth.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Depth.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,70 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+
+ at Entity
+ at Table(name = "depths")
+public class Depth implements Serializable {
+
+    private Integer id;
+
+    private BigDecimal lower;
+    private BigDecimal upper;
+
+
+    public Depth() {
+    }
+
+
+    public Depth(BigDecimal lower, BigDecimal upper) {
+        this.lower = lower;
+        this.upper = upper;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_DEPTHS_ID_SEQ",
+        sequenceName   = "DEPTHS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_DEPTHS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "lower")
+    public BigDecimal getLower() {
+        return lower;
+    }
+
+    public void setLower(BigDecimal lower) {
+        this.lower = lower;
+    }
+
+    @Column(name = "upper")
+    public BigDecimal getUpper() {
+        return upper;
+    }
+
+    public void setUpper(BigDecimal upper) {
+        this.upper = upper;
+    }
+
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/DischargeTable.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/DischargeTable.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,193 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.OrderBy;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "discharge_tables")
+public class DischargeTable
+implements   Serializable, Comparable<DischargeTable>
+{
+    private Integer      id;
+    private Gauge        gauge;
+    private String       description;
+    private String       bfgId;
+    private Integer      kind;
+    private TimeInterval timeInterval;
+
+    private List<DischargeTableValue> dischargeTableValues;
+
+    public DischargeTable() {
+        kind = 0;
+    }
+
+    public DischargeTable(Gauge gauge) {
+        this(gauge, null, null, 0, null);
+    }
+
+    public DischargeTable(
+        Gauge        gauge,
+        String       description,
+        String       bfgId,
+        Integer      kind,
+        TimeInterval timeInterval
+    ) {
+        this.gauge        = gauge;
+        this.description  = description;
+        this.bfgId        = bfgId;
+        this.kind         = kind;
+        this.timeInterval = timeInterval;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_DISCHARGE_TABLES_ID_SEQ",
+        sequenceName   = "DISCHARGE_TABLES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_DISCHARGE_TABLES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "gauge_id" )
+    public Gauge getGauge() {
+        return gauge;
+    }
+
+    public void setGauge(Gauge gauge) {
+        this.gauge = gauge;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Column(name = "bfg_id")
+    public String getBfgId() {
+        return bfgId;
+    }
+
+    public void setBfgId(String bfgId) {
+        this.bfgId = bfgId;
+    }
+
+    @Column(name = "kind")
+    public Integer getKind() {
+        return kind;
+    }
+
+    public void setKind(Integer kind) {
+        this.kind = kind;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "time_interval_id" )
+    public TimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(TimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    @OneToMany
+    @JoinColumn(name = "table_id")
+    @OrderBy("q")
+    public List<DischargeTableValue> getDischargeTableValues() {
+        return dischargeTableValues;
+    }
+
+    public void setDischargeTableValues(
+        List<DischargeTableValue> dischargeTableValues
+    ) {
+        this.dischargeTableValues = dischargeTableValues;
+    }
+
+    @Override
+    public int compareTo(DischargeTable o) {
+        if (getKind() == 0 && o.getKind() != 0) {
+            return 1;
+        }
+
+        TimeInterval other = o.getTimeInterval();
+        if (other == null && timeInterval == null) {
+            return 1;
+        }
+        else if (other == null) {
+            return -1;
+        }
+        else if (timeInterval == null) {
+            return 1;
+        }
+
+        Date otherStartTime = other.getStartTime();
+        Date thisStartTime  = timeInterval.getStartTime();
+
+        if (otherStartTime == null) {
+            return -1;
+        }
+        else if (thisStartTime == null) {
+            return 1;
+        }
+
+        long otherStart = otherStartTime.getTime();
+        long thisStart  = thisStartTime.getTime();
+
+        if (otherStart < thisStart) {
+            return 1;
+        }
+        else if (otherStart > thisStart) {
+            return -1;
+        }
+
+        Date otherStopTime  = other.getStopTime();
+        Date thisStopTime  = timeInterval.getStopTime();
+
+        if (otherStopTime == null) {
+            return -1;
+        }
+        else if (thisStopTime == null) {
+            return 1;
+        }
+
+        long otherEnd   = otherStopTime.getTime();
+        long thisEnd    = thisStopTime.getTime();
+
+        if (otherEnd < thisEnd) {
+            return 1;
+        }
+        else if (otherEnd > thisEnd) {
+            return -1;
+        }
+        else {
+            return 0;
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/DischargeTableValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/DischargeTableValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,84 @@
+package de.intevation.flys.model;
+
+import java.math.BigDecimal;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "discharge_table_values")
+public class DischargeTableValue
+implements   Serializable
+{
+    private Integer        id;
+    private DischargeTable dischargeTable;
+    private BigDecimal     q;
+    private BigDecimal     w;
+
+    public DischargeTableValue() {
+    }
+
+    public DischargeTableValue(
+        DischargeTable dischargeTable, BigDecimal q, BigDecimal w)
+    {
+        this.dischargeTable = dischargeTable;
+        this.q              = q;
+        this.w              = w;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_DISCHARGE_TABLE_VALUES_ID_SEQ",
+        sequenceName   = "DISCHARGE_TABLE_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_DISCHARGE_TABLE_VALUES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "table_id" )
+    public DischargeTable getDischargeTable() {
+        return dischargeTable;
+    }
+
+    public void setDischargeTable(DischargeTable dischargeTable) {
+        this.dischargeTable = dischargeTable;
+    }
+
+
+    @Column(name = "q")
+    public BigDecimal getQ() {
+        return q;
+    }
+
+    public void setQ(BigDecimal q) {
+        this.q = q;
+    }
+
+    @Column(name = "w")
+    public BigDecimal getW() {
+        return w;
+    }
+
+    public void setW(BigDecimal w) {
+        this.w = w;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/DischargeZone.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/DischargeZone.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,159 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "discharge_zone")
+public class DischargeZone
+implements   Serializable
+{
+    private static Logger logger = Logger.getLogger(DischargeZone.class);
+
+    private Integer id;
+
+    private River river;
+
+    private String gaugeName;
+
+    private BigDecimal value;
+
+    private String lowerDischarge;
+    private String upperDischarge;
+
+    private String type;
+
+    public DischargeZone() {
+    }
+
+
+    public DischargeZone(
+        River       river,
+        String      gaugeName,
+        BigDecimal  value,
+        String      lowerDischarge,
+        String      upperDischarge
+    ) {
+        this.river          = river;
+        this.gaugeName      = gaugeName;
+        this.value          = value;
+        this.lowerDischarge = lowerDischarge;
+        this.upperDischarge = upperDischarge;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_DISCHARGE_ZONE_ID_SEQ",
+        sequenceName   = "DISCHARGE_ZONE_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_DISCHARGE_ZONE_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id" )
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @Column(name = "value")
+    public BigDecimal getValue() {
+        return value;
+    }
+
+    public void setValue(BigDecimal value) {
+        this.value = value;
+    }
+
+    @Column(name = "gauge_name")
+    public String getGaugeName() {
+        return gaugeName;
+    }
+
+    public void setGaugeName(String gaugeName) {
+        this.gaugeName = gaugeName;
+    }
+
+    @Column(name = "lower_discharge")
+    public String getLowerDischarge() {
+        return lowerDischarge;
+    }
+
+    public void setLowerDischarge(String lowerDischarge) {
+        this.lowerDischarge = lowerDischarge;
+    }
+
+    @Column(name = "upper_discharge")
+    public String getUpperDischarge() {
+        return upperDischarge;
+    }
+
+    public void setUpperDischarge(String upperDischarge) {
+        this.upperDischarge = upperDischarge;
+    }
+
+    public void putType(String type) {
+        this.type = type;
+    }
+
+    public String fetchType() {
+        return this.type;
+    }
+
+    public static List<DischargeZone> getDischargeZones(River river) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from DischargeZone where river=:river");
+
+        query.setParameter("river", river);
+
+        return query.list();
+    }
+
+
+    public static DischargeZone getDischargeZoneById(int id) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from DischargeZone where id=:id");
+
+        query.setParameter("id", id);
+
+        List<DischargeZone> zones = query.list();
+
+        return zones.isEmpty() ? null : zones.get(0);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Edge.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Edge.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,67 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+ at Entity
+ at Table(name = "edges")
+public class Edge
+implements   Serializable
+{
+    private Integer    id;
+    private BigDecimal top;
+    private BigDecimal bottom;
+
+    public Edge() {
+    }
+
+    public Edge(BigDecimal top, BigDecimal bottom) {
+        this.top    = top;
+        this.bottom = bottom;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_EDGES_ID_SEQ",
+        sequenceName   = "EDGES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_EDGES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "top")
+    public BigDecimal getTop() {
+        return top;
+    }
+
+    public void setTop(BigDecimal top) {
+        this.top = top;
+    }
+
+    @Column(name = "bottom")
+    public BigDecimal getBottom() {
+        return bottom;
+    }
+
+    public void setBottom(BigDecimal bottom) {
+        this.bottom = bottom;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/ElevationModel.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/ElevationModel.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,78 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+import org.apache.log4j.Logger;
+
+
+ at Entity
+ at Table(name = "elevation_model")
+public class ElevationModel
+implements   Serializable
+{
+    private static Logger logger = Logger.getLogger(ElevationModel.class);
+
+    protected Integer id;
+
+    protected String name;
+
+    protected Unit unit;
+
+
+    public ElevationModel() {
+    }
+
+
+    public ElevationModel(String name, Unit unit) {
+        this.name = name;
+        this.unit = unit;
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_ELEVATION_MODE_ID_SEQ",
+        sequenceName   = "ELEVATION_MODEL_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_ELEVATION_MODE_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "unit_id")
+    public Unit getUnit() {
+        return unit;
+    }
+
+    public void setUnit(Unit unit) {
+        this.unit = unit;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/FastAnnotations.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/FastAnnotations.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,335 @@
+package de.intevation.flys.model;
+
+import java.util.Comparator;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import java.io.Serializable;
+
+import org.hibernate.Session;
+import org.hibernate.SQLQuery;
+
+import org.hibernate.type.StandardBasicTypes;
+
+import de.intevation.flys.backend.SessionHolder;
+
+public class FastAnnotations
+implements   Serializable
+{
+    public static final String SQL_BY_RIVER_NAME =
+        "SELECT r.a AS a, r.b AS b, p.value AS position, " +
+                "at.value AS attribute, ant.name AS name, " +
+                "e.top AS top, e.bottom AS bottom " +
+        "FROM annotations an " +
+            "JOIN ranges r " +
+                "ON an.range_id = r.id " +
+            "JOIN attributes at " +
+                "ON an.attribute_id = at.id " +
+            "JOIN positions p " +
+                "ON an.position_id = p.id " +
+            "JOIN rivers riv " +
+                "ON r.river_id = riv.id " +
+            "LEFT JOIN annotation_types ant " +
+                "ON an.type_id = ant.id " +
+            "LEFT JOIN edges e " +
+                "ON an.edge_id = e.id " +
+            "WHERE riv.name = :river_name " +
+                "ORDER BY r.a";
+
+    public static final String SQL_BY_RIVER_ID =
+        "SELECT r.a AS a, r.b AS b, p.value AS position, " +
+                "at.value AS attribute, ant.name AS name, " +
+                "e.top AS top, e.bottom AS bottom " +
+        "FROM annotations an " +
+            "JOIN ranges r " +
+                "ON an.range_id = r.id " +
+            "JOIN attributes at " +
+                "ON an.attribute_id = at.id " +
+            "JOIN positions p " +
+                "ON an.position_id = p.id " +
+            "LEFT JOIN annotation_types ant " +
+                "ON an.type_id = ant.id " +
+            "LEFT JOIN edges e " +
+                "ON an.edge_id = e.id " +
+            "WHERE r.id = :river_id " +
+                "ORDER BY r.a";
+
+    public static final double EPSILON = 1e-5;
+
+    public static final Comparator<Annotation> KM_CMP =
+        new Comparator<Annotation>() {
+            @Override
+            public int compare(Annotation a, Annotation b) {
+                double diff = a.a - b.a;
+                if (diff < -EPSILON) return -1;
+                if (diff > +EPSILON) return +1;
+                return 0;
+            }
+        };
+
+    public static final class Annotation
+    implements                Serializable
+    {
+        private double a;
+        private double b;
+        private String position;
+        private String attribute;
+        private String name;
+        private double top;
+        private double bottom;
+
+        public Annotation() {
+        }
+
+        public Annotation(double a) {
+            this.a = a;
+        }
+
+        public Annotation(
+            double a,
+            double b,
+            String position,
+            String attribute,
+            String name,
+            double top,
+            double bottom
+        ) {
+            this.a         = a;
+            this.b         = b;
+            this.position  = position;
+            this.attribute = attribute;
+            this.name      = name;
+            this.top       = top;
+            this.bottom    = bottom;
+        }
+
+        public double getA() {
+            return a;
+        }
+
+        public double getB() {
+            return b;
+        }
+
+        public String getPosition() {
+            return position;
+        }
+
+        public String getAttribute() {
+            return attribute;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public double getTop() {
+            return top;
+        }
+
+        public double getBottom() {
+            return bottom;
+        }
+
+        @Override
+        public String toString() {
+            return "[a=" + a + ";b=" + b +
+                ";pos=" + position + ";attr=" + attribute +
+                ";name=" + name + ";top=" + top +
+                ";bot=" + bottom + "]";
+        }
+    } // class Annotation
+
+    public interface Filter {
+
+        boolean accept(Annotation annotation);
+
+    } // interface Filter
+
+    public static class NameFilter implements Filter {
+
+        private String name;
+
+        public NameFilter(String name) {
+            this.name = name;
+        }
+
+        @Override
+        public boolean accept(Annotation annotation) {
+            return annotation.getName().contains(name);
+        }
+    } // class NameFilter
+
+    public static final Filter ALL = new Filter() {
+        @Override
+        public boolean accept(Annotation annotation) {
+            return true;
+        }
+    };
+
+    public static final Filter IS_POINT = new Filter() {
+        @Override
+        public boolean accept(Annotation annotation) {
+            return Double.isNaN(annotation.getB());
+        }
+    };
+
+    public static final Filter IS_RANGE = new Filter() {
+        @Override
+        public boolean accept(Annotation annotation) {
+            return !Double.isNaN(annotation.getB());
+        }
+    };
+
+    private Annotation [] annotations;
+
+    public FastAnnotations() {
+    }
+
+    public FastAnnotations(Annotation [] annotations) {
+        this.annotations = annotations;
+    }
+
+    public FastAnnotations(String riverName) {
+        this(loadByRiverName(riverName));
+    }
+
+    public FastAnnotations(int riverId) {
+        this(loadByRiverId(riverId));
+    }
+
+    public FastAnnotations(Iterator<Annotation> iter) {
+        this(toArray(iter));
+    }
+
+    public int size() {
+        return annotations.length;
+    }
+
+    public Iterator<Annotation> filter(final Filter filter) {
+        return new Iterator<Annotation>() {
+
+            private int idx;
+            private Annotation current = findNext();
+
+            @Override
+            public boolean hasNext() {
+                return current != null;
+            }
+
+            @Override
+            public Annotation next() {
+                if (current == null) {
+                    throw new NoSuchElementException();
+                }
+                Annotation result = current;
+                current = findNext();
+                return result;
+            }
+
+            private Annotation findNext() {
+
+                while (idx < annotations.length) {
+                    Annotation annotation = annotations[idx++];
+                    if (filter.accept(annotation)) {
+                        return annotation;
+                    }
+                }
+
+                return null;
+            }
+
+            @Override
+            public void remove() {
+                throw new UnsupportedOperationException();
+            }
+        };
+    }
+
+    public static Annotation [] toArray(Iterator<Annotation> iter) {
+
+        ArrayList<Annotation> list = new ArrayList<Annotation>();
+
+        while (iter.hasNext()) {
+            list.add(iter.next());
+        }
+
+        return list.toArray(new Annotation[list.size()]);
+    }
+
+    public Annotation findByKm(double km) {
+        Annotation key = new Annotation(km);
+        int idx = Arrays.binarySearch(annotations, key, KM_CMP);
+        return idx < 0 ? null : annotations[idx];
+    }
+
+    private static SQLQuery createQuery(String query) {
+        Session session = SessionHolder.HOLDER.get();
+
+        return session.createSQLQuery(query)
+            .addScalar("a",         StandardBasicTypes.DOUBLE)
+            .addScalar("b",         StandardBasicTypes.DOUBLE)
+            .addScalar("position",  StandardBasicTypes.STRING)
+            .addScalar("attribute", StandardBasicTypes.STRING)
+            .addScalar("name",      StandardBasicTypes.STRING)
+            .addScalar("top",       StandardBasicTypes.DOUBLE)
+            .addScalar("bottom",    StandardBasicTypes.DOUBLE);
+    }
+
+    private static Annotation [] buildAnnotations(List<Object []> list) {
+        Annotation [] anns = new Annotation[list.size()];
+
+        // Names are likely the same because they are a type
+        // like 'Pegel' or 'Hafen'.
+        HashMap<String, String> names = new HashMap<String, String>();
+
+        for (int i = 0; i < anns.length; ++i) {
+            Object [] data   = list.get(i);
+            double a         = ((Double)data[0]);
+            double b         = data[1] != null ? (Double)data[1] : Double.NaN;
+            String position  = (String)data[2];
+            String attribute = (String)data[3];
+            String name      = (String)data[4];
+            double top       = data[5] != null ? (Double)data[5] : Double.NaN;
+            double bottom    = data[6] != null ? (Double)data[6] : Double.NaN;
+
+            if (name != null) {
+                String old = names.get(name);
+                if (old != null) {
+                    name = old;
+                }
+                else {
+                    names.put(name, name);
+                }
+            }
+
+            anns[i] = new Annotation(
+                a, b, position, attribute, name, top, bottom);
+        }
+
+        return anns;
+    }
+
+    public static Annotation [] loadByRiverName(String riverName) {
+
+        SQLQuery query = createQuery(SQL_BY_RIVER_NAME);
+
+        query.setString("river_name", riverName);
+
+        return buildAnnotations(query.list());
+    }
+
+    public static Annotation [] loadByRiverId(int riverId) {
+
+        SQLQuery query = createQuery(SQL_BY_RIVER_ID);
+
+        query.setInteger("river_id", riverId);
+
+        return buildAnnotations(query.list());
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/FastCrossSectionLine.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/FastCrossSectionLine.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,68 @@
+package de.intevation.flys.model;
+
+import java.util.List;
+import java.util.Comparator;
+
+import java.io.Serializable;
+
+import java.awt.geom.Point2D;
+
+public class FastCrossSectionLine
+implements   Serializable
+{
+    public static final double EPSILON = 1e-5;
+
+    public static final Comparator<FastCrossSectionLine> KM_CMP =
+        new Comparator<FastCrossSectionLine>() {
+            public int compare(
+                FastCrossSectionLine a,
+                FastCrossSectionLine b
+            ) {
+                double diff = a.km - b.km;
+                if (diff < -EPSILON) return -1;
+                return diff > +EPSILON ? +1 : 0;
+            }
+        };
+
+    protected double km;
+    protected List<Point2D> points;
+
+    public FastCrossSectionLine() {
+    }
+
+    public FastCrossSectionLine(double km) {
+        this.km = km;
+    }
+
+    public FastCrossSectionLine(double km, List<Point2D> points) {
+        this(km);
+        this.points = points;
+    }
+
+    public FastCrossSectionLine(CrossSectionLine csl) {
+        Double kmBD = csl.getKm();
+        km = kmBD != null ? kmBD.doubleValue() : 0d;
+        points = csl.fetchCrossSectionLinesPoints();
+    }
+
+    public double getKm() {
+        return km;
+    }
+
+    public void setKm(double km) {
+        this.km = km;
+    }
+
+    public List<Point2D> getPoints() {
+        return points;
+    }
+
+    public void setPoints(List<Point2D> points) {
+        this.points = points;
+    }
+
+    public double [][] fetchCrossSectionProfile() {
+        return CrossSectionLine.fetchCrossSectionProfile(points);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/FedState.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/FedState.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,45 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "fed_states")
+public class FedState implements Serializable {
+
+    private Integer id;
+    private String name;
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+     /**
+     * Get name.
+     *
+     * @return name of the Federal State as String.
+     */
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Fixpoint.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Fixpoint.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,130 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import com.vividsolutions.jts.geom.Point;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "fixpoints")
+public class Fixpoint
+implements   Serializable
+{
+    private Integer    id;
+    private River      river;
+    private Integer    x;
+    private Integer    y;
+    private BigDecimal km;
+    private String     hpgp;
+    private Point      geom;
+
+    public Fixpoint() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "x")
+    public Integer getX() {
+        return x;
+    }
+
+
+    public void setX(Integer x) {
+        this.x = x;
+    }
+
+
+    @Column(name = "y")
+    public Integer getY() {
+        return y;
+    }
+
+
+    public void setY(Integer y) {
+        this.y = y;
+    }
+
+
+    @Column(name = "km")
+    public BigDecimal getKm() {
+        return km;
+    }
+
+
+    public void setKm(BigDecimal km) {
+        this.km = km;
+    }
+
+
+    @Column(name = "hpgp")
+    public String getHpgp() {
+        return hpgp;
+    }
+
+
+    public void setHpgp(String hpgp) {
+        this.hpgp = hpgp;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Point getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(Point geom) {
+        this.geom = geom;
+    }
+
+
+    public static List<Fixpoint> getFixpoints(int riverId) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from Fixpoint where river.id =:river_id");
+        query.setParameter("river_id", riverId);
+
+        return query.list();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Floodmaps.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Floodmaps.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,155 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import com.vividsolutions.jts.geom.Geometry;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "floodmaps")
+public class Floodmaps
+implements   Serializable
+{
+    private Integer      id;
+    private River        river;
+    private String       name;
+    private Integer      kind;
+    private Integer      count;
+    private BigDecimal   diff;
+    private BigDecimal   area;
+    private BigDecimal   perimeter;
+    private Geometry     geom;
+
+    public Floodmaps() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    @Column(name = "kind")
+    public Integer getKind() {
+        return kind;
+    }
+
+
+    public void setKind(Integer kind) {
+        this.kind = kind;
+    }
+
+
+    @Column(name = "count")
+    public Integer getCount() {
+        return count;
+    }
+
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+
+    @Column(name = "diff")
+    public BigDecimal getDiff() {
+        return diff;
+    }
+
+
+    public void setDiff(BigDecimal diff) {
+        this.diff = diff;
+    }
+
+
+    @Column(name = "area")
+    public BigDecimal getArea() {
+        return area;
+    }
+
+
+    public void setArea(BigDecimal area) {
+        this.area = area;
+    }
+
+
+    @Column(name = "perimeter")
+    public BigDecimal getPerimeter() {
+        return perimeter;
+    }
+
+
+    public void setPerimeter(BigDecimal perimeter) {
+        this.perimeter = perimeter;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Geometry getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(Geometry geom) {
+        this.geom = geom;
+    }
+
+
+    public static List<Floodmaps> getFloodmaps(int riverId, String name) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from Floodmaps where river.id =:river_id AND name =:name");
+        query.setParameter("river_id", riverId);
+        query.setParameter("name", name);
+
+        return query.list();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Floodmark.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Floodmark.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,129 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import com.vividsolutions.jts.geom.Point;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "flood_marks")
+public class Floodmark
+implements   Serializable
+{
+    private Integer    id;
+    private River      river;
+    private Integer    z;
+    private Integer    year;
+    private BigDecimal km;
+    private Point      geom;
+
+    public Floodmark() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "z")
+    public Integer getZ() {
+        return z;
+    }
+
+
+    public void setZ(Integer z) {
+        this.z = z;
+    }
+
+
+    @Column(name = "year")
+    public Integer getYear() {
+        return year;
+    }
+
+
+    public void setYear(Integer year) {
+        this.year = year;
+    }
+
+
+    @Column(name = "km")
+    public BigDecimal getKm() {
+        return km;
+    }
+
+
+    public void setKm(BigDecimal km) {
+        this.km = km;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Point getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(Point geom) {
+        this.geom = geom;
+    }
+
+    public static List<Floodmark> getFloodmarks(int riverId) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from Floodmark where river.id =:river_id");
+        query.setParameter("river_id", riverId);
+
+        return query.list();
+    }
+
+    public static List<Floodmark> getFloodmarks(int riverId, int year) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from Floodmark where river.id =:river_id and year = :year");
+        query.setParameter("river_id", riverId);
+        query.setParameter("year", year);
+
+        return query.list();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Floodplain.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Floodplain.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,134 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.annotations.Type;
+import org.hibernate.HibernateException;
+
+import com.vividsolutions.jts.geom.Polygon;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "floodplain")
+public class Floodplain
+implements   Serializable
+{
+    private Integer        id;
+
+    private FloodplainKind kind;
+
+    private River          river;
+
+    private Polygon        geom;
+
+    private String         name;
+
+
+    public Floodplain() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "kind_id")
+    public FloodplainKind getKind() {
+        return kind;
+    }
+
+    public void setKind(FloodplainKind kind) {
+        this.kind = kind;
+    }
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Polygon getGeom() {
+        return geom;
+    }
+
+    public void setGeom(Polygon geom) {
+        this.geom = geom;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public static List<Floodplain> getFloodplains(String river, String name, int kind)
+    throws HibernateException {
+        Session session = SessionHolder.HOLDER.get();
+        Query query = session.createQuery(
+            "from Floodplain as fp where river.name =:river" +
+            " and kind.id =:kind" +
+            " and fp.name=:name");
+        query.setParameter("river", river);
+        query.setParameter("kind", kind);
+        query.setParameter("name", name);
+
+        List<Floodplain> list = query.list();
+        return list.isEmpty() ? null : list;
+    }
+
+    public static List<Floodplain> getFloodplains(String river, int kind)
+    throws HibernateException {
+        Session session = SessionHolder.HOLDER.get();
+        Query query = session.createQuery(
+            "from Floodplain where river.name =:river AND kind.id =:kind");
+        query.setParameter("river", river);
+        query.setParameter("kind", kind);
+
+        List<Floodplain> list = query.list();
+        return list.isEmpty() ? null : list;
+    }
+
+    public static Floodplain getFloodplain(String river) {
+        Session session = SessionHolder.HOLDER.get();
+
+        // kind_id 0 -> Offical
+        // kind_id 1 -> Misc.
+        Query query = session.createQuery(
+            "from Floodplain where river.name =:river and kind_id=1");
+        query.setParameter("river", river);
+
+        List<Floodplain> result = query.list();
+
+        return result.isEmpty() ? null : result.get(0);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/FloodplainKind.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/FloodplainKind.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,45 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "floodplain_kinds")
+public class FloodplainKind implements Serializable {
+    private Integer id;
+    private String name;
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return The name of the Floodplain Kind as String.
+     */
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}
+
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/FlowVelocityMeasurement.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/FlowVelocityMeasurement.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,96 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+
+import org.apache.log4j.Logger;
+
+
+ at Entity
+ at Table(name = "flow_velocity_measurements")
+public class FlowVelocityMeasurement
+implements   Serializable
+{
+    private static Logger logger =
+        Logger.getLogger(FlowVelocityMeasurement.class);
+
+    private Integer id;
+
+    private River river;
+
+    private String description;
+
+    private List<FlowVelocityMeasurementValue> values;
+
+
+    public FlowVelocityMeasurement() {
+    }
+
+
+    public FlowVelocityMeasurement(River river, String description) {
+        this.river       = river;
+        this.description = description;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_FV_MEASURE_ID_SEQ",
+        sequenceName   = "FV_MEASURE_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_FV_MEASURE_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id" )
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @OneToMany
+    @JoinColumn(name = "measurements_id")
+    public List<FlowVelocityMeasurementValue> getValues() {
+        return values;
+    }
+
+    public void setValues(List<FlowVelocityMeasurementValue> values) {
+        this.values = values;
+    }
+
+    public void addValue(FlowVelocityMeasurementValue value) {
+        this.values.add(value);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/FlowVelocityMeasurementValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/FlowVelocityMeasurementValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,196 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+import org.apache.log4j.Logger;
+
+
+/** Measured Flow Velocities. */
+ at Entity
+ at Table(name = "flow_velocity_measure_values")
+public class FlowVelocityMeasurementValue
+implements   Serializable
+{
+    private static Logger logger =
+        Logger.getLogger(FlowVelocityMeasurementValue.class);
+
+    private Integer id;
+
+    private FlowVelocityMeasurement measurement;
+
+    private BigDecimal station;
+    private BigDecimal w;
+    private BigDecimal q;
+    private BigDecimal v;
+
+    private Date datetime;
+
+    private String description;
+
+    /** Non-mapped class holding same values. */
+    public static class FastFlowVelocityMeasurementValue {
+        protected double station;
+        protected double w;
+        protected double q;
+        protected double v;
+        protected Date   datetime;
+        protected String description;
+
+        public FastFlowVelocityMeasurementValue(double station,
+            double w, double q, double v, Date datetime, String description) {
+            this.station = station;
+            this.w       = w;
+            this.q       = q;
+            this.v       = v;
+            this.datetime = datetime;
+            this.description = description;
+        }
+
+        public double getStation() {
+            return station;
+        }
+
+        public double getW() {
+            return w;
+        }
+
+        public double getQ() {
+            return q;
+        }
+
+        public double getV() {
+            return v;
+        }
+
+        public Date getDatetime() {
+            return datetime;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+    }
+
+
+    public FlowVelocityMeasurementValue() {
+    }
+
+
+    public FlowVelocityMeasurementValue(
+        FlowVelocityMeasurement measurement,
+        Date                    datetime,
+        BigDecimal              station,
+        BigDecimal              w,
+        BigDecimal              q,
+        BigDecimal              v,
+        String                  description
+    ) {
+        this.measurement = measurement;
+        this.datetime    = datetime;
+        this.station     = station;
+        this.w           = w;
+        this.q           = q;
+        this.v           = v;
+        this.description = description;
+    }
+
+    public static FastFlowVelocityMeasurementValue getUnmapped(
+            double station, double w, double q, double v, Date datetime, String description) {
+         return new FastFlowVelocityMeasurementValue(
+             station, w, q, v, datetime, description);
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_FV_MEASURE_VALUES_ID_SEQ",
+        sequenceName   = "FV_MEASURE_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_FV_MEASURE_VALUES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "measurements_id")
+    public FlowVelocityMeasurement getMeasurement() {
+        return measurement;
+    }
+
+    public void setMeasurement(FlowVelocityMeasurement measurement) {
+        this.measurement = measurement;
+    }
+
+    @Column(name = "station")
+    public BigDecimal getStation() {
+        return station;
+    }
+
+    public void setStation(BigDecimal station) {
+        this.station = station;
+    }
+
+    @Column(name = "datetime")
+    public Date getDatetime() {
+        return datetime;
+    }
+
+    public void setDatetime(Date datetime) {
+        this.datetime = datetime;
+    }
+
+    @Column(name = "w")
+    public BigDecimal getW() {
+        return w;
+    }
+
+    public void setW(BigDecimal w) {
+        this.w = w;
+    }
+
+    @Column(name = "q")
+    public BigDecimal getQ() {
+        return q;
+    }
+
+    public void setQ(BigDecimal q) {
+        this.q = q;
+    }
+
+    @Column(name = "v")
+    public BigDecimal getV() {
+        return v;
+    }
+
+    public void setV(BigDecimal v) {
+        this.v = v;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/FlowVelocityModel.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/FlowVelocityModel.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,106 @@
+package de.intevation.flys.model;
+
+import de.intevation.flys.backend.SessionHolder;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+
+ at Entity
+ at Table(name = "flow_velocity_model")
+public class FlowVelocityModel
+implements   Serializable
+{
+    private static Logger logger = Logger.getLogger(FlowVelocityModel.class);
+
+
+    private Integer id;
+
+    private DischargeZone dischargeZone;
+
+    private String description;
+
+
+    public FlowVelocityModel() {
+    }
+
+
+    public FlowVelocityModel(DischargeZone dischargeZone) {
+        this(dischargeZone, null);
+    }
+
+
+    public FlowVelocityModel(
+        DischargeZone dischargeZone,
+        String        description
+    ) {
+        this.dischargeZone = dischargeZone;
+        this.description   = description;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_FLOW_VELOCITY_MODEL_ID_SEQ",
+        sequenceName   = "FLOW_VELOCITY_MODEL_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_FLOW_VELOCITY_MODEL_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "discharge_zone_id")
+    public DischargeZone getDischargeZone() {
+        return dischargeZone;
+    }
+
+    public void setDischargeZone(DischargeZone dischargeZone) {
+        this.dischargeZone = dischargeZone;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+
+    public static List<FlowVelocityModel> getModels(DischargeZone zone) {
+
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from FlowVelocityModel where dischargeZone=:zone");
+
+        query.setParameter("zone", zone);
+
+        return query.list();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/FlowVelocityModelValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/FlowVelocityModelValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,158 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "flow_velocity_model_values")
+public class FlowVelocityModelValue
+implements   Serializable
+{
+    private static Logger logger =
+        Logger.getLogger(FlowVelocityModelValue.class);
+
+
+    private Integer id;
+
+    private FlowVelocityModel flowVelocity;
+
+    private BigDecimal station;
+    private BigDecimal q;
+    private BigDecimal totalChannel;
+    private BigDecimal mainChannel;
+    private BigDecimal shearStress;
+
+
+    public FlowVelocityModelValue() {
+    }
+
+
+    public FlowVelocityModelValue(
+        FlowVelocityModel flowVelocity,
+        BigDecimal        station,
+        BigDecimal        q,
+        BigDecimal        totalChannel,
+        BigDecimal        mainChannel,
+        BigDecimal        shearStress
+    ) {
+        this.flowVelocity = flowVelocity;
+        this.station      = station;
+        this.q            = q;
+        this.totalChannel = totalChannel;
+        this.mainChannel  = mainChannel;
+        this.shearStress  = shearStress;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_FLOW_VELOCITY_M_VALUES_ID_SEQ",
+        sequenceName   = "FLOW_VELOCITY_M_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_FLOW_VELOCITY_M_VALUES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "flow_velocity_model_id")
+    public FlowVelocityModel getFlowVelocity() {
+        return flowVelocity;
+    }
+
+    public void setFlowVelocity(FlowVelocityModel flowVelocity) {
+        this.flowVelocity = flowVelocity;
+    }
+
+    @Column(name = "station")
+    public BigDecimal getStation() {
+        return station;
+    }
+
+    public void setStation(BigDecimal station) {
+        this.station = station;
+    }
+
+    @Column(name = "q")
+    public BigDecimal getQ() {
+        return q;
+    }
+
+    public void setQ(BigDecimal q) {
+        this.q = q;
+    }
+
+    @Column(name = "total_channel")
+    public BigDecimal getTotalChannel() {
+        return totalChannel;
+    }
+
+    public void setTotalChannel(BigDecimal totalChannel) {
+        this.totalChannel = totalChannel;
+    }
+
+    @Column(name = "main_channel")
+    public BigDecimal getMainChannel() {
+        return mainChannel;
+    }
+
+    public void setMainChannel(BigDecimal mainChannel) {
+        this.mainChannel = mainChannel;
+    }
+
+    @Column(name = "shear_stress")
+    public BigDecimal getShearStress() {
+        return shearStress;
+    }
+
+    public void setShearStress(BigDecimal shearStress) {
+        this.shearStress = shearStress;
+    }
+
+
+    public static List<FlowVelocityModelValue> getValues(
+        FlowVelocityModel model,
+        double kmLo,
+        double kmHi
+    ) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from FlowVelocityModelValue where " +
+            "   flowVelocity=:model and" +
+            "   station >= :kmLo and " +
+            "   station <= :kmHi");
+
+        query.setParameter("model", model);
+        query.setParameter("kmLo", new BigDecimal(kmLo));
+        query.setParameter("kmHi", new BigDecimal(kmHi));
+
+        return query.list();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Gauge.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Gauge.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,334 @@
+package de.intevation.flys.model;
+
+import java.math.BigDecimal;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.backend.SessionHolder;
+
+/** Database-mapped Gauge with all info about it. */
+ at Entity
+ at Table(name = "gauges")
+public class Gauge
+implements   Serializable, Comparable<Gauge>
+{
+    public static final int DEFAULT_SCALE = 100;
+
+    public static final int MASTER_DISCHARGE_TABLE = 0;
+
+    private Integer    id;
+    private String     name;
+    private River      river;
+    private BigDecimal station;
+    private BigDecimal aeo;
+    private BigDecimal datum;
+    private Long       officialNumber;
+    private Range      range;
+
+    private List<DischargeTable> dischargeTables;
+
+    /** MainValues at this Gauge. */
+    protected List<MainValue> mainValues;
+
+    public Gauge() {
+    }
+
+    public Gauge(
+        String     name,
+        River      river,
+        BigDecimal station,
+        BigDecimal aeo,
+        BigDecimal datum,
+        Long       officialNumber,
+        Range      range
+    ) {
+        this.name            = name;
+        this.river           = river;
+        this.station         = station;
+        this.aeo             = aeo;
+        this.datum           = datum;
+        this.officialNumber  = officialNumber;
+        this.range           = range;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_GAUGES_ID_SEQ",
+        sequenceName   = "GAUGES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_GAUGES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id" )
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Column(name = "station") // FIXME: type mapping needed
+    public BigDecimal getStation() {
+        return station;
+    }
+
+    public void setStation(BigDecimal station) {
+        this.station = station;
+    }
+
+    @Column(name = "aeo") // FIXME: type mapping needed
+    public BigDecimal getAeo() {
+        return aeo;
+    }
+
+    public void setAeo(BigDecimal aeo) {
+        this.aeo = aeo;
+    }
+
+    @Column(name = "datum") // FIXME: type mapping needed
+    public BigDecimal getDatum() {
+        return datum;
+    }
+
+    public void setDatum(BigDecimal datum) {
+        this.datum = datum;
+    }
+
+    @Column(name = "official_number")
+    public Long getOfficialNumber() {
+        return officialNumber;
+    }
+
+    public void setOfficialNumber(Long officialNumber) {
+        this.officialNumber = officialNumber;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "range_id" )
+    public Range getRange() {
+        return range;
+    }
+
+    public void setRange(Range range) {
+        this.range = range;
+    }
+
+    @OneToMany
+    @JoinColumn(name = "gauge_id")
+    public List<DischargeTable> getDischargeTables() {
+        return dischargeTables;
+    }
+
+    public void setDischargeTables(List<DischargeTable> dischargeTables) {
+        this.dischargeTables = dischargeTables;
+    }
+
+
+    /**
+     * Returns min and max W values of this gauge based with a DEFAULT_SCALE.
+     *
+     * @return min and max W value of this gauge [min,max].
+     */
+    public double[] determineMinMaxW() {
+        return determineMinMaxW(DEFAULT_SCALE);
+    }
+
+
+    /**
+     * Returns min and max W values of this gauge.
+     *
+     * @return the min and max W value of this gauge [min,max].
+     */
+    public double[] determineMinMaxW(int scale) {
+        Session session = SessionHolder.HOLDER.get();
+
+        List<DischargeTable> tables   = getDischargeTables();
+        DischargeTable dischargeTable = null;
+
+        for (DischargeTable tmp: tables) {
+            if (tmp.getKind() == 0) {
+                dischargeTable = tmp;
+                break;
+            }
+        }
+
+        if (dischargeTable == null) {
+            return null;
+        }
+
+        Query query  = session.createQuery(
+            "select min(w) as min, max(w) as max from DischargeTableValue " +
+            "where table_id =:table");
+        query.setParameter("table", dischargeTable.getId());
+
+        List     results = query.list();
+        Object[] result  = (Object[]) results.get(0);
+
+        return result != null
+            ? new double[] {
+                ((BigDecimal) result[0]).doubleValue() * scale,
+                ((BigDecimal) result[1]).doubleValue() * scale}
+            : null;
+    }
+
+    @OneToMany
+    @JoinColumn(name = "gauge_id")
+    public List<MainValue> getMainValues() {
+        return mainValues;
+    }
+
+    public void setMainValues(List<MainValue> mainValues) {
+        this.mainValues = mainValues;
+    }
+
+
+    public static Gauge getGaugeByOfficialNumber(long number) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from Gauge where officialNumber=:number");
+
+        query.setParameter("number", number);
+
+        List<Gauge> results = query.list();
+
+        return results.isEmpty() ? null : results.get(0);
+    }
+
+
+    public DischargeTable fetchMasterDischargeTable() {
+        for (DischargeTable dt: dischargeTables) {
+            if (dt.getKind() == MASTER_DISCHARGE_TABLE) {
+                return dt;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Returns an array of [days, qs] necessary to create duration curves.
+     *
+     * @return a 2dim array of [days, qs] where days is an int[] and qs is
+     * an double[].
+     */
+    public Object[] fetchDurationCurveData() {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "select cast(nmv.name as integer) as days, mv.value as q " +
+            "from MainValue as mv " +
+            "join mv.mainValue as nmv " +
+            "join nmv.type mvt " +
+            "where mvt.name = 'D' and mv.gauge.id = :gauge_id " +
+            "order by days");
+
+        query.setParameter("gauge_id", getId());
+
+        List<Object> results = query.list();
+        int[]        days    = new int[results.size()];
+        double[]     qs      = new double[results.size()];
+
+        int idx = 0;
+
+        for (Object obj: results) {
+            Object[] arr = (Object[]) obj;
+
+            try {
+                int  day = ((Integer)    arr[0]).intValue();
+                double q = ((BigDecimal) arr[1]).doubleValue();
+
+                days[idx] = day;
+                qs[idx++] = q;
+            }
+            catch (NumberFormatException nfe) {
+            }
+        }
+
+        return new Object[] { days, qs };
+    }
+
+    /**
+     * Calculates the maximum and minimum W and Q values
+     *
+     * @return the MaxMinWQ object representing the calculated values
+     */
+    public MinMaxWQ fetchMaxMinWQ() {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "select max(mv.value) as max, min(mv.value) as min " +
+            "from MainValue as mv " +
+            "join mv.mainValue as nmv " +
+            "join nmv.type mvt " +
+            "where mvt.name in ('W', 'Q') " +
+            "and mv.gauge.id = :gauge_id " +
+            "group by mvt.name order by mvt.name"
+            );
+
+        query.setParameter("gauge_id", getId());
+
+        List<Object> results = query.list();
+        if (results.isEmpty()) {
+            // No values found
+            return new MinMaxWQ();
+        }
+
+        Object[] arr = (Object[]) results.get(0);
+        BigDecimal maxw = (BigDecimal)arr[0];
+        BigDecimal minw = (BigDecimal)arr[1];
+        BigDecimal maxq = null;
+        BigDecimal minq = null;
+
+
+        if (results.size() > 1) {
+            arr = (Object[]) results.get(1);
+            maxq = (BigDecimal)arr[0];
+            minq = (BigDecimal)arr[1];
+        }
+
+        return new MinMaxWQ(minw, maxw, minq, maxq);
+    }
+
+    @Override
+    public int compareTo(Gauge o) {
+        return getName().compareTo(o.getName());
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/GaugeLocation.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/GaugeLocation.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,106 @@
+package de.intevation.flys.model;
+
+import com.vividsolutions.jts.geom.Point;
+
+import de.intevation.flys.backend.SessionHolder;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+import org.hibernate.annotations.Type;
+
+
+ at Entity
+ at Table(name = "gauge_location")
+public class GaugeLocation
+implements   Serializable
+{
+    private Integer    id;
+    private River      river;
+    private String     name;
+    private Point      geom;
+
+
+    public GaugeLocation() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Point getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(Point geom) {
+        this.geom = geom;
+    }
+
+
+    /**
+     * Returns a list of RiverAxisKm objects for a given river.
+     *
+     * @param riverid The ID of a river in the database.
+     *
+     * @return a list of RiverAxisKm objects.
+     */
+    public static List<GaugeLocation> getGaugeLocations(int riverid, String name) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from GaugeLocation where river.id =:riverid and name=:name");
+        query.setParameter("riverid", riverid);
+        query.setParameter("name", name);
+
+        List<GaugeLocation> list = query.list();
+
+        return list;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/GrainFraction.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/GrainFraction.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,94 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+import org.apache.log4j.Logger;
+
+
+ at Entity
+ at Table(name = "grain_fraction")
+public class GrainFraction
+implements   Serializable
+{
+    public static final String TOTAL              = "total";
+    public static final String COARSE             = "coarse";
+    public static final String FINE_MIDDLE        = "fine_middle";
+    public static final String SAND               = "sand";
+    public static final String SUSP_SAND          = "susp_sand";
+    public static final String SUSP_SAND_BED      = "susp_sand_bed";
+    public static final String SUSPENDED_SEDIMENT = "suspended_sediment";
+
+
+    private static Logger logger = Logger.getLogger(GrainFraction.class);
+
+    private Integer id;
+
+    private String name;
+
+    private Double lower;
+    private Double upper;
+
+
+    public GrainFraction() {
+    }
+
+    public GrainFraction(String name, Double lower, Double upper) {
+        this.name  = name;
+        this.lower = lower;
+        this.upper = upper;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_GRAIN_FRACTION_ID_SEQ",
+        sequenceName   = "GRAIN_FRACTION_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_GRAIN_FRACTION_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "name" )
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Column(name = "lower")
+    public Double getLower() {
+        return lower;
+    }
+
+    public void setLower(Double lower) {
+        this.lower = lower;
+    }
+
+    @Column(name = "upper")
+    public Double getUpper() {
+        return upper;
+    }
+
+    public void setUpper(Double upper) {
+        this.upper = upper;
+    }
+
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HWSKind.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HWSKind.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,44 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "hws_kinds")
+public class HWSKind implements Serializable {
+    private Integer id;
+    private String name;
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return The name of the Hochwasserschutzanlagenart as String.
+     */
+    @Column(name = "kind")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HWSLine.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HWSLine.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,336 @@
+package de.intevation.flys.model;
+
+import com.vividsolutions.jts.geom.Geometry;
+
+import de.intevation.flys.model.HWSKind;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.SequenceGenerator;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import de.intevation.flys.backend.SessionHolder;
+
+ at Entity
+ at Table(name = "hws_lines")
+public class HWSLine implements Serializable {
+
+    private Integer  id;
+
+    private Integer  ogrFid;
+    private HWSKind  kind;
+    private FedState fedState;
+    private River    river;
+    private Integer  official;
+    private Integer  shoreSide;
+    private String   name;
+    private String   path;
+    private String   agency;
+    private String   range;
+    private String   source;
+    private String   status_date;
+    private String   description;
+    private Geometry geom;
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_HWS_LINES_ID_SEQ",
+        sequenceName   = "HWS_LINES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_HWS_LINES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Geometry getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(Geometry geom) {
+        this.geom = geom;
+    }
+
+    /**
+     * Get ogrFid.
+     *
+     * @return ogrFid as Integer.
+     */
+    @Column(name = "ogr_fid")
+    public Integer getOgrFid() {
+        return ogrFid;
+    }
+
+    /**
+     * Set ogrFid.
+     *
+     * @param ogrFid the value to set.
+     */
+    public void setOgrFid(Integer ogrFid) {
+        this.ogrFid = ogrFid;
+    }
+
+
+    /**
+     * Get official.
+     *
+     * @return official as Integer.
+     */
+    @Column(name = "official")
+    public Integer getofficial() {
+        return official;
+    }
+
+    /**
+     * Set official.
+     *
+     * @param official the value to set.
+     */
+    public void setofficial(Integer official) {
+        this.official = official;
+    }
+
+    /**
+     * Get shoreSide.
+     *
+     * @return shoreSide as Integer.
+     */
+    @Column(name = "shore_side")
+    public Integer getShoreSide() {
+        return shoreSide;
+    }
+
+    /**
+     * Set shoreSide.
+     *
+     * @param shoreSide the value to set.
+     */
+    public void setShoreSide(Integer shoreSide) {
+        this.shoreSide = shoreSide;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return name as String.
+     */
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Get path.
+     *
+     * @return path as String.
+     */
+    @Column(name = "path")
+    public String getPath() {
+        return path;
+    }
+
+    /**
+     * Set path.
+     *
+     * @param path the value to set.
+     */
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    /**
+     * Get agency.
+     *
+     * @return agency as String.
+     */
+    @Column(name = "agency")
+    public String getAgency() {
+        return agency;
+    }
+
+    /**
+     * Set agency.
+     *
+     * @param agency the value to set.
+     */
+    public void setAgency(String agency) {
+        this.agency = agency;
+    }
+
+    /**
+     * Get range.
+     *
+     * @return range as String.
+     */
+    @Column(name = "range")
+    public String getRange() {
+        return range;
+    }
+
+    /**
+     * Set range.
+     *
+     * @param range the value to set.
+     */
+    public void setRange(String range) {
+        this.range = range;
+    }
+
+    /**
+     * Get source.
+     *
+     * @return source as String.
+     */
+    @Column(name = "source")
+    public String getSource() {
+        return source;
+    }
+
+    /**
+     * Set source.
+     *
+     * @param source the value to set.
+     */
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    /**
+     * Get status_date.
+     *
+     * @return status_date as String.
+     */
+    @Column(name = "status_date")
+    public String getStatusDate() {
+        return status_date;
+    }
+
+    /**
+     * Set status_date.
+     *
+     * @param status_date the value to set.
+     */
+    public void setStatusDate(String status_date) {
+        this.status_date = status_date;
+    }
+
+    /**
+     * Get description.
+     *
+     * @return description as String.
+     */
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Set description.
+     *
+     * @param description the value to set.
+     */
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * Get kind.
+     *
+     * @return kind as HWSKind.
+     */
+    @OneToOne
+    @JoinColumn(name = "kind_id")
+    public HWSKind getKind() {
+        return kind;
+    }
+
+    /**
+     * Set kind.
+     *
+     * @param kind the value to set.
+     */
+    public void setKind(HWSKind kind) {
+        this.kind = kind;
+    }
+
+    /**
+     * Get fedState.
+     *
+     * @return fedState as FedState.
+     */
+    @OneToOne
+    @JoinColumn(name = "fed_state_id")
+    public FedState getFedState() {
+        return fedState;
+    }
+
+    /**
+     * Set fedState.
+     *
+     * @param fedState the value to set.
+     */
+    public void setFedState(FedState fedState) {
+        this.fedState = fedState;
+    }
+
+    /**
+     * Get river.
+     *
+     * @return river as River.
+     */
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    /**
+     * Set river.
+     *
+     * @param river the value to set.
+     */
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    public static List<HWSLine> getLines(int riverId, String name) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+                    "from HWSLine where river.id =:river_id and name=:name");
+        query.setParameter("river_id", riverId);
+        query.setParameter("name", name);
+
+        return query.list();
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HWSPoint.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HWSPoint.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,457 @@
+package de.intevation.flys.model;
+
+import com.vividsolutions.jts.geom.Geometry;
+
+import java.io.Serializable;
+import java.util.List;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.SequenceGenerator;
+
+import org.hibernate.annotations.Type;
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+import de.intevation.flys.backend.SessionHolder;
+
+ at Entity
+ at Table(name = "hws_points")
+public class HWSPoint implements Serializable {
+
+    private Integer    id;
+
+    private Integer    ogrFid;
+    private HWSKind    kind;
+    private FedState   fedState;
+    private River      river;
+    private Integer    official;
+    private Integer    shoreSide;
+    private String     name;
+    private String     path;
+    private String     agency;
+    private String     range;
+    private String     source;
+    private String     statusDate;
+    private String     description;
+    private BigDecimal freeboard;
+    private BigDecimal dikeKm;
+    private BigDecimal z;
+    private BigDecimal zTarget;
+    private BigDecimal ratedLevel;
+    private Geometry   geom;
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_HWS_POINTS_ID_SEQ",
+        sequenceName   = "HWS_POINTS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_HWS_POINTS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Geometry getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(Geometry geom) {
+        this.geom = geom;
+    }
+
+    /**
+     * Get ogrFid.
+     *
+     * @return ogrFid as Integer.
+     */
+    @Column(name = "ogr_fid")
+    public Integer getOgrFid() {
+        return ogrFid;
+    }
+
+    /**
+     * Set ogrFid.
+     *
+     * @param ogrFid the value to set.
+     */
+    public void setOgrFid(Integer ogrFid) {
+        this.ogrFid = ogrFid;
+    }
+
+
+    /**
+     * Get official.
+     *
+     * @return official as Integer.
+     */
+    @Column(name = "official")
+    public Integer getofficial() {
+        return official;
+    }
+
+    /**
+     * Set official.
+     *
+     * @param official the value to set.
+     */
+    public void setofficial(Integer official) {
+        this.official = official;
+    }
+
+    /**
+     * Get shoreSide.
+     *
+     * @return shoreSide as Integer.
+     */
+    @Column(name = "shore_side")
+    public Integer getShoreSide() {
+        return shoreSide;
+    }
+
+    /**
+     * Set shoreSide.
+     *
+     * @param shoreSide the value to set.
+     */
+    public void setShoreSide(Integer shoreSide) {
+        this.shoreSide = shoreSide;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return name as String.
+     */
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Get path.
+     *
+     * @return path as String.
+     */
+    @Column(name = "path")
+    public String getPath() {
+        return path;
+    }
+
+    /**
+     * Set path.
+     *
+     * @param path the value to set.
+     */
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    /**
+     * Get agency.
+     *
+     * @return agency as String.
+     */
+    @Column(name = "agency")
+    public String getAgency() {
+        return agency;
+    }
+
+    /**
+     * Set agency.
+     *
+     * @param agency the value to set.
+     */
+    public void setAgency(String agency) {
+        this.agency = agency;
+    }
+
+    /**
+     * Get range.
+     *
+     * @return range as String.
+     */
+    @Column(name = "range")
+    public String getRange() {
+        return range;
+    }
+
+    /**
+     * Set range.
+     *
+     * @param range the value to set.
+     */
+    public void setRange(String range) {
+        this.range = range;
+    }
+
+    /**
+     * Get source.
+     *
+     * @return source as String.
+     */
+    @Column(name = "source")
+    public String getSource() {
+        return source;
+    }
+
+    /**
+     * Set source.
+     *
+     * @param source the value to set.
+     */
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    /**
+     * Get statusDate.
+     *
+     * @return statusDate as String.
+     */
+    @Column(name = "status_date")
+    public String getStatusDate() {
+        return statusDate;
+    }
+
+    /**
+     * Set statusDate.
+     *
+     * @param statusDate the value to set.
+     */
+    public void setStatusDate(String statusDate)
+    {
+        this.statusDate = statusDate;
+    }
+
+    /**
+     * Get description.
+     *
+     * @return description as String.
+     */
+    @Column(name = "description")
+    public String getDescription()
+    {
+        return description;
+    }
+
+    /**
+     * Set description.
+     *
+     * @param description the value to set.
+     */
+    public void setDescription(String description)
+    {
+        this.description = description;
+    }
+
+    /**
+     * Get freeboard.
+     *
+     * @return freeboard as BigDecimal.
+     */
+    @Column(name = "freeboard")
+    public BigDecimal getFreeboard()
+    {
+        return freeboard;
+    }
+
+    /**
+     * Set freeboard.
+     *
+     * @param freeboard the value to set.
+     */
+    public void setFreeboard(BigDecimal freeboard)
+    {
+        this.freeboard = freeboard;
+    }
+
+    /**
+     * Get dikeKm.
+     *
+     * @return dikeKm as BigDecimal.
+     */
+    @Column(name = "dike_km")
+    public BigDecimal getDikeKm()
+    {
+        return dikeKm;
+    }
+
+    /**
+     * Set dikeKm.
+     *
+     * @param dikeKm the value to set.
+     */
+    public void setDikeKm(BigDecimal dikeKm)
+    {
+        this.dikeKm = dikeKm;
+    }
+
+    /**
+     * Get z.
+     *
+     * @return z as BigDecimal.
+     */
+    @Column(name = "z")
+    public BigDecimal getZ()
+    {
+        return z;
+    }
+
+    /**
+     * Set z.
+     *
+     * @param z the value to set.
+     */
+    public void setZ(BigDecimal z)
+    {
+        this.z = z;
+    }
+
+    /**
+     * Get zTarget.
+     *
+     * @return zTarget as BigDecimal.
+     */
+    @Column(name = "z_target")
+    public BigDecimal getZTarget()
+    {
+        return zTarget;
+    }
+
+    /**
+     * Set zTarget.
+     *
+     * @param zTarget the value to set.
+     */
+    public void setZTarget(BigDecimal zTarget)
+    {
+        this.zTarget = zTarget;
+    }
+
+    /**
+     * Get ratedLevel.
+     *
+     * @return ratedLevel as BigDecimal.
+     */
+    @Column(name = "rated_level")
+    public BigDecimal getRatedLevel()
+    {
+        return ratedLevel;
+    }
+
+    /**
+     * Set ratedLevel.
+     *
+     * @param ratedLevel the value to set.
+     */
+    public void setRatedLevel(BigDecimal ratedLevel)
+    {
+        this.ratedLevel = ratedLevel;
+    }
+
+    /**
+     * Get kind.
+     *
+     * @return kind as HWSKind.
+     */
+    @OneToOne
+    @JoinColumn(name = "kind_id")
+    public HWSKind getKind()
+    {
+        return kind;
+    }
+
+    /**
+     * Set kind.
+     *
+     * @param kind the value to set.
+     */
+    public void setKind(HWSKind kind)
+    {
+        this.kind = kind;
+    }
+
+    /**
+     * Get fedState.
+     *
+     * @return fedState as FedState.
+     */
+    @OneToOne
+    @JoinColumn(name = "fed_state_id")
+    public FedState getFedState()
+    {
+        return fedState;
+    }
+
+    /**
+     * Set fedState.
+     *
+     * @param fedState the value to set.
+     */
+    public void setFedState(FedState fedState)
+    {
+        this.fedState = fedState;
+    }
+
+    /**
+     * Get river.
+     *
+     * @return river as River.
+     */
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver()
+    {
+        return river;
+    }
+
+    /**
+     * Set river.
+     *
+     * @param river the value to set.
+     */
+    public void setRiver(River river)
+    {
+        this.river = river;
+    }
+
+    public static List<HWSPoint> getPoints(int riverId, String name) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+                    "from HWSPoint where river.id =:river_id and name=:name");
+        query.setParameter("river_id", riverId);
+        query.setParameter("name", name);
+
+        return query.list();
+    }
+}
+
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HYK.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HYK.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,85 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "hyks")
+public class HYK
+implements   Serializable
+{
+    private Integer id;
+    private River   river;
+    private String  description;
+
+    private List<HYKEntry> entries;
+
+    public HYK() {
+    }
+
+    public HYK(River river, String description) {
+        this.river       = river;
+        this.description = description;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_HYKS_ID_SEQ",
+        sequenceName   = "HYKS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_HYKS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @OneToMany
+    @OrderBy("km")
+    @JoinColumn(name="hyk_id")
+    public List<HYKEntry> getEntries() {
+        return entries;
+    }
+
+    public void setEntries(List<HYKEntry> entries) {
+        this.entries = entries;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HYKEntry.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HYKEntry.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,99 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.math.BigDecimal;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "hyk_entries")
+public class HYKEntry
+implements   Serializable
+{
+    private Integer    id;
+    private HYK        hyk;
+    private BigDecimal km;
+    private Date       measure;
+
+    private List<HYKFormation> formations;
+
+    public HYKEntry() {
+    }
+
+    public HYKEntry(HYK hyk, BigDecimal km, Date measure) {
+        this.hyk     = hyk;
+        this.km      = km;
+        this.measure = measure;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_HYK_ENTRIES_ID_SEQ",
+        sequenceName   = "HYK_ENTRIES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_HYK_ENTRIES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "hyk_id")
+    public HYK getHYK() {
+        return hyk;
+    }
+
+    public void setHYK(HYK hyk) {
+        this.hyk = hyk;
+    }
+
+    @Column(name = "km")
+    public BigDecimal getKm() {
+        return km;
+    }
+
+    public void setKm(BigDecimal km) {
+        this.km = km;
+    }
+
+    @Column(name = "measure")
+    public Date getMeasure() {
+        return measure;
+    }
+
+    public void setMeasure(Date measure) {
+        this.measure = measure;
+    }
+
+    @OneToMany
+    @OrderBy("formationNum")
+    @JoinColumn(name="hyk_entry_id")
+    public List<HYKFormation> getFormations() {
+        return formations;
+    }
+
+    public void setFormations(List<HYKFormation> formations) {
+        this.formations = formations;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HYKFlowZone.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HYKFlowZone.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,98 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "hyk_flow_zones")
+public class HYKFlowZone
+implements   Serializable
+{
+    private Integer         id;
+    private HYKFormation    formation;
+    private HYKFlowZoneType type;
+    private BigDecimal      a;
+    private BigDecimal      b;
+
+    public HYKFlowZone() {
+    }
+
+    public HYKFlowZone(
+        HYKFormation    formation,
+        HYKFlowZoneType type,
+        BigDecimal      a,
+        BigDecimal      b
+    ) {
+        this.formation = formation;
+        this.type      = type;
+        this.a         = a;
+        this.b         = b;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_HYK_FLOW_ZONES_ID_SEQ",
+        sequenceName   = "HYK_FLOW_ZONES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_HYK_FLOW_ZONES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "formation_id")
+    public HYKFormation getFormation() {
+        return formation;
+    }
+
+    public void setFormation(HYKFormation formation) {
+        this.formation = formation;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "type_id")
+    public HYKFlowZoneType getType() {
+        return type;
+    }
+
+    public void setType(HYKFlowZoneType type) {
+        this.type = type;
+    }
+
+    @Column(name = "a")
+    public BigDecimal getA() {
+        return a;
+    }
+
+    public void setA(BigDecimal a) {
+        this.a = a;
+    }
+
+    @Column(name = "b")
+    public BigDecimal getB() {
+        return b;
+    }
+
+    public void setB(BigDecimal b) {
+        this.b = b;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HYKFlowZoneType.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HYKFlowZoneType.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,69 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+ at Entity
+ at Table(name = "hyk_flow_zone_types")
+public class HYKFlowZoneType
+implements   Serializable
+{
+    private Integer id;
+    private String  name;
+    private String  description;
+
+    public HYKFlowZoneType() {
+    }
+
+    public HYKFlowZoneType(String name) {
+        this.name = name;
+    }
+
+    public HYKFlowZoneType(String name, String description) {
+        this.name        = name;
+        this.description = description;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_HYK_FLOW_ZONE_TYPES_ID_SEQ",
+        sequenceName   = "HYK_FLOW_ZONE_TYPES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_HYK_FLOW_ZONE_TYPES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HYKFormation.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HYKFormation.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,151 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "hyk_formations")
+public class HYKFormation
+implements   Serializable
+{
+    private Integer    id;
+    private Integer    formationNum;
+    private HYKEntry   entry;
+    private BigDecimal top;
+    private BigDecimal bottom;
+    private BigDecimal distanceVL;
+    private BigDecimal distanceHF;
+    private BigDecimal distanceVR;
+
+    private List<HYKFlowZone> zones;
+
+    public HYKFormation() {
+    }
+
+    public HYKFormation(
+        Integer    formationNum,
+        HYKEntry   entry,
+        BigDecimal top,
+        BigDecimal bottom,
+        BigDecimal distanceVL,
+        BigDecimal distanceHF,
+        BigDecimal distanceVR
+    ) {
+        this.formationNum = formationNum;
+        this.entry        = entry;
+        this.top          = top;
+        this.bottom       = bottom;
+        this.distanceVL   = distanceVL;
+        this.distanceHF   = distanceHF;
+        this.distanceVR   = distanceVR;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_HYK_FORMATIONS_ID_SEQ",
+        sequenceName   = "HYK_FORMATIONS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_HYK_FORMATIONS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "formation_num")
+    public Integer getFormationNum() {
+        return formationNum;
+    }
+
+    public void setFormationNum(Integer formationNum) {
+        this.formationNum = formationNum;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "hyk_entry_id")
+    public HYKEntry getEntry() {
+        return entry;
+    }
+
+    public void setEntry(HYKEntry entry) {
+        this.entry = entry;
+    }
+
+    @Column(name = "top")
+    public BigDecimal getTop() {
+        return top;
+    }
+
+    public void setTop(BigDecimal top) {
+        this.top = top;
+    }
+
+    @Column(name = "bottom")
+    public BigDecimal getBottom() {
+        return bottom;
+    }
+
+    public void setBottom(BigDecimal bottom) {
+        this.bottom = bottom;
+    }
+
+    @Column(name = "distance_vl")
+    public BigDecimal getDistanceVL() {
+        return distanceVL;
+    }
+
+    public void setDistanceVL(BigDecimal distanceVL) {
+        this.distanceVL = distanceVL;
+    }
+
+    @Column(name = "distance_hf")
+    public BigDecimal getDistanceHF() {
+        return distanceHF;
+    }
+
+    public void setDistanceHF(BigDecimal distanceHF) {
+        this.distanceHF = distanceHF;
+    }
+
+    @Column(name = "distance_vr")
+    public BigDecimal getDistanceVR() {
+        return distanceVR;
+    }
+
+    public void setDistanceVR(BigDecimal distanceVR) {
+        this.distanceVR = distanceVR;
+    }
+
+
+    @OneToMany
+    @OrderBy("a")
+    @JoinColumn(name="formation_id")
+    public List<HYKFlowZone> getZones() {
+        return zones;
+    }
+
+    public void setZones(List<HYKFlowZone> zones) {
+        this.zones = zones;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HydrBoundary.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HydrBoundary.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,184 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.SequenceGenerator;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import com.vividsolutions.jts.geom.MultiLineString;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "hydr_boundaries")
+public class HydrBoundary
+implements   Serializable
+{
+    private Integer    id;
+    private SectieKind sectie;
+    private SobekKind  sobek;
+    private String     name;
+    private River      river;
+    private MultiLineString geom;
+    private BoundaryKind kind;
+
+    public HydrBoundary() {
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_HYDR_BOUNDARIES_ID_SEQ",
+        sequenceName   = "HYDR_BOUNDARIES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_HYDR_BOUNDARIES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public MultiLineString getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(MultiLineString geom) {
+        this.geom = geom;
+    }
+
+    public static List<HydrBoundary> getHydrBoundaries(int riverId, String name, int kindId) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from HydrBoundary where river.id =:river_id and name=:name" + 
+            " and kind.id=:kind_id");
+        query.setParameter("river_id", riverId);
+        query.setParameter("name", name);
+        query.setParameter("kind_id", kindId);
+
+        return query.list();
+    }
+
+    public static List<HydrBoundary> getHydrBoundaries(int riverId, String name) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from HydrBoundary where river.id =:river_id and name=:name");
+        query.setParameter("river_id", riverId);
+        query.setParameter("name", name);
+
+        return query.list();
+    }
+
+    /**
+     * Get sectie.
+     *
+     * @return sectie as SectieKind.
+     */
+    @OneToOne
+    @JoinColumn(name = "sectie")
+    public SectieKind getSectie()
+    {
+        return sectie;
+    }
+
+    /**
+     * Set sectie.
+     *
+     * @param sectie the value to set.
+     */
+    public void setSectie(SectieKind sectie)
+    {
+        this.sectie = sectie;
+    }
+
+    /**
+     * Get sobek.
+     *
+     * @return sobek as SobekKind.
+     */
+    @OneToOne
+    @JoinColumn(name = "sobek")
+    public SobekKind getSobek()
+    {
+        return sobek;
+    }
+
+    /**
+     * Set sobek.
+     *
+     * @param sobek the value to set.
+     */
+    public void setSobek(SobekKind sobek)
+    {
+        this.sobek = sobek;
+    }
+
+    /**
+     * Get kind.
+     *
+     * @return kind as BoundaryKind.
+     */
+    @OneToOne
+    @JoinColumn(name = "kind")
+    public BoundaryKind getKind()
+    {
+        return kind;
+    }
+
+    /**
+     * Set kind.
+     *
+     * @param kind the value to set.
+     */
+    public void setKind(BoundaryKind kind)
+    {
+        this.kind = kind;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/HydrBoundaryPoly.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/HydrBoundaryPoly.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,194 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.SequenceGenerator;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import com.vividsolutions.jts.geom.Geometry;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "hydr_boundaries_poly")
+public class HydrBoundaryPoly
+implements   Serializable
+{
+    private Integer    id;
+    private String     name;
+    private River      river;
+    private Geometry   geom;
+    private SectieKind sectie;
+    private SobekKind  sobek;
+    private BoundaryKind kind;
+
+    public HydrBoundaryPoly() {
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_HYDR_BOUNDARIES_POLY_ID_SEQ",
+        sequenceName   = "HYDR_BOUNDARIES_POLY_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_HYDR_BOUNDARIES_POLY_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Geometry getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(Geometry geom) {
+        this.geom = geom;
+    }
+
+
+    public static List<HydrBoundaryPoly> getHydrBoundaries(int riverId, String name) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from HydrBoundaryPoly where river.id =:river_id and name=:name");
+        query.setParameter("river_id", riverId);
+        query.setParameter("name", name);
+
+        return query.list();
+    }
+
+    public static List<HydrBoundaryPoly> getHydrBoundaries(int riverId,
+            int kind, int sectie, int sobek) {
+        Session session = SessionHolder.HOLDER.get();
+
+        String filter = " where river.id =:river_id";
+
+        if (kind != -1) {
+            filter += " and kind = " + kind;
+        }
+        if (sectie != -1) {
+            filter += " and sectie = " + sectie;
+        }
+        if (sobek != -1){
+            filter += " and sobek = " + sobek;
+        }
+
+        Query query = session.createQuery("from HydrBoundaryPoly" + filter);
+        query.setParameter("river_id", riverId);
+        return query.list();
+    }
+
+    /**
+     * Get sectie.
+     *
+     * @return sectie as SectieKind.
+     */
+    @OneToOne
+    @JoinColumn(name = "sectie")
+    public SectieKind getSectie()
+    {
+        return sectie;
+    }
+
+    /**
+     * Set sectie.
+     *
+     * @param sectie the value to set.
+     */
+    public void setSectie(SectieKind sectie)
+    {
+        this.sectie = sectie;
+    }
+
+    /**
+     * Get sobek.
+     *
+     * @return sobek as SobekKind.
+     */
+    @OneToOne
+    @JoinColumn(name = "sobek")
+    public SobekKind getSobek()
+    {
+        return sobek;
+    }
+
+    /**
+     * Set sobek.
+     *
+     * @param sobek the value to set.
+     */
+    public void setSobek(SobekKind sobek)
+    {
+        this.sobek = sobek;
+    }
+
+    /**
+     * Get kind.
+     *
+     * @return kind as BoundaryKind.
+     */
+    @OneToOne
+    @JoinColumn(name = "kind")
+    public BoundaryKind getKind()
+    {
+        return kind;
+    }
+
+    /**
+     * Set kind.
+     *
+     * @param kind the value to set.
+     */
+    public void setKind(BoundaryKind kind)
+    {
+        this.kind = kind;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Jetty.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Jetty.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,79 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import com.vividsolutions.jts.geom.Geometry;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import de.intevation.flys.backend.SessionHolder;
+
+ at Entity
+ at Table(name = "jetties")
+public class Jetty
+implements   Serializable
+{
+    private Integer    id;
+    private River      river;
+    private Geometry   geom;
+
+    public Jetty() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Geometry getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(Geometry geom) {
+        this.geom = geom;
+    }
+
+    public static List<Jetty> getJetties(int riverId, int kindId) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from Jetty where river.id =:river_id and kind_id=:kind_id");
+        query.setParameter("kind_id", kindId);
+        query.setParameter("river_id", riverId);
+
+        return query.list();
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/LocationSystem.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/LocationSystem.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,68 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+
+ at Entity
+ at Table(name = "location_system")
+public class LocationSystem implements Serializable {
+
+    protected Integer id;
+
+    protected String name;
+    protected String description;
+
+
+    public LocationSystem() {
+    }
+
+
+    public LocationSystem(String name, String description) {
+        this.name        = name;
+        this.description = description;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_LOCATION_SYSTEM_ID_SEQ",
+        sequenceName   = "LOCATION_SYSTEM_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_LOCATION_SYSTEM_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/MainValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/MainValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,105 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+import javax.persistence.GenerationType;
+
+import java.math.BigDecimal;
+
+
+/** A Main or Extreme value of a rivers gauge. */
+ at Entity
+ at Table(name = "main_values")
+public class MainValue
+implements   Serializable
+{
+    private Integer        id;
+
+    private Gauge          gauge;
+
+    private NamedMainValue mainValue;
+
+    private BigDecimal     value;
+
+    private TimeInterval   timeInterval;
+
+    public MainValue() {
+    }
+
+    public MainValue(
+        Gauge          gauge,
+        NamedMainValue mainValue,
+        BigDecimal     value,
+        TimeInterval   timeInterval
+    ) {
+        this.gauge        = gauge;
+        this.mainValue    = mainValue;
+        this.value        = value;
+        this.timeInterval = timeInterval;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_MAIN_VALUES_ID_SEQ",
+        sequenceName   = "MAIN_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_MAIN_VALUES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "gauge_id")
+    public Gauge getGauge() {
+        return gauge;
+    }
+
+    public void setGauge(Gauge gauge) {
+        this.gauge = gauge;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "named_value_id")
+    public NamedMainValue getMainValue() {
+        return mainValue;
+    }
+
+    public void setMainValue(NamedMainValue mainValue) {
+        this.mainValue = mainValue;
+    }
+
+    @Column(name = "value") // FIXME: type mapping needed?
+    public BigDecimal getValue() {
+        return value;
+    }
+
+    public void setValue(BigDecimal value) {
+        this.value = value;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "time_interval_id")
+    public TimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(TimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/MainValueType.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/MainValueType.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,54 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+ at Entity
+ at Table(name = "main_value_types")
+public class MainValueType
+implements   Serializable
+{
+    private Integer id;
+    private String  name;
+
+    public MainValueType() {
+    }
+
+    public MainValueType(String name) {
+        this.name = name;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_MAIN_VALUE_TYPES_ID_SEQ",
+        sequenceName   = "MAIN_VALUE_TYPES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_MAIN_VALUE_TYPES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "name") // FIXME: Type conversion needed?
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/MeasurementStation.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/MeasurementStation.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,171 @@
+package de.intevation.flys.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+
+ at Entity
+ at Table(name = "measurement_station")
+public class MeasurementStation {
+
+    private Integer id;
+
+    private String name;
+    private String measurementType;
+    private String riverside;
+    private String operator;
+    private String description;
+
+    private Double station;
+    private Range range;
+
+    private River river;
+
+    private Gauge gauge;
+    private String gaugeName;
+
+    private TimeInterval observationTimerange;
+
+    public MeasurementStation() {
+    }
+
+    public MeasurementStation(River river, String name, String measurementType,
+        String riverside, Double station, Range range, Gauge gauge,
+        String gaugeName, TimeInterval observationTimerange, String operator,
+        String description
+    ) {
+        this.river = river;
+        this.name = name;
+        this.measurementType = measurementType;
+        this.riverside = riverside;
+        this.station = station;
+        this.range = range;
+        this.gauge = gauge;
+        this.gaugeName = gaugeName;
+        this.observationTimerange = observationTimerange;
+        this.operator = operator;
+        this.description = description;
+    }
+
+    @Id
+    @SequenceGenerator(name = "SEQ_MEASUREMENT_STATION_ID_SEQ", sequenceName = "MEASUREMENT_STATION_ID_SEQ", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_MEASUREMENT_STATION_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Column(name = "measurement_type")
+    public String getMeasurementType() {
+        return measurementType;
+    }
+
+    public void setMeasurementType(String measurementType) {
+        this.measurementType = measurementType;
+    }
+
+    @Column(name = "riverside")
+    public String getRiverside() {
+        return riverside;
+    }
+
+    public void setRiverside(String riverside) {
+        this.riverside = riverside;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "reference_gauge_id")
+    public Gauge getGauge() {
+        return gauge;
+    }
+
+    public void setGauge(Gauge gauge) {
+        this.gauge = gauge;
+    }
+
+    @Column(name = "reference_gauge_name")
+    public String getGaugeName() {
+        return gaugeName;
+    }
+
+    public void setGaugeName(String gaugeName) {
+        this.gaugeName = gaugeName;
+    }
+
+    @Column(name = "station")
+    public Double getStation() {
+        return station;
+    }
+
+    public void setStation(Double station) {
+        this.station = station;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "range_id")
+    public Range getRange() {
+        return range;
+    }
+
+    public void setRange(Range range) {
+        this.range = range;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "observation_timerange_id")
+    public TimeInterval getObservationTimerange() {
+        return observationTimerange;
+    }
+
+    public void setObservationTimerange(TimeInterval observationTimerange) {
+        this.observationTimerange = observationTimerange;
+    }
+
+    @Column(name = "operator")
+    public String getOperator() {
+        return operator;
+    }
+
+    public void setOperator(String operator) {
+        this.operator = operator;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/MinMaxWQ.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/MinMaxWQ.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,58 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * Represents minmimum and maximum values for W and Q
+ */
+public class MinMaxWQ implements Serializable {
+
+    private BigDecimal minw;
+    private BigDecimal maxw;
+    private BigDecimal minq;
+    private BigDecimal maxq;
+
+    /**
+     * Default constuctor to indecate that no min and max w and q values
+     * are available
+     */
+    public MinMaxWQ() {
+    }
+
+    /**
+     * Constructor for a new MinMaxWQ value
+     *
+     * @param minw Mimimim W
+     * @param maxw Maximum W
+     * @param minq Mimimim Q
+     * @param maxq Maximum Q
+     */
+    public MinMaxWQ(
+            BigDecimal minw,
+            BigDecimal maxw,
+            BigDecimal minq,
+            BigDecimal maxq)
+    {
+        this.minw = minw;
+        this.maxw = maxw;
+        this.minq = minq;
+        this.maxq = maxq;
+    }
+
+    public BigDecimal getMinW() {
+        return this.minw;
+    }
+
+    public BigDecimal getMaxW() {
+        return this.maxw;
+    }
+
+    public BigDecimal getMinQ() {
+        return this.minq;
+    }
+
+    public BigDecimal getMaxQ() {
+        return this.maxq;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/MorphologicalWidth.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/MorphologicalWidth.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,88 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+
+
+ at Entity
+ at Table(name = "morphologic_width")
+public class MorphologicalWidth implements Serializable {
+
+    private Integer id;
+
+    private River river;
+
+    private Unit unit;
+
+    private List<MorphologicalWidthValue> values;
+
+
+    public MorphologicalWidth() {
+    }
+
+
+    public MorphologicalWidth(River river, Unit unit) {
+        this.river = river;
+        this.unit  = unit;
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_MORPHOLOGIC_WIDTH_ID_SEQ",
+        sequenceName   = "MORPHOLOGIC_WIDTH_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_MORPHOLOGIC_WIDTH_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "unit_id")
+    public Unit getUnit() {
+        return unit;
+    }
+
+    public void setUnit(Unit unit) {
+        this.unit = unit;
+    }
+
+    @OneToMany
+    @JoinColumn(name = "morphologic_width_id")
+    public List<MorphologicalWidthValue> getValues() {
+        return values;
+    }
+
+    public void setValues(List<MorphologicalWidthValue> values) {
+        this.values = values;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/MorphologicalWidthValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/MorphologicalWidthValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,103 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+
+ at Entity
+ at Table(name = "morphologic_width_values")
+public class MorphologicalWidthValue implements Serializable {
+
+    private Integer id;
+
+    private MorphologicalWidth morphologicalWidth;
+
+    private BigDecimal station;
+    private BigDecimal width;
+
+    private String description;
+
+
+    public MorphologicalWidthValue() {
+    }
+
+
+    public MorphologicalWidthValue(
+        MorphologicalWidth morphologicalWidth,
+        BigDecimal         station,
+        BigDecimal         width,
+        String             description
+    ) {
+        this.morphologicalWidth = morphologicalWidth;
+        this.station            = station;
+        this.width              = width;
+        this.description        = description;
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_MORPH_WIDTH_VALUES_ID_SEQ",
+        sequenceName   = "MORPH_WIDTH_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_MORPH_WIDTH_VALUES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "morphologic_width_id")
+    public MorphologicalWidth getMorphologicalWidth() {
+        return morphologicalWidth;
+    }
+
+    public void setMorphologicalWidth(MorphologicalWidth width) {
+        this.morphologicalWidth = width;
+    }
+
+    @Column(name = "station")
+    public BigDecimal getStation() {
+        return station;
+    }
+
+    public void setStation(BigDecimal station) {
+        this.station = station;
+    }
+
+    @Column(name = "width")
+    public BigDecimal getWidth() {
+        return width;
+    }
+
+    public void setWidth(BigDecimal width) {
+        this.width = width;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/NamedMainValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/NamedMainValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,68 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "named_main_values")
+public class NamedMainValue
+implements   Serializable
+{
+    private Integer       id;
+    private String        name;
+    private MainValueType type;
+
+    public NamedMainValue() {
+    }
+
+    public NamedMainValue(String name, MainValueType type) {
+        this.name = name;
+        this.type = type;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_NAMED_MAIN_VALUES_ID_SEQ",
+        sequenceName   = "NAMED_MAIN_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_NAMED_MAIN_VALUES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "type_id" )
+    public MainValueType getType() {
+        return type;
+    }
+
+    public void setType(MainValueType type) {
+        this.type = type;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Position.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Position.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,71 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.OneToMany;
+import javax.persistence.JoinColumn;
+import javax.persistence.GenerationType;
+
+import java.util.List;
+
+ at Entity
+ at Table(name = "positions")
+public class Position
+implements   Serializable
+{
+    private Integer id;
+
+    private String  value;
+
+    private List<Annotation> annotations;
+
+    public Position() {
+    }
+
+    public Position(String value) {
+        this.value = value;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_POSITIONS_ID_SEQ",
+        sequenceName   = "POSITIONS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_POSITIONS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "value")
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    @OneToMany
+    @JoinColumn(name="position_id")
+    public List<Annotation> getAnnotations() {
+        return annotations;
+    }
+
+    public void setAnnotations(List<Annotation> annotations) {
+        this.annotations = annotations;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Range.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Range.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,173 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+ at Entity
+ at Table(name = "ranges")
+public class Range
+implements   Serializable
+{
+    public static final double EPSILON = 1e-5;
+    private Integer    id;
+    private BigDecimal a;
+    private BigDecimal b;
+
+    private River      river;
+
+    public Range() {
+    }
+
+    public Range(double a, double b, River river) {
+        this(new BigDecimal(a), new BigDecimal(b), river);
+    }
+
+    public Range(BigDecimal a, BigDecimal b, River river) {
+        this.a     = a;
+        this.b     = b;
+        this.river = river;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_RANGES_ID_SEQ",
+        sequenceName   = "RANGES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_RANGES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "a") // FIXME: type mapping needed?
+    public BigDecimal getA() {
+        return a;
+    }
+
+    public void setA(BigDecimal a) {
+        this.a = a;
+    }
+
+    @Column(name = "b") // FIXME: type mapping needed?
+    public BigDecimal getB() {
+        return b;
+    }
+
+    public void setB(BigDecimal b) {
+        this.b = b;
+    }
+
+    public boolean containsTolerant(double x) {
+            return containsTolerant(x, EPSILON);
+    }
+
+    public boolean containsTolerant(double x, double tolerance) {
+        BigDecimal b = this.b != null ? this.b : a;
+        double av = a.doubleValue();
+        double bv = b.doubleValue();
+        if (av > bv) {
+            double t = av;
+            av = bv;
+            bv = t;
+        }
+        return x+tolerance >= av && x-tolerance <= bv;
+    }
+
+    public boolean contains(double x) {
+        BigDecimal b = this.b != null ? this.b : a;
+        double av = a.doubleValue();
+        double bv = b.doubleValue();
+        if (av > bv) {
+            double t = av;
+            av = bv;
+            bv = t;
+        }
+        return x >= av && x <= bv;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    public int code() {
+        int code = 0;
+        if (a != null) code  = 1;
+        if (b != null) code |= 2;
+        return code;
+    }
+
+    public boolean intersects(BigDecimal c) {
+        return !(a.compareTo(c) > 0 || b.compareTo(c) < 0);
+    }
+
+    public boolean intersects(Range other) {
+
+        int code  = code();
+        int ocode = other.code();
+
+        if (code == 0 || ocode == 0) {
+            return false;
+        }
+
+        switch (code) {
+            case 1: // has a
+                switch (ocode) {
+                    case 1: // has a
+                        return a.compareTo(other.a) == 0;
+                    case 2: // has b
+                        return a.compareTo(other.b) == 0;
+                    case 3: // has range
+                        return other.intersects(a);
+                }
+                break;
+            case 2: // has b
+                switch (ocode) {
+                    case 1: // has a
+                        return b.compareTo(other.a) == 0;
+                    case 2: // has b
+                        return b.compareTo(other.b) == 0;
+                    case 3: // has range
+                        return other.intersects(b);
+                }
+                break;
+            case 3: // has range
+                switch (ocode) {
+                    case 1: // has a
+                        return intersects(other.a);
+                    case 2: // has b
+                        return intersects(other.b);
+                    case 3: // has range
+                        return !(other.b.compareTo(a) < 0
+                               ||other.a.compareTo(b) > 0);
+                }
+                break;
+
+        }
+
+        return false;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/River.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/River.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,345 @@
+package de.intevation.flys.model;
+
+import de.intevation.flys.backend.SessionHolder;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.OrderBy;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+
+
+ at Entity
+ at Table(name = "rivers")
+public class River
+implements   Serializable
+{
+    public static final MathContext PRECISION = new MathContext(6);
+
+    public static final double EPSILON = 1e-5;
+
+    public static final Comparator<Double> KM_CMP = new Comparator<Double>() {
+        @Override
+        public int compare(Double a, Double b) {
+            double diff = a - b;
+            if (diff < -EPSILON) return -1;
+            if (diff >  EPSILON) return +1;
+            return 0;
+        }
+    };
+
+    private Integer id;
+
+    private Long    officialNumber;
+
+    private String  name;
+
+    private boolean kmUp;
+
+    private List<Gauge> gauges;
+
+    private List<MeasurementStation> measurementstations;
+
+    private Unit wstUnit;
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_RIVERS_ID_SEQ",
+        sequenceName   = "RIVERS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_RIVERS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "official_number")
+    public Long getOfficialNumber() {
+        return officialNumber;
+    }
+
+    public void setOfficialNumber(Long officialNumber) {
+        this.officialNumber = officialNumber;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Column(name = "km_up")
+    public boolean getKmUp() {
+        return kmUp;
+    }
+
+    public void setKmUp(boolean kmUp) {
+        this.kmUp = kmUp;
+    }
+
+    public River() {
+    }
+
+    public River(String name, Unit wstUnit) {
+        this.name    = name;
+        this.wstUnit = wstUnit;
+    }
+
+    @OneToMany
+    @JoinColumn(name="river_id")
+    public List<Gauge> getGauges() {
+        return gauges;
+    }
+
+    public void setGauges(List<Gauge> gauges) {
+        this.gauges = gauges;
+    }
+
+
+    @OneToMany
+    @OrderBy("station")
+    @JoinColumn(name="river_id")
+    public List<MeasurementStation> getMeasurementStations() {
+        return measurementstations;
+    }
+
+    public void setMeasurementStations(List<MeasurementStation> mstations) {
+        this.measurementstations = mstations;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "wst_unit_id" )
+    public Unit getWstUnit() {
+        return wstUnit;
+    }
+
+    public void setWstUnit(Unit wstUnit) {
+        this.wstUnit = wstUnit;
+    }
+
+
+
+    @Override
+    public String toString() {
+        return name != null ? name : "";
+    }
+
+
+    /**
+     * This method returns the gauges that intersect with <i>a</i> and
+     * <i>b</i>,
+     *
+     * @param a A start point.
+     * @param b An end point.
+     *
+     * @return the intersecting gauges.
+     */
+    public List<Gauge> determineGauges(double a, double b) {
+        Session session = SessionHolder.HOLDER.get();
+
+        if (a > b) { double t = a; a = b; b = t; }
+
+        Query query = session.createQuery(
+            "from Gauge where river=:river " +
+            "and not (range.a > :b or range.b < :a) order by a");
+        query.setParameter("river", this);
+        query.setParameter("a", new BigDecimal(a, PRECISION));
+        query.setParameter("b", new BigDecimal(b, PRECISION));
+
+        return query.list();
+    }
+
+    public Gauge maxOverlap(double a, double b) {
+        List<Gauge> gauges = determineGauges(a, b);
+        if (gauges == null) {
+            return null;
+        }
+
+        if (a > b) { double t = a; a = b; b = t; }
+
+        double max = -Double.MAX_VALUE;
+
+        Gauge result = null;
+
+        for (Gauge gauge: gauges) {
+            Range  r = gauge.getRange();
+            double c = r.getA().doubleValue();
+            double d = r.getB().doubleValue();
+
+            double start = c >= a ? c : a;
+            double stop  = d <= b ? d : b;
+
+            double length = stop - start;
+
+            if (length > max) {
+                max = length;
+                result = gauge;
+            }
+        }
+
+        return result;
+    }
+
+    public Gauge determineGaugeByName(String name) {
+        Session session = SessionHolder.HOLDER.get();
+        Query query = session.createQuery(
+            "from Gauge where river=:river and name=:name");
+        query.setParameter("river", this);
+        query.setParameter("name", name);
+        List<Gauge> gauges = query.list();
+        return gauges.isEmpty() ? null : gauges.get(0);
+    }
+
+    public Gauge determineGaugeByPosition(double p) {
+        Session session = SessionHolder.HOLDER.get();
+        Query query = session.createQuery(
+            "from Gauge g where river=:river "  +
+            "and :p between g.range.a and g.range.b");
+        query.setParameter("river", this);
+        query.setParameter("p", new BigDecimal(p, PRECISION));
+        List<Gauge> gauges = query.list();
+        return gauges.isEmpty() ? null : gauges.get(0);
+    }
+
+    public Gauge determineGaugeByStation(double a, double b) {
+
+        if (a > b) { double t = a; a = b; b = t; }
+
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from Gauge where river.id=:river " +
+            "and station between :a and :b");
+        query.setParameter("river", getId());
+        query.setParameter("a", new BigDecimal(a));
+        query.setParameter("b", new BigDecimal(b));
+
+        List<Gauge> gauges = query.list();
+        return gauges.isEmpty() ? null : gauges.get(0);
+    }
+
+    public double[] determineMinMaxQ() {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "select min(wqr.q) as min, max(wqr.q) as max " +
+            "from Wst as w " +
+            "join w.columns as wc " +
+            "join wc.columnQRanges as wcqr " +
+            "join wcqr.wstQRange as wqr " +
+            "where w.kind = 0 and river_id = :river");
+
+        query.setParameter("river", getId());
+
+        double minmax[] = new double[] { Double.MAX_VALUE, Double.MIN_VALUE };
+
+        List<Object> results = query.list();
+
+        if (!results.isEmpty()) {
+            Object[] arr = (Object[]) results.get(0);
+            BigDecimal minq = (BigDecimal)arr[0];
+            BigDecimal maxq = (BigDecimal)arr[1];
+            minmax[0] = minq.doubleValue();
+            minmax[1] = maxq.doubleValue();
+        }
+
+        return minmax;
+    }
+
+
+    /**
+     * This method returns the first gauge that is intersected by <i>a</i> and
+     * <i>b</i>,
+     *
+     * @param a A start point.
+     * @param b An end point.
+     *
+     * @return the first intersecting gauge.
+     */
+    public Gauge determineGauge(double a, double b) {
+        List<Gauge> gauges = determineGauges(a, b);
+
+        int idx = a < b ? 0 : gauges.size() - 1;
+
+        return gauges.isEmpty() ? null : gauges.get(idx);
+    }
+
+    /**
+     * Returns the min and max distance of this river. The first position in the
+     * resulting array contains the min distance, the second position the max
+     * distance.
+     *
+     * @return the min and max distance of this river.
+     */
+    public double[] determineMinMaxDistance() {
+        List<Gauge> gauges = getGauges();
+
+        if (gauges == null || gauges.isEmpty()) {
+            return null;
+        }
+
+        double minmax[] = new double[] { Double.MAX_VALUE, Double.MIN_VALUE };
+
+        for (Gauge g: gauges) {
+            Range r = g.getRange();
+
+            if (r == null) {
+                continue;
+            }
+
+            double a  = r.getA().doubleValue();
+            minmax[0] = minmax[0] < a ? minmax[0] : a;
+
+            BigDecimal bigB = r.getB();
+            if (bigB != null) {
+                double b  = bigB.doubleValue();
+                minmax[1] = minmax[1] > b ? minmax[1] : b;
+            }
+        }
+
+        return minmax;
+    }
+
+    public Map<Double, Double> queryGaugeDatumsKMs() {
+        List<Gauge> gauges = getGauges();
+        Map result = new TreeMap<Double, Double>(KM_CMP);
+
+        for (Gauge gauge: gauges) {
+            BigDecimal km    = gauge.getStation();
+            BigDecimal datum = gauge.getDatum();
+            if (km != null && datum != null) {
+                result.put(km.doubleValue(), datum.doubleValue());
+            }
+        }
+
+        return result;
+    }
+
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/RiverAxis.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/RiverAxis.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,146 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import com.vividsolutions.jts.geom.MultiLineString;
+
+import de.intevation.flys.backend.SessionHolder;
+import de.intevation.flys.model.AxisKind;
+
+
+/**
+ * A river has one axis that is used for calculation.
+ * Additional axes of a river can be used to be painted int maps etc.
+ * which one is the main river axis can be determined over the axis kind.
+ */
+ at Entity
+ at Table(name = "river_axes")
+public class RiverAxis
+implements   Serializable
+{
+    private Integer    id;
+    private AxisKind   kind;
+    private River      river;
+    private String     name;
+    private MultiLineString geom;
+
+    public static final int KIND_UNKOWN = 0;
+    public static final int KIND_CURRENT = 1;
+    public static final int KIND_OTHER = 2;
+
+    public RiverAxis() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Get kind.
+     *
+     * @return kind as AxisKind.
+     */
+    @OneToOne
+    @JoinColumn(name = "kind_id")
+    public AxisKind getKind() {
+        return kind;
+    }
+
+    /**
+     * Set kind.
+     *
+     * @param kind the value to set.
+     */
+    public void setKind(AxisKind kind) {
+        this.kind = kind;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public MultiLineString getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(MultiLineString geom) {
+        this.geom = geom;
+    }
+
+
+    public static List<RiverAxis> getRiverAxis(String river)
+    throws IllegalArgumentException {
+        return getRiverAxis(river, KIND_CURRENT);
+    }
+
+    public static List<RiverAxis> getRiverAxis(String river, String name, int kind)
+    throws HibernateException {
+        Session session = SessionHolder.HOLDER.get();
+        Query query = session.createQuery(
+            "from RiverAxis as ax where river.name =:river" +
+            " and kind.id =:kind" +
+            " and ax.name=:name");
+        query.setParameter("river", river);
+        query.setParameter("kind", kind);
+        query.setParameter("name", name);
+
+        List<RiverAxis> list = query.list();
+        return list.isEmpty() ? null : list;
+    }
+
+    public static List<RiverAxis> getRiverAxis(String river, int kind)
+    throws HibernateException {
+        Session session = SessionHolder.HOLDER.get();
+        Query query = session.createQuery(
+            "from RiverAxis where river.name =:river AND kind.id =:kind");
+        query.setParameter("river", river);
+        query.setParameter("kind", kind);
+
+        List<RiverAxis> list = query.list();
+        return list.isEmpty() ? null : list;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/RiverAxisKm.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/RiverAxisKm.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,104 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.Session;
+import org.hibernate.Query;
+import org.hibernate.annotations.Type;
+
+import com.vividsolutions.jts.geom.Point;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "river_axes_km")
+public class RiverAxisKm
+implements   Serializable
+{
+    private Integer    id;
+    private River      river;
+    private BigDecimal km;
+    private Point      geom;
+
+
+    public RiverAxisKm() {
+    }
+
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "km")
+    public BigDecimal getKm() {
+        return km;
+    }
+
+
+    public void setKm(BigDecimal km) {
+        this.km = km;
+    }
+
+
+    @Column(name = "geom")
+    @Type(type = "org.hibernatespatial.GeometryUserType")
+    public Point getGeom() {
+        return geom;
+    }
+
+
+    public void setGeom(Point geom) {
+        this.geom = geom;
+    }
+
+
+    /**
+     * Returns a list of RiverAxisKm objects for a given river.
+     *
+     * @param riverid The ID of a river in the database.
+     *
+     * @return a list of RiverAxisKm objects.
+     */
+    public static List<RiverAxisKm> getRiverAxisKms(int riverid) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+            "from RiverAxisKm where river.id =:riverid");
+        query.setParameter("riverid", riverid);
+
+        List<RiverAxisKm> list = query.list();
+
+        return list;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/SQRelation.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/SQRelation.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,105 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+import javax.persistence.GenerationType;
+
+
+ at Entity
+ at Table(name = "sq_relation")
+public class SQRelation implements Serializable {
+
+    private Integer id;
+
+    private River river;
+
+    private TimeInterval timeInterval;
+
+    private String description;
+
+    private List<SQRelationValue> values;
+
+
+    protected SQRelation() {
+    }
+
+
+    public SQRelation(River river, TimeInterval timeInterval, String desc) {
+        this.river        = river;
+        this.timeInterval = timeInterval;
+        this.description  = desc;
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_SQ_ID_SEQ",
+        sequenceName   = "SQ_RELATION_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_SQ_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "time_interval_id")
+    public TimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(TimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+
+    @OneToMany
+    @JoinColumn(name = "sq_relation_id")
+    public List<SQRelationValue> getValues() {
+        return values;
+    }
+
+    public void setValues(List<SQRelationValue> values) {
+        this.values = values;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/SQRelationValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/SQRelationValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,191 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.JoinColumn;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.OneToOne;
+import javax.persistence.GenerationType;
+
+
+ at Entity
+ at Table(name = "sq_relation_value")
+public class SQRelationValue implements Serializable {
+
+    private Integer id;
+
+    private SQRelation sqRelation;
+
+    private String parameter;
+
+    private MeasurementStation measurementStation;
+
+    private Double a;
+    private Double b;
+    private Double qMax;
+    private Double rSQ;
+    private Integer nTot;
+    private Integer nOutlier;
+    private Double cFerguson;
+    private Double cDuan;
+
+
+    protected SQRelationValue() {
+    }
+
+
+    public SQRelationValue(
+        SQRelation         sqRelation,
+        String             parameter,
+        MeasurementStation measurementStation,
+        Double             a,
+        Double             b,
+        Double             qMax,
+        Double             rSQ,
+        Integer            nTot,
+        Integer            nOutlier,
+        Double             cFerguson,
+        Double             cDuan
+    ) {
+        this.sqRelation         = sqRelation;
+        this.parameter          = parameter;
+        this.measurementStation = measurementStation;
+        this.a                  = a;
+        this.b                  = b;
+        this.qMax               = qMax;
+        this.rSQ                = rSQ;
+        this.nTot               = nTot;
+        this.nOutlier           = nOutlier;
+        this.cFerguson          = cFerguson;
+        this.cDuan              = cDuan;
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_SQ_VALUE_ID_SEQ",
+        sequenceName   = "SQ_RELATION_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_SQ_VALUE_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @OneToOne
+    @JoinColumn(name = "sq_relation_id")
+    public SQRelation getSqRelation() {
+        return sqRelation;
+    }
+
+    public void setSqRelation(SQRelation sqRelation) {
+        this.sqRelation = sqRelation;
+    }
+
+
+    @Column(name = "parameter")
+    public String getParameter() {
+        return parameter;
+    }
+
+    public void setParameter(String parameter) {
+        this.parameter = parameter;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "measurement_station_id")
+    public MeasurementStation getMeasurementStation() {
+        return measurementStation;
+    }
+
+    public void setMeasurementStation(MeasurementStation measurementStation) {
+        this.measurementStation = measurementStation;
+    }
+
+
+    @Column(name = "a")
+    public Double getA() {
+        return a;
+    }
+
+    public void setA(Double a) {
+        this.a = a;
+    }
+
+
+    @Column(name = "b")
+    public Double getB() {
+        return b;
+    }
+
+    public void setB(Double b) {
+        this.b = b;
+    }
+
+    @Column(name = "qmax")
+    public Double getQMax() {
+        return qMax;
+    }
+
+    public void setQMax(Double qMax) {
+        this.qMax = qMax;
+    }
+
+    @Column(name = "rsq")
+    public Double getRSQ() {
+        return rSQ;
+    }
+
+    public void setRSQ(Double rSQ) {
+        this.rSQ = rSQ;
+    }
+
+    @Column(name = "ntot")
+    public Integer getNTot () {
+        return nTot;
+    }
+
+    public void setNTot(Integer nTot) {
+        this.nTot = nTot;
+    }
+
+    @Column(name = "noutl")
+    public Integer getNOutlier() {
+        return nOutlier;
+    }
+
+    public void setNOutlier(Integer nOutlier) {
+        this.nOutlier = nOutlier;
+    }
+
+    @Column(name = "cferguson")
+    public Double getCFerguson() {
+        return cFerguson;
+    }
+
+    public void setCFerguson(Double cFerguson) {
+        this.cFerguson = cFerguson;
+    }
+
+    @Column(name = "cduan")
+    public Double getCDuan() {
+        return cDuan;
+    }
+
+    public void setCDuan(Double cDuan) {
+        this.cDuan = cDuan;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/SectieKind.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/SectieKind.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,44 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "sectie_kinds")
+public class SectieKind implements Serializable {
+    private Integer id;
+    private String name;
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return name of the kind of sectie as String.
+     */
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/SedimentDensity.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/SedimentDensity.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,103 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+
+
+ at Entity
+ at Table(name = "sediment_density")
+public class SedimentDensity implements Serializable {
+
+    private Integer id;
+
+    private River river;
+
+    private Depth depth;
+
+    private List<SedimentDensityValue> values;
+
+    private String description;
+
+
+    public SedimentDensity() {
+    }
+
+
+    public SedimentDensity(River river, Depth depth, String desc) {
+        this.river       = river;
+        this.depth       = depth;
+        this.description = desc;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_SEDIMENT_DENSITY_ID_SEQ",
+        sequenceName   = "SEDIMENT_DENSITY_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_SEDIMENT_DENSITY_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id" )
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "depth_id")
+    public Depth getDepth() {
+        return depth;
+    }
+
+    public void setDepth(Depth depth) {
+        this.depth = depth;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @OneToMany
+    @JoinColumn(name="sediment_density_id")
+    public List<SedimentDensityValue> getValues() {
+        return values;
+    }
+
+    public void setValues(List<SedimentDensityValue> values) {
+        this.values = values;
+    }
+
+    public void addValue(SedimentDensityValue value) {
+        this.values.add(value);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/SedimentDensityValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/SedimentDensityValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,125 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+
+ at Entity
+ at Table(name = "sediment_density_values")
+public class SedimentDensityValue implements Serializable {
+
+    private Integer id;
+
+    private SedimentDensity sedimentDensity;
+
+    private BigDecimal station;
+    private BigDecimal shoreOffset;
+    private BigDecimal density;
+    private BigDecimal year;
+
+    private String description;
+
+
+    public SedimentDensityValue() {
+    }
+
+
+    public SedimentDensityValue(
+        SedimentDensity sedimentDensity,
+        BigDecimal      station,
+	BigDecimal      shoreOffset,
+        BigDecimal      density,
+        BigDecimal      year,
+        String          desc
+    ) {
+        this.sedimentDensity = sedimentDensity;
+        this.station         = station;
+	this.shoreOffset     = shoreOffset;
+        this.density         = density;
+        this.year            = year;
+        this.description     = desc;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_SEDIMENT_DENSITY_VALUES_ID_SEQ",
+        sequenceName   = "SEDIMENT_DENSITY_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_SEDIMENT_DENSITY_VALUES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "sediment_density_id")
+    public SedimentDensity getSedimentDensity() {
+        return sedimentDensity;
+    }
+
+    public void setSedimentDensity(SedimentDensity sedimentDensity) {
+        this.sedimentDensity = sedimentDensity;
+    }
+
+    @Column(name = "station")
+    public BigDecimal getStation() {
+        return station;
+    }
+
+    public void setStation(BigDecimal station) {
+        this.station = station;
+    }
+
+    @Column(name = "shore_offset")
+    public BigDecimal getShoreOffset() {
+        return shoreOffset;
+    }
+
+    public void setShoreOffset(BigDecimal shoreOffset) {
+        this.shoreOffset = shoreOffset;
+    }
+
+    @Column(name = "density")
+    public BigDecimal getDensity() {
+        return density;
+    }
+
+    public void setDensity(BigDecimal density) {
+        this.density = density;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Column(name = "year")
+    public BigDecimal getYear() {
+        return year;
+    }
+
+    public void setYear(BigDecimal year) {
+        this.year = year;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/SedimentYield.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/SedimentYield.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,145 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+import org.apache.log4j.Logger;
+
+
+ at Entity
+ at Table(name = "sediment_yield")
+public class SedimentYield
+implements   Serializable
+{
+    private static Logger logger = Logger.getLogger(SedimentYield.class);
+
+    private Integer id;
+
+    private River river;
+
+    private GrainFraction grainFraction;
+
+    private Unit unit;
+
+    private TimeInterval timeInterval;
+
+    private String description;
+
+    private List<SedimentYieldValue> values;
+
+
+    public SedimentYield() {
+        this.values = new ArrayList<SedimentYieldValue>();
+    }
+
+    public SedimentYield(River river, Unit unit, TimeInterval timeInterval) {
+        this();
+
+        this.river        = river;
+        this.unit         = unit;
+        this.timeInterval = timeInterval;
+    }
+
+
+    public SedimentYield(
+        River         river,
+        Unit          unit,
+        TimeInterval  timeInterval,
+        GrainFraction grainFraction
+    ) {
+        this(river, unit, timeInterval);
+
+        this.grainFraction = grainFraction;
+    }
+
+
+    public SedimentYield(
+        River         river,
+        Unit          unit,
+        TimeInterval  timeInterval,
+        GrainFraction grainFraction,
+        String        description
+    ) {
+        this(river, unit, timeInterval, grainFraction);
+
+        this.description = description;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_SEDIMENT_YIELD_ID_SEQ",
+        sequenceName   = "SEDIMENT_YIELD_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_SEDIMENT_YIELD_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id")
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @OneToOne
+    @JoinColumn(name="grain_fraction_id")
+    public GrainFraction getGrainFraction() {
+        return grainFraction;
+    }
+
+    public void setGrainFraction(GrainFraction grainFraction) {
+        this.grainFraction = grainFraction;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "unit_id")
+    public Unit getUnit() {
+        return unit;
+    }
+
+    public void setUnit(Unit unit) {
+        this.unit = unit;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "time_interval_id")
+    public TimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(TimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/SedimentYieldValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/SedimentYieldValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,93 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+import org.apache.log4j.Logger;
+
+
+ at Entity
+ at Table(name = "sediment_yield_values")
+public class SedimentYieldValue
+implements   Serializable
+{
+    private static Logger logger = Logger.getLogger(SedimentYieldValue.class);
+
+    private Integer id;
+
+    private SedimentYield sedimentYield;
+
+    private Double station;
+    private Double value;
+
+    private Unit unit;
+
+
+    public SedimentYieldValue() {
+    }
+
+    public SedimentYieldValue(
+        SedimentYield sedimentYield,
+        Double        station,
+        Double        value
+    ) {
+        this.sedimentYield = sedimentYield;
+        this.station       = station;
+        this.value         = value;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_SEDIMENT_YIELD_VALuES_ID_SEQ",
+        sequenceName   = "SEDIMENT_YIELD_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_SEDIMENT_YIELD_VALuES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "sediment_yield_id" )
+    public SedimentYield getSedimentYield() {
+        return sedimentYield;
+    }
+
+    public void setSedimentYield(SedimentYield sedimentYield) {
+        this.sedimentYield = sedimentYield;
+    }
+
+    @Column(name="station")
+    public Double getStation() {
+        return station;
+    }
+
+    public void setStation(Double station) {
+        this.station = station;
+    }
+
+    @Column(name = "value")
+    public Double getValue() {
+        return value;
+    }
+
+    public void setValue(Double value) {
+        this.value = value;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/SobekKind.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/SobekKind.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,45 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "sobek_kinds")
+public class SobekKind implements Serializable {
+
+    private Integer id;
+    private String name;
+
+    @Id
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * Get name.
+     *
+     * @return name of the kind of sobek as String.
+     */
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set name.
+     *
+     * @param name the value to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/TimeInterval.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/TimeInterval.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,67 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+ at Entity
+ at Table(name = "time_intervals")
+public class TimeInterval
+implements   Serializable
+{
+    private Integer id;
+    private Date    startTime;
+    private Date    stopTime;
+
+    public TimeInterval() {
+    }
+
+    public TimeInterval(Date startTime, Date stopTime) {
+        this.startTime = startTime;
+        this.stopTime  = stopTime;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_TIME_INTERVALS_ID_SEQ",
+        sequenceName   = "TIME_INTERVALS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_TIME_INTERVALS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Column(name = "start_time") // FIXME: type mapping needed?
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    @Column(name = "stop_time") // FIXME: type mapping needed?
+    public Date getStopTime() {
+        return stopTime;
+    }
+
+    public void setStopTime(Date stopTime) {
+        this.stopTime = stopTime;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Unit.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Unit.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,60 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+
+ at Entity
+ at Table(name = "units")
+public class Unit
+implements   Serializable
+{
+    protected Integer id;
+    protected String  name;
+
+
+    public Unit() {
+    }
+
+
+    public Unit(String name) {
+        this.name = name;
+    }
+
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_UNITS_ID_SEQ",
+        sequenceName   = "UNITS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_UNITS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/Wst.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/Wst.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,215 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.Session;
+import org.hibernate.SQLQuery;
+import org.hibernate.Query;
+import org.hibernate.type.StandardBasicTypes;
+
+import de.intevation.flys.backend.SessionHolder;
+
+
+ at Entity
+ at Table(name = "wsts")
+public class Wst
+implements   Serializable
+{
+    private static Logger logger = Logger.getLogger(Wst.class);
+
+    private Integer id;
+    private River   river;
+    private String  description;
+    private Integer kind;
+
+    private List<WstColumn> columns;
+
+
+    public static final String SQL_SELECT_MINMAX =
+        "select min(q) as minQ, max(q) as maxQ from wst_q_values " +
+        "where wst_id = :wst and not (a > :km or b < :km)";
+
+    public Wst() {
+    }
+
+    public Wst(River river, String description) {
+        this(river, description, 0);
+    }
+
+    public Wst(River river, String description, Integer kind) {
+        this.river       = river;
+        this.description = description;
+        this.kind        = kind;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_WSTS_ID_SEQ",
+        sequenceName   = "WSTS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_WSTS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "river_id" )
+    public River getRiver() {
+        return river;
+    }
+
+    public void setRiver(River river) {
+        this.river = river;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Column(name = "kind")
+    public Integer getKind() {
+        return kind;
+    }
+
+    public void setKind(Integer kind) {
+        this.kind = kind;
+    }
+
+    @OneToMany
+    @JoinColumn(name="wst_id")
+    public List<WstColumn> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(List<WstColumn> columns) {
+        this.columns = columns;
+    }
+
+
+    /**
+     * Determines the min and max Q values of this WST. The min value is placed
+     * in the first field of the resulting array - the max value is placed in
+     * the second field.
+     *
+     * @return the min and max Q values of this WST.
+     */
+    public double[] determineMinMaxQ() {
+        double[] ab = river.determineMinMaxDistance();
+        return determineMinMaxQ(new Range(ab[0], ab[1], river));
+    }
+
+
+    /**
+     * Determines the min and max Q values of this WST in the given range. The
+     * min value is placed in the first field of the resulting array - the max
+     * value is placed in the second field.
+     *
+     * @param range The range used for querying the Q values.
+     *
+     * @return the min and max Q values of this WST.
+     */
+    public double[] determineMinMaxQ(Range range) {
+        if (range != null) {
+            return determineMinMaxQ(
+                range.getA().doubleValue(),
+                range.getB().doubleValue());
+        }
+
+        return null;
+    }
+
+
+    /**
+     * Determines the min and max Q values of this WST in the given range. The
+     * min value is placed in the first field of the resulting array - the max
+     * value is placed in the second field.
+     *
+     * @param fromKm the lower km value.
+     * @param toKm the upper km value.
+     *
+     * @return the min and max Q values of this WST.
+     */
+    public double[] determineMinMaxQ(double fromKm, double toKm) {
+        Session session = SessionHolder.HOLDER.get();
+
+        Query query = session.createQuery(
+          "select min(q), max(q) from WstQRange where " +
+          " id in " +
+          "  (select wstQRange.id from WstColumnQRange where " +
+          "    wstColumn.id in (select id from WstColumn where wst.id = :wst)) " +
+          " and range.id in " +
+          "  (select id from Range where not (a > :end or b < :start))");
+
+        query.setParameter("wst",   getId());
+        query.setParameter("start", new BigDecimal(fromKm));
+        query.setParameter("end",   new BigDecimal(toKm));
+
+        List<Object []> results = query.list();
+
+        if (results.isEmpty()) {
+            return null;
+        }
+
+        Object [] result = results.get(0);
+
+        return new double [] {
+            ((BigDecimal)result[0]).doubleValue(),
+            ((BigDecimal)result[1]).doubleValue() };
+    }
+
+
+    public double[] determineMinMaxQFree(double km) {
+        Session session = SessionHolder.HOLDER.get();
+
+        SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_MINMAX)
+            .addScalar("minQ", StandardBasicTypes.DOUBLE)
+            .addScalar("maxQ", StandardBasicTypes.DOUBLE);
+
+        sqlQuery.setInteger("wst", getId());
+        sqlQuery.setDouble("km", km);
+
+        List<Object[]> minmaxQ = sqlQuery.list();
+
+
+        if (minmaxQ.isEmpty()) {
+            return null;
+        }
+
+        Object[] mm = minmaxQ.get(0);
+
+        if (mm[0] == null || mm[1] == null) {
+            logger.warn ("No min/max Q for km " + km + " found.");
+            return null;
+        }
+
+        return new double[] { (Double) mm[0], (Double) mm[1] };
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/WstColumn.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/WstColumn.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,134 @@
+package de.intevation.flys.model;
+
+import java.util.List;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.OneToMany;
+
+ at Entity
+ at Table(name = "wst_columns")
+public class WstColumn
+implements   Serializable
+{
+    private Integer               id;
+    private Wst                   wst;
+    private String                name;
+    private String                description;
+    private Integer               position;
+    private TimeInterval          timeInterval;
+
+    private List<WstColumnQRange> columnQRanges;
+    private List<WstColumnValue>  columnValues;
+
+    public WstColumn() {
+    }
+
+    public WstColumn(
+        Wst          wst,
+        String       name,
+        String       description,
+        Integer      position,
+        TimeInterval timeInterval
+    ) {
+        this.wst          = wst;
+        this.name         = name;
+        this.description  = description;
+        this.position     = position;
+        this.timeInterval = timeInterval;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_WST_COLUMNS_ID_SEQ",
+        sequenceName   = "WST_COLUMNS_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_WST_COLUMNS_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "wst_id" )
+    public Wst getWst() {
+        return wst;
+    }
+
+    public void setWst(Wst wst) {
+        this.wst = wst;
+    }
+
+    @Column(name = "name")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Column(name = "description")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Column(name = "position")
+    public Integer getPosition() {
+        return position;
+    }
+
+    public void setPosition(Integer position) {
+        this.position = position;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "time_interval_id" )
+    public TimeInterval getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(TimeInterval timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    @OneToMany
+    @JoinColumn(name="wst_column_id")
+    public List<WstColumnQRange> getColumnQRanges() {
+        return columnQRanges;
+    }
+
+    public void setColumnQRanges(List<WstColumnQRange> columnQRanges) {
+        this.columnQRanges = columnQRanges;
+    }
+
+    @OneToMany
+    @JoinColumn(name="wst_column_id")
+    public List<WstColumnValue> getColumnValues() {
+        return columnValues;
+    }
+
+    public void setColumnValues(List<WstColumnValue> columnValues) {
+        this.columnValues = columnValues;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/WstColumnQRange.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/WstColumnQRange.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,73 @@
+package de.intevation.flys.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "wst_column_q_ranges")
+public class WstColumnQRange
+implements   Serializable
+{
+    private Integer   id;
+    private WstColumn wstColumn;
+    private WstQRange wstQRange;
+
+    public WstColumnQRange() {
+    }
+
+    public WstColumnQRange(
+        WstColumn wstColumn,
+        WstQRange wstQRange
+    ) {
+        this.wstColumn = wstColumn;
+        this.wstQRange = wstQRange;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_WST_Q_RANGES_ID_SEQ",
+        sequenceName   = "WST_Q_RANGES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_WST_Q_RANGES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "wst_column_id" )
+    public WstColumn getWstColumn() {
+        return wstColumn;
+    }
+
+    public void setWstColumn(WstColumn wstColumn) {
+        this.wstColumn = wstColumn;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "wst_q_range_id" )
+    public WstQRange getWstQRange() {
+        return wstQRange;
+    }
+
+    public void setWstQRange(WstQRange wstQRange) {
+        this.wstQRange = wstQRange;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/WstColumnValue.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/WstColumnValue.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,85 @@
+package de.intevation.flys.model;
+
+import java.math.BigDecimal;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "wst_column_values")
+public class WstColumnValue
+implements   Serializable
+{
+    private Integer    id;
+    private WstColumn  wstColumn;
+    private BigDecimal position;
+    private BigDecimal w;
+
+    public WstColumnValue() {
+    }
+
+    public WstColumnValue(
+        WstColumn  wstColumn,
+        BigDecimal position,
+        BigDecimal w
+    ) {
+        this.wstColumn = wstColumn;
+        this.position  = position;
+        this.w         = w;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_WST_COLUMN_VALUES_ID_SEQ",
+        sequenceName   = "WST_COLUMN_VALUES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_WST_COLUMN_VALUES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "wst_column_id")
+    public WstColumn getWstColumn() {
+        return wstColumn;
+    }
+
+    public void setWstColumn(WstColumn wstColumn) {
+        this.wstColumn = wstColumn;
+    }
+
+    @Column(name = "position") // FIXME: type mapping needed?
+    public BigDecimal getPosition() {
+        return position;
+    }
+
+    public void setPosition(BigDecimal position) {
+        this.position = position;
+    }
+
+    @Column(name = "w") // FIXME: type mapping needed?
+    public BigDecimal getW() {
+        return w;
+    }
+
+    public void setW(BigDecimal w) {
+        this.w = w;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/model/WstQRange.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/model/WstQRange.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,70 @@
+package de.intevation.flys.model;
+
+import java.math.BigDecimal;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Column;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+
+ at Entity
+ at Table(name = "wst_q_ranges")
+public class WstQRange
+implements   Serializable
+{
+    private Integer    id;
+    private Range      range;
+    private BigDecimal q;
+
+    public WstQRange() {
+    }
+
+    public WstQRange(Range range, BigDecimal q) {
+        this.range = range;
+        this.q     = q;
+    }
+
+    @Id
+    @SequenceGenerator(
+        name           = "SEQUENCE_WST_Q_RANGES_ID_SEQ",
+        sequenceName   = "WST_Q_RANGES_ID_SEQ",
+        allocationSize = 1)
+    @GeneratedValue(
+        strategy  = GenerationType.SEQUENCE,
+        generator = "SEQUENCE_WST_Q_RANGES_ID_SEQ")
+    @Column(name = "id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @OneToOne
+    @JoinColumn(name = "range_id" )
+    public Range getRange() {
+        return range;
+    }
+
+    public void setRange(Range range) {
+        this.range = range;
+    }
+
+    @Column(name = "q") // FIXME: type mapping needed?!
+    public BigDecimal getQ() {
+        return q;
+    }
+
+    public void setQ(BigDecimal q) {
+        this.q = q;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/utils/DBCPConnectionProvider.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/utils/DBCPConnectionProvider.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,253 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package de.intevation.flys.utils;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Map;
+import java.util.Collections;
+import java.util.StringTokenizer;
+
+import org.apache.commons.dbcp.BasicDataSource;
+import org.apache.commons.dbcp.BasicDataSourceFactory;
+
+import org.apache.log4j.Logger;
+
+import org.hibernate.HibernateException;
+
+import org.hibernate.connection.ConnectionProviderFactory;
+import org.hibernate.connection.ConnectionProvider;
+
+import org.hibernate.cfg.Environment;
+
+/**
+ * <p>A connection provider that uses an Apache commons DBCP connection pool.</p>
+ *
+ * <p>To use this connection provider set:<br>
+ * <code>hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider</code></p>
+ *
+ * <pre>Supported Hibernate properties:
+ *   hibernate.connection.driver_class
+ *   hibernate.connection.url
+ *   hibernate.connection.username
+ *   hibernate.connection.password
+ *   hibernate.connection.isolation
+ *   hibernate.connection.autocommit
+ *   hibernate.connection.pool_size
+ *   hibernate.connection (JDBC driver properties)</pre>
+ * <br>
+ * All DBCP properties are also supported by using the hibernate.dbcp prefix.
+ * A complete list can be found on the DBCP configuration page:
+ * <a href="http://jakarta.apache.org/commons/dbcp/configuration.html">http://jakarta.apache.org/commons/dbcp/configuration.html</a>.
+ * <br>
+ * <pre>Example:
+ *   hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
+ *   hibernate.connection.driver_class org.hsqldb.jdbcDriver
+ *   hibernate.connection.username sa
+ *   hibernate.connection.password
+ *   hibernate.connection.url jdbc:hsqldb:test
+ *   hibernate.connection.pool_size 20
+ *   hibernate.dbcp.initialSize 10
+ *   hibernate.dbcp.maxWait 3000
+ *   hibernate.dbcp.validationQuery select 1 from dual</pre>
+ *
+ * <p>More information about configuring/using DBCP can be found on the
+ * <a href="http://jakarta.apache.org/commons/dbcp/">DBCP website</a>.
+ * There you will also find the DBCP wiki, mailing lists, issue tracking
+ * and other support facilities</p>
+ *
+ * @see org.hibernate.connection.ConnectionProvider
+ * @author Dirk Verbeeck
+ */
+public class DBCPConnectionProvider
+implements   ConnectionProvider
+{
+    private static Logger log = Logger.getLogger(DBCPConnectionProvider.class);
+
+    private static final String PREFIX = "hibernate.dbcp.";
+
+    private BasicDataSource ds;
+
+    // Old Environment property for backward-compatibility
+    // (property removed in Hibernate3)
+    private static final String DBCP_PS_MAXACTIVE =
+        "hibernate.dbcp.ps.maxActive";
+
+    // Property doesn't exists in Hibernate2
+    private static final String AUTOCOMMIT =
+        "hibernate.connection.autocommit";
+
+    public void configure(Properties props) throws HibernateException {
+        try {
+            log.debug("Configure DBCPConnectionProvider");
+
+            // DBCP properties used to create the BasicDataSource
+            Properties dbcpProperties = new Properties();
+
+            // DriverClass & url
+            String jdbcDriverClass = props.getProperty(Environment.DRIVER);
+            String jdbcUrl = props.getProperty(Environment.URL);
+            dbcpProperties.put("driverClassName", jdbcDriverClass);
+            dbcpProperties.put("url", jdbcUrl);
+
+            // Username / password
+            String username = props.getProperty(Environment.USER);
+            String password = props.getProperty(Environment.PASS);
+            dbcpProperties.put("username", username);
+            dbcpProperties.put("password", password);
+
+            // Isolation level
+            String isolationLevel = props.getProperty(Environment.ISOLATION);
+            if (isolationLevel != null
+            && (isolationLevel = isolationLevel.trim()).length() > 0) {
+                dbcpProperties.put("defaultTransactionIsolation", isolationLevel);
+            }
+
+            // Turn off autocommit (unless autocommit property is set)
+            String autocommit = props.getProperty(AUTOCOMMIT);
+            if (autocommit != null
+            && (autocommit = autocommit.trim()).length() > 0) {
+                dbcpProperties.put("defaultAutoCommit", autocommit);
+            } else {
+                dbcpProperties.put("defaultAutoCommit", String.valueOf(Boolean.FALSE));
+            }
+
+            // Pool size
+            String poolSize = props.getProperty(Environment.POOL_SIZE);
+            if (poolSize != null
+            && (poolSize = poolSize.trim()).length() > 0
+            && Integer.parseInt(poolSize) > 0)  {
+                dbcpProperties.put("maxActive", poolSize);
+            }
+
+            // Copy all "driver" properties into "connectionProperties"
+            Properties driverProps =
+                ConnectionProviderFactory.getConnectionProperties(props);
+
+            if (driverProps.size() > 0) {
+                StringBuilder connectionProperties = new StringBuilder();
+                for (Iterator iter = driverProps.entrySet().iterator();
+                    iter.hasNext();
+                ) {
+                    Map.Entry entry = (Map.Entry)iter.next();
+                    String    key   = (String)entry.getKey();
+                    String    value = (String)entry.getValue();
+                    connectionProperties
+                        .append(key)
+                        .append('=')
+                        .append(value);
+                    if (iter.hasNext()) {
+                        connectionProperties.append(';');
+                    }
+                }
+                dbcpProperties.put(
+                    "connectionProperties", connectionProperties.toString());
+            }
+
+            // Copy all DBCP properties removing the prefix
+            for (Iterator iter = props.entrySet().iterator() ; iter.hasNext() ;) {
+                Map.Entry entry = (Map.Entry)iter.next();
+                String    key   = (String)entry.getKey();
+                if (key.startsWith(PREFIX)) {
+                    String property = key.substring(PREFIX.length());
+                    String value    = (String)entry.getValue();
+                    dbcpProperties.put(property, value);
+                }
+            }
+
+            // Backward-compatibility
+            if (props.getProperty(DBCP_PS_MAXACTIVE) != null) {
+                dbcpProperties.put(
+                    "poolPreparedStatements",
+                    String.valueOf(Boolean.TRUE));
+                dbcpProperties.put(
+                    "maxOpenPreparedStatements",
+                    props.getProperty(DBCP_PS_MAXACTIVE));
+            }
+
+            // Some debug info
+            /* // commented out, because it leaks the password
+            if (log.isDebugEnabled()) {
+                log.debug("Creating a DBCP BasicDataSource" +
+                          " with the following DBCP factory properties:");
+                StringWriter sw = new StringWriter();
+                dbcpProperties.list(new PrintWriter(sw, true));
+                log.debug(sw.toString());
+            }
+            */
+
+            // Let the factory create the pool
+            ds = (BasicDataSource)BasicDataSourceFactory
+                .createDataSource(dbcpProperties);
+
+            // This needs to be done manually as it is somehow ignored
+            // by the BasicDataSourceFactory if you set it as a dbcpProperty
+            String connectionInitSqls = props.getProperty("connectionInitSqls");
+            if (connectionInitSqls != null) {
+                StringTokenizer tokenizer = new StringTokenizer(connectionInitSqls, ";");
+                ds.setConnectionInitSqls(Collections.list(tokenizer));
+            }
+            // The BasicDataSource has lazy initialization
+            // borrowing a connection will start the DataSource
+            // and make sure it is configured correctly.
+
+            // Connection conn = ds.getConnection();
+            // conn.close();
+        }
+        catch (Exception e) {
+            String message = "Could not create a DBCP pool";
+            log.fatal(message, e);
+            if (ds != null) {
+                BasicDataSource x = ds; ds = null;
+                try {
+                    x.close();
+                }
+                catch (SQLException sqle) {
+                }
+            }
+            throw new HibernateException(message, e);
+        }
+        log.debug("Configure DBCPConnectionProvider complete");
+    }
+
+    public Connection getConnection() throws SQLException {
+        return ds.getConnection();
+    }
+
+    public void closeConnection(Connection conn) throws SQLException {
+        conn.close();
+    }
+
+    public void close() throws HibernateException {
+        try {
+            if (ds != null) {
+                BasicDataSource x = ds; ds = null;
+                x.close();
+            }
+        }
+        catch (SQLException sqle) {
+            throw new HibernateException("Could not close DBCP pool", sqle);
+        }
+    }
+
+    public boolean supportsAggressiveRelease() {
+        return false;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/utils/DateGuesser.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/utils/DateGuesser.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,258 @@
+package de.intevation.flys.utils;
+
+/**
+ * Copyright (c) 2006 by Intevation GmbH
+ *
+ * @author Sascha L. Teichmann (teichmann at intevation.de)
+ *
+ * This program is free software under the LGPL (>=v2.1)
+ * Read the file LGPL coming with FLYS for details.
+ */
+
+import java.util.Date;
+import java.util.Calendar;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+public final class DateGuesser {
+    public static final String [] MONTH = {
+        "jan", "feb", "mrz", "apr", "mai", "jun",
+        "jul", "aug", "sep", "okt", "nov", "dez"
+    };
+
+    public static final int guessMonth(String s) {
+        s = s.toLowerCase();
+        for (int i = 0; i < MONTH.length; ++i)
+            if (MONTH[i].equals(s)) {
+                return i;
+            }
+        return -1;
+    }
+
+    public static final Pattern YYYY_MM_DD =
+        Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})$");
+
+    public static final Pattern DD_MM_YYYY =
+        Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})$");
+
+    public static final Pattern MMM_YYYY =
+        Pattern.compile("^(\\d{0,2})\\.?(\\w{3})\\.?(\\d{2,4})$");
+
+    public static final Pattern GARBAGE_YYYY =
+        Pattern.compile("^\\D*(\\d{2,4})$");
+
+    public static final Pattern YYYY_MM_DDThh_mm =
+        Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$");
+
+    public static final Pattern YYYY_MM_DDThh_mm_ss =
+        Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})$");
+
+    public static final Pattern DD_MM_YYYYThh_mm =
+        Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})T(\\d{1,2}):(\\d{2})$");
+
+    public static final Pattern DD_MM_YYYYThh_mm_ss =
+        Pattern.compile("^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2,4})T(\\d{1,2}):(\\d{2}):(\\d{2})$");
+
+    public static final Pattern DDMMYY =
+        Pattern.compile("^(\\d{1,2})(\\d{1,2})(\\d{1,2})$");
+
+    private DateGuesser() {
+    }
+
+    public static final int calendarMonth(String month) {
+        return calendarMonth(Integer.parseInt(month));
+    }
+
+    public static final int calendarMonth(int month) {
+        return Math.max(Math.min(month-1, 11), 0);
+    }
+
+    /**
+     * Guess date by trying all different patterns.
+     * Throws IllegalArgumentException if not able to guess.
+     * @param s The date to be guessed (e.g. 11.02.2001).
+     * @return the parsed Date.
+     */
+    public static Date guessDate(String s) {
+        if (s == null || (s = s.trim()).length() == 0) {
+            throw new IllegalArgumentException();
+        }
+
+        Matcher m;
+
+        m = YYYY_MM_DD.matcher(s);
+
+        if (m.matches()) {
+            Calendar cal = Calendar.getInstance();
+            String year  = m.group(1);
+            String month = m.group(2);
+            String day   = m.group(3);
+            cal.set(
+                Integer.parseInt(year),
+                calendarMonth(month),
+                Integer.parseInt(day),
+                12, 0, 0);
+            return cal.getTime();
+        }
+
+        m = DD_MM_YYYY.matcher(s);
+
+        if (m.matches()) {
+            Calendar cal = Calendar.getInstance();
+            String year  = m.group(3);
+            String month = m.group(2);
+            String day   = m.group(1);
+            cal.set(
+                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
+                calendarMonth(month),
+                Integer.parseInt(m.group(1)),
+                12, 0, 0);
+            return cal.getTime();
+        }
+
+        m = MMM_YYYY.matcher(s);
+
+        if (m.matches()) {
+            int month = guessMonth(m.group(2));
+            if (month >= 0) {
+                Calendar cal = Calendar.getInstance();
+                String year = m.group(3);
+                String day  = m.group(1);
+                cal.set(
+                    Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
+                    month,
+                    day.length() == 0 ? 15 : Integer.parseInt(day),
+                    12, 0, 0);
+                return cal.getTime();
+            }
+        }
+
+        m = YYYY_MM_DDThh_mm.matcher(s);
+
+        if (m.matches()) {
+            Calendar cal = Calendar.getInstance();
+            String year = m.group(1);
+            String month = m.group(2);
+            String day = m.group(3);
+            String hour = m.group(4);
+            String minute = m.group(5);
+            cal.set(
+                Integer.parseInt(year),
+                calendarMonth(month),
+                Integer.parseInt(day),
+                Integer.parseInt(hour),
+                Integer.parseInt(minute),
+                0
+            );
+            return cal.getTime();
+        }
+
+        m = YYYY_MM_DDThh_mm_ss.matcher(s);
+
+        if (m.matches()) {
+            Calendar cal = Calendar.getInstance();
+            String year = m.group(1);
+            String month = m.group(2);
+            String day = m.group(3);
+            String hour = m.group(4);
+            String minute = m.group(5);
+            String second = m.group(6);
+            cal.set(
+                Integer.parseInt(year),
+                calendarMonth(month),
+                Integer.parseInt(day),
+                Integer.parseInt(hour),
+                Integer.parseInt(minute),
+                Integer.parseInt(second)
+            );
+            return cal.getTime();
+        }
+
+        m = DD_MM_YYYYThh_mm.matcher(s);
+
+        if (m.matches()) {
+            Calendar cal = Calendar.getInstance();
+            String year = m.group(3);
+            String month = m.group(2);
+            String day = m.group(1);
+            String hour = m.group(4);
+            String minute = m.group(5);
+            cal.set(
+                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
+                calendarMonth(month),
+                Integer.parseInt(day),
+                Integer.parseInt(hour),
+                Integer.parseInt(minute),
+                0
+            );
+            return cal.getTime();
+        }
+
+        m = DD_MM_YYYYThh_mm_ss.matcher(s);
+
+        if (m.matches()) {
+            Calendar cal = Calendar.getInstance();
+            String year = m.group(3);
+            String month = m.group(2);
+            String day = m.group(1);
+            String hour = m.group(4);
+            String minute = m.group(5);
+            String second = m.group(6);
+            cal.set(
+                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
+                calendarMonth(month),
+                Integer.parseInt(day),
+                Integer.parseInt(hour),
+                Integer.parseInt(minute),
+                Integer.parseInt(second)
+            );
+            return cal.getTime();
+        }
+
+        m = DDMMYY.matcher(s);
+
+        if (m.matches()) {
+            Calendar cal = Calendar.getInstance();
+            String day   = m.group(1);
+            String month = m.group(2);
+            String yearS = m.group(3);
+            int year = Integer.parseInt(yearS);
+
+            if (year <= cal.get(Calendar.YEAR) % 100) {
+                year += 2000;
+            }
+            else {
+                year += 1900;
+            }
+            cal.set(
+                year,
+                Integer.parseInt(month),  // month
+                Integer.parseInt(day), // day
+                12, 0, 0);
+            return cal.getTime();
+        }
+
+        m = GARBAGE_YYYY.matcher(s);
+
+        if (m.matches()) {
+            Calendar cal = Calendar.getInstance();
+            String year = m.group(1);
+            cal.set(
+                Integer.parseInt(year) + (year.length() == 2 ? 1900 : 0),
+                5,  // month
+                15, // day
+                12, 0, 0);
+            return cal.getTime();
+        }
+
+        throw new IllegalArgumentException();
+    }
+
+    public static void main(String [] args) {
+        for (int i = 0; i < args.length; ++i) {
+            System.out.println(args[i] + ": " + guessDate(args[i]));
+        }
+    }
+}
+// end of file
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/utils/EpsilonComparator.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/utils/EpsilonComparator.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,27 @@
+package de.intevation.flys.utils;
+
+import java.util.Comparator;
+
+/** Comparator with some tolerance (epsilon). */
+public class EpsilonComparator implements Comparator<Double>
+{
+    public static final double EPSILON = 1e-4;
+
+    /** Ready-made comparator with 1e-4 tolerance. */
+    public static final EpsilonComparator CMP = new EpsilonComparator(EPSILON);
+
+    private double epsilon;
+
+    public EpsilonComparator(double epsilon) {
+        this.epsilon = epsilon;
+    }
+
+    @Override
+    public int compare(Double a, Double b) {
+        double diff = a - b;
+        if (diff < -epsilon) return -1;
+        if (diff >  epsilon) return +1;
+        return 0;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/main/java/org/dive4elements/river/utils/StringUtil.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/org/dive4elements/river/utils/StringUtil.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,829 @@
+package de.intevation.flys.utils;
+
+/**
+ * Copyright (c) 2006 by Intevation GmbH
+ *
+ * @author Sascha L. Teichmann (teichmann at intevation.de)
+ * @author Ludwig Reiter       (ludwig at intevation.de)
+ *
+ * This program is free software under the LGPL (>=v2.1)
+ * Read the file LGPL coming with FLYS for details.
+ */
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Locale;
+
+import java.net.URLEncoder;
+import java.net.URLDecoder;
+
+import java.io.UnsupportedEncodingException;
+import java.io.IOException;
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.PrintWriter;
+
+
+public final class StringUtil {
+    final static String NUMBER_SEPERATOR = ";";
+    final static String LINE_SEPERATOR = ":";
+
+    private StringUtil() {
+    }
+
+    public static final String double2DArrayToString(double[][] values) {
+
+        if (values == null) {
+            throw new IllegalArgumentException("keine double[][]-Werte");
+        }
+
+        StringBuilder strbuf = new StringBuilder();
+
+        for (int i=0; i < values.length; i++) {
+            if (i>0) {
+                strbuf.append(LINE_SEPERATOR);
+            }
+            for (int j=0; j < values[i].length; j++) {
+                if (j > 0) {
+                    strbuf.append(NUMBER_SEPERATOR);
+                }
+                strbuf.append(values[i][j]);
+            }
+        }
+
+        return strbuf.toString();
+    }
+
+    public static final double[][] stringToDouble2DArray(String str) {
+        if (str == null || str.length() == 0) {
+            return null;
+        }
+
+        String[] lineSplit = str.split(LINE_SEPERATOR);
+        double[][] array2D = new double[lineSplit.length][];
+        for (int i=0; i < lineSplit.length; i++) {
+            String[] numberSplit =  lineSplit[i].split(NUMBER_SEPERATOR);
+
+            double[] numbers = new double[numberSplit.length];
+            for (int j=0; j < numberSplit.length; j++) {
+                numbers[j] = Double.valueOf(numberSplit[j]).doubleValue();
+            }
+
+            array2D[i] = numbers;
+        }
+
+        return array2D;
+    }
+
+    /**
+     * Remove first occurrence of "[" and "]" (if both do occur).
+     * @param value String to be stripped of [] (might be null).
+     * @return input string but with [ and ] removed, or input string if no
+     *         brackets were found.
+     */
+    public static final String unbracket(String value) {
+        // null- guard
+        if (value == null) return value;
+
+        int start = value.indexOf("[");
+        int end   = value.indexOf("]");
+
+        if (start < 0 || end < 0) {
+            return value;
+        }
+
+        value = value.substring(start + 1, end);
+
+        return value;
+    }
+
+
+    /**
+     * From "Q=1" make "W(Q=1)".
+     * @return original string wraped in "W()" if it contains a "Q", original
+     *         string otherwise.
+     */
+    public static String wWrap(String wOrQ) {
+        return (wOrQ != null && wOrQ.indexOf("Q") >=0)
+               ? "W(" + wOrQ + ")"
+               : wOrQ;
+        }
+
+
+    public static final String [] splitLines(String s) {
+        if (s == null) {
+            return null;
+        }
+        ArrayList<String> list = new ArrayList<String>();
+
+        BufferedReader in = null;
+
+        try {
+            in =
+                new BufferedReader(
+                new StringReader(s));
+
+            String line;
+
+            while ((line = in.readLine()) != null) {
+                list.add(line);
+            }
+        }
+        catch (IOException ioe) {
+            return null;
+        }
+        finally {
+            if (in != null)
+                try {
+                    in.close();
+                }
+                catch (IOException ioe) {}
+        }
+
+        return list.toArray(new String[list.size()]);
+    }
+
+    public static final String concat(String [] s) {
+        return concat(s, null);
+    }
+
+    public static final String concat(String [] s, String glue) {
+        if (s == null) {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < s.length; ++i) {
+            if (i > 0 && glue != null) {
+                sb.append(glue);
+            }
+            sb.append(s[i]);
+        }
+        return sb.toString();
+    }
+
+    public static final String [] splitAfter(String [] src, int N) {
+        if (src == null) {
+            return null;
+        }
+
+        ArrayList<String> list = new ArrayList<String>(src.length);
+        for (int i = 0; i < src.length; ++i) {
+            String s = src[i];
+            int R;
+            if (s == null || (R = s.length()) == 0) {
+                list.add(s);
+            }
+            else {
+                while (R > N) {
+                    list.add(s.substring(0, N));
+                    s = s.substring(N);
+                    R = s.length();
+                }
+                list.add(s);
+            }
+        }
+        return list.toArray(new String[list.size()]);
+    }
+
+    public static final String [] splitQuoted(String s) {
+        return splitQuoted(s, '"');
+    }
+
+    public static final String[] fitArray(String [] src, String [] dst) {
+        if (src == null) {
+            return dst;
+        }
+        if (dst == null) {
+            return src;
+        }
+
+        if (src.length == dst.length) {
+            return src;
+        }
+
+        System.arraycopy(src, 0, dst, 0, Math.min(dst.length, src.length));
+
+        return dst;
+    }
+
+    public static final String [] splitQuoted(String s, char quoteChar) {
+        if (s == null) {
+            return null;
+        }
+        ArrayList<String> l = new ArrayList<String>();
+        int mode = 0, last_mode = 0;
+        StringBuilder sb = new StringBuilder();
+        for (int N = s.length(), i = 0; i < N; ++i) {
+            char c = s.charAt(i);
+            switch (mode) {
+                case 0: // unquoted mode
+                    if (c == quoteChar) {
+                        mode = 1; // to quoted mode
+                        if (sb.length() > 0) {
+                            l.add(sb.toString());
+                            sb.setLength(0);
+                        }
+                    }
+                    else if (c == '\\') {
+                        last_mode = 0;
+                        mode = 2; // escape mode
+                    }
+                    else if (!Character.isWhitespace(c)) {
+                        sb.append(c);
+                    }
+                    else if (sb.length() > 0) {
+                        l.add(sb.toString());
+                        sb.setLength(0);
+                    }
+                    break;
+                case 1: // quote mode
+                    if (c == '\\') {
+                        last_mode = 1;
+                        mode = 2; // escape mode
+                    }
+                    else if (c == quoteChar) { // leave quote mode
+                        l.add(sb.toString());
+                        sb.setLength(0);
+                        mode = 0; // to unquoted mode
+                    }
+                    else {
+                        sb.append(c);
+                    }
+                    break;
+                case 2: // escape mode
+                    sb.append(c);
+                    mode = last_mode;
+                    break;
+            }
+        }
+        if (sb.length() > 0) {
+            l.add(sb.toString());
+        }
+        return l.toArray(new String[l.size()]);
+    }
+
+    public static final String [] splitUnique(String s) {
+        return splitUnique(s, "[\\s,]+");
+    }
+
+    public static final String [] splitUnique(String s, String sep) {
+        return s != null ? unique(s.split(sep)) : null;
+    }
+
+    public static final String [] unique(String [] str) {
+        if (str == null || str.length == 1) {
+            return str;
+        }
+
+        Arrays.sort(str);
+
+        for (int i = 1; i < str.length; ++i)
+            if (str[i].equals(str[i-1])) {
+                ArrayList<String> list = new ArrayList<String>(str.length);
+
+                for (int j = 0; j < i; ++j) {
+                    list.add(str[j]);
+                }
+
+                String last = str[i];
+
+                for (++i; i < str.length; ++i)
+                    if (!last.equals(str[i])) {
+                        list.add(last = str[i]);
+                    }
+
+                return list.toArray(new String[list.size()]);
+            }
+
+        return str;
+    }
+
+    public static final String [] ensureEmptyExistence(String [] str) {
+        if (str == null) {
+            return null;
+        }
+
+        for (int i = 0; i < str.length; ++i)
+            if (str[i].length() == 0) {
+                if (i != 0) { // copy to front
+                    String t = str[0];
+                    str[0] = str[i];
+                    str[i] = t;
+                }
+                return str;
+            }
+
+        String [] n = new String[str.length+1];
+        n[0] = "";
+        System.arraycopy(str, 0, n, 1, str.length);
+        return n;
+    }
+
+    public static final String ensureWidthPadLeft(String s, int width, char pad) {
+        int N = s.length();
+        if (N >= width) {
+            return s;
+        }
+        StringBuilder sb = new StringBuilder(width);
+        for (; N < width; ++N) {
+            sb.append(pad);
+        }
+        sb.append(s);
+        return sb.toString();
+    }
+
+    public static final String [] splitWhiteSpaceWithNAsPad(
+        String s,
+        int    N,
+        String pad
+    ) {
+        if (s == null) {
+            return null;
+        }
+
+        boolean copyChars = true;
+        int     count     = 0; // number of WS
+
+        int S = s.length();
+
+        ArrayList<String> parts = new ArrayList<String>();
+
+        StringBuilder part = new StringBuilder(S);
+
+        for (int i = 0; i < S; ++i) {
+            char c = s.charAt(i);
+            if (copyChars) { // char mode
+                if (Character.isWhitespace(c)) {
+                    if (part.length() > 0) {
+                        parts.add(part.toString());
+                        part.setLength(0);
+                    }
+                    count     = 1;
+                    copyChars = false; // to WS mode
+                }
+                else {
+                    part.append(c);
+                }
+            }
+            else { // counting WS
+                if (Character.isWhitespace(c)) {
+                    ++count;
+                }
+                else {
+                    while (count >= N) {// enough to insert pad?
+                        parts.add(pad);
+                        count -= N;
+                    }
+                    part.append(c);
+                    count     = 0;
+                    copyChars = true; // back to char mode
+                }
+            }
+        } // for all chars
+
+        if (copyChars) {
+            if (part.length() > 0) {
+                parts.add(part.toString());
+            }
+        }
+        else {
+            while (count >= N) { // enough to insert pad?
+                parts.add(pad);
+                count -= N;
+            }
+        }
+
+        return parts.toArray(new String[parts.size()]);
+    }
+
+    public static final String encodeURL(String url) {
+        try {
+            return url != null
+                   ? URLEncoder.encode(url, "UTF-8")
+                   : "";
+        }
+        catch (UnsupportedEncodingException usee) {
+            throw new RuntimeException(usee.getLocalizedMessage());
+        }
+    }
+
+    public static final String decodeURL(String url) {
+        try {
+            return url != null
+                   ? URLDecoder.decode(url, "UTF-8")
+                   : "";
+        }
+        catch (UnsupportedEncodingException usee) {
+            throw new RuntimeException(usee.getLocalizedMessage());
+        }
+    }
+
+    public static final boolean isEmpty(String s) {
+        return s == null || s.length() == 0;
+    }
+
+    public static final String empty(String s) {
+        return s == null ? "" : s;
+    }
+
+
+    public static final String trim(String s) {
+        return s != null ? s.trim() : null;
+    }
+
+    public static final String uniqueWhitespaces(String s) {
+        if (s == null) {
+            return null;
+        }
+
+        boolean wasWS = false;
+        StringBuilder sb = new StringBuilder();
+
+        for (int N = s.length(), i = 0; i < N; ++i) {
+            char c = s.charAt(i);
+            if (Character.isWhitespace(c)) {
+                if (!wasWS) {
+                    sb.append(c);
+                    wasWS = true;
+                }
+            }
+            else {
+                sb.append(c);
+                wasWS = false;
+            }
+        }
+
+        return sb.toString();
+    }
+
+    public static final String replaceNewlines(String s) {
+        return s == null
+               ? null
+               : s.replace('\r', ' ').replace('\n', ' ');
+    }
+
+    /*
+    public static final String quoteReplacement(String s) {
+
+        if (s == null || (s.indexOf('\\') == -1 && s.indexOf('$') == -1))
+            return s;
+
+        StringBuilder sb = new StringBuilder();
+
+        for (int N = s.length(), i = 0; i < N; ++i) {
+            char c = s.charAt(i);
+            if (c == '\\' || c == '$') sb.append('\\');
+            sb.append(c);
+        }
+
+        return sb.toString();
+    }
+    */
+
+    public static final String quoteReplacement(String s) {
+
+        if (s == null) {
+            return null;
+        }
+
+        for (int N = s.length(), i = 0; i < N; ++i) { // plain check loop
+            char c = s.charAt(i);
+            if (c == '$' || c == '\\') { // first special -> StringBuilder
+                StringBuilder sb = new StringBuilder(s.substring(0, i))
+                .append('\\')
+                .append(c);
+                for (++i; i < N; ++i) { // build StringBuilder with rest
+                    if ((c = s.charAt(i)) == '$' || c == '\\') {
+                        sb.append('\\');
+                    }
+                    sb.append(c);
+                }
+                return sb.toString();
+            }
+        }
+
+        return s;
+    }
+
+    public static final String repeat(String what, int times) {
+        return repeat(what, times, new StringBuilder()).toString();
+    }
+
+    public static final StringBuilder repeat(String what, int times, StringBuilder sb) {
+        while (times-- > 0) {
+            sb.append(what);
+        }
+        return sb;
+    }
+
+    /**
+     * Returns the file name without extension.
+     */
+    public static final String cutExtension(String s) {
+        if (s == null) {
+            return null;
+        }
+        int dot = s.lastIndexOf('.');
+        return dot >= 0
+               ? s.substring(0, dot)
+               : s;
+    }
+
+    public static final String extension(String s) {
+        if (s == null) {
+            return null;
+        }
+        int dot = s.lastIndexOf('.');
+        return dot >= 0
+               ? s.substring(dot+1)
+               : s;
+    }
+
+    public static final String [] splitExtension(String x) {
+        if (x == null) {
+            return null;
+        }
+        int i = x.lastIndexOf('.');
+        return i < 0
+               ? new String[] { x, null }
+               : new String[] { x.substring(0, Math.max(0, i)), x.substring(i+1).toLowerCase() };
+    }
+
+    public static String entityEncode(String s) {
+        if (s == null || s.length() == 0) {
+            return s;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (int i=0, N =s.length(); i < N; i++) {
+            char c = s.charAt(i);
+            switch (c) {
+                case '<':
+                    sb.append("<");
+                    break;
+                case '>':
+                    sb.append(">");
+                    break;
+                case '&':
+                    sb.append("&");
+                    break;
+                default:
+                    sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+    public static String entityDecode(String s) {
+        if (s == null || s.length() == 0) {
+            return s;
+        }
+
+        boolean amp = false;
+        StringBuilder sb = new StringBuilder();
+        StringBuilder ampbuf = new StringBuilder();
+        for (int i=0, N =s.length(); i < N; i++) {
+            char c = s.charAt(i);
+            if (amp) {
+                if (c == ';') {
+                    amp = false;
+                    String str = ampbuf.toString();
+                    ampbuf.setLength(0);
+                    if (str.equals("lt")) {
+                        sb.append('<');
+                    }
+                    else if (str.equals("gt")) {
+                        sb.append('>');
+                    }
+                    else if (str.equals("amp")) {
+                        sb.append('&');
+                    }
+                    else {
+                        sb.append('&').append(str).append(';');
+                    }
+                }
+                else {
+                    ampbuf.append(c);
+                }
+            }
+            else if (c=='&') {
+                amp = true;
+            }
+            else {
+                sb.append(c);
+            }
+
+        }
+        return sb.toString();
+    }
+
+    public static final String quote(String s) {
+        return quote(s, '"');
+    }
+
+    public static final String quote(String s, char quoteChar) {
+        if (s == null) {
+            return null;
+        }
+
+        int N = s.length();
+
+        if (N == 0)
+            return new StringBuilder(2)
+                   .append(quoteChar)
+                   .append(quoteChar)
+                   .toString();
+
+        StringBuilder sb = null;
+
+        int i = 0;
+
+        for (; i < N; ++i) {
+            char c = s.charAt(i);
+
+            if (Character.isWhitespace(c)) {
+                sb = new StringBuilder()
+                .append(quoteChar)
+                .append(s.substring(0, i+1));
+                break;
+            }
+            else if (c == quoteChar) {
+                sb = new StringBuilder()
+                .append(quoteChar)
+                .append(s.substring(0, i))
+                .append('\\')
+                .append(quoteChar);
+                break;
+            }
+        }
+
+        if (sb == null) {
+            return s;
+        }
+
+        for (++i; i < N; ++i) {
+            char c = s.charAt(i);
+            if (c == quoteChar || c == '\\') {
+                sb.append('\\');
+            }
+
+            sb.append(c);
+        }
+
+        return sb.append(quoteChar).toString();
+    }
+
+    /*
+    public static String sprintf(String format, Object... args) {
+        return sprintf(null, format, args);
+    }
+    */
+
+    public static String sprintf(Locale locale, String format, Object ... args) {
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        pw.printf(locale, format, args);
+        pw.flush();
+        return sw.toString();
+    }
+
+
+    public static void testQuote() {
+        System.err.println("testing quote:");
+
+        String cases []  = {
+            "",          "''",
+            "test",      "test",
+            "test test", "'test test'",
+            "  test",    "'  test'",
+            "test   ",   "'test   '",
+            " test ",    "' test '",
+            "'test",     "'\\'test'",
+            "'",         "'\\''",
+            " ' ' ",     "' \\' \\' '",
+            "te'st",     "'te\\'st'"
+        };
+
+        int failed = 0;
+
+        for (int i = 0; i < cases.length; i += 2) {
+            String in  = cases[i];
+            String out = cases[i+1];
+
+            String res = quote(in, '\'');
+            if (!res.equals(out)) {
+                ++failed;
+                System.err.println(
+                    "quote failed on: >" + in +
+                    "< result: >" + res +
+                    "< expected: >" + out + "<");
+            }
+        }
+
+        int T = cases.length/2;
+
+        System.err.println("tests total: "  + T);
+        System.err.println("tests failed: " + failed);
+        System.err.println("tests passed: " + (T - failed));
+    }
+
+    public static void testQuoteReplacement() {
+        System.err.println("testing quoteReplacement:");
+
+        String cases []  = {
+            "",          "",
+            "test",      "test",
+            "$",         "\\$",
+            "\\",        "\\\\",
+            "\\$",       "\\\\\\$",
+            "test\\$",   "test\\\\\\$",
+            "\\test",    "\\\\test",
+            "test$",     "test\\$",
+            "test$test", "test\\$test",
+            "$test$",    "\\$test\\$"
+        };
+
+        int failed = 0;
+
+        for (int i = 0; i < cases.length; i += 2) {
+            String in  = cases[i];
+            String out = cases[i+1];
+
+            String res = quoteReplacement(in);
+            if (!res.equals(out)) {
+                ++failed;
+                System.err.println(
+                    "quoteReplacement failed on: '" + in +
+                    "' result: '" + res +
+                    "' expected: '" + out + "'");
+            }
+        }
+
+        int T = cases.length/2;
+
+        System.err.println("tests total: "  + T);
+        System.err.println("tests failed: " + failed);
+        System.err.println("tests passed: " + (T - failed));
+    }
+
+    public static void testStringArray2D() {
+        int total = 0;
+        int fail = 0;
+        int passed = 0;
+
+        System.err.println("testing StringArray2D:");
+
+        double[][] testarray = {{1.0, 2.0, 3.0},
+            {1.1, 2.1, 3.1},
+            {100.2, 200.2}
+        };
+        String str = double2DArrayToString(testarray);
+
+        total += 1;
+        if (str.equals("1.0;2.0;3.0:1.1;2.1;3.1:100.2;200.2")) {
+            passed +=1;
+        }
+        else {
+            fail +=1;
+            System.err.println("Der Ergebnis-String ist nicht richtig:");
+            System.err.println(str);
+        }
+
+
+
+        double[][] testarray2 = stringToDouble2DArray(str);
+        boolean failed = false;
+
+        total +=1;
+        for (int i=0; i < testarray.length; i++)
+            for (int j=0; j < testarray[i].length; j++)
+                if (testarray[i][j] != testarray2[i][j]) {
+                    System.err.println("Test scheitert bei i=" +i +" j=" +j);
+                    System.err.println("alter Wert=" + testarray[i][j] +" neuer Wert=" +testarray2[i][j]);
+                    failed = true;
+                }
+        if (failed) {
+            fail +=1;
+        }
+        else {
+            passed +=1;
+        }
+        System.err.println("tests total: "+ total);
+        System.err.println("tests failed: "+ fail);
+        System.err.println("tests passed: "+ passed);
+    }
+
+    public static void main(String [] args) {
+
+        testQuoteReplacement();
+        testQuote();
+        testStringArray2D();
+    }
+
+    /** Check for occurence of needle in hay, converting both to lowercase
+     * to be ignorant of cases. */
+    public static boolean containsIgnoreCase(String hay, String needle) {
+        return hay.toLowerCase().contains(needle.toLowerCase());
+    }
+}
+// end of file
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/test/java/de/intevation/flys/AppTest.java
--- a/flys-backend/src/test/java/de/intevation/flys/AppTest.java	Thu Apr 25 11:48:36 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-package de.intevation.flys;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Unit test for simple App.
- */
-public class AppTest
-    extends TestCase
-{
-    /**
-     * Create the test case
-     *
-     * @param testName name of the test case
-     */
-    public AppTest( String testName )
-    {
-        super( testName );
-    }
-
-    /**
-     * @return the suite of tests being tested
-     */
-    public static Test suite()
-    {
-        return new TestSuite( AppTest.class );
-    }
-
-    /**
-     * Rigourous Test :-)
-     */
-    public void testApp()
-    {
-        assertTrue( true );
-    }
-}
diff -r e308d4ecd35a -r dfb26b03b179 flys-backend/src/test/java/org/dive4elements/river/AppTest.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/test/java/org/dive4elements/river/AppTest.java	Thu Apr 25 11:53:11 2013 +0200
@@ -0,0 +1,38 @@
+package de.intevation.flys;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}


More information about the Dive4elements-commits mailing list