diff --git a/pom.xml b/pom.xml
index f5d987b2779347151b2b7a51ea8794b45516d05d..5ca5dedc2ffbf5473d6e8863e458696bf1ea197b 100755
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <geotools.version>13.4</geotools.version>
+        <geotools.version>20.2</geotools.version>
     </properties>
     <name>VIPSLogic</name>
     <url>http://maven.apache.org</url>
@@ -19,6 +19,10 @@
             <id>jitpack.io</id>
             <url>https://jitpack.io</url>
         </repository>
+        <repository>
+            <id>mvnrepository.com</id>
+            <url>https://mvnrepository.com</url>
+        </repository>
         <repository>
             <id>bedatadriven</id>
             <name>bedatadriven public repo</name>
@@ -49,15 +53,15 @@
             <version>4.2.0</version>
         </dependency>
         <dependency>
-            <groupId>com.github.bjornharrtell</groupId>
-            <!--groupId>org.wololo</groupId-->
+            <!--groupId>com.github.bjornharrtell</groupId-->
+            <groupId>org.wololo</groupId>
             <artifactId>jts2geojson</artifactId>
-            <version>0.10.0</version>
+            <version>0.12.0</version>
         </dependency>
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-spatial</artifactId>
-            <version>5.3.9.Final</version>
+            <version>5.4.2.Final</version>
             <exclusions>
                 <exclusion>
                     <artifactId>postgresql</artifactId>
@@ -168,8 +172,7 @@
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-core</artifactId>
-            <version>5.3.9.Final</version>
-            <scope>provided</scope>
+            <version>5.4.2.Final</version>
         </dependency>
         <dependency>
             <groupId>org.postgresql</groupId>
@@ -183,6 +186,12 @@
             <version>2.9.8</version>
             <type>jar</type>
         </dependency>
+        <dependency>
+            <groupId>org.locationtech.jts</groupId>
+            <artifactId>jts-core</artifactId>
+            <version>1.16.1</version>
+            <type>jar</type>
+        </dependency>
         <dependency>
             <groupId>javax</groupId>
             <artifactId>javaee-web-api</artifactId>
@@ -251,12 +260,12 @@
         <dependency>
             <groupId>org.geotools</groupId>
             <artifactId>gt-api</artifactId>
-            <version>17.2</version>
+            <version>20.3</version>
         </dependency>
         <dependency>
             <groupId>org.geotools</groupId>
             <artifactId>gt-epsg-hsql</artifactId>
-            <version>17.2</version>
+            <version>20.3</version>
         </dependency>
         <dependency>
             <groupId>com.webcohesion.enunciate</groupId>
@@ -272,7 +281,7 @@
         <dependency>
             <groupId>com.bedatadriven</groupId>
             <artifactId>jackson-datatype-jts</artifactId>
-            <version>2.2</version>
+            <version>2.4</version>
         </dependency>
     </dependencies>
 
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java
index 67a068d77657ddf6b1b562ea9056eda6f962e60c..68f30fcbefa199f806de82884ecc2dadf561afaa 100644
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java
@@ -20,11 +20,8 @@
 package no.nibio.vips.logic.controller.servlet;
 
 import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.Locale;
 import java.util.TimeZone;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java
index 20676a24358b948d44aa14ceb81f4b6061ee98c6..b3fb1d1b33bc6cf3ebc6aa3f24bea3864bd87197 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java
@@ -19,9 +19,9 @@
 
 package no.nibio.vips.logic.controller.servlet;
 
-import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.GeometryFactory;
-import com.vividsolutions.jts.geom.Point;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.Point;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.util.Collections;
diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
index 0b16c62705c583f6ec075420a32f8ee154fa3fb6..b6553a330107a34e6044e20f79c61881e5aa0b4d 100755
--- a/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
@@ -20,7 +20,6 @@
 package no.nibio.vips.logic.controller.session;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.base.Functions;
 import java.util.Calendar;
 import java.util.TimeZone;
 import de.micromata.opengis.kml.v_2_2_0.Coordinate;
@@ -51,7 +50,6 @@ import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
 import javax.persistence.Query;
-import javax.ws.rs.ProcessingException;
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.WebTarget;
@@ -599,7 +597,7 @@ public class ForecastBean {
                 {
                     ex.printStackTrace();
                 }*/
-                    Response resp = this.getManagerResource().runModel(config.getModelId(), request);                
+                    Response resp = this.getManagerResource().runModel(config.getModelId(), request);         
                     if(resp.getStatus() == Response.Status.OK.getStatusCode())
                     {
                         //System.out.println(resp.readEntity(String.class));
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java b/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java
index 4d4d1f2a269835f7a293dc96ccdb1478861ba883..d886aa58f9cddabeb469808aa503ddd3ccbf970a 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java
@@ -45,7 +45,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.vividsolutions.jts.geom.Geometry;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import no.nibio.vips.logic.entity.helpers.ForecastResultSerializer;
+import org.locationtech.jts.geom.Geometry;
 
 
 /**
@@ -62,6 +64,7 @@ import com.vividsolutions.jts.geom.Geometry;
     @NamedQuery(name = "ForecastResult.findByForecastConfigurationIdAndPeriod", query = "SELECT f FROM ForecastResult f WHERE f.forecastConfigurationId = :forecastConfigurationId AND f.validTimeStart BETWEEN :timeStart AND :timeEnd ORDER BY f.validTimeStart ASC"),
     @NamedQuery(name = "ForecastResult.findByValidTimeStart", query = "SELECT f FROM ForecastResult f WHERE f.validTimeStart = :validTimeStart ORDER BY f.validTimeStart ASC"),
     @NamedQuery(name = "ForecastResult.findByWarningStatus", query = "SELECT f FROM ForecastResult f WHERE f.warningStatus = :warningStatus ORDER BY f.validTimeStart ASC")})
+@JsonSerialize(using=ForecastResultSerializer.class)
 public class ForecastResult implements Serializable, Comparable{
     private static final long serialVersionUID = 1L;
     @Id
diff --git a/src/main/java/no/nibio/vips/logic/entity/Gis.java b/src/main/java/no/nibio/vips/logic/entity/Gis.java
index b0fef7e6ef89b658adfa0b15517f91bc5f1e4e14..7ee47bb64d87b1f1184284d87a8c1846d6a6dba5 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Gis.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Gis.java
@@ -20,8 +20,8 @@
 package no.nibio.vips.logic.entity;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.Geometry;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Geometry;
 import java.io.Serializable;
 import javax.persistence.Basic;
 import javax.persistence.Column;
diff --git a/src/main/java/no/nibio/vips/logic/entity/Organization.java b/src/main/java/no/nibio/vips/logic/entity/Organization.java
index a02f5f55c5ddd011e90ca43606cb85550ea7657e..aaa394b877711f52016cdf6224a690c352989fb0 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Organization.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Organization.java
@@ -19,7 +19,7 @@
 
 package no.nibio.vips.logic.entity;
 
-import com.vividsolutions.jts.geom.Point;
+import org.locationtech.jts.geom.Point;
 import java.io.Serializable;
 import java.util.Set;
 import javax.persistence.Basic;
@@ -40,6 +40,7 @@ import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import javax.persistence.FetchType;
 import javax.persistence.OneToOne;
+import org.hibernate.annotations.Type;
 
 /**
  * @copyright 2019 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java
index d047e6dafa7fdb065c2f53ef706da9c5f16f54f3..f8325ed7b538bac528c7bb2ba202491292fc47f7 100755
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java
@@ -39,7 +39,7 @@ import javax.persistence.Transient;
 import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.vividsolutions.jts.geom.Geometry;
+import org.locationtech.jts.geom.Geometry;
 import java.util.Set;
 import javax.persistence.CascadeType;
 import javax.persistence.DiscriminatorType;
diff --git a/src/main/java/no/nibio/vips/logic/entity/helpers/ForecastResultSerializer.java b/src/main/java/no/nibio/vips/logic/entity/helpers/ForecastResultSerializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b7b7655622b93f178eea630bf370e57ea14d883
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/entity/helpers/ForecastResultSerializer.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2018 NIBIO <http://www.nibio.no/>. 
+ * 
+ * This file is part of VIPSCommon.
+ * VIPSCommon is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by 
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ * 
+ * VIPSCommon is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * NIBIO Open Source License for more details.
+ * 
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSCommon.  If not, see <http://www.nibio.no/licenses/>.
+ * 
+ */
+
+package no.nibio.vips.logic.entity.helpers;
+
+import com.bedatadriven.jackson.datatype.jts.JtsModule;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.LineString;
+import org.locationtech.jts.geom.Point;
+import org.locationtech.jts.geom.Polygon;
+import java.io.IOException;
+import no.nibio.vips.gis.GISUtil;
+import no.nibio.vips.logic.entity.ForecastResult;
+
+/**
+ * Unfortunately, we have to do this, since Resteasy does not currently support the org.locationtech.jts package
+ * Ref http://www.baeldung.com/jackson-custom-serialization
+ * @copyright 2019 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+public class ForecastResultSerializer extends StdSerializer<ForecastResult>{
+    ObjectMapper objectMapper;
+    GeometryFactory gf;
+    GISUtil gisUtil;
+    public ForecastResultSerializer() {
+        this(null);
+        this.gisUtil = new GISUtil();
+    }
+   
+    public ForecastResultSerializer(Class<ForecastResult> t) {
+        super(t);
+        this.objectMapper = new ObjectMapper();
+        this.objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+        this.objectMapper.registerModule(new JtsModule());
+    }
+    
+    @Override
+    public void serialize(ForecastResult t, JsonGenerator jg, SerializerProvider sp) throws IOException {
+        jg.writeStartObject();
+        jg.writeStringField("validTimeStart", this.objectMapper.writeValueAsString(t.getValidTimeStart()).replaceAll("\"", ""));
+        jg.writeStringField("validTimeEnd", this.objectMapper.writeValueAsString(t.getValidTimeEnd()).replaceAll("\"", ""));
+        String geoJSON = t.getValidGeometry() == null ? "null" 
+                : t.getValidGeometry().getGeometryType().equals("Point") ? objectMapper.writeValueAsString(this.gisUtil.getVividPoint((Point) t.getValidGeometry()))
+                : t.getValidGeometry().getGeometryType().equals("LineString") ? objectMapper.writeValueAsString((LineString) t.getValidGeometry())
+                :t.getValidGeometry().getGeometryType().equals("Polygon") ? objectMapper.writeValueAsString((Polygon) t.getValidGeometry())
+                : "null";
+        
+        //jg.writeObjectField("validGeometry", t.getValidGeometry());
+        //System.out.println(geoJSON);
+        jg.writeRaw(",\"validGeometry\":" + geoJSON);
+        //
+        jg.writeNumberField("warningStatus", t.getWarningStatus());
+        jg.writeNumberField("forecastResultId", t.getForecastResultId());
+        jg.writeNumberField("forecastConfigurationId", t.getForecastConfigurationId());
+        //System.out.println(t.getAllValues());
+        jg.writeRaw(",\"allValues\": " + t.getAllValues());
+        jg.writeRaw(",\"keys\": [" + "\"" + String.join("\",\"", t.getKeys()) + "\"]");
+        jg.writeEndObject();
+    }
+    
+    
+
+}
diff --git a/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java b/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java
index 81fc2d344275a100080660c09915f3539d203e37..6589880e44b7d844b7c754589c8c47ddd2479756 100755
--- a/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java
+++ b/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java
@@ -19,7 +19,7 @@
 
 package no.nibio.vips.logic.gis;
 
-import com.vividsolutions.jts.geom.Geometry;
+import org.locationtech.jts.geom.Geometry;
 import java.io.Serializable;
 import javax.persistence.Column;
 import javax.persistence.Entity;
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java
index bf96fa03642907de80bd4e7c0b8caef084f8b059..3e425dcd7dd80a0846758d94cdec9e4e244f7b94 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java
@@ -19,7 +19,7 @@
 
 package no.nibio.vips.logic.modules.applefruitmoth;
 
-import com.vividsolutions.jts.geom.Geometry;
+import org.locationtech.jts.geom.Geometry;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.HashSet;
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java
index e22771e2ca96419ce0a7e9a87ec61d9d623a92b0..56c591f0307468b50ef91b2840ba2de2caf7cd66 100644
--- a/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java
@@ -19,7 +19,7 @@
 
 package no.nibio.vips.logic.scheduling.model.grid.preprocessor;
 
-import com.vividsolutions.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Coordinate;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.time.temporal.ChronoUnit;
@@ -34,6 +34,7 @@ import java.util.stream.Stream;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.PointWeatherObservationList;
 import no.nibio.vips.entity.WeatherObservation;
+import no.nibio.vips.gis.CoordinateProxy;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.scheduling.model.ModelRunPreprocessor;
@@ -66,7 +67,7 @@ public class ZymoseptoriaSimpleRiskGridModelPreprocessor extends ModelRunPreproc
         WeatherUtil wUtil = new WeatherUtil();
         for(PointOfInterestWeatherStation station:stations)
         {
-            Coordinate coordinate = new Coordinate(station.getPointOfInterest().getLongitude(), station.getPointOfInterest().getLatitude());
+            CoordinateProxy coordinate = new CoordinateProxy(station.getPointOfInterest().getLongitude(), station.getPointOfInterest().getLatitude());
             List<WeatherObservation> stationObs = getStationObs(station, configuration);
             
             try
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/FinnCerealModelsPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/FinnCerealModelsPreprocessor.java
index bf23442b55740007263e265027e4bdf988ae8c8d..232c0cd2942766ce44489147d6a461123b435aec 100644
--- a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/FinnCerealModelsPreprocessor.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/FinnCerealModelsPreprocessor.java
@@ -2,6 +2,7 @@ package no.nibio.vips.logic.scheduling.model.preprocessor;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -54,6 +55,7 @@ public class FinnCerealModelsPreprocessor extends ModelRunPreprocessor {
                     },
                     sowingDate,
                     configuration.getDateEndInTimeZone());
+                    Collections.sort(observations);
             observations = wUtil.checkForAndFixHourlyTimeSeriesHoles(observations);
 			List<WeatherObservation> temperature = observations.stream().filter(t -> t.getElementMeasurementTypeId().equals(WeatherElements.TEMPERATURE_MEAN))
 					.collect(Collectors.toList());
@@ -63,11 +65,30 @@ public class FinnCerealModelsPreprocessor extends ModelRunPreprocessor {
 					.collect(Collectors.toList());
 			List<WeatherObservation> windSpeedAll = observations.stream().filter(t -> t.getElementMeasurementTypeId().equals(WeatherElements.WIND_SPEED_2M))
 					.collect(Collectors.toList());
-			if(windSpeedAll.isEmpty()) {
-				windSpeedAll = observations.stream().filter(t -> t.getElementMeasurementTypeId().equals(WeatherElements.WIND_SPEED_10MIN_2M))
-						.collect(Collectors.toList());
+                        
+                        // Dealing with wind, which may be dodgy with regards to forecasts etc.
+			if(windSpeedAll.isEmpty() || windSpeedAll.size() != temperature.size()) {
+                            List<WeatherObservation> windFallback = observations.stream()
+                                    .filter(t -> t.getElementMeasurementTypeId().equals(WeatherElements.WIND_SPEED_10MIN_2M))
+                                    .collect(Collectors.toList());
+                            if(windSpeedAll.isEmpty())
+                            {
+                                windSpeedAll.addAll(windFallback);
+                            }
+                            else
+                            {
+                                Collections.sort(windSpeedAll);
+                                Date lastWindTime = windSpeedAll.get(windSpeedAll.size()-1).getTimeMeasured();
+                                windSpeedAll.addAll(windFallback.stream().filter(o->o.getTimeMeasured().after(lastWindTime)).collect(Collectors.toList()));
+                            }
 			}
-                        /*System.out.println("Observations size = " + observations.size());
+                        
+                        
+                        /*
+                        Collections.sort(temperature);
+                        System.out.println("First temp is at " + temperature.get(0).getTimeMeasured());
+                        System.out.println("Last temp is at " + temperature.get(temperature.size()-1).getTimeMeasured());
+                        System.out.println("Observations size = " + observations.size());
                         System.out.println("temperature size=" + temperature.size());
                         System.out.println("rainfall size=" + rainfall.size());
                         System.out.println("rh size =" + rh.size());
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a0c1d6ef4b9a2dd3781320d44190abbb463b65c
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2019 NIBIO <http://www.nibio.no/>. 
+ * 
+ * This file is part of VIPSLogic.
+ * VIPSLogic is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by 
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ * 
+ * VIPSLogic is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * NIBIO Open Source License for more details.
+ * 
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSLogic.  If not, see <http://www.nibio.no/licenses/>.
+ * 
+ */
+
+package no.nibio.vips.logic.scheduling.model.preprocessor;
+
+import java.util.Collections;
+import java.util.List;
+import no.nibio.vips.entity.ModelConfiguration;
+import no.nibio.vips.entity.WeatherObservation;
+import no.nibio.vips.logic.entity.ForecastConfiguration;
+import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
+import no.nibio.vips.logic.scheduling.model.ModelRunPreprocessor;
+import no.nibio.vips.logic.scheduling.model.PreprocessorException;
+import no.nibio.vips.util.WeatherElements;
+import no.nibio.vips.util.weather.WeatherDataSourceException;
+import no.nibio.vips.util.weather.WeatherDataSourceUtil;
+
+/**
+ * @copyright 2019 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+public class SeptoriaHumidityModelPreprocessor  extends ModelRunPreprocessor{
+    
+    @Override
+    public ModelConfiguration getModelConfiguration(ForecastConfiguration configuration) throws PreprocessorException
+    {
+        ModelConfiguration retVal = new ModelConfiguration();
+        retVal.setModelId(this.getModelId());
+        retVal.setConfigParameter("timeZone", configuration.getTimeZone());
+        WeatherDataSourceUtil wdsUtil = new WeatherDataSourceUtil();
+        try
+        {
+            List<WeatherObservation> observations = wdsUtil.getWeatherObservations(
+                        (PointOfInterestWeatherStation) configuration.getWeatherStationPointOfInterestId(), 
+                        WeatherObservation.LOG_INTERVAL_ID_1H, 
+                        new String[]{
+                            WeatherElements.TEMPERATURE_MEAN,
+                            WeatherElements.PRECIPITATION,
+                            WeatherElements.RELATIVE_HUMIDITY_MEAN,
+                            WeatherElements.LEAF_WETNESS_DURATION
+                        }, 
+                        configuration.getDateStart(), 
+                        configuration.getDateEnd()
+                );
+            Collections.sort(observations);
+            retVal.setConfigParameter("observations", observations);
+        }
+        catch(WeatherDataSourceException ex)
+        {
+            throw new PreprocessorException(ex.getMessage());
+        }
+        configuration.getForecastModelConfigurationSet().forEach(c->
+                retVal.setConfigParameter(c.getForecastModelConfigurationPK().getModelConfigParameter(), c.getParameterValue())
+        );
+        return retVal;
+    }
+
+
+
+    @Override
+    public String getModelId() {
+        return "SEPTORIAHU";
+    }
+
+}
diff --git a/src/main/java/no/nibio/vips/logic/service/ModelFormService.java b/src/main/java/no/nibio/vips/logic/service/ModelFormService.java
index 56ddefe8bf63694c9ccd4d100705040de9b76463..04b997c65113b79fbf652011cef02f47f73f90a0 100644
--- a/src/main/java/no/nibio/vips/logic/service/ModelFormService.java
+++ b/src/main/java/no/nibio/vips/logic/service/ModelFormService.java
@@ -19,10 +19,12 @@
 
 package no.nibio.vips.logic.service;
 
-import com.vividsolutions.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Coordinate;
 import com.webcohesion.enunciate.metadata.Facet;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.TimeZone;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -33,17 +35,20 @@ import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.entity.WeatherObservation;
 import no.nibio.vips.gis.GISUtil;
+import no.nibio.vips.logic.entity.ForecastConfiguration;
+import no.nibio.vips.logic.entity.ForecastModelConfiguration;
+import no.nibio.vips.logic.entity.ForecastModelConfigurationPK;
 import no.nibio.vips.logic.entity.Organization;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.entity.WeatherStationDataSource;
+import no.nibio.vips.logic.scheduling.model.PreprocessorException;
+import no.nibio.vips.logic.scheduling.model.preprocessor.SeptoriaHumidityModelPreprocessor;
 import no.nibio.vips.logic.util.RunModelException;
 import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.util.ParseRESTParamUtil;
-import no.nibio.vips.util.WeatherElements;
 import no.nibio.vips.util.WeatherUtil;
 import no.nibio.vips.util.XDate;
-import no.nibio.vips.util.weather.WeatherDataSourceException;
 import no.nibio.vips.util.weather.WeatherDataSourceUtil;
 
 /**
@@ -79,29 +84,50 @@ public class ModelFormService {
     ){
         try
         {
-            ModelConfiguration mConf = new ModelConfiguration();
-            mConf.setModelId("SEPTORIAHU");
-            mConf.setConfigParameter("dateSpraying1", dateSpraying1);
-            mConf.setConfigParameter("dateSpraying2", dateSpraying2);
-            mConf.setConfigParameter("dateGs31", dateGs31);
-            mConf.setConfigParameter("date3rdUpperLeafEmerging", date3rdUpperLeafEmerging);
-            mConf.setConfigParameter("date2ndUpperLeafEmerging", date2ndUpperLeafEmerging);
-            mConf.setConfigParameter("dateUpperLeafEmerging", dateUpperLeafEmerging);
-            mConf.setConfigParameter("dateGs75", dateGs75);
-            mConf.setConfigParameter("thresholdRelativeHumidity", thresholdRelativeHumidity);
-            mConf.setConfigParameter("thresholdLeafWetness", thresholdLeafWetness);
-            mConf.setConfigParameter("thresholdPrecipitation", thresholdPrecipitation);
-            mConf.setConfigParameter("slidingHoursPast", slidingHoursPast);
-            mConf.setConfigParameter("slidingHoursAhead", slidingHoursAhead);
-            mConf.setConfigParameter("thresholdHumidPeriodHours", thresholdHumidPeriodHours);
-            mConf.setConfigParameter("sprayingProtectionDays", sprayingProtectionDays);
-            mConf.setConfigParameter("leafLifeTime", leafLifeTime);
+            ForecastConfiguration fConf = new ForecastConfiguration();
+            fConf.setModelId("SEPTORIAHU");
+            
+            Set<ForecastModelConfiguration> fModelConf = new HashSet<>();
+            fModelConf.add(this.getForecastModelConfiguration("dateSpraying1", dateSpraying1));
+            fModelConf.add(this.getForecastModelConfiguration("dateSpraying2", dateSpraying2));
+            fModelConf.add(this.getForecastModelConfiguration("dateGs31", dateGs31));
+            fModelConf.add(this.getForecastModelConfiguration("date3rdUpperLeafEmerging", date3rdUpperLeafEmerging));
+            fModelConf.add(this.getForecastModelConfiguration("date2ndUpperLeafEmerging", date2ndUpperLeafEmerging));
+            fModelConf.add(this.getForecastModelConfiguration("dateUpperLeafEmerging", dateUpperLeafEmerging));
+            fModelConf.add(this.getForecastModelConfiguration("dateGs75", dateGs75));
+            fModelConf.add(this.getForecastModelConfiguration("thresholdRelativeHumidity", String.valueOf(thresholdRelativeHumidity)));
+            fModelConf.add(this.getForecastModelConfiguration("thresholdLeafWetness", String.valueOf(thresholdLeafWetness)));
+            fModelConf.add(this.getForecastModelConfiguration("thresholdPrecipitation", String.valueOf(thresholdPrecipitation)));
+            fModelConf.add(this.getForecastModelConfiguration("slidingHoursPast", String.valueOf(slidingHoursPast)));
+            fModelConf.add(this.getForecastModelConfiguration("slidingHoursAhead", String.valueOf(slidingHoursAhead)));
+            fModelConf.add(this.getForecastModelConfiguration("thresholdHumidPeriodHours", String.valueOf(thresholdHumidPeriodHours)));
+            fModelConf.add(this.getForecastModelConfiguration("sprayingProtectionDays", String.valueOf(sprayingProtectionDays)));
+            fModelConf.add(this.getForecastModelConfiguration("leafLifeTime", String.valueOf(leafLifeTime)));
+            fConf.setForecastModelConfigurationSet(fModelConf);
+            
+            //ModelConfiguration mConf = new ModelConfiguration();
+            //mConf.setModelId("SEPTORIAHU");
+            //mConf.setConfigParameter("dateSpraying1", dateSpraying1);
+            //mConf.setConfigParameter("dateSpraying2", dateSpraying2);
+            //mConf.setConfigParameter("dateGs31", dateGs31);
+            //mConf.setConfigParameter("date3rdUpperLeafEmerging", date3rdUpperLeafEmerging);
+            //mConf.setConfigParameter("date2ndUpperLeafEmerging", date2ndUpperLeafEmerging);
+            //mConf.setConfigParameter("dateUpperLeafEmerging", dateUpperLeafEmerging);
+            //mConf.setConfigParameter("dateGs75", dateGs75);
+            //mConf.setConfigParameter("thresholdRelativeHumidity", thresholdRelativeHumidity);
+            //mConf.setConfigParameter("thresholdLeafWetness", thresholdLeafWetness);
+            //mConf.setConfigParameter("thresholdPrecipitation", thresholdPrecipitation);
+            //mConf.setConfigParameter("slidingHoursPast", slidingHoursPast);
+            //mConf.setConfigParameter("slidingHoursAhead", slidingHoursAhead);
+            //mConf.setConfigParameter("thresholdHumidPeriodHours", thresholdHumidPeriodHours);
+            //mConf.setConfigParameter("sprayingProtectionDays", sprayingProtectionDays);
+            //mConf.setConfigParameter("leafLifeTime", leafLifeTime);
 
             // Data parsing
 
             Integer organizationId = Integer.valueOf(organizationId_countryCode.split("_")[0]);
             Organization organization = SessionControllerGetter.getUserBean().getOrganization(organizationId);
-            mConf.setConfigParameter("timeZone", organization.getDefaultTimeZone());
+            fConf.setTimeZone(organization.getDefaultTimeZone());
             TimeZone timeZone =  TimeZone.getTimeZone(organization.getDefaultTimeZone());
             ParseRESTParamUtil pUtil = new ParseRESTParamUtil();
             // Start time is gs31, easy
@@ -116,6 +142,9 @@ public class ModelFormService {
             dayAfterTomorrow = new XDate(wUtil.pragmaticAdjustmentToMidnight(dayAfterTomorrow, timeZone));
             // The first check here is to see if the systemtime is too early
             Date endTime = dayAfterTomorrow.after(gs75) ? gs75 : dayAfterTomorrow;
+            
+            fConf.setDateStart(startTime);
+            fConf.setDateEnd(endTime);
 
             String countryCode = organizationId_countryCode.split("_")[1];
             List<WeatherObservation> observations;
@@ -143,29 +172,28 @@ public class ModelFormService {
                 // Weather station id maps to a regular weather station
                 ws = (PointOfInterestWeatherStation) SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(Integer.valueOf(weatherStationId));
             }
-            observations = wdsUtil.getWeatherObservations(
-                        ws, 
-                        WeatherObservation.LOG_INTERVAL_ID_1H, 
-                        new String[]{
-                            WeatherElements.TEMPERATURE_MEAN,
-                            WeatherElements.PRECIPITATION,
-                            WeatherElements.RELATIVE_HUMIDITY_MEAN,
-                            WeatherElements.LEAF_WETNESS_DURATION
-                        }, 
-                        startTime, 
-                        endTime
-                );
-            mConf.setConfigParameter("observations",observations);
+            fConf.setWeatherStationPointOfInterestId(ws);
+            fConf.setLocationPointOfInterestId(ws);
+            
+            ModelConfiguration mConf = new SeptoriaHumidityModelPreprocessor().getModelConfiguration(fConf);
 
             Integer VIPSCoreUserId = organization.getDefaultVipsCoreUserId();
+            System.out.println("defaultVIPScoreUserId = " + VIPSCoreUserId);
 
             List<Result>results = SessionControllerGetter.getForecastBean().runForecast(mConf, VIPSCoreUserId);
 
             return Response.ok().entity(results).build();
         }
-        catch(WeatherDataSourceException | RunModelException ex)
+        catch(PreprocessorException |RunModelException ex)
         {
             return Response.serverError().entity(ex.getMessage()).build();
-        }
+        } 
+    }
+    
+    private ForecastModelConfiguration getForecastModelConfiguration(String key, String value)
+    {
+        ForecastModelConfiguration retVal = new ForecastModelConfiguration(new ForecastModelConfigurationPK(-1, key));
+        retVal.setParameterValue(value);
+        return retVal;
     }
 }
diff --git a/src/main/java/no/nibio/vips/logic/util/GISEntityUtil.java b/src/main/java/no/nibio/vips/logic/util/GISEntityUtil.java
index 0000b69afdff9fb6ed58ff5f324e9329dd604f43..6b9160c76ffb3e4230a69889ebe84473d3b7d142 100755
--- a/src/main/java/no/nibio/vips/logic/util/GISEntityUtil.java
+++ b/src/main/java/no/nibio/vips/logic/util/GISEntityUtil.java
@@ -146,7 +146,7 @@ public class GISEntityUtil {
     
     
     
-    public de.micromata.opengis.kml.v_2_2_0.Coordinate getKMLCoordinateFromJTSCoordinate(com.vividsolutions.jts.geom.Coordinate jtsCoordinate)
+    public de.micromata.opengis.kml.v_2_2_0.Coordinate getKMLCoordinateFromJTSCoordinate(org.locationtech.jts.geom.Coordinate jtsCoordinate)
     {
         return new de.micromata.opengis.kml.v_2_2_0.Coordinate(
                 jtsCoordinate.x, 
diff --git a/src/main/java/no/nibio/web/forms/FormField.java b/src/main/java/no/nibio/web/forms/FormField.java
index 65e23918e16b8888104ca29dfe69439ca0273245..b99a15e2e90f75591b54a3bad0f4e7b101c1d043 100755
--- a/src/main/java/no/nibio/web/forms/FormField.java
+++ b/src/main/java/no/nibio/web/forms/FormField.java
@@ -21,10 +21,10 @@ package no.nibio.web.forms;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.GeometryFactory;
-import com.vividsolutions.jts.geom.Point;
-import com.vividsolutions.jts.geom.PrecisionModel;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.Point;
+import org.locationtech.jts.geom.PrecisionModel;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
diff --git a/src/test/java/no/nibio/vips/logic/entity/ObservationTest.java b/src/test/java/no/nibio/vips/logic/entity/ObservationTest.java
index b3fc6529922d8eee10d3063045ce7a67ed928c08..d1c5c3ee961e2d1cd9832c4944be80ff0cc0fb01 100755
--- a/src/test/java/no/nibio/vips/logic/entity/ObservationTest.java
+++ b/src/test/java/no/nibio/vips/logic/entity/ObservationTest.java
@@ -18,9 +18,9 @@
  */
 package no.nibio.vips.logic.entity;
 
-import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.GeometryCollection;
-import com.vividsolutions.jts.geom.Point;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.GeometryCollection;
+import org.locationtech.jts.geom.Point;
 import java.util.Date;
 import org.junit.After;
 import org.junit.AfterClass;
diff --git a/src/test/java/no/nibio/vips/logic/test/mock/MockModel.java b/src/test/java/no/nibio/vips/logic/test/mock/MockModel.java
index 022dab95728cd1a68831ce407bee99bd969545d8..27b0cd98b5aac157e08f3baf7dfa1e8b2ec1aa1e 100644
--- a/src/test/java/no/nibio/vips/logic/test/mock/MockModel.java
+++ b/src/test/java/no/nibio/vips/logic/test/mock/MockModel.java
@@ -19,8 +19,8 @@
 
 package no.nibio.vips.logic.test.mock;
 
-import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.GeometryFactory;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
diff --git a/src/test/java/no/nibio/vips/util/weather/YrWeatherForecastProviderTest.java b/src/test/java/no/nibio/vips/util/weather/YrWeatherForecastProviderTest.java
index b7294e0c7ca96519f61d6081db62b27faeb6fe8f..4188d964d3d2f5bb00cf9a159a921946d1ac8c2d 100755
--- a/src/test/java/no/nibio/vips/util/weather/YrWeatherForecastProviderTest.java
+++ b/src/test/java/no/nibio/vips/util/weather/YrWeatherForecastProviderTest.java
@@ -18,8 +18,8 @@
  */
 package no.nibio.vips.util.weather;
 
-import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.Point;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Point;
 import java.util.Collections;
 import java.util.List;
 import no.nibio.vips.entity.WeatherObservation;