diff --git a/pom.xml b/pom.xml
index 15abbcf676548f6e887af535fe8928c391d89a01..bc623282a18e2fb8fb19c881278bb40481004a43 100755
--- a/pom.xml
+++ b/pom.xml
@@ -170,6 +170,12 @@
       <version>9.4.1211</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <artifactId>jackson-dataformat-csv</artifactId>
+      <version>2.6.2</version>
+      <type>jar</type>
+    </dependency>
     <dependency>
       <groupId>javax</groupId>
       <artifactId>javaee-web-api</artifactId>
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 f06f13638eba40806db40747f377ef80f02bf261..4d36b8a4de17d89ffb7f9f6d2a14aa5aad48e3aa 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
@@ -113,6 +113,10 @@ public class ForecastBean {
     {
         // Authentication
         ForecastConfiguration fc = em.find(ForecastConfiguration.class, forecastConfigurationId);
+        if(fc == null)
+        {
+            return true;
+        }
         if(fc.getIsPrivate())
         {
             if(userUUID == null)
diff --git a/src/main/java/no/nibio/vips/logic/service/LogicService.java b/src/main/java/no/nibio/vips/logic/service/LogicService.java
index c3f4a7d0e3989d6b320450b6f4c2981e7a16c9b1..2124eac211242d6a67130b398c1df59d290dfddc 100755
--- a/src/main/java/no/nibio/vips/logic/service/LogicService.java
+++ b/src/main/java/no/nibio/vips/logic/service/LogicService.java
@@ -115,6 +115,60 @@ public class LogicService {
         }
     }
     
+    /**
+     * Get all results for one pest prediction
+     * @param forecastConfigurationId
+     * @param userUUID if the forecast is private, the correct userUUID must be supplied. 
+     * @return 
+     */
+    @GET
+    @Path("forecastresults/{forecastConfigurationId}/csv")
+    @GZIP
+    @Produces("text/plain;charset=UTF-8")
+    public Response getForecastResultsCSV(
+            @PathParam("forecastConfigurationId") Long forecastConfigurationId,
+            @QueryParam("userUUID") String userUUID
+    )
+    {
+        if(SessionControllerGetter.getForecastBean().isUserAuthorizedForForecastConfiguration(forecastConfigurationId, userUUID))
+        {
+            String CSVOutput = "";
+            List<ForecastResult> results = SessionControllerGetter.getForecastBean().getForecastResults(forecastConfigurationId);
+            if(results != null && ! results.isEmpty())
+            {
+                List<String> parameters = new ArrayList<>();//new String[results.get(0).getKeys().size() + 3];
+                parameters.add("Valid time start");
+                parameters.add("Valid time end");
+                parameters.add("Warning status");
+                results.get(0).getKeys().stream().forEach(key->{
+                    parameters.add(key);
+                });
+                
+                CSVOutput += String.join(",", parameters) + "\n";
+                
+                CSVOutput += results.stream().map(result->{
+                    String line = result.getValidTimeStart() + "," + result.getValidTimeEnd() + "," + result.getWarningStatus();
+                    Map<String, String> valueMap = result.getAllValuesAsMap();
+                    for(int i=3;i<parameters.size();i++)
+                    {
+                        line += "," + valueMap.get(parameters.get(i));
+                    }
+                    line += "\n";
+                    return line;
+                }).collect(Collectors.joining("\n"));
+                
+                return Response.ok().entity(CSVOutput).build();
+                
+            }
+            
+            return Response.ok().entity("").build();
+        }
+        else
+        {
+            return Response.status(Response.Status.UNAUTHORIZED).build();
+        }
+    }
+    
     /**
      * Get the latestDays results for one pest prediction
      * @param forecastConfigurationId