diff --git a/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java b/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java
index fa37ebc065285a3d3b1775248f07ad14312fff43..a4f38659c67d49e5f11b04ee958b3ccfe5485e11 100644
--- a/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java
+++ b/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java
@@ -25,7 +25,7 @@ import javax.ws.rs.core.Application;
 
 /**
  * Responsible for adding REST resources
- * @copyright 2013 {@link http://www.nibio.no NIBIO}
+ * @copyright 2015 {@link http://www.nibio.no NIBIO}
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @ApplicationPath("/rest/")
@@ -46,6 +46,7 @@ public class VIPSLogicApplication extends Application
      */
     private void addRestResourceClassesManually(Set<Class<?>> resources) {
         resources.add(no.nibio.vips.logic.service.LogicService.class);
+        resources.add(no.nibio.vips.logic.service.VIPSMobileService.class);
         resources.add(no.nibio.vips.logic.modules.barleynetblotch.BarleyNetBlotchModelService.class);
         //resources.add(no.nibio.vips.logic.service.JacksonConfig.class);
         //resources.add(no.nibio.vips.coremanager.service.ManagerResourceImpl.class);
@@ -61,6 +62,7 @@ public class VIPSLogicApplication extends Application
         resources.add(no.nibio.vips.logic.modules.barleynetblotch.BarleyNetBlotchModelService.class);
         resources.add(no.nibio.vips.logic.service.JacksonConfig.class);
         resources.add(no.nibio.vips.logic.service.LogicService.class);
+        resources.add(no.nibio.vips.logic.service.VIPSMobileService.class);
         
     }
 }
\ No newline at end of file
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 f59daf11e81c38b8682c6267cbf1e155a893a1e5..d4f7a713afaaa0525fae2252bf460f5c9646916d 100644
--- a/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
@@ -35,6 +35,7 @@ import de.micromata.opengis.kml.v_2_2_0.Vec2;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -79,7 +80,7 @@ import org.apache.commons.lang.StringUtils;
 import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
 
 /**
- * @copyright 2013-2014 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2013-2015 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Stateless
@@ -308,6 +309,16 @@ public class ForecastBean {
                 .getResultList();
     }
     
+    public List<ForecastConfiguration> getForecastConfigurations(PointOfInterestWeatherStation weatherStation,Date from, Date to)
+    {
+        return em
+                .createNamedQuery("ForecastConfiguration.findByWeatherStationPointOfInterestIdAndDate", ForecastConfiguration.class)
+                .setParameter("weatherStationPointOfInterestId", weatherStation)
+                .setParameter("from", from)
+                .setParameter("to", to)
+                .getResultList();
+    }
+    
     /**
      * Deletes all forecasts and results from the given weather station
      * @param weatherStation 
@@ -797,6 +808,22 @@ public class ForecastBean {
                 .executeUpdate();
     }
     
+    public List<ForecastConfiguration> getForecastConfigurationWithSummaries(List<Long> forecastConfigurationIds)
+    {
+        List<ForecastConfiguration> retVal = em.createNamedQuery("ForecastConfiguration.findByForecastConfigurationIds")
+                .setParameter("forecastConfigurationIds", forecastConfigurationIds)
+                .getResultList();
+        for(ForecastConfiguration config: retVal)
+        {
+            Query q = em.createNamedQuery("ForecastSummary.findByForecastConfigurationId");
+            config.setForecastSummaries(
+                    q.setParameter("forecastConfigurationId", config.getForecastConfigurationId())
+                    .getResultList()
+            );
+        }
+        return retVal;
+    }
+    
     public List<ForecastConfiguration> getForecastConfigurationSummaries(Integer organizationId)
     {
         List<ForecastConfiguration> forecastConfigurations = this.getForecastConfigurations(em.find(Organization.class, organizationId));
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java b/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java
index 871e66e84dcdee4af22db1d31d52b2cb20283127..679b66da5309808a7df8cdc060d7d1950332ac07 100644
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java
@@ -56,6 +56,7 @@ import no.nibio.vips.util.WeatherUtil;
 @NamedQueries({
     @NamedQuery(name = "ForecastConfiguration.findAll", query = "SELECT f FROM ForecastConfiguration f"),
     @NamedQuery(name = "ForecastConfiguration.findByForecastConfigurationId", query = "SELECT f FROM ForecastConfiguration f WHERE f.forecastConfigurationId = :forecastConfigurationId"),
+    @NamedQuery(name = "ForecastConfiguration.findByForecastConfigurationIds", query = "SELECT f FROM ForecastConfiguration f WHERE f.forecastConfigurationId IN(:forecastConfigurationIds)"),
     @NamedQuery(name = "ForecastConfiguration.findByModelId", query = "SELECT f FROM ForecastConfiguration f WHERE f.modelId = :modelId"),
     @NamedQuery(name = "ForecastConfiguration.findByModelIds", query = "SELECT f FROM ForecastConfiguration f WHERE f.modelId IN (:modelIds)"),
     @NamedQuery(name = "ForecastConfiguration.findByDateStart", query = "SELECT f FROM ForecastConfiguration f WHERE f.dateStart = :dateStart"),
@@ -63,6 +64,7 @@ import no.nibio.vips.util.WeatherUtil;
     @NamedQuery(name = "ForecastConfiguration.findActiveAtDate", query = "SELECT f FROM ForecastConfiguration f WHERE f.dateStart <= :currentDate AND f.dateEnd >= :currentDate"),
     @NamedQuery(name = "ForecastConfiguration.findByLocationPointOfInterestId", query = "SELECT f FROM ForecastConfiguration f WHERE f.locationPointOfInterestId = :locationPointOfInterestId"),
     @NamedQuery(name = "ForecastConfiguration.findByWeatherStationPointOfInterestId", query = "SELECT f FROM ForecastConfiguration f WHERE f.weatherStationPointOfInterestId = :weatherStationPointOfInterestId"),
+    @NamedQuery(name = "ForecastConfiguration.findByWeatherStationPointOfInterestIdAndDate", query = "SELECT f FROM ForecastConfiguration f WHERE f.weatherStationPointOfInterestId = :weatherStationPointOfInterestId AND f.dateStart <= :to AND f.dateEnd >= :from"),
     @NamedQuery(name = "ForecastConfiguration.findByVipsLogicUserId", query = "SELECT f FROM ForecastConfiguration f WHERE f.vipsLogicUserId = :vipsLogicUserId"),
     @NamedQuery(name = "ForecastConfiguration.findByVipsLogicUserIdAndDate", query = "SELECT f FROM ForecastConfiguration f WHERE f.vipsLogicUserId = :vipsLogicUserId AND f.dateStart <= :to AND f.dateEnd >= :from" ),
     @NamedQuery(name = "ForecastConfiguration.findByVipsLogicUserIdAndCropOrganismId", query = "SELECT f FROM ForecastConfiguration f WHERE f.vipsLogicUserId = :vipsLogicUserId AND f.cropOrganismId.organismId IN (:cropOrganismIds)"),
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java b/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java
index 63fef4f93840ed4525b6f49cb0fb2d6b81b60ee0..a5dc3990f816b886b725b636e79f22e82aced59c 100644
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java
@@ -41,6 +41,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 @NamedQueries({
     @NamedQuery(name = "ForecastSummary.findAll", query = "SELECT f FROM ForecastSummary f"),
     @NamedQuery(name = "ForecastSummary.findByForecastConfigurationId", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.forecastConfigurationId = :forecastConfigurationId"),
+    @NamedQuery(name = "ForecastSummary.findByForecastConfigurationIds", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.forecastConfigurationId IN(:forecastConfigurationIds)"),
     @NamedQuery(name = "ForecastSummary.findBySummaryForDate", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.summaryForDate = :summaryForDate"),
     @NamedQuery(name = "ForecastSummary.findBySummaryCreatedTime", query = "SELECT f FROM ForecastSummary f WHERE f.summaryCreatedTime = :summaryCreatedTime"),
     @NamedQuery(name = "ForecastSummary.findByWarningStatus", query = "SELECT f FROM ForecastSummary f WHERE f.warningStatus = :warningStatus")})
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageLocale.java b/src/main/java/no/nibio/vips/logic/entity/MessageLocale.java
index c865a145c953a8364ff6b3b2f6200b4c4ba5d603..e0d568a470bec825341658b6f3b21c347b36788f 100644
--- a/src/main/java/no/nibio/vips/logic/entity/MessageLocale.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageLocale.java
@@ -32,6 +32,7 @@ import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
+import javax.persistence.Transient;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
@@ -95,6 +96,12 @@ public class MessageLocale implements Serializable {
     public MessageLocale(int messageId, String locale) {
         this.messageLocalePK = new MessageLocalePK(messageId, locale);
     }
+    
+    @Transient
+    public String getMessageLocaleSyntheticPK()
+    {
+        return this.messageLocalePK.getMessageId() + "_" + this.messageLocalePK.getLocale();
+    }
 
     public MessageLocalePK getMessageLocalePK() {
         return messageLocalePK;
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageTagLocale.java b/src/main/java/no/nibio/vips/logic/entity/MessageTagLocale.java
index faf163c271bd9d48c721025e9b52ee8d3cbc80e8..781f2bcd611733c330459931b536e5b9e97d5909 100644
--- a/src/main/java/no/nibio/vips/logic/entity/MessageTagLocale.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageTagLocale.java
@@ -28,6 +28,7 @@ import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.persistence.Transient;
 import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -67,6 +68,16 @@ public class MessageTagLocale implements Serializable {
     public MessageTagLocalePK getMessageTagLocalePK() {
         return messageTagLocalePK;
     }
+    
+    /**
+     * Decorator for inferior JSON deserializers like Sencha Touch
+     * @return 
+     */
+    @Transient
+    public String getMessageTagLocaleSyntheticPK()
+    {
+        return this.messageTagLocalePK.getMessageTagId() + "_" + this.messageTagLocalePK.getLocale();
+    }
 
     public void setMessageTagLocalePK(MessageTagLocalePK messageTagLocalePK) {
         this.messageTagLocalePK = messageTagLocalePK;
diff --git a/src/main/java/no/nibio/vips/logic/entity/vipsmobile/VIPSMobileForecast.java b/src/main/java/no/nibio/vips/logic/entity/vipsmobile/VIPSMobileForecast.java
new file mode 100644
index 0000000000000000000000000000000000000000..5490b79ff442f43c90e2a1429bbe01835ad6892b
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/entity/vipsmobile/VIPSMobileForecast.java
@@ -0,0 +1,582 @@
+/*
+ * Copyright (c) 2015 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.entity.vipsmobile;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Rip-off from old VIPS VarselBO
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+public final class VIPSMobileForecast implements Comparable
+{
+    private Integer DnmiSiteId;
+    private Map<String, Object> props;
+
+   /**
+    * Lager et nytt varsel Business Object
+    * @param varselId Unik identifikator for varsel
+    * @param lovligVarselId Id for lovligVarsel
+    * @param startDato Startdato for varselet
+    * @param sluttDato Sluttdato for varselet
+    * @param klimastasjonId Id for klimastasjon
+    * @param feltId Id for felt
+    * @param personlig Skiller offentlige og personlige varsel
+    * @param inaktiv Angir om varselet er aktivt eller ikke
+    * @param sistEndretAv Id til bruker som sist endret varselet
+    * @param sistEndretDato Tid for siste endring
+    * @param logiskSlettet Angir om varselet er logisk slettet
+    */
+   public VIPSMobileForecast
+   (
+      long varselId,
+      long lovligVarselId,
+      Date startDato,
+      Date sluttDato,
+      long klimastasjonId,
+      String klimastasjonNavn,
+      long feltId,
+      String feltNavn,
+      boolean personlig,
+      boolean inaktiv,
+      long sistEndretAv,
+      Date sistEndretDato,
+      boolean logiskSlettet,
+      long organismeId,
+      String organismeNavn,
+      long kulturId,
+      String kulturNavn,
+      String modellId,
+      String modellNavn
+   )
+   {
+      setVarselId( varselId );
+      setLovligVarselId( lovligVarselId );
+      setStartDato( startDato );
+      setSluttDato( sluttDato );
+      setKlimastasjonId( klimastasjonId );
+      setKlimastasjonNavn(klimastasjonNavn);
+      setFeltId( feltId );
+      setFeltNavn(feltNavn);
+      setPersonlig( personlig );
+      setInaktiv( inaktiv );
+      setSistEndretAv( sistEndretAv );
+      setSistEndretDato( sistEndretDato );
+      setLogiskSlettet( logiskSlettet );
+      setOrganismeId(organismeId);
+      setOrganismeNavn(organismeNavn);
+      setKulturId(kulturId);
+      setKulturNavn(kulturNavn);
+      setModellId(modellId);
+      setModellNavn(modellNavn);
+   }
+   
+   /**
+    * @param varselId Unik identifikator for varsel
+    */
+   public final void setVarselId( long varselId )
+   {
+      setAttribute("varselId", varselId);
+   }
+   
+   /**
+    * @param lovligVarselId Id for lovligVarsel
+    */
+   public final void setLovligVarselId( long lovligVarselId )
+   {
+      setAttribute("lovligVarselId", lovligVarselId);
+   }
+
+   /**
+    * @param startDato StartDato for varselet
+    */
+   public final void setStartDato( Date startDato )
+   {
+      setAttribute( "startDato", startDato );
+   }
+   
+   /**
+    * @param sluttDato SluttDato for varselet
+    */
+   public final void setSluttDato( Date sluttDato )
+   {
+      setAttribute( "sluttDato", sluttDato );
+   }
+   
+   /**
+    * @param klimastasjonId Id for klimastasjon
+    */
+   public final void setKlimastasjonId( long klimastasjonId )
+   {
+      setAttribute("klimastasjonId", klimastasjonId);
+   }
+
+   /**
+    * @param feltId Id for felt
+    */
+   public final void setFeltId( long feltId )
+   {
+      setAttribute("feltId", feltId);
+   }
+   
+   /**
+    * @param personlig Personlig eller offentlig varsel
+    */
+   public final void setPersonlig( boolean personlig )
+   {
+      setAttribute("personlig", personlig);
+   }
+
+   /**
+    * @param inaktiv Aktivt eller inaktivt varsel
+    */
+   public final void setInaktiv( boolean inaktiv )
+   {
+      setAttribute("inaktiv", inaktiv);
+   }
+
+   /**
+    * @param sistEndretAv Id til bruker som sist endret varselet
+    */
+   public final void setSistEndretAv( long sistEndretAv )
+   {
+      setAttribute("sistEndretAv", sistEndretAv);
+   }
+   
+   /**
+    * @param sistEndretAvBrukernavn Brukernavn til bruker som sist endret varselet
+    */
+   public void setSistEndretAvBrukernavn( String sistEndretAvBrukernavn )
+   {
+      setAttribute( "sistEndretAvBrukernavn", sistEndretAvBrukernavn );
+   }
+
+   /**
+    * @param sistEndretDato Tid for siste endring
+    */
+   public final void setSistEndretDato( Date sistEndretDato )
+   {
+      setAttribute( "sistEndretDato", sistEndretDato );
+   }
+
+   /**
+    * @param logiskSlettet Slettet eller ikke slettet varsel
+    */
+   public final void setLogiskSlettet( boolean logiskSlettet )
+   {
+      setAttribute("logiskSlettet", logiskSlettet);
+   }
+
+   /**
+    * @param klimastasjonNavn Navn for klimastasjon
+    */
+   public void setKlimastasjonNavn( String klimastasjonNavn )
+   {
+      setAttribute( "klimastasjonNavn", klimastasjonNavn );
+   }
+   
+   /**
+    * @param feltNavn Navn for felt
+    */
+   public void setFeltNavn( String feltNavn )
+   {
+      setAttribute( "feltNavn", feltNavn );
+   }
+   
+   /**
+    * @param gaardNavn Navn for gaard
+    */
+   public void setGaardNavn( String gaardNavn )
+   {
+      setAttribute( "gaardNavn", gaardNavn );
+   }
+   
+   /**
+    * @param skifteNavn Navn for skifte
+    */
+   public void setSkifteNavn( String skifteNavn )
+   {
+      setAttribute( "skifteNavn", skifteNavn );
+   }
+
+   /**
+    * @param modellId ModellID
+    */
+   public void setModellId( String modellId )
+   {
+      setAttribute("modellId", modellId);
+   }
+   
+   /**
+    * @param modellNavn ModellNavn
+    */
+   public void setModellNavn( String modellNavn )
+   {
+      setAttribute( "modellNavn", modellNavn );
+   }
+
+   /**
+    * @param modellWebNavn ModellNavn for VIPS-forsiden
+    */
+   public void setModellWebNavn( String modellWebNavn )
+   {
+      setAttribute( "modellWebNavn", modellWebNavn );
+   }
+   
+   /**
+    * @param kulturId KulturID
+    */
+   public void setKulturId( long kulturId )
+   {
+      setAttribute("kulturId", kulturId);
+   }
+   
+   /**
+    * @param skifteKulturId Id til den nyeste kultur som er registrert p� skifte
+    */
+   public void setSkifteKulturId( long skifteKulturId )
+   {
+      setAttribute("skifteKulturId", skifteKulturId);
+   }
+   
+   /**
+    * @param kulturNavn Kulturnavn
+    */
+   public void setKulturNavn( String kulturNavn )
+   {
+      setAttribute( "kulturNavn", kulturNavn );
+   }
+
+   /**
+    * @param organismeId OrganismeID
+    */
+   public void setOrganismeId( long organismeId )
+   {
+      setAttribute("organismeId", organismeId);
+   }
+
+   /**
+    * @param organismeNavn Organismenavn
+    */
+   public void setOrganismeNavn( String organismeNavn )
+   {
+      setAttribute( "organismeNavn", organismeNavn );
+   }
+
+      
+   /**
+    * @return Unik identifikator for varsel
+    */
+   public long getVarselId()
+   {
+      return ( ( Long )getAttribute( "varselId" ) );
+   }
+   
+   /**
+    * @return LovligVarsel Id
+    */
+   public long getLovligVarselId()
+   {
+      return ( ( Long )getAttribute( "lovligVarselId" ) );
+   }
+
+   /**
+    * @return Startdato for varselet
+    */
+   public Date getStartDato()
+   {
+      return ( Date )getAttribute( "startDato" );
+   }
+   
+      /**
+    * @return Sluttdato for varselet
+    */
+   public Date getSluttDato()
+   {
+      return ( Date )getAttribute( "sluttDato" );
+   }
+   
+   /**
+    * @return Id for klimastasjon
+    */
+   public long getKlimastasjonId()
+   {
+      return ( ( Long )getAttribute( "klimastasjonId" ) );
+   }
+
+   /**
+    * @return Id for felt
+    */
+   public long getFeltId()
+   {
+      return ( ( Long )getAttribute( "feltId" ) );
+   }
+
+   /**
+    * @return personlig
+    */
+   public boolean getPersonlig()
+   {
+      return ( ( Boolean )getAttribute( "personlig" ) );
+   }
+
+   /**
+    * @return inaktiv
+    */
+   public boolean getInaktiv()
+   {
+      return ( ( Boolean )getAttribute( "inaktiv" ) );
+   }
+
+   /**
+    * @return sistEndretAv
+    */
+   public long getSistEndretAv()
+   {
+      return ( ( Long )getAttribute( "sistEndretAv" ) );
+   }
+   
+   /**
+    * @return sistEndretAvBrukernavn
+    */
+   public String getSistEndretAvBrukernavn()
+   {
+      return ( String )getAttribute( "sistEndretAvBrukernavn" );
+   }
+
+   /**
+    * @return sistEndretDato
+    */
+   public Date getSistEndretDato()
+   {
+      return ( Date )getAttribute( "sistEndretDato" );
+   }
+   
+   /**
+    * @return True hvis varselet er slettet, false ellers
+    */
+   public boolean getLogiskSlettet()
+   {
+      if( getAttribute( "logiskSlettet" ) != null )
+      {
+         return ( ( Boolean )getAttribute( "logiskSlettet" ) );
+      }
+      else
+      {
+         return false;
+      }
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getKlimastasjonNavn()
+   {
+      return ( String )getAttribute( "klimastasjonNavn" );
+   }
+   
+   /**
+    * @return Id for modell
+    */
+   public String getModellId()
+   {
+      return ( String )getAttribute( "modellId" ) ;
+   }
+   
+   /**
+    * @return Navn p� modell
+    */
+   public String getModellNavn()
+   {
+      return ( String )getAttribute( "modellNavn" );
+   }
+   
+   /**
+    * @return Navn paa modell til bruk p� VIPS-forsiden
+    */
+   public String getModellWebNavn()
+   {
+      return ( String )getAttribute( "modellWebNavn" );
+   }
+   
+   /**
+    * @return Id for kultur
+    */
+   public long getKulturId()
+   {
+      return ( ( Long )getAttribute( "kulturId" ) );
+   }
+   
+   /**
+    * @return Id for kultur
+    */
+   public long getSkifteKulturId()
+   {
+       Long retVal = ( Long )getAttribute( "skifteKulturId" );
+       if(retVal == null) return -1;
+       else return retVal;
+   }
+   
+   /**
+    * @return Navn på kultur
+    */
+   public String getKulturNavn()
+   {
+      return ( String )getAttribute( "kulturNavn" );
+   }
+   
+   /**
+    * @return Id for organisme
+    */
+   public long getOrganismeId()
+   {
+      return ( ( Long )getAttribute( "organismeId" ) );
+   }
+   
+   /**
+    * @return Navn p� organisme
+    */
+   public String getOrganismeNavn()
+   {
+      return ( String )getAttribute( "organismeNavn" );
+   }
+
+   
+   /**
+    * @return Navnet p� feltet varselet utf�res for
+    */
+   public String getFeltNavn()
+   {
+       return ( ( String )getAttribute( "feltNavn" ) );  
+   }
+   
+   /**
+    * @return Navnet p� g�rden varselet utf�res for
+    */
+   public String getGaardNavn()
+   {
+       return ( ( String )getAttribute( "gaardNavn" ) );  
+   }
+   
+   /**
+    * @return Navnet p� skiftet varselet utf�res for
+    */
+   public String getSkifteNavn()
+   {
+       return ( ( String )getAttribute( "skifteNavn" ) );  
+   }
+   
+   
+
+   /**
+    * Sorterer alfabetisk p� klimastasjonNavn, hvis det er oppgitt
+    * @param o
+    * @return
+    */
+    @Override
+    public int compareTo(Object o) {
+        VIPSMobileForecast other = (VIPSMobileForecast) o;
+        return this.compareTo(other);
+    }
+
+    /**
+     * Sorterer alfabetisk p� G�rd, Skifte, Felt og klimastasjonNavn, hvis det er oppgitt. Deretter kronologisk p� startDato
+     * @param other
+     * @return
+     */
+    public int compareTo(VIPSMobileForecast other)
+    {
+        int retVal = 0;
+        try
+        {
+            retVal = this.getGaardNavn().compareTo(other.getGaardNavn());
+            if(retVal != 0) return retVal;
+
+        }catch(NullPointerException npe){}
+
+        try
+        {
+            retVal = this.getSkifteNavn().compareTo(other.getSkifteNavn());
+            if(retVal != 0) return retVal;
+
+        }catch(NullPointerException npe){}
+
+        try
+        {
+            retVal = this.getFeltNavn().compareTo(other.getFeltNavn());
+            if(retVal != 0) return retVal;
+
+        }catch(NullPointerException npe){}
+
+        try
+        {
+            retVal = this.getKlimastasjonNavn().compareTo(other.getKlimastasjonNavn());
+            if(retVal != 0) return retVal;
+        }catch(NullPointerException npe){}
+
+        try
+        {
+            retVal = this.getStartDato().compareTo(other.getStartDato());
+            if(retVal != 0) return retVal;
+        }catch(NullPointerException npe){}
+        
+        
+        return retVal;
+    }
+
+    /**
+     * @return the DnmiSiteId
+     */
+    public Integer getDnmiSiteId() {
+        return DnmiSiteId;
+    }
+
+    /**
+     * @param DnmiSiteId the DnmiSiteId to set
+     */
+    public void setDnmiSiteId(Integer DnmiSiteId) {
+        this.DnmiSiteId = DnmiSiteId;
+    }
+
+    
+    
+   private Object getAttribute(String key)
+   {
+       if(this.props != null)
+       {
+           return this.props.get(key);
+       }
+       else
+       {
+           return null;
+       }
+   }
+   
+   private void setAttribute(String key, Object value)
+   {
+       if(this.props == null)
+       {
+           this.props = new HashMap<>();
+       }
+       this.props.put(key, value);
+   }
+}
diff --git a/src/main/java/no/nibio/vips/logic/entity/vipsmobile/VIPSMobileMessage.java b/src/main/java/no/nibio/vips/logic/entity/vipsmobile/VIPSMobileMessage.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c317dc33db4774a9a7422a4f05b74d36dc2bc21
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/entity/vipsmobile/VIPSMobileMessage.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2015 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.entity.vipsmobile;
+
+import java.util.Date;
+
+/**
+ * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+public class VIPSMobileMessage {
+    
+    private int meldingId;
+    private String tittel;
+    private String ingress;
+    private String tekst;
+    private Date registrertDato;
+    private Date gyldigTilDato;
+    private int meldingType;
+    private String bildeURL;
+    private String bildetekst;
+    
+    public VIPSMobileMessage (
+            int meldingId,
+            String tittel,
+            String ingress,
+            String tekst,
+            Date registrertDato,
+            Date gyldigTilDato,
+            int meldingType,
+            String bildeURL,
+            String bildetekst
+    )
+    {
+        this.meldingId = meldingId;
+        this.tittel = tittel;
+        this.ingress = ingress;
+        this.tekst = tekst;
+        this.registrertDato = registrertDato;
+        this.gyldigTilDato = gyldigTilDato;
+        this.meldingType = meldingType;
+        this.bildeURL = bildeURL;
+        this.bildetekst = bildetekst;
+    }
+
+    /**
+     * @return the meldingId
+     */
+    public int getMeldingId() {
+        return meldingId;
+    }
+
+    /**
+     * @param meldingId the meldingId to set
+     */
+    public void setMeldingId(int meldingId) {
+        this.meldingId = meldingId;
+    }
+
+    /**
+     * @return the tittel
+     */
+    public String getTittel() {
+        return tittel;
+    }
+
+    /**
+     * @param tittel the tittel to set
+     */
+    public void setTittel(String tittel) {
+        this.tittel = tittel;
+    }
+
+    /**
+     * @return the ingress
+     */
+    public String getIngress() {
+        return ingress;
+    }
+
+    /**
+     * @param ingress the ingress to set
+     */
+    public void setIngress(String ingress) {
+        this.ingress = ingress;
+    }
+
+    /**
+     * @return the tekst
+     */
+    public String getTekst() {
+        return tekst;
+    }
+
+    /**
+     * @param tekst the tekst to set
+     */
+    public void setTekst(String tekst) {
+        this.tekst = tekst;
+    }
+
+    /**
+     * @return the registrertDato
+     */
+    public Date getRegistrertDato() {
+        return registrertDato;
+    }
+
+    /**
+     * @param registrertDato the registrertDato to set
+     */
+    public void setRegistrertDato(Date registrertDato) {
+        this.registrertDato = registrertDato;
+    }
+
+    /**
+     * @return the gyldigTilDato
+     */
+    public Date getGyldigTilDato() {
+        return gyldigTilDato;
+    }
+
+    /**
+     * @param gyldigTilDato the gyldigTilDato to set
+     */
+    public void setGyldigTilDato(Date gyldigTilDato) {
+        this.gyldigTilDato = gyldigTilDato;
+    }
+
+    /**
+     * @return the meldingType
+     */
+    public int getMeldingType() {
+        return meldingType;
+    }
+
+    /**
+     * @param meldingType the meldingType to set
+     */
+    public void setMeldingType(int meldingType) {
+        this.meldingType = meldingType;
+    }
+
+    /**
+     * @return the bildeURL
+     */
+    public String getBildeURL() {
+        return bildeURL;
+    }
+
+    /**
+     * @param bildeURL the bildeURL to set
+     */
+    public void setBildeURL(String bildeURL) {
+        this.bildeURL = bildeURL;
+    }
+
+    /**
+     * @return the bildetekst
+     */
+    public String getBildetekst() {
+        return bildetekst;
+    }
+
+    /**
+     * @param bildetekst the bildetekst to set
+     */
+    public void setBildetekst(String bildetekst) {
+        this.bildetekst = bildetekst;
+    }
+    
+    public boolean getLeaf()
+    {
+        return true;
+    }
+
+}
diff --git a/src/main/java/no/nibio/vips/logic/entity/vipsmobile/VIPSMobilePresentation.java b/src/main/java/no/nibio/vips/logic/entity/vipsmobile/VIPSMobilePresentation.java
new file mode 100644
index 0000000000000000000000000000000000000000..eba5fd7943e8536669678ce2bc3ac158f77e23b7
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/entity/vipsmobile/VIPSMobilePresentation.java
@@ -0,0 +1,882 @@
+/*
+ * Copyright (c) 2015 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.entity.vipsmobile;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * Rip off from old VIPS
+ * &copy; 2015 NIBIO
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+public class VIPSMobilePresentation 
+{
+    
+    private Map<String, Object> props;
+   /**
+    * Lager et nytt presentasjon Business Object
+    * @param 
+    */
+   public VIPSMobilePresentation
+   (
+      long presentasjonId,
+      Date dagensDato, 
+      int nivaa,
+      int varselFarge1,
+      int varselFarge2,
+      int varselFarge3,
+      int varselFarge4,
+      int varselFarge5,
+      int varselFarge6,
+      int varselFarge7,
+      int varselFarge8,
+      int varselFarge9,
+      int varselFarge10,
+      int varselFarge11,
+      String varselTekst1,
+      String varselTekst2,
+      String varselTekst3,
+      String varselTekst4,
+      String varselTekst5,
+      String varselTekst6,
+      String varselTekst7,
+      String varselTekst8,
+      String varselTekst9,
+      String varselTekst10,
+      String varselTekst11,
+      long klimastasjonId,
+      long organismeId,
+      long kulturId,
+      long feltId,
+      String modellId,
+		long varselId,
+      String klimastasjonNavn,
+      String organismeNavn,
+      String kulturNavn,
+      String feltNavn,
+      String modellNavn,
+      String klimastasjonHjelpUrl,
+      String modellHjelpUrl,
+		boolean personlig ) {
+		   this (
+	       presentasjonId,
+	       dagensDato, 
+	       nivaa,
+	       varselFarge1,
+	       varselFarge2,
+	       varselFarge3,
+	       varselFarge4,
+	       varselFarge5,
+	       varselFarge6,
+	       varselFarge7,
+	       varselFarge8,
+	       varselFarge9,
+	       varselFarge10,
+	       varselFarge11,
+	       varselTekst1,
+	       varselTekst2,
+	       varselTekst3,
+	       varselTekst4,
+	       varselTekst5,
+	       varselTekst6,
+	       varselTekst7,
+	       varselTekst8,
+	       varselTekst9,
+	       varselTekst10,
+	       varselTekst11,
+	       klimastasjonId,
+	       organismeId,
+	       kulturId,
+	       feltId,
+	       modellId,
+	       klimastasjonNavn,
+	       organismeNavn,
+	       kulturNavn,
+	       feltNavn,
+	       modellNavn,
+	       klimastasjonHjelpUrl,
+	       modellHjelpUrl );
+	       setVarselId( varselId );
+			 setPersonlig( personlig );
+		}
+	
+/**
+    * Lager et nytt presentasjon Business Object
+    * @param 
+    */
+   public VIPSMobilePresentation
+   (
+      long presentasjonId,
+      Date dagensDato, 
+      int nivaa,
+      int varselFarge1,
+      int varselFarge2,
+      int varselFarge3,
+      int varselFarge4,
+      int varselFarge5,
+      int varselFarge6,
+      int varselFarge7,
+      int varselFarge8,
+      int varselFarge9,
+      int varselFarge10,
+      int varselFarge11,
+      String varselTekst1,
+      String varselTekst2,
+      String varselTekst3,
+      String varselTekst4,
+      String varselTekst5,
+      String varselTekst6,
+      String varselTekst7,
+      String varselTekst8,
+      String varselTekst9,
+      String varselTekst10,
+      String varselTekst11,
+      long klimastasjonId,
+      long organismeId,
+      long kulturId,
+      long feltId,
+      String modellId,
+      String klimastasjonNavn,
+      String organismeNavn,
+      String kulturNavn,
+      String feltNavn,
+      String modellNavn,
+      String klimastasjonHjelpUrl,
+      String modellHjelpUrl
+   )
+   {
+      setPresentasjonId( presentasjonId );
+      setDagensDato( dagensDato );
+      setNivaa( nivaa );
+      setVarselFarge1( varselFarge1 );
+      setVarselFarge2( varselFarge2 );
+      setVarselFarge3( varselFarge3 );
+      setVarselFarge4( varselFarge4 );
+      setVarselFarge5( varselFarge5 );
+      setVarselFarge6( varselFarge6 );
+      setVarselFarge7( varselFarge7 );
+      setVarselFarge8( varselFarge8 );
+      setVarselFarge9( varselFarge9 );
+      setVarselFarge10( varselFarge10 );
+      setVarselFarge11( varselFarge11 );
+      setVarselTekst1( varselTekst1 );
+      setVarselTekst2( varselTekst2 );
+      setVarselTekst3( varselTekst3 );
+      setVarselTekst4( varselTekst4 );
+      setVarselTekst5( varselTekst5 );
+      setVarselTekst6( varselTekst6 );
+      setVarselTekst7( varselTekst7 );
+      setVarselTekst8( varselTekst8 );
+      setVarselTekst9( varselTekst9 );
+      setVarselTekst10( varselTekst10 );
+      setVarselTekst11( varselTekst11 );
+      setKlimastasjonId( klimastasjonId );
+      setOrganismeId( organismeId );
+      setKulturId( kulturId );
+      setFeltId( feltId );
+      setModellId( modellId );
+      setKlimastasjonNavn( klimastasjonNavn );
+      setOrganismeNavn( organismeNavn );
+      setKulturNavn( kulturNavn );
+      setFeltNavn( feltNavn );
+      setModellNavn( modellNavn );
+      setKlimastasjonHjelpUrl( klimastasjonHjelpUrl );
+      setModellHjelpUrl( modellHjelpUrl );
+		setVarselId( -1 );
+		setPersonlig( false );
+   }
+
+   /**
+    * @param varselId Unik identifikator for presentasjon
+    */
+   public final void setPresentasjonId( long presentasjonId )
+   {
+      setAttribute("presentasjonId", presentasjonId);
+   }
+
+   /**
+    * @param varselId Unik identifikator for presentasjon
+    */
+   public final void setPersonlig( boolean personlig )
+   {
+      setAttribute("personlig", personlig);
+   }
+
+   /**
+    * @param dagensDato Dato presentasjonen gjelder for
+    */
+   public final void setDagensDato( Date dagensDato )
+   {
+      setAttribute( "dagensDato", dagensDato );
+   }   
+   
+   /**
+    * @param nivaa Nivaa for presentasjon
+    */
+   public final void setNivaa( int nivaa )
+   {
+      setAttribute("nivaa", nivaa);
+   }
+
+   /**
+    * @param varselFarge1 Status for farge
+    */
+   public final void setVarselFarge1( int varselFarge1 )
+   {
+      setAttribute("varselFarge1", varselFarge1);
+   }
+
+   /**
+    * @param varselFarge2 Status for farge
+    */
+   public final void setVarselFarge2( int varselFarge2 )
+   {
+      setAttribute("varselFarge2", varselFarge2);
+   }
+
+   /**
+    * @param varselFarge3 Status for farge
+    */
+   public final void setVarselFarge3( int varselFarge3 )
+   {
+      setAttribute("varselFarge3", varselFarge3);
+   }
+
+   /**
+    * @param varselFarge4 Status for farge
+    */
+   public final void setVarselFarge4( int varselFarge4 )
+   {
+      setAttribute("varselFarge4", varselFarge4);
+   }
+
+   /**
+    * @param varselFarge5 Status for farge
+    */
+   public final void setVarselFarge5( int varselFarge5 )
+   {
+      setAttribute("varselFarge5", varselFarge5);
+   }
+
+   /**
+    * @param varselFarge6 Status for farge
+    */
+   public final void setVarselFarge6( int varselFarge6 )
+   {
+      setAttribute("varselFarge6", varselFarge6);
+   }
+
+   /**
+    * @param varselFarge7 Status for farge
+    */
+   public final void setVarselFarge7( int varselFarge7 )
+   {
+      setAttribute("varselFarge7", varselFarge7);
+   }
+
+   /**
+    * @param varselFarge8 Status for farge
+    */
+   public final void setVarselFarge8( int varselFarge8 )
+   {
+      setAttribute("varselFarge8", varselFarge8);
+   }
+
+   /**
+    * @param varselFarge9 Status for farge
+    */
+   public final void setVarselFarge9( int varselFarge9 )
+   {
+      setAttribute("varselFarge9", varselFarge9);
+   }
+
+   /**
+    * @param varselFarge10 Status for farge
+    */
+   public final void setVarselFarge10( int varselFarge10 )
+   {
+      setAttribute("varselFarge10", varselFarge10);
+   }
+
+   /**
+    * @param varselFarge11 Status for farge
+    */
+   public final void setVarselFarge11( int varselFarge11 )
+   {
+      setAttribute("varselFarge11", varselFarge11);
+   }
+
+   /**
+    * @param varselTekst1 Tekst for varsel rute
+    */
+   public final void setVarselTekst1( String varselTekst1 )
+   {
+      setAttribute( "varselTekst1", varselTekst1 );
+   }
+
+
+   /**
+    * @param varselTekst2 Tekst for varsel rute
+    */
+   public final void setVarselTekst2( String varselTekst2 )
+   {
+      setAttribute( "varselTekst2", varselTekst2 );
+   }
+
+   /**
+    * @param varselTekst3 Tekst for varsel rute
+    */
+   public final void setVarselTekst3( String varselTekst3 )
+   {
+      setAttribute( "varselTekst3", varselTekst3 );
+   }
+
+   /**
+    * @param varselTekst4 Tekst for varsel rute
+    */
+   public final void setVarselTekst4( String varselTekst4 )
+   {
+      setAttribute( "varselTekst4", varselTekst4 );
+   }
+
+   /**
+    * @param varselTekst5 Tekst for varsel rute
+    */
+   public final void setVarselTekst5( String varselTekst5 )
+   {
+      setAttribute( "varselTekst5", varselTekst5 );
+   }
+
+   /**
+    * @param varselTekst6 Tekst for varsel rute
+    */
+   public final void setVarselTekst6( String varselTekst6 )
+   {
+      setAttribute( "varselTekst6", varselTekst6 );
+   }
+
+   /**
+    * @param varselTekst7 Tekst for varsel rute
+    */
+   public final void setVarselTekst7( String varselTekst7 )
+   {
+      setAttribute( "varselTekst7", varselTekst7 );
+   }
+
+   /**
+    * @param varselTekst8 Tekst for varsel rute
+    */
+   public final void setVarselTekst8( String varselTekst8 )
+   {
+      setAttribute( "varselTekst8", varselTekst8 );
+   }
+
+   /**
+    * @param varselTekst9 Tekst for varsel rute
+    */
+   public final void setVarselTekst9( String varselTekst9 )
+   {
+      setAttribute( "varselTekst9", varselTekst9 );
+   }
+
+   /**
+    * @param varselTekst10 Tekst for varsel rute
+    */
+   public final void setVarselTekst10( String varselTekst10 )
+   {
+      setAttribute( "varselTekst10", varselTekst10 );
+   }
+
+   /**
+    * @param varselTekst11 Tekst for varsel rute
+    */
+   public final void setVarselTekst11( String varselTekst11 )
+   {
+      setAttribute( "varselTekst11", varselTekst11 );
+   }
+
+   /**
+    * @param klimastasjonId Id for klimastasjon
+    */
+   public final void setKlimastasjonId( long klimastasjonId )
+   {
+      setAttribute("klimastasjonId", klimastasjonId);
+   }
+
+   /**
+    * @param organismeId Id for organisme
+    */
+   public final void setOrganismeId( long organismeId )
+   {
+      setAttribute("organismeId", organismeId);
+   }
+
+   /**
+    * @param kulturId Id for kultur
+    */
+   public final void setKulturId( long kulturId )
+   {
+      setAttribute("kulturId", kulturId);
+   }
+
+   /**
+    * @param feltId Id for felt
+    */
+   public final void setFeltId( long feltId )
+   {
+      setAttribute("feltId", feltId);
+   }
+
+   /**
+    * @param modellId Id for modell
+    */
+   public final void setModellId( String modellId )
+   {
+      setAttribute( "modellId", modellId );
+   }
+
+	/**
+    * @param modellId Id for modell
+    */
+   public final void setVarselId( long varselId )
+   {
+      setAttribute("varselId", varselId);
+   }
+
+   /**
+    * @param klimastasjonNavn Navn for klimastasjon
+    */
+   public final void setKlimastasjonNavn( String klimastasjonNavn )
+   {
+      setAttribute( "klimastasjonNavn", klimastasjonNavn );
+   }
+
+   /**
+    * @param organismeNavn Navn for organisme
+    */
+   public final void setOrganismeNavn( String organismeNavn )
+   {
+      setAttribute( "organismeNavn", organismeNavn );
+   }
+
+   /**
+    * @param kulturNavn Navn for kultur
+    */
+   public final void setKulturNavn( String kulturNavn )
+   {
+      setAttribute( "kulturNavn", kulturNavn );
+   }
+
+   /**
+    * @param feltNavn Navn for felt
+    */
+   public final void setFeltNavn( String feltNavn )
+   {
+      setAttribute( "feltNavn", feltNavn );
+   }
+
+   /**
+    * @param modellNavn Navn for modell
+    */
+   public final void setModellNavn( String modellNavn )
+   {
+      setAttribute( "modellNavn", modellNavn );
+   }
+   
+   /**
+    * @param modellNavn Navn for modell til bruk p� VIPS-forsiden
+    */
+   public void setModellWebNavn( String modellWebNavn )
+   {
+      setAttribute( "modellWebNavn", modellWebNavn );
+   }
+
+   /**
+    * @param klimastasjonHjelpUrl Hjelp url for klimastasjon
+    */
+   public final void setKlimastasjonHjelpUrl( String klimastasjonHjelpUrl )
+   {
+      setAttribute( "klimastasjonHjelpUrl", klimastasjonHjelpUrl );
+   }
+
+   /**
+    * @param modellHjelpUrl Hjelp url for modell
+    */
+   public final void setModellHjelpUrl( String modellHjelpUrl )
+   {
+      setAttribute( "modellHjelpUrl", modellHjelpUrl );
+   }
+
+      
+   /**
+    * @return Unik identifikator for varsel
+    */
+   public long getPresentasjonId()
+   {
+      return ( ( Long )getAttribute( "presentasjonId" ) );
+   }
+
+	/**
+    * @return Unik identifikator for varsel
+    */
+   public boolean getPersonlig()
+   {
+      return ( ( Boolean )getAttribute( "personlig" ) );
+   }
+
+   /**
+    * @return  dagensDato 
+    */
+//   @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
+   @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ssXXX", timezone="UTC")
+   //@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd.MM.yyyy", timezone="UTC")
+   public Date getDagensDato()
+   {
+       return ( (Date)getAttribute( "dagensDato" ) );  
+   }   
+   
+   /**
+    * @return Nivaa for presentasjon
+    */
+   public int getNivaa()
+   {
+      return ( ( Integer )getAttribute( "nivaa" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge1()
+   {
+      return ( ( Integer )getAttribute( "varselFarge1" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge2()
+   {
+      return ( ( Integer )getAttribute( "varselFarge2" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge3()
+   {
+      return ( ( Integer )getAttribute( "varselFarge3" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge4()
+   {
+      return ( ( Integer )getAttribute( "varselFarge4" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge5()
+   {
+      return ( ( Integer )getAttribute( "varselFarge5" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge6()
+   {
+      return ( ( Integer )getAttribute( "varselFarge6" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge7()
+   {
+      return ( ( Integer )getAttribute( "varselFarge7" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge8()
+   {
+      return ( ( Integer )getAttribute( "varselFarge8" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge9()
+   {
+      return ( ( Integer )getAttribute( "varselFarge9" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge10()
+   {
+      return ( ( Integer )getAttribute( "varselFarge10" ) );
+   }
+
+   /**
+    * @return Farge for varsel
+    */
+   public int getVarselFarge11()
+   {
+      return ( ( Integer )getAttribute( "varselFarge11" ) );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst1()
+   {
+      return ( String )getAttribute( "varselTekst1" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst2()
+   {
+      return ( String )getAttribute( "varselTekst2" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst3()
+   {
+      return ( String )getAttribute( "varselTekst3" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst4()
+   {
+      return ( String )getAttribute( "varselTekst4" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst5()
+   {
+      return ( String )getAttribute( "varselTekst5" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst6()
+   {
+      return ( String )getAttribute( "varselTekst6" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst7()
+   {
+      return ( String )getAttribute( "varselTekst7" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst8()
+   {
+      return ( String )getAttribute( "varselTekst8" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst9()
+   {
+      return ( String )getAttribute( "varselTekst9" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst10()
+   {
+      return ( String )getAttribute( "varselTekst10" );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getVarselTekst11()
+   {
+      return ( String )getAttribute( "varselTekst11" );
+   }
+
+   /**
+    * @return Id for klimastasjon
+    */
+   public long getKlimastasjonId()
+   {
+      return ( ( Long )getAttribute( "klimastasjonId" ) );
+   }
+
+   /**
+    * @return Id for organisme
+    */
+   public long getOrganismeId()
+   {
+      return ( ( Long )getAttribute( "organismeId" ) );
+   }
+
+   /**
+    * @return Id for kultur
+    */
+   public long getKulturId()
+   {
+      return ( ( Long )getAttribute( "kulturId" ) );
+   }
+
+   /**
+    * @return Id for felt
+    */
+   public long getFeltId()
+   {
+      return ( ( Long )getAttribute( "feltId" ) );
+   }
+
+   /**
+    * @return Id for modell
+    */
+   public String getModellId()
+   {
+      return ( String )getAttribute( "modellId" );
+   }
+
+	/**
+    * @return Id for modell
+    */
+   public long getVarselId()
+   {
+      return ( ( Long )getAttribute( "varselId" ) );
+   }
+
+   /**
+    * @return Navn for klimastasjon
+    */
+   public String getKlimastasjonNavn()
+   {
+      return ( String )getAttribute( "klimastasjonNavn" );
+   }
+
+   /**
+    * @return Navn for organisme
+    */
+   public String getOrganismeNavn()
+   {
+      return ( String )getAttribute( "organismeNavn" );
+   }
+
+   /**
+    * @return Navn for kultur
+    */
+   public String getKulturNavn()
+   {
+      return ( String )getAttribute( "kulturNavn" );
+   }
+
+   /**
+    * @return Navn for modell
+    */
+   public String getFeltNavn()
+   {
+      return ( String )getAttribute( "feltNavn" );
+   }
+
+   /**
+    * @return Navn for modell
+    */
+   public String getModellNavn()
+   {
+      return ( String )getAttribute( "modellNavn" );
+   }
+   
+   /**
+    * @return Navn for modell til bruk paa VIPS-forsiden
+    */
+   public String getModellWebNavn()
+   {
+      return ( String )getAttribute( "modellWebNavn" );
+   }
+
+   /**
+    * @return Hjelp url for klimastasjon
+    */
+   public String getKlimastasjonHjelpUrl()
+   {
+      return ( String )getAttribute( "klimastasjonHjelpUrl" );
+   }
+
+   /**
+    * @return Hjelp url for modell
+    */
+   public String getModellHjelpUrl()
+   {
+      return ( String )getAttribute( "modellHjelpUrl" );
+   }
+   
+ 
+   public boolean getLeaf()
+   {
+       return true;
+   }
+    
+
+   private Object getAttribute(String key)
+   {
+       if(this.props != null)
+       {
+           return this.props.get(key);
+       }
+       else
+       {
+           return null;
+       }
+   }
+   
+   private void setAttribute(String key, Object value)
+   {
+       if(this.props == null)
+       {
+           this.props = new HashMap<>();
+       }
+       this.props.put(key, value);
+   }
+}
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 8946f6467a89c1492a2e73e8d1223366c254efce..a8e5b3ca097812312e000386eae0f7c2627cec97 100644
--- a/src/main/java/no/nibio/vips/logic/service/LogicService.java
+++ b/src/main/java/no/nibio/vips/logic/service/LogicService.java
@@ -285,6 +285,7 @@ public class LogicService {
     @Produces("application/json;charset=UTF-8")
     public Response getMessageList(
             @QueryParam("publishedFrom") String publishedFrom , @QueryParam("publishedTo") String publishedTo,
+            @QueryParam("locale") String locale,
             @PathParam("organizationId") Integer organizationId
     )
     {
diff --git a/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java b/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java
new file mode 100644
index 0000000000000000000000000000000000000000..928d19465b18b2fefacc1d62b5368c0101b30835
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 2015 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.service;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.TimeZone;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import no.nibio.vips.entity.Result;
+import no.nibio.vips.logic.entity.ForecastConfiguration;
+import no.nibio.vips.logic.entity.ForecastSummary;
+import no.nibio.vips.logic.entity.Message;
+import no.nibio.vips.logic.entity.MessageIllustration;
+import no.nibio.vips.logic.entity.MessageLocale;
+import no.nibio.vips.logic.entity.ModelInformation;
+import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
+import no.nibio.vips.logic.entity.VipsLogicUser;
+import no.nibio.vips.logic.entity.vipsmobile.VIPSMobileForecast;
+import no.nibio.vips.logic.entity.vipsmobile.VIPSMobileMessage;
+import no.nibio.vips.logic.entity.vipsmobile.VIPSMobilePresentation;
+import no.nibio.vips.logic.i18n.SessionLocaleUtil;
+import no.nibio.vips.logic.util.SessionControllerGetter;
+import no.nibio.vips.logic.util.SystemTime;
+import no.nibio.vips.util.WeatherUtil;
+import org.jboss.resteasy.spi.HttpRequest;
+
+/**
+ * The purpose of this service is to mimic the services for VIPSMobile that
+ * were implemented in the old VIPS. It's assumed that it's easier to adapt the
+ * service layer than the client layer in Sencha Touch...
+ * 
+ * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+@Path("rest/vipsmobile")
+public class VIPSMobileService {
+    
+    @Context
+    private HttpRequest httpRequest;
+    @Context
+    private HttpServletRequest httpServletRequest;
+    
+    @GET
+    @Path("melding")
+    @Produces("application/json;charset=UTF-8")
+    public Response getMessages(
+            @QueryParam("organizationId") Integer organizationId,
+            @QueryParam("locale") String locale
+    )
+    {
+            Date datePublishedFrom = SystemTime.getSystemTime();
+            Date datePublishedTo = datePublishedFrom;
+            List<Message> messageList = SessionControllerGetter.getMessageBean().getMessageList(organizationId, datePublishedFrom, datePublishedTo);
+            
+            List<VIPSMobileMessage> retVal = new ArrayList<>();
+            for(Message message: messageList)
+            {
+                // Determine language
+                // Priority: Preferred language, English, first available locale
+                Set<MessageLocale> messageLocales = message.getMessageLocaleSet();
+                MessageLocale first = null;
+                MessageLocale english = null;
+                MessageLocale optimal = null;
+                for(MessageLocale mLocale:messageLocales)
+                {
+                    if(mLocale.getMessageLocalePK().getLocale().equals(locale))
+                    {
+                        optimal = mLocale;
+                        break;
+                    }
+                    if(first == null)
+                    {
+                        first = mLocale;
+                    }
+                    if(mLocale.getMessageLocalePK().getLocale().equals("en"))
+                    {
+                        english = mLocale;
+                    }
+                }
+                
+                MessageLocale pragmaticBestLocale = optimal != null ? optimal
+                                                : english != null ? english
+                                                : first;
+                
+                String imageURL = "";
+                String imageCaption = "";
+                try
+                {
+                    MessageIllustration illustration = message.getMessageIllustrationSet().iterator().next();
+                    imageURL = String.format("/static/images/messages/%s/%s", pragmaticBestLocale.getCreatedBy().getOrganizationId().getOrganizationId(), illustration.getMessageIllustrationPK().getFileName());
+                }catch(NoSuchElementException | NullPointerException ex){}
+                
+                VIPSMobileMessage vmMessage = new VIPSMobileMessage(
+                        message.getMessageId(),
+                        pragmaticBestLocale.getHeading(),
+                        pragmaticBestLocale.getLeadParagraph(),
+                        pragmaticBestLocale.getBody(),
+                        message.getDatePub(),
+                        message.getDateValidTo(),
+                        message.getMessageTagSet().iterator().next().getMessageTagId(),
+                        imageURL,
+                        "Test"
+                );
+                
+                retVal.add(vmMessage);
+            }
+            
+            return Response.ok().entity(retVal).build();
+    }
+    
+    @GET
+    @Path("presentasjoner")
+    @Produces("application/json;charset=UTF-8")
+    public Response getPresentations(
+            @QueryParam("varselIder") String forecastConfigurationIds,
+            @QueryParam("timeZone") String timeZoneStr,
+            @QueryParam("locale") String locale
+    ){
+        // Default locale is English
+        if(locale == null)
+        {
+            locale = "en";
+        }
+        
+        // Get model info
+        Map<String, ModelInformation> modelInformationMap = SessionControllerGetter.getForecastBean().getIndexedModelInformation();
+        
+        TimeZone timeZone = timeZoneStr != null ? TimeZone.getTimeZone(timeZoneStr)
+                : TimeZone.getDefault();
+        List<Long> parsedIds = new ArrayList<>();
+        for(String idCandidate:forecastConfigurationIds.split(","))
+        {
+            try
+            {
+                parsedIds.add(Long.valueOf(idCandidate));
+            }
+            catch(NumberFormatException ex){}
+        }
+        List<VIPSMobilePresentation> retVal = new ArrayList<>();
+        if(!parsedIds.isEmpty())
+        {
+            List<ForecastConfiguration> configsWithSummaries = SessionControllerGetter.getForecastBean().getForecastConfigurationWithSummaries(parsedIds);
+            // Initializing the array of summaries
+            Date today = new WeatherUtil().normalizeToExactDate(SystemTime.getSystemTime(), timeZone);
+            List<Date> datesList = new ArrayList<>();
+            Integer[] statusList = new Integer[11];
+            Calendar cal = Calendar.getInstance(timeZone);
+            cal.setTime(today);
+            cal.add(Calendar.DATE, -4);
+            for(int i=0;i<11;i++)
+            {
+                datesList.add(cal.getTime());
+                statusList[i] = Result.WARNING_STATUS_NO_WARNING_MISSING_DATA;
+                cal.add(Calendar.DATE, 1);
+            }
+            
+            for(ForecastConfiguration config:configsWithSummaries)
+            {
+                List<ForecastSummary> summaries = config.getForecastSummaries();
+                if(summaries == null || summaries.isEmpty())
+                {
+                    continue;
+                }
+                for(ForecastSummary summary:summaries)
+                {
+                    for(int i=0;i<11;i++)
+                    {
+                        if(datesList.get(i).compareTo(summary.getForecastSummaryPK().getSummaryForDate()) == 0)
+                        {
+                            statusList[i] = summary.getWarningStatus();
+                        }
+                    }
+                }
+                
+                VIPSMobilePresentation pres = new VIPSMobilePresentation(
+                        -1, 
+                        today, 
+                        2, 
+                        statusList[0], 
+                        statusList[1], 
+                        statusList[2], 
+                        statusList[3], 
+                        statusList[4], 
+                        statusList[5], 
+                        statusList[6], 
+                        statusList[7], 
+                        statusList[8], 
+                        statusList[9], 
+                        statusList[10], 
+                        "", 
+                        "", 
+                        "", 
+                        "", 
+                        "", 
+                        "", 
+                        "", 
+                        "", 
+                        "", 
+                        "", 
+                        "", 
+                        config.getWeatherStationPointOfInterestId().getPointOfInterestId(), 
+                        config.getPestOrganismId().getOrganismId(), 
+                        config.getCropOrganismId().getOrganismId(), 
+                        config.getLocationPointOfInterestId().getPointOfInterestId(), 
+                        config.getModelId(), 
+                        config.getWeatherStationPointOfInterestId().getName(), 
+                        config.getPestOrganismId().getLocalName(locale), 
+                        config.getCropOrganismId().getLocalName(locale), 
+                        config.getLocationPointOfInterestId().getName(), 
+                        SessionLocaleUtil.getI18nText(httpServletRequest, config.getModelId()),
+                        "", 
+                        ""
+                );
+                pres.setVarselId(config.getForecastConfigurationId());
+                retVal.add(pres);
+                // Reset statusList
+                for(int i=0;i<11;i++)
+                {
+                    statusList[i] = Result.WARNING_STATUS_NO_WARNING_MISSING_DATA;
+                    cal.add(Calendar.DATE, 1);
+                }
+            }
+        }
+        return Response.ok().entity(retVal).build(); 
+    }
+    
+    @GET
+    @Path("varsler")
+    @Produces("application/json;charset=UTF-8")
+    public Response getForecastConfigurations(
+            @QueryParam("klimastasjonId") Integer klimastasjonId,
+            @QueryParam("kulturId") List<Integer> kulturIder,
+            @QueryParam("locale") String locale
+    )
+    {
+        // Default locale is English
+        if(locale == null)
+        {
+            locale = "en";
+        }
+        
+        Date to = SystemTime.getSystemTime();
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(to);
+        cal.add(Calendar.MONTH, -2);
+        Date from = cal.getTime();
+        
+        PointOfInterestWeatherStation station = (PointOfInterestWeatherStation) SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(klimastasjonId);
+        List<ForecastConfiguration> forecasts = SessionControllerGetter.getForecastBean().getForecastConfigurations(station, from, to);
+        List<VIPSMobileForecast> retVal = new ArrayList<>();
+        for(ForecastConfiguration forecast:forecasts)
+        {
+            for(Integer cropOrganismId:kulturIder)
+            {
+                if(cropOrganismId.equals(forecast.getCropOrganismId().getOrganismId()))
+                {
+                    // Create old style VIPS forecast object, add to returned list
+                    VIPSMobileForecast varsel = new VIPSMobileForecast(
+                            forecast.getForecastConfigurationId(), 
+                            -1, 
+                            forecast.getDateStart(), 
+                            forecast.getDateEnd(), 
+                            forecast.getWeatherStationPointOfInterestId().getPointOfInterestId(),
+                            forecast.getWeatherStationPointOfInterestId().getName(), 
+                            forecast.getLocationPointOfInterestId().getPointOfInterestId(), 
+                            forecast.getLocationPointOfInterestId().getName(), 
+                            false, 
+                            false, 
+                            -1, 
+                            null, 
+                            false, 
+                            forecast.getPestOrganismId() != null ? forecast.getPestOrganismId().getOrganismId() : -1l, 
+                            forecast.getPestOrganismId() != null ? 
+                                    forecast.getPestOrganismId().getLocalName(locale) != null && ! forecast.getPestOrganismId().getLocalName(locale).isEmpty() ? 
+                                            forecast.getPestOrganismId().getLocalName(locale)
+                                            : forecast.getPestOrganismId().getLatinName()
+                                    : "", 
+                            forecast.getCropOrganismId().getOrganismId(), 
+                            forecast.getCropOrganismId().getLocalName(locale), 
+                            forecast.getModelId(), 
+                            SessionLocaleUtil.getI18nText(httpServletRequest, forecast.getModelId())
+                    );
+                    retVal.add(varsel);
+                    break;
+                }
+            }
+        }
+        return Response.ok().entity(retVal).build();   
+    }
+    
+    /**
+     * Returns a list of forecasts for given organization
+     * @param organizationId
+     * @return 
+     */
+    @GET
+    @Path("organizationforecastconfigurations/{organizationId}")
+    @Produces("application/json;charset=UTF-8")
+    public Response getForecastConfigurationsForOrganization(
+            @PathParam("organizationId") Integer organizationId, 
+            @QueryParam("cropOrganismId") List<Integer> cropOrganismIds,
+            @QueryParam("from") Date from,
+            @QueryParam("to") Date to
+            )
+    {
+        
+        if(from == null || to == null)
+        {
+            to = SystemTime.getSystemTime();
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(to);
+            cal.add(Calendar.MONTH, -2);
+            from = cal.getTime();
+        }
+
+        // First: Get all users for organization
+        List<VipsLogicUser> organizationUsers = SessionControllerGetter.getUserBean().getUsersByOrganization(organizationId);
+        // Then: Get forecasts for these users, collate and return
+        List<ForecastConfiguration> forecasts = new ArrayList<>();
+        
+        for(VipsLogicUser user:organizationUsers)
+        {
+            Integer userId = user.getUserId();
+            List<ForecastConfiguration> result = cropOrganismIds != null && ! cropOrganismIds.isEmpty() ?
+                    SessionControllerGetter.getForecastBean().getForecastConfigurationsForUserAndCropsAndDate(userId,cropOrganismIds, from, to)
+                    : SessionControllerGetter.getForecastBean().getForecastConfigurationsForUserAndDate(userId, from, to);
+            if(forecasts == null)
+                forecasts = result;
+            else
+                forecasts.addAll(result);
+        }
+        
+        return Response.ok().entity(forecasts).build();
+    }
+}