diff --git a/catalog.xml b/catalog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/enunciate.xml b/enunciate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..38acc62875b5ceb2eb2e945af7efa394d3d4dcfd
--- /dev/null
+++ b/enunciate.xml
@@ -0,0 +1,29 @@
+<enunciate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://enunciate.webcohesion.com/schemas/enunciate-2.0.0-M.4.xsd">
+
+  <title>VIPSLogic API</title>
+  <description>
+      The VIPSLogic service API gives access to stored pest predictions and observations
+  </description>
+  <copyright>NIBIO</copyright>
+  <contact>Tor-Einar Skog</contact>
+
+  <application root="/"/>
+
+
+  <modules>
+    <docs>
+      <download file="LICENSE.txt" name="NIBIO" description="The license governing this API" showLink="true"/>
+    </docs>
+    <java-xml-client>
+        <facet name="restricted" pattern="**"/>
+    </java-xml-client>
+  </modules>
+
+  <api-classes>
+      <exclude pattern="no.nibio.vips.logic.messaging.UniversalMessagingServiceClient"/>
+      <exclude pattern="no.nibio.vips.util.weather.dnmipointweb.**"/>
+  </api-classes>
+  <facets>
+        <exclude name="restricted"/>
+  </facets>
+</enunciate>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 4cfa5b0bacdfa21ad7eb9a221fe386a7646458d8..c746e5185bd580800423d3a82260597b1e3483f1 100755
--- a/pom.xml
+++ b/pom.xml
@@ -245,6 +245,17 @@
         <artifactId>gt-epsg-hsql</artifactId>
         <version>17.2</version>
     </dependency>
+    <dependency>
+        <groupId>com.webcohesion.enunciate</groupId>
+        <artifactId>enunciate-core-annotations</artifactId>
+        <version>2.10.1</version>
+      </dependency>
+
+      <dependency>
+        <groupId>com.webcohesion.enunciate</groupId>
+        <artifactId>enunciate-rt-util</artifactId>
+        <version>2.10.1</version>
+      </dependency>
   </dependencies>
 
   <build>
@@ -331,6 +342,23 @@
             <argLine>-Xmx6048m</argLine>
         </configuration>
     </plugin>
+    <plugin>
+    <groupId>com.webcohesion.enunciate</groupId>
+    <artifactId>enunciate-maven-plugin</artifactId>
+    <version>2.10.1</version>
+    <executions>
+      <execution>
+        <goals>
+          <!--goal>assemble</goal-->
+          <goal>docs</goal>
+        </goals>
+        <configuration>
+            <docsDir>${project.build.directory}/${project.build.finalName}/public/RESTdocs</docsDir>
+        </configuration>
+      </execution>
+    </executions>
+    
+  </plugin>
     </plugins>
   </build>
   
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/LoginController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/LoginController.java
index 5ee9435ac71f61902595ab9668181ad913ca5103..9f5dde0951e54e4e1423b5eb197fc46fd3ae715c 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/LoginController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/LoginController.java
@@ -19,6 +19,7 @@
 
 package no.nibio.vips.logic.controller.servlet;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeRequestUrl;
 import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest;
 import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
@@ -42,9 +43,11 @@ import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.Response;
 import no.nibio.vips.logic.entity.UserAuthenticationType;
 import no.nibio.vips.logic.entity.UserUuid;
 import no.nibio.vips.logic.entity.VipsLogicUser;
+import no.nibio.vips.logic.i18n.SessionLocaleUtil;
 import no.nibio.vips.logic.util.Globals;
 import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.util.ServletUtil;
@@ -197,7 +200,7 @@ public class LoginController extends HttpServlet {
                         }
                         if(nextPage.indexOf(Globals.PROTOCOL) == 0)
                         {
-                            System.out.println("nextPage=" + nextPage);
+                            //System.out.println("nextPage=" + nextPage);
                             response.sendRedirect(nextPage);
                         }
                         else
@@ -263,6 +266,48 @@ public class LoginController extends HttpServlet {
                 request.getRequestDispatcher("/login.ftl").forward(request, response);
             }
         }
+        // Login from a remote resource. Return UUID
+        else if(request.getServletPath().contains("remotelogin"))
+        {
+            String username = request.getParameter("username");
+            String password = request.getParameter("password");
+            
+
+            Map<String,String> creds = new HashMap();
+            creds.put("username", username);
+            creds.put("password", password);
+
+            VipsLogicUser user = SessionControllerGetter.getUserBean().authenticateUser(creds);
+            PrintWriter out = response.getWriter();
+            if(user != null && user.getUserStatusId().equals(Globals.USER_STATUS_APPROVED))
+            {
+                request.getSession().setAttribute("user", user);
+                UUID uUUID = this.handleRememberUser(request, response, user);
+                // All is well, return object
+                ObjectMapper mapper = new ObjectMapper();
+                user.setUserUuid(uUUID);
+                mapper.writeValue(out,user);
+                out.close();
+            }
+            else
+            {
+                response.setStatus(Response.Status.UNAUTHORIZED.getStatusCode());
+                
+                if(user != null && user.getUserStatusId().equals(Globals.USER_STATUS_AWAITING_EMAIL_VERIFICATION))
+                {
+                    out.print(SessionLocaleUtil.getI18nText(request, "emailNotVerified"));
+                }
+                else if(user != null && user.getUserStatusId().equals(Globals.USER_STATUS_AWAITING_APPROVAL))
+                {
+                    out.print(SessionLocaleUtil.getI18nText(request, "pleaseAwaitApproval"));
+                    request.getRequestDispatcher("/login.ftl").forward(request, response);
+                }
+                else
+                {
+                    out.print(SessionLocaleUtil.getI18nText(request, "invalidcredentials"));
+                }
+            }
+        }
         // No login attempt. Show form
         else
         {
diff --git a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java
index 91eb2526d2c22fac7249420ddd889bc0f03ab9c0..3c5bf66ebe33fe88a53ae147e66bbce47ef66993 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java
@@ -19,12 +19,10 @@
 
 package no.nibio.vips.logic.messaging;
 
+import com.webcohesion.enunciate.metadata.Facet;
 import javax.ws.rs.Consumes;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Response;
 
@@ -32,6 +30,7 @@ import javax.ws.rs.core.Response;
  * @copyright 2015 <a href="http://www.bioforsk.no/">Bioforsk</a>
  * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
  */
+@Facet("restricted")
 @Path("/")
 public interface UniversalMessagingServiceClient {
 
diff --git a/src/main/java/no/nibio/vips/logic/messaging/sms/SMSHandlingService.java b/src/main/java/no/nibio/vips/logic/messaging/sms/SMSHandlingService.java
index 35d6a299713880d341868d25e64b1fc6550f50e2..93d453f00bec03d1526a809218f555f15abaaa39 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/sms/SMSHandlingService.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/sms/SMSHandlingService.java
@@ -19,11 +19,11 @@
 
 package no.nibio.vips.logic.messaging.sms;
 
+import com.webcohesion.enunciate.metadata.Facet;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Response;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.util.SessionControllerGetter;
 
@@ -32,6 +32,7 @@ import no.nibio.vips.logic.util.SessionControllerGetter;
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/sms")
+@Facet("restricted")
 public class SMSHandlingService {
 
     /**
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothService.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothService.java
index de3471840d9150db4645abcafd7ab121995132dc..dbd2c57059dde9a5a33c250548f4f4d4e432d02d 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothService.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothService.java
@@ -19,6 +19,7 @@
 
 package no.nibio.vips.logic.modules.applefruitmoth;
 
+import com.webcohesion.enunciate.metadata.Facet;
 import de.micromata.opengis.kml.v_2_2_0.Kml;
 import java.util.Calendar;
 import javax.servlet.http.HttpServletRequest;
@@ -38,6 +39,7 @@ import no.nibio.vips.util.ServletUtil;
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/applefruitmoth")
+@Facet("restricted")
 public class AppleFruitMothService {
     
     @Context
diff --git a/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/BarleyNetBlotchModelService.java b/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/BarleyNetBlotchModelService.java
index daed2eadd514f84ef9cff7eb2624ae7b70fa6a46..3092f7625e3dea370f5cd8fbd5d3bd7993902377 100755
--- a/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/BarleyNetBlotchModelService.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/BarleyNetBlotchModelService.java
@@ -19,6 +19,7 @@
 
 package no.nibio.vips.logic.modules.barleynetblotch;
 
+import com.webcohesion.enunciate.metadata.Facet;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -55,6 +56,7 @@ import no.nibio.vips.util.weather.WeatherDataSourceUtil;
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/barleynetblotchmodel")
+@Facet("restricted")
 public class BarleyNetBlotchModelService {
     private final static String VIPSCOREMANAGER_URL = System.getProperty("no.nibio.vips.logic.VIPSCOREMANAGER_URL");
     
diff --git a/src/main/java/no/nibio/vips/logic/modules/roughage/RoughageService.java b/src/main/java/no/nibio/vips/logic/modules/roughage/RoughageService.java
index 32042161b8870701864640a86fd99866dc641f89..81c5f25395435568cb47c61ccc35bec8f562eb8d 100755
--- a/src/main/java/no/nibio/vips/logic/modules/roughage/RoughageService.java
+++ b/src/main/java/no/nibio/vips/logic/modules/roughage/RoughageService.java
@@ -19,6 +19,7 @@
 
 package no.nibio.vips.logic.modules.roughage;
 
+import com.webcohesion.enunciate.metadata.Facet;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
@@ -26,7 +27,6 @@ import java.util.Calendar;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.TimeZone;
@@ -60,6 +60,7 @@ import no.nibio.vips.util.weather.WeatherDataSourceUtil;
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/roughage")
+@Facet("restricted")
 public class RoughageService {
     private final static String VIPSCOREMANAGER_URL = System.getProperty("no.nibio.vips.logic.VIPSCOREMANAGER_URL");
 
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 a13b6fb4dffac65c55197f3795873a1570184b4a..157ecd2541cf5ca7860a336a6e151c2e5186c835 100755
--- a/src/main/java/no/nibio/vips/logic/service/LogicService.java
+++ b/src/main/java/no/nibio/vips/logic/service/LogicService.java
@@ -20,6 +20,7 @@
 package no.nibio.vips.logic.service;
 
 import com.ibm.icu.util.ULocale;
+import com.webcohesion.enunciate.metadata.Facet;
 import java.util.TimeZone;
 import de.micromata.opengis.kml.v_2_2_0.Kml;
 import java.text.DateFormat;
@@ -83,6 +84,12 @@ public class LogicService {
     @Context
     private HttpServletRequest httpServletRequest;
     
+    /**
+     * 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}")
     @GZIP
@@ -107,6 +114,13 @@ public class LogicService {
         }
     }
     
+    /**
+     * Get the latestDays results for one pest prediction
+     * @param forecastConfigurationId
+     * @param latestDays
+     * @param userUUID if the forecast is private, the correct userUUID must be supplied. 
+     * @return 
+     */
     @GET
     @Path("forecastresults/{forecastConfigurationId}/{latestDays}")
     @GZIP
@@ -133,7 +147,6 @@ public class LogicService {
     }
     
     /**
-     * 
      * @param organizationId
      * @param cropOrganismIds
      * @return 
@@ -142,6 +155,7 @@ public class LogicService {
     @Path("forecastconfigurationsummaries/{organizationId}")
     @GZIP
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getForecastSummaries(
             @PathParam("organizationId") Integer organizationId,
             @QueryParam("cropOrganismId") List<Integer> cropOrganismIds
@@ -160,6 +174,7 @@ public class LogicService {
     @Path("forecastconfigurationsummaries/private/{userUUID}")
     @GZIP
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getForecastSummaries(
             @PathParam("userUUID") String userUUID
     )
@@ -177,10 +192,11 @@ public class LogicService {
         }
         
     }
-    
+        
     /**
-     * Returns the requested forecast configuration
+     * Get the configuration of the specified forecast
      * @param forecastConfigurationId
+     * @param userUUID if the forecast is private, the correct userUUID must be supplied. 
      * @return 
      */
     @GET
@@ -207,6 +223,7 @@ public class LogicService {
     @GET
     @Path("forecastconfigurations/private/{userUUID}")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getPrivateForecastConfigurations(@PathParam("userUUID") String userUUID)
     {
         try
@@ -234,8 +251,8 @@ public class LogicService {
      * Returns a list of forecasts for given organization
      * @param organizationId
      * @param cropOrganismIds
-     * @param from
-     * @param to
+     * @param from format="yyyy-MM-dd"
+     * @param to format="yyyy-MM-dd"
      * @return 
      */
     @GET
@@ -294,6 +311,7 @@ public class LogicService {
     @GET
     @Path("evaluatepassword/{password}")
     @Produces("text/plain;charset=UTF-8")
+    @Facet("restricted")
     public Response evaluatePassord(@PathParam("password") String password)
     {
         ULocale currentLocale = SessionLocaleUtil.getCurrentLocale(httpServletRequest);
@@ -312,6 +330,7 @@ public class LogicService {
     @GET
     @Path("forecastmodelconfiguration/{forecastConfigurationId}")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getForecastModelConfiguration(@PathParam("forecastConfigurationId") Long forecastConfigurationId)
     {
         List<ForecastModelConfiguration> forecastModelConfigurations = SessionControllerGetter.getForecastBean().getForecastModelConfigurations(forecastConfigurationId);
@@ -328,6 +347,7 @@ public class LogicService {
     @Path("forecastresults/aggregate/{organizationId}")
     @GZIP
     @Produces("application/vnd.google-earth.kml+xml;charset=utf-8")
+    @Facet("restricted")
     public Response getForecastResultsAggregate(
             @PathParam("organizationId") Integer organizationId,
             @QueryParam("cropCategoryId") List<Integer> cropCategoryIds)
@@ -347,7 +367,7 @@ public class LogicService {
     /**
      * 
      * @param poiId
-     * @return 
+     * @return The latest forecast results (within the current season) for a given Point Of Interest (poi)
      */
     @GET
     @Path("forecastresults/latest/poi/{poiId}")
@@ -360,7 +380,7 @@ public class LogicService {
     }
     
     /**
-     * 
+     * Get a list of weather stations for a given organization
      * @param excludeWeatherStationId
      * @param highlightWeatherStationId
      * @param organizationId
@@ -376,11 +396,11 @@ public class LogicService {
     }
     
     /**
-     * 
+     * Get a KML list of locations (pois) for a given organization
      * @param excludePoiId
      * @param highlightPoiId
      * @param organizationId
-     * @return 
+     * @return KML
      */
     @GET
     @Path("pois/kml/{organizationId}")
@@ -393,7 +413,7 @@ public class LogicService {
     
     
     /**
-     * 
+     * Get a list of locations (pois) for a given organization
      * @param organizationId
      * @return 
      */
@@ -410,7 +430,7 @@ public class LogicService {
     /**
      * 
      * @param pointOfInterestId
-     * @return 
+     * @return a particular POI (Point of interest)
      */
     @GET
     @Path("poi/{pointOfInterestId}")
@@ -422,7 +442,7 @@ public class LogicService {
     }
     
     /**
-     * 
+     * Find a POI (Point of interest) by name
      * @param poiName
      * @return 
      */
@@ -442,6 +462,7 @@ public class LogicService {
     @GET
     @Path("poi/user/")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getPoisForCurrentUser()
     {
         VipsLogicUser user = (VipsLogicUser) httpServletRequest.getSession().getAttribute("user");
@@ -456,6 +477,7 @@ public class LogicService {
     @GET
     @Path("organism/list")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getOrganismList()
     {
         List<Organism> organismList = SessionControllerGetter.getOrganismBean().getOrganismSubTree(null);
@@ -463,7 +485,7 @@ public class LogicService {
     }
     
     /**
-     * 
+     * Look up an organism by its latin name
      * @param keywords
      * @return 
      */
@@ -478,12 +500,13 @@ public class LogicService {
     }
     
     /**
-     * 
+     * Get a list of crops
      * @return 
      */
     @GET
     @Path("organism/crop/list")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getCropOrganismList()
     {
         List<Organism> organismList = SessionControllerGetter.getOrganismBean().getAllCrops();
@@ -498,6 +521,7 @@ public class LogicService {
     @GET
     @Path("message/{messageId}")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getMessage(@PathParam("messageId") Integer messageId)
     {
         Message message = SessionControllerGetter.getMessageBean().getMessage(messageId);
@@ -517,6 +541,7 @@ public class LogicService {
     @Path("message/list/{organizationId}")
     @GZIP
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getMessageList(
             @QueryParam("publishedFrom") String publishedFrom , @QueryParam("publishedTo") String publishedTo,
             @QueryParam("locale") String locale,
@@ -557,6 +582,7 @@ public class LogicService {
     @Path("message/list/{organizationId}/tagfilter")
     @GZIP
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getMessageListWithTags(@QueryParam("tagId") List<Integer> tagIds, @PathParam("organizationId") Integer organizationId)
     {
         List<Message> messageListWithTags = SessionControllerGetter.getMessageBean().getCurrentFilteredMessagesForOrganization(tagIds, organizationId);
@@ -570,6 +596,7 @@ public class LogicService {
     @GET
     @Path("messagetag/list")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getMessageTagList()
     {
         List<MessageTag> messageTags = SessionControllerGetter.getMessageBean().getMessageTagList();
@@ -577,11 +604,11 @@ public class LogicService {
     }
     
     /**
-     * 
+     * Get a list of observations for a given organization
      * @param organizationId
      * @return 
      */
-    @GET
+    /*@GET
     @Path("observation")
     @GZIP
     @Produces("application/json;charset=UTF-8")
@@ -589,10 +616,10 @@ public class LogicService {
     {
         List<Observation> observations = SessionControllerGetter.getObservationBean().getObservations(organizationId);
         return Response.ok().entity(observations).build();
-    }
+    }*/
     
     /**
-     * 
+     * Not ready for production use!
      * @param latitude
      * @param longitude
      * @param startTimeStr
@@ -604,6 +631,7 @@ public class LogicService {
     @GET
     @Path("weather/calculation/solarradiation/json")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getCalculatedSolarRadiationAtLocationAndTimeJSON(
             @QueryParam("latitude") Double latitude, 
             @QueryParam("longitude") Double longitude, 
@@ -633,7 +661,7 @@ public class LogicService {
     }
     
     /**
-     * 
+     * Not ready for production use!
      * @param latitude
      * @param longitude
      * @param startTimeStr
@@ -645,6 +673,7 @@ public class LogicService {
     @GET
     @Path("weather/calculation/solarradiation/csv")
     @Produces("text/csv;charset=UTF-8")
+    @Facet("restricted")
     public Response getCalculatedSolarRadiationAtLocationAndTimeCSV(
             @QueryParam("latitude") Double latitude, 
             @QueryParam("longitude") Double longitude, 
@@ -676,7 +705,7 @@ public class LogicService {
     }
     
     /**
-     * 
+     * Not ready for production use!
      * @param latitude
      * @param longitude
      * @param startTimeStr
@@ -712,6 +741,7 @@ public class LogicService {
     @GET
     @Path("batch/updateforecastcaches")
     @Produces("text/plain;charset=UTF-8")
+    @Facet("restricted")
     public Response updateForecastCaches()
     {
         //System.out.println(httpServletRequest.getHeader("X-Forwarded-For"));
@@ -737,6 +767,7 @@ public class LogicService {
     @GET
     @Path("user/uuid/{userUUID}")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getVipsLogicUserByUUID(@PathParam("userUUID") String userUUID)
     {
         try
@@ -759,13 +790,14 @@ public class LogicService {
     }
     
     /**
-     * 
+     * TODO: Must be authenticated or not??
      * @param userUUID
      * @return 
      */
     @DELETE
     @Path("user/uuid/{userUUID}")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response deleteVipsLogicUserUUID(@PathParam("userUUID") String userUUID)
     {
         try
@@ -788,6 +820,7 @@ public class LogicService {
     @GET
     @Path("organism/croppest/{cropOrganismId}")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getCropPest(@PathParam("cropOrganismId") Integer cropOrganismId)
     {
         CropPest retVal = SessionControllerGetter.getOrganismBean().getCropPestRecursive(cropOrganismId,true);
@@ -809,6 +842,7 @@ public class LogicService {
     @GET
     @Path("organism/cropcategory/{organizationId}")
     @Produces("application/json;charset=UTF-8")
+    @Facet("restricted")
     public Response getCropCategories(@PathParam("organizationId") Integer organizationId)
     {
         if(organizationId != null)
@@ -822,7 +856,7 @@ public class LogicService {
     }
     
     /**
-     * Get the client to use for calling VIPSCoreManager REST services programatically
+     * Get the client to use for calling VIPSCoreManager REST services programmatically
      * @return 
      */
     private ManagerResource getManagerResource()
diff --git a/src/main/java/no/nibio/vips/logic/service/ObservationService.java b/src/main/java/no/nibio/vips/logic/service/ObservationService.java
index b11eac413df6d264173dda8c0400d62d29cc9c79..24a81647701723b8cf01dc4beba02e7d4c5dde42 100755
--- a/src/main/java/no/nibio/vips/logic/service/ObservationService.java
+++ b/src/main/java/no/nibio/vips/logic/service/ObservationService.java
@@ -19,6 +19,7 @@
 
 package no.nibio.vips.logic.service;
 
+import com.webcohesion.enunciate.metadata.Facet;
 import java.io.IOException;
 import java.net.URI;
 import java.text.ParseException;
@@ -49,6 +50,7 @@ import org.jboss.resteasy.annotations.GZIP;
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/observation")
+@Facet("restricted")
 public class ObservationService {
     
     @Context
diff --git a/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java b/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java
index b53c73e2fccb7958c4d795cb6e6355ce8a3f376f..2569197651fdbaa9bbb0e78e23040fa6696f517b 100755
--- a/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java
+++ b/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java
@@ -19,7 +19,7 @@
 
 package no.nibio.vips.logic.service;
 
-import java.text.SimpleDateFormat;
+import com.webcohesion.enunciate.metadata.Facet;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
@@ -31,7 +31,6 @@ import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TimeZone;
-import javax.json.JsonObject;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -70,6 +69,7 @@ import org.jboss.resteasy.spi.HttpRequest;
  * @copyright 2017 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
+@Facet("restricted")
 @Path("rest/vipsmobile")
 public class VIPSMobileService {
     
diff --git a/src/main/java/no/nibio/vips/logic/service/WeatherProxyService.java b/src/main/java/no/nibio/vips/logic/service/WeatherProxyService.java
index 792acb49157b774b4947e276b6368c948d4bbd1b..7be58c495b86a601b536bc9316ded2bb1a7a282b 100755
--- a/src/main/java/no/nibio/vips/logic/service/WeatherProxyService.java
+++ b/src/main/java/no/nibio/vips/logic/service/WeatherProxyService.java
@@ -21,6 +21,7 @@ package no.nibio.vips.logic.service;
 
 import com.vividsolutions.jts.geom.Envelope;
 import com.vividsolutions.jts.geom.GeometryFactory;
+import com.webcohesion.enunciate.metadata.Facet;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.text.ParseException;
@@ -41,7 +42,6 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Response;
 import no.nibio.vips.entity.PointWeatherObservationList;
 import no.nibio.vips.entity.WeatherObservation;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.util.weather.ALabDataParser;
 import no.nibio.vips.util.weather.FruitWebDavisDataParser;
@@ -224,6 +224,7 @@ public class WeatherProxyService {
      * @param endDateGET
      * @return 
      */
+    @Facet("restricted")
     @GET
     @POST
     @Path("dmipointweb/{stationId}")
@@ -295,6 +296,7 @@ public class WeatherProxyService {
         }
     }
     
+    @Facet("restricted")
     @GET
     @Path("metno/thredds/point/")
     @GZIP
@@ -348,6 +350,7 @@ public class WeatherProxyService {
      * @param elementMeasurementTypes
      * @return 
      */
+    @Facet("restricted")
     @GET
     @Path("metno/thredds/grid/")
     @GZIP
diff --git a/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java b/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java
index db79860e55d4c40e79114e8e3308d66bda7f74af..137936753347fca97cc9d732fb3910c93875ef5b 100755
--- a/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java
+++ b/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java
@@ -22,9 +22,8 @@ package no.nibio.vips.observationdata;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.ibm.icu.util.ULocale;
+import com.webcohesion.enunciate.metadata.Facet;
 import java.io.IOException;
-import java.math.BigDecimal;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -45,6 +44,7 @@ import no.nibio.vips.logic.i18n.SessionLocaleUtil;
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
+@Facet("restricted")
 @Path("rest/observationdata")
 public class ObservationDataService {
     @PersistenceContext(unitName="VIPSLogic-PU")
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 891735b0b77e44aacd697b0db5677f8debda5814..dff81c3e22c4d0c8dcb561b45e9d68fd4dcf373a 100755
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -98,6 +98,7 @@
         <url-pattern>/login</url-pattern>
         <url-pattern>/logout</url-pattern>
         <url-pattern>/loginsubmit</url-pattern>
+        <url-pattern>/remotelogin</url-pattern>
         <url-pattern>/oauth2callback</url-pattern>
         <url-pattern>/closeAndReloadParentAfterLogin</url-pattern>
     </servlet-mapping>