diff --git a/pom.xml b/pom.xml
index 02eb8ea3d39b469a5e5155a30d697eb0fdb93f0f..f55fad85eb9f12edab90ec682e0f97d865fe2568 100755
--- a/pom.xml
+++ b/pom.xml
@@ -19,10 +19,6 @@
             <id>jitpack.io</id>
             <url>https://jitpack.io</url>
         </repository>
-        <repository>
-            <id>mvnrepository.com</id>
-            <url>https://mvnrepository.com</url>
-        </repository>
         <repository>
             <id>bedatadriven</id>
             <name>bedatadriven public repo</name>
@@ -85,19 +81,19 @@
         <dependency>
             <groupId>org.jboss.resteasy</groupId>
             <artifactId>resteasy-jaxrs</artifactId>
-            <version>3.6.3.Final</version>
+            <version>3.15.3.Final</version>
             <scope>provided</scope> 
         </dependency>
         <dependency>
             <groupId>org.jboss.resteasy</groupId>
             <artifactId>resteasy-client</artifactId>
-            <version>3.6.3.Final</version>
+            <version>4.7.4.Final</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.jboss.resteasy</groupId>
             <artifactId>resteasy-jackson2-provider</artifactId>
-            <version>3.6.3.Final</version>
+            <version>4.7.4.Final</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -119,13 +115,13 @@
         <dependency>
             <groupId>org.reflections</groupId>
             <artifactId>reflections</artifactId>
-            <version>0.9.9</version>
+            <version>0.10.2</version>
             <type>jar</type>
         </dependency>
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
-            <version>4.5</version>
+            <version>4.5.13</version>
             <type>jar</type>
             <scope>provided</scope>
         </dependency>
@@ -138,53 +134,47 @@
         <dependency>
             <groupId>commons-lang</groupId>
             <artifactId>commons-lang</artifactId>
-            <version>2.5</version>
+            <version>2.6</version>
             <type>jar</type>
         </dependency>
         <dependency>
             <groupId>de.micromata.jak</groupId>
             <artifactId>JavaAPIforKml</artifactId>
-            <version>2.2.0</version>
+            <version>2.2.1</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/net.postgis/postgis-jdbc -->
         <dependency>
             <groupId>net.postgis</groupId>
             <artifactId>postgis-jdbc</artifactId>
-            <version>2.2.2</version>
+            <version>2.5.1</version>
         </dependency>
 
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-annotations</artifactId>
-            <version>2.9.8</version>
+            <version>2.13.1</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-core</artifactId>
-            <version>2.9.8</version>
+            <version>2.13.1</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
-            <version>2.9.8</version>
-        </dependency>
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-            <version>1.2.14</version>
-            <type>jar</type>
+            <version>2.13.1</version>
         </dependency>
         <dependency>
             <groupId>org.passay</groupId>
             <artifactId>passay</artifactId>
-            <version>1.1.0</version>
+            <version>1.6.1</version>
         </dependency>
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-core</artifactId>
-            <version>5.4.24.Final</version>
+            <version>5.6.3.Final</version>
             <exclusions>
             	<exclusion>
             		<groupId>org.dom4j</groupId>
@@ -195,50 +185,50 @@
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
-            <version>42.2.18</version>
+            <version>42.3.1</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.dataformat</groupId>
             <artifactId>jackson-dataformat-csv</artifactId>
-            <version>2.9.8</version>
+            <version>2.13.1</version>
             <type>jar</type>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.datatype</groupId>
             <artifactId>jackson-datatype-jsr310</artifactId>
-            <version>2.9.8</version>
+            <version>2.13.1</version>
             <type>jar</type>
         </dependency>
         <dependency>
             <groupId>org.locationtech.jts</groupId>
             <artifactId>jts-core</artifactId>
-            <version>1.16.1</version>
+            <version>1.18.2</version>
             <type>jar</type>
         </dependency>
         <dependency>
             <groupId>org.wololo</groupId>
             <artifactId>jts2geojson</artifactId>
-            <version>0.14.1</version>
+            <version>0.16.1</version>
         </dependency>
         <dependency>
             <groupId>javax</groupId>
             <artifactId>javaee-web-api</artifactId>
-            <version>8.0</version>
+            <version>8.0.1</version>
             <type>jar</type>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>javax</groupId>
             <artifactId>javaee-api</artifactId>
-            <version>8.0</version>
+            <version>8.0.1</version>
             <type>jar</type>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.freemarker</groupId>
             <artifactId>freemarker</artifactId>
-            <version>2.3.24-incubating</version>
+            <version>2.3.31</version>
         </dependency>
         <dependency>
             <groupId>it.sauronsoftware.cron4j</groupId>
@@ -263,12 +253,12 @@
         <dependency>
             <groupId>commons-fileupload</groupId>
             <artifactId>commons-fileupload</artifactId>
-            <version>1.3.1</version>
+            <version>1.4</version>
         </dependency>
         <dependency>
             <groupId>com.ibm.icu</groupId>
             <artifactId>icu4j</artifactId>
-            <version>52.1</version>
+            <version>70.1</version>
         </dependency>
         
         <!--dependency>
@@ -280,17 +270,17 @@
         <dependency>
             <groupId>org.openjdk.jol</groupId>
             <artifactId>jol-core</artifactId>
-            <version>0.9</version>
+            <version>0.16</version>
         </dependency>
         <dependency>
             <groupId>org.geotools</groupId>
             <artifactId>gt-api</artifactId>
-            <version>20.3</version>
+            <version>20.5</version>
         </dependency>
         <dependency>
             <groupId>org.geotools</groupId>
             <artifactId>gt-epsg-hsql</artifactId>
-            <version>20.3</version>
+            <version>20.5</version>
         </dependency>
         <dependency>
             <groupId>com.webcohesion.enunciate</groupId>
@@ -315,16 +305,16 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.0.2</version>
+                <version>3.8.1</version>
                 <configuration>
-                    <source>10</source>
-                    <target>10</target>
+                    <source>11</source>
+                    <target>11</target>
                 </configuration>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-war-plugin</artifactId>
-                <version>2.0.2</version>
+                <version>3.3.2</version>
                 <configuration>
                     <webResources>
                         <resource>
@@ -349,7 +339,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.10</version>
+                <version>2.22.2</version>
                 <configuration>
                     <argLine>-Xmx6048m</argLine>
                 </configuration>
diff --git a/src/main/java/no/nibio/vips/logic/authenticate/AuthenticationFilter.java b/src/main/java/no/nibio/vips/logic/authenticate/AuthenticationFilter.java
index abfc6264317ca6c93772cdc9c1d0455b09f50526..76ad91784fece34063773465153c4e552cd931dd 100755
--- a/src/main/java/no/nibio/vips/logic/authenticate/AuthenticationFilter.java
+++ b/src/main/java/no/nibio/vips/logic/authenticate/AuthenticationFilter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 NIBIO <http://www.nibio.no/>. 
+ * Copyright (c) 2022 NIBIO <http://www.nibio.no/>. 
  * 
  * This file is part of VIPSLogic.
  * VIPSLogic is free software: you can redistribute it and/or modify
@@ -23,10 +23,12 @@ package no.nibio.vips.logic.authenticate;
 import java.io.IOException;
 import java.net.URLEncoder;
 import java.util.UUID;
+import javax.ejb.EJB;
 import javax.servlet.*;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.util.Globals;
 import no.nibio.vips.logic.util.SessionControllerGetter;
@@ -34,10 +36,13 @@ import no.nibio.vips.util.ServletUtil;
 
 /**
  * Ensures that user accessing a restricted resource is actually logged in. Redirects to login page if not
- * @copyright 2013 <a href="http://www.nibio.no">NIBIO</a>
+ * @copyright 2013-2022 <a href="http://www.nibio.no">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class AuthenticationFilter implements Filter{
+    
+    @EJB
+    UserBean userBean;
 
     // The URLs that do not require login
     private String[] unprivilegedURLs;
@@ -72,7 +77,7 @@ public class AuthenticationFilter implements Filter{
             Cookie remembered = ServletUtil.getCookie(httpRequest, "rememberedUser");
             if(remembered != null)
             {
-                VipsLogicUser user = SessionControllerGetter.getUserBean().findVipsLogicUser(UUID.fromString(remembered.getValue()));
+                VipsLogicUser user = userBean.findVipsLogicUser(UUID.fromString(remembered.getValue()));
                 if(user != null)
                 {
                     httpRequest.getSession().setAttribute("user", user);
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/CropCategoryController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/CropCategoryController.java
index deeb40443f7383e1e6aa0804e1af4df15511ad18..3789c3cecc3f3b00a0b3f6e6868738178f73d0ed 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/CropCategoryController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/CropCategoryController.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 NIBIO <http://www.nibio.no/>. 
+ * Copyright (c) 2022 NIBIO <http://www.nibio.no/>. 
  * 
  * This file is part of VIPSLogic.
  * VIPSLogic is free software: you can redistribute it and/or modify
@@ -24,10 +24,13 @@ import java.io.PrintWriter;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import javax.ejb.EJB;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import no.nibio.vips.logic.controller.session.OrganismBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.CropCategory;
 import no.nibio.vips.logic.entity.Organism;
 import no.nibio.vips.logic.entity.Organization;
@@ -41,11 +44,17 @@ import no.nibio.web.forms.FormValidationException;
 import no.nibio.web.forms.FormValidator;
 
 /**
- * @copyright 2016 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @copyright 2016-2022 <a href="http://www.bioforsk.no/">Bioforsk</a>
  * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
  */
 public class CropCategoryController extends HttpServlet {
    
+    @EJB
+    UserBean userBean;
+    
+    @EJB
+    OrganismBean organismBean;
+    
     /** 
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
      * @param request servlet request
@@ -63,19 +72,19 @@ public class CropCategoryController extends HttpServlet {
         if(action == null)
         {
             Organization currentOrganization = user.isSuperUser() && request.getParameter("organizationId") != null ? 
-                        SessionControllerGetter.getUserBean().getOrganization(Integer.valueOf(request.getParameter("organizationId")))
+                        userBean.getOrganization(Integer.valueOf(request.getParameter("organizationId")))
                         : user.getOrganizationId();
             if(user.isSuperUser())
             {
-                List<Organization> allOrganizations = SessionControllerGetter.getUserBean().getTopLevelOrganizations();
+                List<Organization> allOrganizations = userBean.getTopLevelOrganizations();
                 request.setAttribute("allOrganizations", allOrganizations);
             }
             
-            List<CropCategory> cropCategories = SessionControllerGetter.getOrganismBean().getCropCategories(currentOrganization.getOrganizationId());
+            List<CropCategory> cropCategories = organismBean.getCropCategories(currentOrganization.getOrganizationId());
             
             request.setAttribute("organization", currentOrganization);
             request.setAttribute("cropCategories", cropCategories);
-            List<Organism> cropList = SessionControllerGetter.getOrganismBean().getAllCrops();
+            List<Organism> cropList = organismBean.getAllCrops();
             Map<String, Organism> allCrops = new HashMap<>();
             for(Organism crop:cropList)
             {
@@ -94,9 +103,9 @@ public class CropCategoryController extends HttpServlet {
                 {
                     Integer cropCategoryId = formValidation.getFormField("cropCategoryId").getValueAsInteger();
                     List<Integer> cropCategoryCropOrganismIds = FormUtil.getIdsFromMultipleSelect(formValidation.getFormField("cropCategoryCropOrganismIds").getWebValues());
-                    CropCategory cropCategory = SessionControllerGetter.getOrganismBean().getCropCategory(cropCategoryId);
+                    CropCategory cropCategory = organismBean.getCropCategory(cropCategoryId);
                     cropCategory.setCropOrganismIds(cropCategoryCropOrganismIds.toArray(new Integer[cropCategoryCropOrganismIds.size()]));
-                    SessionControllerGetter.getOrganismBean().storeCropCategory(cropCategory);
+                    organismBean.storeCropCategory(cropCategory);
                     
                     response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://").append(ServletUtil.getServerName(request)).append("/organism/cropcategory?messageKey=cropCategoryUpdated").toString());
                 }
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/ForecastConfigurationController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/ForecastConfigurationController.java
index 92568c8866de3a3c9a483d2eea0fb1df3f009ffe..ddd0bf7896461a221d88e3aaf6f920d218528703 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/ForecastConfigurationController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/ForecastConfigurationController.java
@@ -29,6 +29,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.servlet.ServletException;
@@ -36,6 +37,7 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import no.nibio.vips.logic.controller.session.ForecastBean;
+import no.nibio.vips.logic.controller.session.OrganismBean;
 import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.ModelInformation;
@@ -62,6 +64,15 @@ public class ForecastConfigurationController extends HttpServlet {
     
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
+    
+    @EJB
+    ForecastBean forecastBean;
+    
+    @EJB
+    UserBean userBean;
+    
+    @EJB
+    OrganismBean organismBean;
 
     /**
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
@@ -78,8 +89,6 @@ public class ForecastConfigurationController extends HttpServlet {
         
         String action = request.getParameter("action");
         VipsLogicUser user = (VipsLogicUser) request.getSession().getAttribute("user");
-        ForecastBean forecastBean = SessionControllerGetter.getForecastBean();
-        UserBean userBean = SessionControllerGetter.getUserBean();
         
         // Default: View list of forecast configurations
         // for SUPERUSERS and ORGANIZATION ADMINS
@@ -233,8 +242,8 @@ public class ForecastConfigurationController extends HttpServlet {
                         request.setAttribute("allCrops", em.createNamedQuery("Organism.findAllCrops").getResultList());
                         request.setAttribute("allPests", em.createNamedQuery("Organism.findAllPests").getResultList());
                         // Hierarchy categories
-                        request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
-                        request.setAttribute("modelInformations", SessionControllerGetter.getForecastBean().getBatchableModels());
+                        request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                        request.setAttribute("modelInformations", forecastBean.getBatchableModels());
                         request.setAttribute("messageKey", request.getParameter("messageKey"));
                         request.getRequestDispatcher("/forecastConfigurationForm.ftl").forward(request, response);
                        
@@ -267,7 +276,7 @@ public class ForecastConfigurationController extends HttpServlet {
                     request.setAttribute("allCrops", em.createNamedQuery("Organism.findAllCrops").getResultList());
                     request.setAttribute("allPests", em.createNamedQuery("Organism.findAllPests").getResultList());
                     // Hierarchy categories
-                    request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                    request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
                     request.setAttribute("modelInformations", em.createNamedQuery("ModelInformation.findAll").getResultList());
                     request.setAttribute("messageKey", request.getParameter("messageKey"));
                     request.getRequestDispatcher("/forecastConfigurationForm.ftl").forward(request, response);
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 8c169a334ec470129cd3655e3b3555279826dadb..ef89b33385608638c4100df90deef47ab99d77a3 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
@@ -38,23 +38,24 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
+import javax.ejb.EJB;
 import javax.servlet.ServletException;
 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.controller.session.UserBean;
 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;
 
 /**
  * Logs a user in or out
- * @copyright 2013-2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2013-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class LoginController extends HttpServlet {
@@ -62,6 +63,9 @@ public class LoginController extends HttpServlet {
     
     private static final String RETURN_UUID_PARAMETER_NAME = "returnUUID";
     
+    @EJB
+    UserBean userBean;
+    
     /**
      * Processes requests for both HTTP
      * <code>GET</code> and
@@ -116,7 +120,7 @@ public class LoginController extends HttpServlet {
                 Payload payload = idToken.getPayload();
                 
                 // Try to find the user
-                VipsLogicUser user = SessionControllerGetter.getUserBean().getUser(payload.getSubject(), UserAuthenticationType.TYPE_OPENID_GOOGLE);
+                VipsLogicUser user = userBean.getUser(payload.getSubject(), UserAuthenticationType.TYPE_OPENID_GOOGLE);
                 if(user != null)
                 {
                     request.getSession().setAttribute("user", user);
@@ -156,7 +160,7 @@ public class LoginController extends HttpServlet {
             {
                 rememberedUser.setMaxAge(0);
                 response.addCookie(rememberedUser);
-                SessionControllerGetter.getUserBean().deleteUserUuid(UUID.fromString(rememberedUser.getValue()));
+                userBean.deleteUserUuid(UUID.fromString(rememberedUser.getValue()));
             }
             request.setAttribute("messageKey","logoutsuccess");
             request.getRequestDispatcher("/login.ftl").forward(request, response);
@@ -188,7 +192,7 @@ public class LoginController extends HttpServlet {
                     creds.put("username", username);
                     creds.put("password", password);
 
-                    VipsLogicUser user = SessionControllerGetter.getUserBean().authenticateUser(creds);
+                    VipsLogicUser user = userBean.authenticateUser(creds);
 
                     if(user != null && user.getUserStatusId().equals(Globals.USER_STATUS_APPROVED))
                     {
@@ -277,7 +281,7 @@ public class LoginController extends HttpServlet {
             creds.put("username", username);
             creds.put("password", password);
 
-            VipsLogicUser user = SessionControllerGetter.getUserBean().authenticateUser(creds);
+            VipsLogicUser user = userBean.authenticateUser(creds);
             PrintWriter out = response.getWriter();
             if(user != null && user.getUserStatusId().equals(Globals.USER_STATUS_APPROVED))
             {
@@ -371,7 +375,7 @@ public class LoginController extends HttpServlet {
         request.getSession().removeAttribute("rememberUser");
         if(returnUUID || (rememberUser != null && rememberUser.equals("on")))
         {
-            UserUuid uUUID = SessionControllerGetter.getUserBean().createAndPersistUserUuid(user);
+            UserUuid uUUID = userBean.createAndPersistUserUuid(user);
             if(rememberUser != null && rememberUser.equals("on"))
             {
                 Cookie rememberedUser = new Cookie("rememberedUser", uUUID.getUserUuidPK().getUserUuid().toString());
@@ -388,7 +392,7 @@ public class LoginController extends HttpServlet {
             {
                 rememberedUser.setMaxAge(0);
                 response.addCookie(rememberedUser);
-                SessionControllerGetter.getUserBean().deleteUserUuid(UUID.fromString(rememberedUser.getValue()));
+                userBean.deleteUserUuid(UUID.fromString(rememberedUser.getValue()));
             }
             return null;
         }
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/MessageController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/MessageController.java
index 2cbc6d43c5e0de93e693227603f30e61648db46f..b1987c845e02258db823c0eb4e8e14256706e3f5 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/MessageController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/MessageController.java
@@ -27,6 +27,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
@@ -35,12 +36,14 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import no.nibio.vips.i18n.LanguageUtil;
+import no.nibio.vips.logic.controller.session.MessageBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.Message;
 import no.nibio.vips.logic.entity.MessageLocale;
 import no.nibio.vips.logic.entity.MessageTag;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
+import no.nibio.vips.logic.messaging.MessagingBean;
 import no.nibio.vips.logic.util.Globals;
 import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
@@ -56,7 +59,7 @@ import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 
 /**
- * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2014-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class MessageController extends HttpServlet {
@@ -64,6 +67,15 @@ public class MessageController extends HttpServlet {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    MessageBean messageBean;
+    
+    @EJB
+    UserBean userBean;
+    
+    @EJB
+    MessagingBean messagingBean;
+    
     /** 
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
      * @param request servlet request
@@ -92,11 +104,11 @@ public class MessageController extends HttpServlet {
             List<Message> messages;
             if(user.isSuperUser())
             {
-                messages = SessionControllerGetter.getMessageBean().getFilteredMessages(null,null,datePubStart, datePubEnd);
+                messages = messageBean.getFilteredMessages(null,null,datePubStart, datePubEnd);
             }
             else
             {
-                messages = SessionControllerGetter.getMessageBean().getFilteredMessages(user.getOrganizationId().getOrganizationId(),null, datePubStart, datePubEnd);
+                messages = messageBean.getFilteredMessages(user.getOrganizationId().getOrganizationId(),null, datePubStart, datePubEnd);
             }
             request.setAttribute("messages", messages);
             request.setAttribute("selectedMessageTags", em.createNamedQuery("MessageTag.findAll", MessageTag.class).getResultList());
@@ -115,8 +127,8 @@ public class MessageController extends HttpServlet {
             // If no tags are selected, ALL tags are selected
             List<Integer> selectedMessageTags = request.getParameterValues("filterMessageTags") != null ? 
                                         FormUtil.getIdsFromMultipleSelect(request.getParameterValues("filterMessageTags"))
-                                        : SessionControllerGetter.getMessageBean().getAllMessageTagIds();
-            Map<String, List<MessageTag>> messageTags = SessionControllerGetter.getMessageBean()
+                                        : messageBean.getAllMessageTagIds();
+            Map<String, List<MessageTag>> messageTags = messageBean
                     .getFilterMessageTags(selectedMessageTags);
             request.setAttribute("selectedMessageTags", messageTags.get("selected"));
             request.setAttribute("notSelectedMessageTags", messageTags.get("notSelected"));
@@ -140,11 +152,11 @@ public class MessageController extends HttpServlet {
             List<Message> messages;
             if(user.isSuperUser())
             {
-                messages = SessionControllerGetter.getMessageBean().getFilteredMessages(null,selectedMessageTags, datePubStart, datePubEnd);
+                messages = messageBean.getFilteredMessages(null,selectedMessageTags, datePubStart, datePubEnd);
             }
             else
             {
-                messages = SessionControllerGetter.getMessageBean().getFilteredMessages(user.getOrganizationId().getOrganizationId(),selectedMessageTags, datePubStart, datePubEnd);
+                messages = messageBean.getFilteredMessages(user.getOrganizationId().getOrganizationId(),selectedMessageTags, datePubStart, datePubEnd);
             }
             request.setAttribute("datePubStart", datePubStart);
             request.setAttribute("datePubEnd", datePubEnd);
@@ -212,7 +224,7 @@ public class MessageController extends HttpServlet {
                 tags.removeAll(message.getMessageTagSet());
                 request.setAttribute("unusedTags", tags);
                 request.setAttribute("messageKey", request.getParameter("messageKey"));
-                request.setAttribute("organizations", SessionControllerGetter.getUserBean().getOrganizations());
+                request.setAttribute("organizations", userBean.getOrganizations());
                 request.setAttribute("allCropCategoryIds", em.createNamedQuery("CropCategory.findByOrganizationId").setParameter("organizationId",user.getOrganizationId().getOrganizationId()).getResultList());
                 request.getRequestDispatcher("/messageForm.ftl").forward(request, response);
             }
@@ -239,7 +251,7 @@ public class MessageController extends HttpServlet {
                                 : SessionLocaleUtil.getCurrentLocale(request).getLanguage()
                 );
                 request.setAttribute("unusedTags", em.createNamedQuery("MessageTag.findAll").getResultList());
-                request.setAttribute("organizations", SessionControllerGetter.getUserBean().getOrganizations());
+                request.setAttribute("organizations", userBean.getOrganizations());
                 request.setAttribute("allCropCategoryIds", em.createNamedQuery("CropCategory.findByOrganizationId").setParameter("organizationId",user.getOrganizationId().getOrganizationId()).getResultList());
                 request.getRequestDispatcher("/messageForm.ftl").forward(request, response);
             }
@@ -287,19 +299,19 @@ public class MessageController extends HttpServlet {
                 if(formValidation.isValid())
                 {
                     // Store the message
-                    Message message = SessionControllerGetter.getMessageBean().storeMessage(formValidation.getFormFields(), user);
+                    Message message = messageBean.storeMessage(formValidation.getFormFields(), user);
                     
                     // New messages should be sent to subscribers
                     if(formValidation.getFormField("messageId").getValueAsInteger() < 0)
                     {
-                        SessionControllerGetter.getMessagingBean().sendUniversalMessage(message);
+                        messagingBean.sendUniversalMessage(message);
                     }
 
                     // Delete the current illustration
                     String deleteIllustration = formValidation.getFormField("deleteIllustration").getWebValue();
                     if(deleteIllustration != null && deleteIllustration.equals("true"))
                     {
-                        message = SessionControllerGetter.getMessageBean().deleteMessageIllustration(message);
+                        message = messageBean.deleteMessageIllustration(message);
                     }
                     // Store the new illustration (replaces former illustration if not already deleted)
                     if(items != null)
@@ -308,12 +320,12 @@ public class MessageController extends HttpServlet {
                         {
                             if(!item.isFormField() && item.getSize() > 0)
                             {
-                                message = SessionControllerGetter.getMessageBean().storeMessageIllustration(message, item);
+                                message = messageBean.storeMessageIllustration(message, item);
                             }
                         }
                     }   
                     // If an illustration is attached to the message, update the caption
-                    SessionControllerGetter.getMessageBean().updateMessageIllustrationCaption(message, 
+                    messageBean.updateMessageIllustrationCaption(message, 
                                 formValidation.getFormField("messageIllustrationCaptionLocale").getWebValue(),
                                 formValidation.getFormField("locale").getWebValue()
                                 );
@@ -369,7 +381,7 @@ public class MessageController extends HttpServlet {
             try
             {
                 Integer messageId = Integer.valueOf(request.getParameter("messageId"));
-                SessionControllerGetter.getMessageBean().deleteMessage(messageId);
+                messageBean.deleteMessage(messageId);
                 // Redirect to list
                 response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://")
                         .append(ServletUtil.getServerName(request))
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/NotificationSubscriptionController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/NotificationSubscriptionController.java
index fed4cf5e3d1b73db48bf8ae3ba2cf537457a1400..d0cd5c29532f496e217a588ab949a7f896fe7aaa 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/NotificationSubscriptionController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/NotificationSubscriptionController.java
@@ -20,14 +20,16 @@ package no.nibio.vips.logic.controller.servlet;
 
 import freemarker.core.ParseException;
 import java.io.IOException;
-import java.util.Collections;
 import java.util.List;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import no.nibio.vips.logic.controller.session.OrganismBean;
+import no.nibio.vips.logic.controller.session.PointOfInterestBean;
 import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.CropCategory;
 import no.nibio.vips.logic.entity.VipsLogicRole;
@@ -35,14 +37,14 @@ import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
 import no.nibio.vips.logic.messaging.ForecastEventNotificationSubscription;
 import no.nibio.vips.logic.messaging.MessageNotificationSubscription;
+import no.nibio.vips.logic.messaging.MessagingBean;
 import no.nibio.vips.logic.messaging.ObservationNotificationSubscription;
 import no.nibio.vips.logic.util.Globals;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.util.ServletUtil;
 import no.nibio.web.forms.FormUtil;
 
 /**
- * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2016-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 
@@ -52,6 +54,18 @@ public class NotificationSubscriptionController extends HttpServlet {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    UserBean userBean;
+    
+    @EJB
+    MessagingBean messagingBean;
+    
+    @EJB
+    OrganismBean organismBean;
+    
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    
     /**
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
      * methods.
@@ -66,7 +80,6 @@ public class NotificationSubscriptionController extends HttpServlet {
         
         String action = request.getParameter("action");
         VipsLogicUser user = (VipsLogicUser) request.getSession().getAttribute("user");
-        UserBean userBean = SessionControllerGetter.getUserBean();
         
         try
         {
@@ -94,22 +107,22 @@ public class NotificationSubscriptionController extends HttpServlet {
                 {
                     viewUser = em.find(VipsLogicUser.class, user.getUserId());
                 }
-                ObservationNotificationSubscription observationNotificationSubscription = SessionControllerGetter.getMessagingBean().getObservationNotificationSubscription(viewUser.getUserId());
+                ObservationNotificationSubscription observationNotificationSubscription = messagingBean.getObservationNotificationSubscription(viewUser.getUserId());
                 request.setAttribute("observationNotificationSubscription", observationNotificationSubscription);
-                MessageNotificationSubscription messageNotificationSubscription = SessionControllerGetter.getMessagingBean().getMessageNotificationSubscription(viewUser.getUserId());
+                MessageNotificationSubscription messageNotificationSubscription = messagingBean.getMessageNotificationSubscription(viewUser.getUserId());
                 request.setAttribute("messageNotificationSubscription",messageNotificationSubscription);
-                ForecastEventNotificationSubscription forecastEventNotificationSubscription = SessionControllerGetter.getMessagingBean().getForecastEventNotificationSubscription(viewUser.getUserId());
+                ForecastEventNotificationSubscription forecastEventNotificationSubscription = messagingBean.getForecastEventNotificationSubscription(viewUser.getUserId());
                 request.setAttribute("forecastEventNotificationSubscription",forecastEventNotificationSubscription);
                 request.setAttribute("viewUser", viewUser);
-                List<CropCategory> allCropCategories = SessionControllerGetter.getOrganismBean()
+                List<CropCategory> allCropCategories = organismBean
                         .sortCropCategoryByLocalName(
                                 em.createNamedQuery("CropCategory.findByOrganizationId").setParameter("organizationId", viewUser.getOrganizationId().getOrganizationId()).getResultList(),
                                 SessionLocaleUtil.getCurrentLocale(request).getLanguage()
                         );
                 request.setAttribute("allCropCategories", allCropCategories);
                 request.setAttribute("messageTagSet", em.createNamedQuery("MessageTag.findAll").getResultList());
-                request.setAttribute("weatherStationIds", SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForOrganization(viewUser.getOrganizationId(), true));
-                request.setAttribute("universalMessageFormats", SessionControllerGetter.getMessagingBean().getAllUniversalMessageFormats());
+                request.setAttribute("weatherStationIds", pointOfInterestBean.getWeatherstationsForOrganization(viewUser.getOrganizationId(), true));
+                request.setAttribute("universalMessageFormats", messagingBean.getAllUniversalMessageFormats());
                 request.setAttribute("messageKey", request.getParameter("messageKey"));
                 request.getRequestDispatcher("/notificationSubscriptionForm.ftl").forward(request, response);
             }
@@ -130,20 +143,20 @@ public class NotificationSubscriptionController extends HttpServlet {
                 mSubscription.setCropCategoryIds(FormUtil.getIdsFromMultipleSelect(request.getParameterValues("messageN_cropCategoryIds")));
                 mSubscription.setMessageTagIds(FormUtil.getIdsFromMultipleSelect(request.getParameterValues("messageN_messageTagIds")));
                 mSubscription.setUserId(viewUser.getUserId());
-                SessionControllerGetter.getMessagingBean().storeMessageNotificationSubscription(mSubscription);
+                messagingBean.storeMessageNotificationSubscription(mSubscription);
                 
                 ForecastEventNotificationSubscription fSubscription = new ForecastEventNotificationSubscription();
                 fSubscription.setUniversalMessageFormatId(Integer.valueOf(request.getParameter("forecastN_universalMessageFormatId")));
                 fSubscription.setCropCategoryIds(FormUtil.getIdsFromMultipleSelect(request.getParameterValues("forecastN_cropCategoryIds")));
                 fSubscription.setWeatherStationIds(FormUtil.getIdsFromMultipleSelect(request.getParameterValues("forecastN_weatherStationIds")));
                 fSubscription.setUserId(viewUser.getUserId());
-                SessionControllerGetter.getMessagingBean().storeForecastEventNotificationSubscription(fSubscription);
+                messagingBean.storeForecastEventNotificationSubscription(fSubscription);
                 
                 ObservationNotificationSubscription oSubscription = new ObservationNotificationSubscription();
                 oSubscription.setUniversalMessageFormatId(Integer.valueOf(request.getParameter("observationN_universalMessageFormatId")));
                 oSubscription.setCropCategoryIds(FormUtil.getIdsFromMultipleSelect(request.getParameterValues("observationN_cropCategoryIds")));
                 oSubscription.setUserId(viewUser.getUserId());
-                SessionControllerGetter.getMessagingBean().storeObservationNotificationSubscription(oSubscription);
+                messagingBean.storeObservationNotificationSubscription(oSubscription);
                 
                 // Redirect to form with confirmation message
                 response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://")
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationController.java
index 84fc06f83aeb5251fc18679a1c41eaf6b9649afc..c49849aa6a2051c61a14e20cadbea3c72f8366e8 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationController.java
@@ -33,6 +33,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TimeZone;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.servlet.ServletContext;
@@ -40,6 +41,10 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import no.nibio.vips.logic.controller.session.ObservationBean;
+import no.nibio.vips.logic.controller.session.OrganismBean;
+import no.nibio.vips.logic.controller.session.PointOfInterestBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.Observation;
 import no.nibio.vips.logic.entity.ObservationFormShortcut;
 import no.nibio.vips.logic.entity.ObservationMethod;
@@ -50,6 +55,7 @@ import no.nibio.vips.logic.entity.PolygonService;
 import no.nibio.vips.logic.entity.VipsLogicRole;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
+import no.nibio.vips.logic.messaging.MessagingBean;
 import no.nibio.vips.logic.util.Globals;
 import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
@@ -67,12 +73,24 @@ import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 
 /**
- * @copyright 2014-2017 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2014-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class ObservationController extends HttpServlet {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
+    
+    @EJB
+    UserBean userBean;
+    @EJB
+    ObservationBean observationBean;
+    @EJB
+    MessagingBean messagingBean;
+    @EJB
+    OrganismBean organismBean;
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    
     /** 
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
      * @param request servlet request
@@ -89,15 +107,15 @@ public class ObservationController extends HttpServlet {
         List<OrganizationGroup> organizationGroups = null;
         if(user.isSuperUser())
         {
-           organizationGroups =  SessionControllerGetter.getUserBean().getOrganizationGroups();
+           organizationGroups =  userBean.getOrganizationGroups();
         }
         else if(user.isOrganizationAdmin())
         {
-            organizationGroups = SessionControllerGetter.getUserBean().getOrganizationGroups(user.getOrganizationId());
+            organizationGroups = userBean.getOrganizationGroups(user.getOrganizationId());
         }
         else
         {
-            organizationGroups = SessionControllerGetter.getUserBean().getOrganizationGroups(user);
+            organizationGroups = userBean.getOrganizationGroups(user);
         }
         // Default: View observation list
         // for everyone
@@ -179,16 +197,16 @@ public class ObservationController extends HttpServlet {
                 }
                 
                 // First: Get observations for organization or user
-                if(viewOthersObservations && SessionControllerGetter.getUserBean().authorizeUser(user, 
+                if(viewOthersObservations && userBean.authorizeUser(user, 
                         VipsLogicRole.OBSERVATION_AUTHORITY, 
                         VipsLogicRole.ORGANIZATION_ADMINISTRATOR, 
                         VipsLogicRole.SUPERUSER))
                 {
-                    observations = SessionControllerGetter.getObservationBean().getObservations(user.getOrganizationId().getOrganizationId(), timeOfObservationFrom, timeOfObservationTo);
+                    observations = observationBean.getObservations(user.getOrganizationId().getOrganizationId(), timeOfObservationFrom, timeOfObservationTo);
                 }
                 else 
                 {
-                    observations = SessionControllerGetter.getObservationBean().getObservationsForUser(user, timeOfObservationFrom, timeOfObservationTo);
+                    observations = observationBean.getObservationsForUser(user, timeOfObservationFrom, timeOfObservationTo);
                 }
                 
                 // Then: Filter on other criteria
@@ -218,7 +236,7 @@ public class ObservationController extends HttpServlet {
                     final Set<Integer> ogi = organizationGroupId;
                     observations = observations.stream()
                             .filter((Observation obs) -> {
-                                List<Integer> availableOrganizationGroupIds = SessionControllerGetter.getObservationBean().getOrganizationGroupIds(obs);
+                                List<Integer> availableOrganizationGroupIds = observationBean.getOrganizationGroupIds(obs);
                                 if(availableOrganizationGroupIds != null && ! availableOrganizationGroupIds.isEmpty())
                                 {
                                     if (availableOrganizationGroupIds.stream().anyMatch((gId) -> (ogi.contains(gId)))) {
@@ -231,15 +249,15 @@ public class ObservationController extends HttpServlet {
                 }
                 
                 // Check for form shortcuts
-                List<ObservationFormShortcut> shortcuts = SessionControllerGetter.getObservationBean().getObservationFormShortcuts(user.getOrganizationId());
+                List<ObservationFormShortcut> shortcuts = observationBean.getObservationFormShortcuts(user.getOrganizationId());
                 
                 Collections.sort(observations);
                 Collections.reverse(observations);
                 //observations.forEach(o->System.out.println(o));
                 List<Organism> allPests = em.createNamedQuery("Organism.findAllPests").getResultList();
                 request.setAttribute("shortcuts", shortcuts);
-                request.setAttribute("allPests", SessionControllerGetter.getOrganismBean().sortOrganismsByLocalName(allPests, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
-                request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                request.setAttribute("allPests", organismBean.sortOrganismsByLocalName(allPests, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
+                request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
                 request.setAttribute("timeOfObservationFrom", userDefinedFrom ? timeOfObservationFrom : null);
                 request.setAttribute("timeOfObservationTo", userDefinedTo ? timeOfObservationTo : null);
                 request.setAttribute("selectedPestOrganismId", pestOrganismId);
@@ -248,8 +266,8 @@ public class ObservationController extends HttpServlet {
                 request.setAttribute("organizationGroups", organizationGroups);
                 request.setAttribute("organizationGroupId", organizationGroupId);
                 request.setAttribute("observations", observations);
-                request.setAttribute("userHasObserverPrivilege", SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER));
-                request.setAttribute("userIsObservationAuthority", SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER));
+                request.setAttribute("userHasObserverPrivilege", userBean.authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER));
+                request.setAttribute("userIsObservationAuthority", userBean.authorizeUser(user, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER));
                 // If this is a redirect from a controller, with a message to be passed on
                 request.setAttribute("messageKey", request.getParameter("messageKey"));
                 request.getRequestDispatcher("/observationList.ftl").forward(request, response);
@@ -258,7 +276,7 @@ public class ObservationController extends HttpServlet {
             // Authorization: ORGANIZATION ADMIN, OBSERVER or SUPERUSER
             else if(action.equals("newObservationForm"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     try
                     {
@@ -276,7 +294,7 @@ public class ObservationController extends HttpServlet {
                             Integer organismId = Integer.valueOf(request.getParameter("organismId"));
                             observation.setOrganism(em.find(Organism.class, organismId));
                             // If pest has been selected, include only associated crops
-                            allCrops = SessionControllerGetter.getOrganismBean().getPestCrops(organismId);
+                            allCrops = organismBean.getPestCrops(organismId);
                         }
                         else
                         {
@@ -284,7 +302,7 @@ public class ObservationController extends HttpServlet {
                         }
                         
                         // Get the polygonServices
-                        List<PolygonService> polygonServices = SessionControllerGetter.getObservationBean().getPolygonServicesForOrganization(user.getOrganization_id());
+                        List<PolygonService> polygonServices = observationBean.getPolygonServicesForOrganization(user.getOrganization_id());
                         
                         request.setAttribute("observation", observation);
                         request.setAttribute("polygonServices", polygonServices);
@@ -295,20 +313,20 @@ public class ObservationController extends HttpServlet {
                                 );
                         request.setAttribute("hideObservationFormMap", request.getParameter("hideObservationFormMap") != null ? request.getParameter("hideObservationFormMap").equals("true") : false);
                         request.setAttribute("noBroadcast", request.getParameter("noBroadcast") != null);
-                        request.setAttribute("mapLayers", SessionControllerGetter.getUserBean().getMapLayerJSONForUser(user));
+                        request.setAttribute("mapLayers", userBean.getMapLayerJSONForUser(user));
                         request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                         request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
-                        request.setAttribute("locationPointOfInterests", SessionControllerGetter.getPointOfInterestBean().getRelevantPointOfInterestsForUser(user));
+                        request.setAttribute("locationPointOfInterests", pointOfInterestBean.getRelevantPointOfInterestsForUser(user));
                         List<Organism> allPests = em.createNamedQuery("Organism.findAllPests").getResultList();
-                        request.setAttribute("allPests", SessionControllerGetter.getOrganismBean().sortOrganismsByLocalName(allPests, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
-                        request.setAttribute("allCrops", SessionControllerGetter.getOrganismBean().sortOrganismsByLocalName(allCrops, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
+                        request.setAttribute("allPests", organismBean.sortOrganismsByLocalName(allPests, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
+                        request.setAttribute("allCrops", organismBean.sortOrganismsByLocalName(allCrops, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
                         request.setAttribute("selectedOrganizationGroupIds", new ArrayList<>());
                         // Hierarchy categories
-                        request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                        request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
                         request.setAttribute("observationMethods", em.createNamedQuery("ObservationMethod.findAll", ObservationMethod.class).getResultList());
                         request.setAttribute("organizationGroups", organizationGroups);
                         request.setAttribute("editAccess", "W"); // User always has edit access to new observation
-                        if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                        if(userBean.authorizeUser(user, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                         {
                             request.setAttribute("statusTypeIds", em.createNamedQuery("ObservationStatusType.findAll").getResultList());
                         }
@@ -328,31 +346,31 @@ public class ObservationController extends HttpServlet {
             // Authorization: ORGANIZATION ADMIN, OBSERVER or SUPERUSER
             else if(action.equals("editObservationForm"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     try
                     {
                         Integer observationId = Integer.valueOf(request.getParameter("observationId"));
-                        Observation observation = SessionControllerGetter.getObservationBean().getObservation(observationId);//em.find(Observation.class, observationId);
-                        List<PolygonService> polygonServices = SessionControllerGetter.getObservationBean().getPolygonServicesForOrganization(user.getOrganization_id());
+                        Observation observation = observationBean.getObservation(observationId);//em.find(Observation.class, observationId);
+                        List<PolygonService> polygonServices = observationBean.getPolygonServicesForOrganization(user.getOrganization_id());
                         request.setAttribute("locationVisibilityFormValue", this.getLocationVisibilityFormValue(observation));
                         request.setAttribute("observation", observation);
                         request.setAttribute("polygonServices", polygonServices);
                         request.setAttribute("noBroadcast", request.getParameter("noBroadcast") != null);
-                        request.setAttribute("mapLayers", SessionControllerGetter.getUserBean().getMapLayerJSONForUser(user));
+                        request.setAttribute("mapLayers", userBean.getMapLayerJSONForUser(user));
                         //System.out.println(observation.getGeoinfo());
                         request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                         request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
                         List<Organism> allPests = em.createNamedQuery("Organism.findAllPests").getResultList();
-                        request.setAttribute("allPests", SessionControllerGetter.getOrganismBean().sortOrganismsByLocalName(allPests, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
+                        request.setAttribute("allPests", organismBean.sortOrganismsByLocalName(allPests, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
                         List<Organism> allCrops = em.createNamedQuery("Organism.findAllCrops").getResultList();
-                        request.setAttribute("allCrops", SessionControllerGetter.getOrganismBean().sortOrganismsByLocalName(allCrops, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
-                        request.setAttribute("selectedOrganizationGroupIds", SessionControllerGetter.getObservationBean().getOrganizationGroupIds(observation));
+                        request.setAttribute("allCrops", organismBean.sortOrganismsByLocalName(allCrops, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
+                        request.setAttribute("selectedOrganizationGroupIds", observationBean.getOrganizationGroupIds(observation));
                         // Hierarchy categories
-                        request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                        request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
                         request.setAttribute("observationMethods", em.createNamedQuery("ObservationMethod.findAll", ObservationMethod.class).getResultList());
                         request.setAttribute("organizationGroups", organizationGroups);
-                        if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                        if(userBean.authorizeUser(user, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                         {
                             request.setAttribute("statusTypeIds", em.createNamedQuery("ObservationStatusType.findAll").getResultList());
                         }
@@ -388,7 +406,7 @@ public class ObservationController extends HttpServlet {
             // Authorization: ORGANIZATION ADMIN, OBSERVER or SUPERUSER
             else if(action.equals("observationFormSubmit"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     try
                     {
@@ -456,7 +474,7 @@ public class ObservationController extends HttpServlet {
 
                             boolean sendNotification = false;    
                             // Storing approval status
-                            if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                            if(userBean.authorizeUser(user, VipsLogicRole.OBSERVATION_AUTHORITY, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                             {
                                 Integer statusTypeId = formValidation.getFormField("statusTypeId").getValueAsInteger();
                                 if(
@@ -494,14 +512,14 @@ public class ObservationController extends HttpServlet {
                                 observation.setGeoinfo(formValidation.getFormField("geoInfo").getWebValue());
                             }
                             
-                            observation = SessionControllerGetter.getObservationBean().storeObservation(observation);
+                            observation = observationBean.storeObservation(observation);
 
                             // Image handling
                             // Delete the current illustration
                             String deleteIllustration = formValidation.getFormField("deleteIllustration").getWebValue();
                             if(deleteIllustration != null && deleteIllustration.equals("true"))
                             {
-                                observation = SessionControllerGetter.getObservationBean().deleteObservationIllustration(observation);
+                                observation = observationBean.deleteObservationIllustration(observation);
                             }
 
                             // Store the new illustration (replaces former illustration if not already deleted)
@@ -511,13 +529,13 @@ public class ObservationController extends HttpServlet {
                                 {
                                     if(!item.isFormField() && item.getSize() > 0)
                                     {
-                                        observation = SessionControllerGetter.getObservationBean().storeObservationIllustration(observation, item);
+                                        observation = observationBean.storeObservationIllustration(observation, item);
                                     }
                                 }
                             }
                             
                             // Checking for organization groups
-                            SessionControllerGetter.getObservationBean().storeOrganizationGroupObservationIds(observation, formValidation.getFormField("organizationGroupId").getWebValues());
+                            observationBean.storeOrganizationGroupObservationIds(observation, formValidation.getFormField("organizationGroupId").getWebValues());
                             
                             // All transactions finished, we can send notifications
                             // if conditions are met
@@ -525,7 +543,7 @@ public class ObservationController extends HttpServlet {
                                     (System.getProperty("DISABLE_MESSAGING_SYSTEM") != null && System.getProperty("DISABLE_MESSAGING_SYSTEM").equals("true"))
                                     )
                             {
-                                SessionControllerGetter.getMessagingBean().sendUniversalMessage(observation);
+                                messagingBean.sendUniversalMessage(observation);
                             }
 
                             // Redirect to form
@@ -544,7 +562,7 @@ public class ObservationController extends HttpServlet {
                             List<Organism> allOrganisms = em.createNamedQuery("Organism.findAll").getResultList();
                             request.setAttribute("allOrganisms", allOrganisms);
                             // Hierarchy categories
-                            request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                            request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
                             request.setAttribute("observationMethods", em.createNamedQuery("ObservationMethod.findAll", ObservationMethod.class).getResultList());
                             request.getRequestDispatcher("/observationForm.ftl").forward(request, response);
                         }
@@ -568,12 +586,12 @@ public class ObservationController extends HttpServlet {
             // Authorization: ORGANIZATION ADMIN, OBSERVER or SUPERUSER
             else if(action.equals("deleteObservation"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.OBSERVER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     try
                     {
                         Integer observationId = Integer.valueOf(request.getParameter("observationId"));
-                        SessionControllerGetter.getObservationBean().deleteObservation(observationId);
+                        observationBean.deleteObservation(observationId);
 
                         // Redirect to list
                         response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://")
@@ -596,7 +614,7 @@ public class ObservationController extends HttpServlet {
         else if(request.getServletPath().endsWith("/map"))
         {
             // Only for superusers, organizationadmins and observation authorities
-            if(SessionControllerGetter.getUserBean().authorizeUser(user, 
+            if(userBean.authorizeUser(user, 
                     VipsLogicRole.SUPERUSER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.OBSERVATION_AUTHORITY)
                     )
             {
@@ -609,7 +627,7 @@ public class ObservationController extends HttpServlet {
                                 formValidation.getFormField("organizationId").getValueAsInteger()
                                 :user.getOrganizationId().getOrganizationId();
                         organization = em.find(Organization.class, organizationId);
-                        request.setAttribute("organizations", SessionControllerGetter.getUserBean().getOrganizations());
+                        request.setAttribute("organizations", userBean.getOrganizations());
                         request.setAttribute("organizationId", organizationId);
 
                     }
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganismController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganismController.java
index 6f887f7b8e790ace23664afd2d173c30c0c8f85f..4fe1f614cbe676b64cde796709a16c2b94eafc11 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganismController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganismController.java
@@ -20,17 +20,18 @@
 package no.nibio.vips.logic.controller.servlet;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import no.nibio.vips.logic.controller.session.OrganismBean;
 import no.nibio.vips.logic.entity.CropPest;
 import no.nibio.vips.logic.entity.Organism;
 import no.nibio.vips.logic.entity.OrganismExternalResource;
@@ -38,7 +39,6 @@ import no.nibio.vips.logic.entity.OrganismExternalResourcePK;
 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.ExceptionUtil;
 import no.nibio.vips.util.ServletUtil;
 import no.nibio.web.forms.FormField;
@@ -48,13 +48,16 @@ import no.nibio.web.forms.FormValidationException;
 import no.nibio.web.forms.FormValidator;
 
 /**
- * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2016-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class OrganismController extends HttpServlet {
    
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
+    
+    @EJB
+    OrganismBean organismBean;
 
     /** 
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
@@ -80,12 +83,12 @@ public class OrganismController extends HttpServlet {
                 )
                 {
                     organism = new Organism();
-                    organism.setChildOrganisms(SessionControllerGetter.getOrganismBean().getTopLevelOrganisms());
+                    organism.setChildOrganisms(organismBean.getTopLevelOrganisms());
                 }
                 else
                 {
                     Integer organismId = Integer.valueOf(request.getParameter("organismId"));
-                    organism = SessionControllerGetter.getOrganismBean().getOrganismAndChildrenTwoLevels(organismId);
+                    organism = organismBean.getOrganismAndChildrenTwoLevels(organismId);
                 }
                 request.setAttribute("organism", organism);
                 // Check if any of the child organisms has trade name
@@ -119,27 +122,27 @@ public class OrganismController extends HttpServlet {
         {
             
             List<Organism> allCrops = em.createNamedQuery("Organism.findAllCrops").getResultList();
-            Map<String,Organism> allPestsMapped = SessionControllerGetter.getOrganismBean().getAllPestsMapped();
-            Map<String, CropPest> cropPestsMap = SessionControllerGetter.getOrganismBean().getCropPestsMapped();
+            Map<String,Organism> allPestsMapped = organismBean.getAllPestsMapped();
+            Map<String, CropPest> cropPestsMap = organismBean.getCropPestsMapped();
             request.setAttribute("allCrops", 
-                    SessionControllerGetter.getOrganismBean().sortOrganismsByLocalName(
+                    organismBean.sortOrganismsByLocalName(
                         allCrops, 
                         SessionLocaleUtil.getCurrentLocale(request).getLanguage())
             );
             request.setAttribute("allPestsMapped", allPestsMapped);
             request.setAttribute("cropPestsMap", cropPestsMap);
-            request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+            request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
             request.getRequestDispatcher("/cropList.ftl").forward(request, response);
         }
         else if(action.equals("listPests"))
         {
             List<Organism> allPests = em.createNamedQuery("Organism.findAllPests").getResultList();
             request.setAttribute("allPests", 
-                    SessionControllerGetter.getOrganismBean().sortOrganismsByLocalName(
+                    organismBean.sortOrganismsByLocalName(
                             allPests, 
                             SessionLocaleUtil.getCurrentLocale(request).getLanguage())
             );
-            request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+            request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
             request.getRequestDispatcher("/pestList.ftl").forward(request, response);
         }
         else if(action.equals("viewOrganism"))
@@ -151,7 +154,7 @@ public class OrganismController extends HttpServlet {
                 request.setAttribute("organism", organism);
                 
                 // Hierarchy categories
-                request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
                 request.setAttribute("parentOrganism", organism.getParentOrganismId() != null ? em.find(Organism.class, organism.getParentOrganismId()) : null);
                 request.getRequestDispatcher("/organismDetails.ftl").forward(request, response);
             }
@@ -177,15 +180,15 @@ public class OrganismController extends HttpServlet {
                 request.setAttribute("organism", organism);
                 if(organism.getIsCrop())
                 {
-                    request.setAttribute("cropCategories", SessionControllerGetter.getOrganismBean().getCropCategories(user.getOrganizationId().getOrganizationId()));
+                    request.setAttribute("cropCategories", organismBean.getCropCategories(user.getOrganizationId().getOrganizationId()));
                 }
                 // All organisms used for parent organism list
                 List<Organism> allOrganisms = em.createNamedQuery("Organism.findAll").getResultList();
                 request.setAttribute("allOrganisms", allOrganisms);
                 // Hierarchy categories
-                request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
                 // Finding all external resources where entry is missing
-                request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getOrganismBean().getUnusedExternalResourcesForOrganism(organism));
+                request.setAttribute("unreferencedExternalResources", organismBean.getUnusedExternalResourcesForOrganism(organism));
                 request.getRequestDispatcher("/organismForm.ftl").forward(request, response);
             }
             catch(NullPointerException | NumberFormatException ex)
@@ -207,10 +210,10 @@ public class OrganismController extends HttpServlet {
                 request.setAttribute("organism", organism);
                 request.setAttribute("allOrganisms", em.createNamedQuery("Organism.findAll").getResultList());
                 // Hierarchy categories
-                request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
                 
                 // Finding all external resources where entry is missing
-                request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getOrganismBean().getUnusedExternalResourcesForOrganism(organism));
+                request.setAttribute("unreferencedExternalResources", organismBean.getUnusedExternalResourcesForOrganism(organism));
 
                 request.getRequestDispatcher("/organismForm.ftl").forward(request, response);
             }
@@ -235,7 +238,7 @@ public class OrganismController extends HttpServlet {
                     organism.setHierarchyCategoryId(formValidation.getFormField("hierarchyCategoryId").getValueAsInteger());
                     organism.setParentOrganismId(formValidation.getFormField("parentOrganismId").getValueAsInteger());
                     
-                    organism = SessionControllerGetter.getOrganismBean().storeOrganismWithLocalName(
+                    organism = organismBean.storeOrganismWithLocalName(
                             organism,
                             formValidation.getFormField("localName").getWebValue(),
                             SessionLocaleUtil.getCurrentLocale(request)
@@ -250,7 +253,7 @@ public class OrganismController extends HttpServlet {
                            cropCategoryIds.add(Integer.valueOf(idStr));
                        }
                     }
-                    SessionControllerGetter.getOrganismBean().storeOrganismCropCategories(user.getOrganizationId().getOrganizationId(), organism, cropCategoryIds);
+                    organismBean.storeOrganismCropCategories(user.getOrganizationId().getOrganizationId(), organism, cropCategoryIds);
                     
                     //System.out.println(formValidation.getFormFields().toString());
                     if(formValidation.getMultipleMapFormFields().get("externalResourceIdentifier") != null)
@@ -268,7 +271,7 @@ public class OrganismController extends HttpServlet {
                             OrganismExternalResourcePK pk = new OrganismExternalResourcePK(organism.getOrganismId(), externalResourceId);
                             organismExternalResource.setOrganismExternalResourcePK(pk);
                             organismExternalResource.setResourceIdentifier(identifierField.getWebValue());
-                            SessionControllerGetter.getOrganismBean().storeOrganismExternalResource(organismExternalResource);
+                            organismBean.storeOrganismExternalResource(organismExternalResource);
                         }
                     }
                     // Need to refresh organism after storing the external resources
@@ -276,13 +279,13 @@ public class OrganismController extends HttpServlet {
                     request.setAttribute("organism", refreshedOrganism);
                     if(refreshedOrganism.getIsCrop())
                     {
-                        request.setAttribute("cropCategories", SessionControllerGetter.getOrganismBean().getCropCategories(user.getOrganizationId().getOrganizationId()));
+                        request.setAttribute("cropCategories", organismBean.getCropCategories(user.getOrganizationId().getOrganizationId()));
                     }
                     request.setAttribute("allOrganisms", em.createNamedQuery("Organism.findAll").getResultList());
                     // Hierarchy categories
-                    request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+                    request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
                     // Finding all external resources where entry is missing
-                    request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getOrganismBean().getUnusedExternalResourcesForOrganism(refreshedOrganism));
+                    request.setAttribute("unreferencedExternalResources", organismBean.getUnusedExternalResourcesForOrganism(refreshedOrganism));
                     request.setAttribute("messageKey", organismId > 0 ? "organismUpdated" : "organismRegistered");
                     request.getRequestDispatcher("/organismForm.ftl").forward(request, response);
                 }
@@ -291,7 +294,7 @@ public class OrganismController extends HttpServlet {
                     request.setAttribute("formValidation", formValidation);
                     request.setAttribute("organism", organism);
                     // Finding all external resources where entry is missing
-                    request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getOrganismBean().getUnusedExternalResourcesForOrganism(organism));
+                    request.setAttribute("unreferencedExternalResources", organismBean.getUnusedExternalResourcesForOrganism(organism));
                     request.getRequestDispatcher("/organismForm.ftl").forward(request, response);
                 }
             }
@@ -319,7 +322,7 @@ public class OrganismController extends HttpServlet {
                 Integer organismId = Integer.valueOf(request.getParameter("organismId"));
                 Organism organism = em.find(Organism.class, organismId);
                 String parentOrganismId = organism.getParentOrganismId() != null ? String.valueOf(organism.getParentOrganismId()) : "null";
-                if(SessionControllerGetter.getOrganismBean().deleteOrganism(organismId))
+                if(organismBean.deleteOrganism(organismId))
                 {
                     // Route back to where we were with confirmation message
                     response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://").append(ServletUtil.getServerName(request)).append("/organism?action=listChildOrganisms&organismId=").append(parentOrganismId).append("&messageKey=organismDeleted").toString());
@@ -358,10 +361,10 @@ public class OrganismController extends HttpServlet {
             if(cropOrganismId != null && cropOrganismId > 0)
             {
                 request.setAttribute("cropOrganismId", cropOrganismId);
-                CropPest cropPest = SessionControllerGetter.getOrganismBean().getCropPest(cropOrganismId);
+                CropPest cropPest = organismBean.getCropPest(cropOrganismId);
                 request.setAttribute("cropPest", cropPest);
             }
-            request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+            request.setAttribute("hierarchyCategories", organismBean.getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
             request.setAttribute("messageKey", request.getParameter("messageKey"));
             request.getRequestDispatcher("/cropPestForm.ftl").forward(request, response);
         }
@@ -387,7 +390,7 @@ public class OrganismController extends HttpServlet {
                     cropPest.setIncludeAllChildCrops(includeAllChildCrops);
                     cropPest.setPestOrganismIds(pestOrganismIds);
                     
-                    SessionControllerGetter.getOrganismBean().storeCropPest(cropPest);
+                    organismBean.storeCropPest(cropPest);
                     
                     response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://").append(ServletUtil.getServerName(request)).append("/organism?action=editCropPest&cropOrganismId=").append(cropOrganismId).append("&messageKey=cropPestUpdated").toString());
                 }
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java
index 68f30fcbefa199f806de82884ecc2dadf561afaa..d139855447a5e7fb2de7c8d0105ae684ca0d28be 100644
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java
@@ -23,26 +23,30 @@ import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.TimeZone;
+import javax.ejb.EJB;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import no.nibio.vips.gis.GISUtil;
 import no.nibio.vips.gis.LonLatStringFormatException;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.Organization;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.util.Globals;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.util.ServletUtil;
 import no.nibio.web.forms.FormValidation;
 import no.nibio.web.forms.FormValidationException;
 import no.nibio.web.forms.FormValidator;
 
 /**
- * @copyright 2019 <a href="http://www.bioforsk.no/">Bioforsk</a>
- * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ * @copyright 2019-2022 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class OrganizationController extends HttpServlet {
+    
+    @EJB
+    UserBean userBean;
    
     /** 
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
@@ -66,7 +70,7 @@ public class OrganizationController extends HttpServlet {
         // the user is a member
         if(action == null && user.isSuperUser())
         {
-            List<Organization> organizations = SessionControllerGetter.getUserBean().getTopLevelOrganizations();
+            List<Organization> organizations = userBean.getTopLevelOrganizations();
             request.setAttribute("organizations", organizations);
             request.getRequestDispatcher("/organizationList.ftl").forward(request, response);
         }
@@ -76,8 +80,8 @@ public class OrganizationController extends HttpServlet {
             List<VipsLogicUser> organizationUsers;
             try
             {
-                organization = SessionControllerGetter.getUserBean().getOrganization(Integer.valueOf(request.getParameter("organizationId")));
-                organizationUsers = SessionControllerGetter.getUserBean().getUsersByOrganization(organization.getOrganizationId());
+                organization = userBean.getOrganization(Integer.valueOf(request.getParameter("organizationId")));
+                organizationUsers = userBean.getUsersByOrganization(organization.getOrganizationId());
                 Collections.sort(organizationUsers);
             }
             catch(NumberFormatException ex)
@@ -95,7 +99,7 @@ public class OrganizationController extends HttpServlet {
             
             request.setAttribute("messageKey", request.getParameter("messageKey") != null ? request.getParameter("messageKey") : null);
             request.setAttribute("organizationUsers", organizationUsers);
-            request.setAttribute("countries", SessionControllerGetter.getUserBean().getCountries());
+            request.setAttribute("countries", userBean.getCountries());
             request.setAttribute("timeZones", TimeZone.getAvailableIDs());
             request.setAttribute("organization", organization);
             request.getRequestDispatcher("/organizationForm.ftl").forward(request, response);
@@ -106,7 +110,7 @@ public class OrganizationController extends HttpServlet {
             {
                 Integer organizationId = Integer.valueOf(request.getParameter("organizationId"));
                 Organization organization = organizationId > 0 ? 
-                        SessionControllerGetter.getUserBean().getOrganization(organizationId)
+                        userBean.getOrganization(organizationId)
                         : new Organization();
                 
                 FormValidation formValidation = FormValidator.validateForm("organizationForm", request, getServletContext());
@@ -116,13 +120,13 @@ public class OrganizationController extends HttpServlet {
                     organization.setAddress1(formValidation.getFormField("address1").getWebValue());
                     organization.setAddress2(formValidation.getFormField("address2").getWebValue());
                     organization.setPostalCode(formValidation.getFormField("postalCode").getWebValue());
-                    organization.setCountryCode(SessionControllerGetter.getUserBean().getCountry(formValidation.getFormField("countryCode").getWebValue()));
+                    organization.setCountryCode(userBean.getCountry(formValidation.getFormField("countryCode").getWebValue()));
                     organization.setCity(formValidation.getFormField("city").getWebValue());
                     organization.setDefaultLocale(formValidation.getFormField("defaultLocale").getWebValue());
                     organization.setDefaultTimeZone(formValidation.getFormField("defaultTimeZone").getWebValue());
                     organization.setVipswebUrl(formValidation.getFormField("vipswebUrl").getWebValue());
                     Integer archiveUserId = formValidation.getFormField("archiveUserId").getValueAsInteger();
-                    organization.setArchiveUser(archiveUserId > 0 ? SessionControllerGetter.getUserBean().getVipsLogicUser(archiveUserId) : null);
+                    organization.setArchiveUser(archiveUserId > 0 ? userBean.getVipsLogicUser(archiveUserId) : null);
                     organization.setDefaultVipsCoreUserId(
                             formValidation.getFormField("defaultVipsCoreUserId").isEmpty() ? 
                                     null
@@ -139,7 +143,7 @@ public class OrganizationController extends HttpServlet {
                                     : new GISUtil().getJtsPointFromString(formValidation.getFormField("defaultMapCenter").getWebValue())
                     );
                     
-                    organization = SessionControllerGetter.getUserBean().storeOrganization(organization);
+                    organization = userBean.storeOrganization(organization);
                     
                     response.sendRedirect(
                             Globals.PROTOCOL + "://" + ServletUtil.getServerName(request)
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationGroupController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationGroupController.java
index 3609acda8d9b3cb691e099adbfbb99668f9af1f4..cbca3e4299f56ef1b857f36f2ec646a952744919 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationGroupController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationGroupController.java
@@ -20,26 +20,31 @@ package no.nibio.vips.logic.controller.servlet;
 
 import java.io.IOException;
 import java.util.List;
+import javax.ejb.EJB;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.Organization;
 import no.nibio.vips.logic.entity.OrganizationGroup;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.util.Globals;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.util.ServletUtil;
 import no.nibio.web.forms.FormValidation;
 import no.nibio.web.forms.FormValidationException;
 import no.nibio.web.forms.FormValidator;
 
 /**
- *
- * @author treinar
+ * @copyright 2022 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class OrganizationGroupController extends HttpServlet {
 
+    
+    @EJB
+    UserBean userBean;
+    
     /**
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
      * methods.
@@ -64,13 +69,13 @@ public class OrganizationGroupController extends HttpServlet {
                 Organization organization = user.getOrganizationId();
                 if(user.isSuperUser() && request.getParameter("organizationId") != null)
                 {
-                    organization = SessionControllerGetter.getUserBean().getOrganization(Integer.valueOf(request.getParameter("organizationId")));
+                    organization = userBean.getOrganization(Integer.valueOf(request.getParameter("organizationId")));
                 }
-                groups = SessionControllerGetter.getUserBean().getOrganizationGroups(organization);
+                groups = userBean.getOrganizationGroups(organization);
             }
             else
             {
-                groups = SessionControllerGetter.getUserBean().getOrganizationGroups(user);
+                groups = userBean.getOrganizationGroups(user);
             }
             request.setAttribute("organizationGroups", groups);
             request.setAttribute("messageKey",request.getParameter("messageKey"));
@@ -82,13 +87,13 @@ public class OrganizationGroupController extends HttpServlet {
             {
                 // TODO: Restrict group access based on user privileges
                 Integer organizationGroupId = Integer.valueOf(request.getParameter("organizationGroupId"));
-                OrganizationGroup oGroup = organizationGroupId > 0 ? SessionControllerGetter.getUserBean().getOrganizationGroup(organizationGroupId)
+                OrganizationGroup oGroup = organizationGroupId > 0 ? userBean.getOrganizationGroup(organizationGroupId)
                         : new OrganizationGroup();
 
                 request.setAttribute("messageKey",request.getParameter("messageKey"));
                 request.setAttribute("organizationGroup", oGroup);
-                request.setAttribute("users", SessionControllerGetter.getUserBean().getUsers(user.getOrganizationId()));
-                request.setAttribute("memberIds", SessionControllerGetter.getUserBean().getOrganizationGroupMemberIds(oGroup));
+                request.setAttribute("users", userBean.getUsers(user.getOrganizationId()));
+                request.setAttribute("memberIds", userBean.getOrganizationGroupMemberIds(oGroup));
                 request.getRequestDispatcher("organizationGroupForm.ftl").forward(request, response);
             }
             catch(NullPointerException | NumberFormatException ex)
@@ -102,7 +107,7 @@ public class OrganizationGroupController extends HttpServlet {
             {
                 Integer organizationGroupId = Integer.valueOf(request.getParameter("organizationGroupId"));
                 OrganizationGroup oGroup = organizationGroupId > 0 ? 
-                        SessionControllerGetter.getUserBean().getOrganizationGroup(organizationGroupId)
+                        userBean.getOrganizationGroup(organizationGroupId)
                         :new OrganizationGroup();
                 
                 // Validate form fields (except uploaded file)
@@ -121,7 +126,7 @@ public class OrganizationGroupController extends HttpServlet {
                     }
                     
                     // Store the organizationGroup
-                    oGroup = SessionControllerGetter.getUserBean().storeOrganizationGroup(oGroup, formValidation.getFormField("organizationGroupUserIds").getWebValues());
+                    oGroup = userBean.storeOrganizationGroup(oGroup, formValidation.getFormField("organizationGroupUserIds").getWebValues());
                     
                     response.sendRedirect(
                             Globals.PROTOCOL + "://" + ServletUtil.getServerName(request)
@@ -141,11 +146,11 @@ public class OrganizationGroupController extends HttpServlet {
             if(user.isOrganizationAdmin() || user.isSuperUser())
             {
                 Integer organizationGroupId = Integer.valueOf(request.getParameter("organizationGroupId"));
-                OrganizationGroup oGroup = SessionControllerGetter.getUserBean().getOrganizationGroup(organizationGroupId);
+                OrganizationGroup oGroup = userBean.getOrganizationGroup(organizationGroupId);
                 String messageKey = "";
                 if(oGroup != null)
                 {
-                    SessionControllerGetter.getUserBean().deleteOrganizationGroup(oGroup);
+                    userBean.deleteOrganizationGroup(oGroup);
                     messageKey = "organizationGroupDeleted";
                 }
                 
@@ -168,13 +173,13 @@ public class OrganizationGroupController extends HttpServlet {
                 if(user.isSuperUser() || user.isOrganizationAdmin())
                 {
                     Integer userId = Integer.valueOf(request.getParameter("userId"));
-                    viewUser = SessionControllerGetter.getUserBean().getVipsLogicUser(userId);
+                    viewUser = userBean.getVipsLogicUser(userId);
                 }
                 else
                 {
                     viewUser = user;
                 }
-                List<OrganizationGroup> userGroups = SessionControllerGetter.getUserBean().getOrganizationGroups(viewUser);
+                List<OrganizationGroup> userGroups = userBean.getOrganizationGroups(viewUser);
                 request.setAttribute("viewUser", user);
                 request.setAttribute("userGroups", userGroups);
                 request.getRequestDispatcher("userOrganizationGroupsList.ftl").forward(request, response);
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java
index f829adbef049020735e1c595390dd289eab2d645..97ce9d8d1830d1755b1a2a53491ac2df9599b6dd 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java
@@ -28,6 +28,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.servlet.ServletException;
@@ -45,16 +46,16 @@ import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.entity.VipsLogicRole;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.entity.WeatherStationDataSource;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.util.ExceptionUtil;
 import no.nibio.vips.util.ServletUtil;
 import no.nibio.vips.logic.entity.WeatherForecastProvider;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
 import no.nibio.vips.gis.GISUtil;
+import no.nibio.vips.logic.controller.session.ForecastBean;
+import no.nibio.vips.logic.controller.session.ObservationBean;
+import no.nibio.vips.logic.controller.session.PointOfInterestBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.Observation;
-import no.nibio.vips.logic.entity.PointOfInterestType;
-import no.nibio.vips.logic.entity.PointOfInterestTypeFarm;
-import no.nibio.vips.logic.entity.PointOfInterestTypeField;
 import no.nibio.vips.logic.entity.helpers.PointOfInterestFactory;
 import no.nibio.vips.logic.util.Globals;
 import no.nibio.vips.logic.util.SystemTime;
@@ -66,12 +67,23 @@ import org.apache.http.client.utils.URIBuilder;
 
 /**
  * Handles transactions for POIs
- * @copyright 2013-2019 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2013-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class PointOfInterestController extends HttpServlet {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
+    
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    @EJB
+    UserBean userBean;
+    @EJB
+    ForecastBean forecastBean;
+    @EJB
+    ObservationBean observationBean;
+    
+    
     /**
      * Processes requests for both HTTP
      * <code>GET</code> and
@@ -116,24 +128,24 @@ public class PointOfInterestController extends HttpServlet {
                                 :user.getOrganizationId().getOrganizationId();
                         if(organizationId.equals(-1))
                         {
-                            activeWeatherStations = SessionControllerGetter.getPointOfInterestBean().getAllWeatherStations(true);
-                            inactiveWeatherStations = SessionControllerGetter.getPointOfInterestBean().getAllWeatherStations(false);
+                            activeWeatherStations = pointOfInterestBean.getAllWeatherStations(true);
+                            inactiveWeatherStations = pointOfInterestBean.getAllWeatherStations(false);
                         }
                         else
                         {
                             organization = em.find(Organization.class, organizationId);
-                            activeWeatherStations = SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForOrganization(organization, true);
-                            inactiveWeatherStations = SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForOrganization(organization, false);
+                            activeWeatherStations = pointOfInterestBean.getWeatherstationsForOrganization(organization, true);
+                            inactiveWeatherStations = pointOfInterestBean.getWeatherstationsForOrganization(organization, false);
                         }
-                        request.setAttribute("organizations", SessionControllerGetter.getUserBean().getOrganizations());
+                        request.setAttribute("organizations", userBean.getOrganizations());
                         request.setAttribute("organizationId", organizationId);
                         
                     }
                     else
                     {
                         organization = user.getOrganizationId();
-                        activeWeatherStations = SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForOrganization(organization,true);
-                        inactiveWeatherStations = SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForOrganization(organization, false);
+                        activeWeatherStations = pointOfInterestBean.getWeatherstationsForOrganization(organization,true);
+                        inactiveWeatherStations = pointOfInterestBean.getWeatherstationsForOrganization(organization, false);
                         request.setAttribute("organizationId", organization.getOrganizationId());
                     }
                     
@@ -159,7 +171,7 @@ public class PointOfInterestController extends HttpServlet {
                 // Single view
                 else
                 {
-                    PointOfInterest weatherStation = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(Integer.valueOf(pointOfInterestId));
+                    PointOfInterest weatherStation = pointOfInterestBean.getPointOfInterest(Integer.valueOf(pointOfInterestId));
                     if(weatherStation instanceof PointOfInterestWeatherStation)
                     {
                         PointOfInterestWeatherStation stationWithDataSource = (PointOfInterestWeatherStation) weatherStation;
@@ -187,7 +199,7 @@ public class PointOfInterestController extends HttpServlet {
             }
             else if(action.equals("newWeatherStationForm"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     try
                     {
@@ -195,14 +207,14 @@ public class PointOfInterestController extends HttpServlet {
                         request.getSession().setAttribute("weatherStation", weatherStation);
                         request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                         request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
-                        request.getSession().setAttribute("dataSources", SessionControllerGetter.getPointOfInterestBean().getWeatherStationDataSources());
+                        request.getSession().setAttribute("dataSources", pointOfInterestBean.getWeatherStationDataSources());
                         request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                         request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                         request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
                         request.getSession().setAttribute("defaultCountryCode", user.getOrganizationId().getCountryCode().getCountryCode());
                         request.getSession().setAttribute("weatherForecastProviders", em.createNamedQuery("WeatherForecastProvider.findAll").getResultList());
                         // Finding all external resources where entry is missing
-                        request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getPointOfInterestBean().getUnusedExternalResourcesForPointOfInterest(weatherStation));
+                        request.setAttribute("unreferencedExternalResources", pointOfInterestBean.getUnusedExternalResourcesForPointOfInterest(weatherStation));
                 
                         if(user.isSuperUser())
                         {
@@ -227,7 +239,7 @@ public class PointOfInterestController extends HttpServlet {
             // Authorization: ORGANIZATION ADMIN or SUPERUSER
             else if(action.equals("editWeatherStationForm"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     try
                     {
@@ -236,14 +248,14 @@ public class PointOfInterestController extends HttpServlet {
                         request.getSession().setAttribute("weatherStation", weatherStation);
                         request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                         request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
-                        request.getSession().setAttribute("dataSources", SessionControllerGetter.getPointOfInterestBean().getWeatherStationDataSources());
+                        request.getSession().setAttribute("dataSources", pointOfInterestBean.getWeatherStationDataSources());
                         request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                         request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                         request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
                         request.getSession().setAttribute("defaultCountryCode", user.getOrganizationId().getCountryCode().getCountryCode());
                         request.getSession().setAttribute("weatherForecastProviders", em.createNamedQuery("WeatherForecastProvider.findAll").getResultList());
                         // Finding all external resources where entry is missing
-                        request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getPointOfInterestBean().getUnusedExternalResourcesForPointOfInterest(weatherStation));
+                        request.setAttribute("unreferencedExternalResources", pointOfInterestBean.getUnusedExternalResourcesForPointOfInterest(weatherStation));
                         request.setAttribute("messageKey", request.getParameter("messageKey"));
                         if(user.isSuperUser())
                         {
@@ -267,7 +279,7 @@ public class PointOfInterestController extends HttpServlet {
             // Authorization: ORGANIZATION ADMIN or SUPERUSER
             else if(action.equals("weatherStationFormSubmit"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     try
                     {
@@ -327,7 +339,7 @@ public class PointOfInterestController extends HttpServlet {
                                 weatherStation.setUserId(user);
                             }
                             // Store
-                            weatherStation = SessionControllerGetter.getPointOfInterestBean().storeWeatherStation(weatherStation);
+                            weatherStation = pointOfInterestBean.storeWeatherStation(weatherStation);
                             
                             Map<String, FormField> externalResourceIdentifiers = formValidation.getMultipleMapFormFields().get("externalResourceIdentifier");
                             if(externalResourceIdentifiers != null)
@@ -339,7 +351,7 @@ public class PointOfInterestController extends HttpServlet {
                                     if(identifierField.getWebValue() == null || identifierField.getWebValue().isEmpty())
                                     {
                                         // We delete existing if unset
-                                        SessionControllerGetter.getPointOfInterestBean().deletePointOfInterestExternalResource(weatherStation.getPointOfInterestId(), externalResourceId);
+                                        pointOfInterestBean.deletePointOfInterestExternalResource(weatherStation.getPointOfInterestId(), externalResourceId);
                                     }
                                     else
                                     {
@@ -348,7 +360,7 @@ public class PointOfInterestController extends HttpServlet {
                                         PointOfInterestExternalResourcePK pk = new PointOfInterestExternalResourcePK(weatherStation.getPointOfInterestId(), externalResourceId);
                                         poiExternalResource.setPointOfInterestExternalResourcePK(pk);
                                         poiExternalResource.setResourceIdentifier(identifierField.getWebValue());
-                                        SessionControllerGetter.getPointOfInterestBean().storePointOfInterestExternalResource(poiExternalResource);
+                                        pointOfInterestBean.storePointOfInterestExternalResource(poiExternalResource);
                                     }
                                 }
                             }
@@ -367,7 +379,7 @@ public class PointOfInterestController extends HttpServlet {
                             request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                             request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
                             request.setAttribute("returnURL","weatherStation?organizationId=" + user.getOrganizationId().getOrganizationId());
-                            request.getSession().setAttribute("dataSources", SessionControllerGetter.getPointOfInterestBean().getWeatherStationDataSources());
+                            request.getSession().setAttribute("dataSources", pointOfInterestBean.getWeatherStationDataSources());
                             request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                             request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                             request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
@@ -387,13 +399,13 @@ public class PointOfInterestController extends HttpServlet {
             }
             else if(action.equals("deleteWeatherStationPreview"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     try
                     {
                         Integer pointOfInterestId = Integer.valueOf(request.getParameter("pointOfInterestId"));
                         PointOfInterestWeatherStation weatherStation = em.find(PointOfInterestWeatherStation.class, pointOfInterestId);
-                        List<ForecastConfiguration> forecastConfigurations = SessionControllerGetter.getForecastBean().getForecastConfigurationsByWeatherStation(weatherStation);
+                        List<ForecastConfiguration> forecastConfigurations = forecastBean.getForecastConfigurationsByWeatherStation(weatherStation);
                         // If no strings attached, delete immediately
                         if(forecastConfigurations.isEmpty())
                         {
@@ -405,7 +417,7 @@ public class PointOfInterestController extends HttpServlet {
                         }
                         else
                         {
-                            Map<String, ModelInformation> modelInformationMap = SessionControllerGetter.getForecastBean().getIndexedModelInformation();
+                            Map<String, ModelInformation> modelInformationMap = forecastBean.getIndexedModelInformation();
                             request.setAttribute("returnURL","weatherStation?action=editWeatherStationForm&pointOfInterestId=" + pointOfInterestId);
                             request.setAttribute("weatherStation", weatherStation);
                             request.setAttribute("forecastConfigurations", forecastConfigurations);
@@ -425,13 +437,13 @@ public class PointOfInterestController extends HttpServlet {
             }
             else if(action.equals("deleteWeatherStation"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     try
                     {
                         Integer pointOfInterestId = Integer.valueOf(request.getParameter("pointOfInterestId"));
                         //PointOfInterestWeatherStation weatherStation = em.find(PointOfInterestWeatherStation.class, pointOfInterestId);
-                        SessionControllerGetter.getPointOfInterestBean().deleteWeatherStation(pointOfInterestId);
+                        pointOfInterestBean.deleteWeatherStation(pointOfInterestId);
                         response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://")
                                 .append(ServletUtil.getServerName(request))
                                 .append("/weatherStation")
@@ -467,26 +479,26 @@ public class PointOfInterestController extends HttpServlet {
                                 :user.getOrganizationId().getOrganizationId();
                         if(organizationId.equals(-1))
                         {
-                            pois = SessionControllerGetter.getPointOfInterestBean().getAllPois();
+                            pois = pointOfInterestBean.getAllPois();
                         }
                         else
                         {
                             organization = em.find(Organization.class, organizationId);
-                            pois = SessionControllerGetter.getPointOfInterestBean().getPoisForOrganization(organization);
+                            pois = pointOfInterestBean.getPoisForOrganization(organization);
                         }
-                        request.setAttribute("organizations", SessionControllerGetter.getUserBean().getOrganizations());
+                        request.setAttribute("organizations", userBean.getOrganizations());
                         request.setAttribute("organizationId", organizationId);
                         
                     }
                     else if(user.isOrganizationAdmin())
                     {
                         organization = user.getOrganizationId();
-                        pois = SessionControllerGetter.getPointOfInterestBean().getPoisForOrganization(organization);
+                        pois = pointOfInterestBean.getPoisForOrganization(organization);
                         request.setAttribute("organizationId", organization.getOrganizationId());
                     }
                     else
                     {
-                        pois = SessionControllerGetter.getPointOfInterestBean().getRelevantPointOfInterestsForUser(user);
+                        pois = pointOfInterestBean.getRelevantPointOfInterestsForUser(user);
                         request.setAttribute("organizationId", user.getOrganizationId().getOrganizationId());
                     }
                     
@@ -511,7 +523,7 @@ public class PointOfInterestController extends HttpServlet {
                 // Single view
                 else
                 {
-                    PointOfInterest poi = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(Integer.valueOf(pointOfInterestId));
+                    PointOfInterest poi = pointOfInterestBean.getPointOfInterest(Integer.valueOf(pointOfInterestId));
                     request.getSession().setAttribute("poi", poi);
                     request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                     request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
@@ -537,11 +549,11 @@ public class PointOfInterestController extends HttpServlet {
                         request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                         request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
                         request.getSession().setAttribute("defaultCountryCode", user.getOrganizationId().getCountryCode().getCountryCode());
-                        request.getSession().setAttribute("groups", user.isSuperUser() || user.isOrganizationAdmin() ? SessionControllerGetter.getUserBean().getOrganizationGroups(user.getOrganizationId())
-                                :SessionControllerGetter.getUserBean().getOrganizationGroups(user));
-                        request.getSession().setAttribute("poiGroupIds", SessionControllerGetter.getPointOfInterestBean().getPoiGroupIds(poi));
+                        request.getSession().setAttribute("groups", user.isSuperUser() || user.isOrganizationAdmin() ? userBean.getOrganizationGroups(user.getOrganizationId())
+                                :userBean.getOrganizationGroups(user));
+                        request.getSession().setAttribute("poiGroupIds", pointOfInterestBean.getPoiGroupIds(poi));
                         // Finding all external resources where entry is missing
-                        request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getPointOfInterestBean().getUnusedExternalResourcesForPointOfInterest(poi));
+                        request.setAttribute("unreferencedExternalResources", pointOfInterestBean.getUnusedExternalResourcesForPointOfInterest(poi));
                 
                         if(user.isSuperUser())
                         {
@@ -572,7 +584,7 @@ public class PointOfInterestController extends HttpServlet {
                     Integer pointOfInterestId = Integer.valueOf(request.getParameter("pointOfInterestId"));
                     PointOfInterest poi = em.find(PointOfInterest.class, pointOfInterestId);
                     // Does the current user have the rights to edit this poi?
-                    if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
+                    if(userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
                             || Objects.equals(user.getUserId(), poi.getUserId().getUserId())
                     )
                     {
@@ -584,11 +596,11 @@ public class PointOfInterestController extends HttpServlet {
                         request.getSession().setAttribute("weatherForecastProviders", em.createNamedQuery("WeatherForecastProvider.findAll").getResultList());
                         request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
                         request.getSession().setAttribute("defaultCountryCode", user.getOrganizationId().getCountryCode().getCountryCode());
-                        request.getSession().setAttribute("groups", user.isSuperUser() || user.isOrganizationAdmin() ? SessionControllerGetter.getUserBean().getOrganizationGroups(user.getOrganizationId())
-                                :SessionControllerGetter.getUserBean().getOrganizationGroups(user));
-                        request.getSession().setAttribute("poiGroupIds", SessionControllerGetter.getPointOfInterestBean().getPoiGroupIds(poi));
+                        request.getSession().setAttribute("groups", user.isSuperUser() || user.isOrganizationAdmin() ? userBean.getOrganizationGroups(user.getOrganizationId())
+                                :userBean.getOrganizationGroups(user));
+                        request.getSession().setAttribute("poiGroupIds", pointOfInterestBean.getPoiGroupIds(poi));
                         // Finding all external resources where entry is missing
-                        request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getPointOfInterestBean().getUnusedExternalResourcesForPointOfInterest(poi));
+                        request.setAttribute("unreferencedExternalResources", pointOfInterestBean.getUnusedExternalResourcesForPointOfInterest(poi));
                         request.setAttribute("messageKey", request.getParameter("messageKey"));
                         if(user.isSuperUser())
                         {
@@ -624,12 +636,12 @@ public class PointOfInterestController extends HttpServlet {
                         PointOfInterest poi = pointOfInterestId > 0 ? 
                                                                         em.find(PointOfInterest.class, pointOfInterestId) 
                                                                         : PointOfInterestFactory.getPointOfInterest(formValidation.getFormField("pointOfInterestTypeId").getValueAsInteger());
-                        if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
+                        if(userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
                             || poi.getPointOfInterestId() == null
                             || Objects.equals(user.getUserId(), poi.getUserId().getUserId())
                             )
                         {
-                            Boolean poiNameAlreadyExists = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(formValidation.getFormField("name").getWebValue()) != null;
+                            Boolean poiNameAlreadyExists = pointOfInterestBean.getPointOfInterest(formValidation.getFormField("name").getWebValue()) != null;
                             // Only store if valid form data and NOT a new poi with an existing poiName
                             if(formValidation.isValid() && !(poi.getPointOfInterestId() == null && poiNameAlreadyExists))
                             {
@@ -637,7 +649,7 @@ public class PointOfInterestController extends HttpServlet {
                                 poi.setName(formValidation.getFormField("name").getWebValue());                                
                                 // A POI is per default not a forecast location. Only superusers and orgadmins 
                                 // may change the status
-                                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+                                if(userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                                 {
                                     poi.setIsForecastLocation(formValidation.getFormField("isForecastLocation").getWebValue() != null);
                                 }
@@ -683,7 +695,7 @@ public class PointOfInterestController extends HttpServlet {
                                     poi.setUserId(user);
                                 }
                                 // Store
-                                poi = SessionControllerGetter.getPointOfInterestBean().storePoi(poi);
+                                poi = pointOfInterestBean.storePoi(poi);
 
                                 Map<String, FormField> externalResourceIdentifiers = formValidation.getMultipleMapFormFields().get("externalResourceIdentifier");
                                 if(externalResourceIdentifiers != null)
@@ -695,7 +707,7 @@ public class PointOfInterestController extends HttpServlet {
                                         if(identifierField.getWebValue() == null || identifierField.getWebValue().isEmpty())
                                         {
                                             // We delete existing if unset
-                                            SessionControllerGetter.getPointOfInterestBean().deletePointOfInterestExternalResource(poi.getPointOfInterestId(), externalResourceId);
+                                            pointOfInterestBean.deletePointOfInterestExternalResource(poi.getPointOfInterestId(), externalResourceId);
                                         }
                                         else
                                         {
@@ -704,12 +716,12 @@ public class PointOfInterestController extends HttpServlet {
                                             PointOfInterestExternalResourcePK pk = new PointOfInterestExternalResourcePK(poi.getPointOfInterestId(), externalResourceId);
                                             poiExternalResource.setPointOfInterestExternalResourcePK(pk);
                                             poiExternalResource.setResourceIdentifier(identifierField.getWebValue());
-                                            SessionControllerGetter.getPointOfInterestBean().storePointOfInterestExternalResource(poiExternalResource);
+                                            pointOfInterestBean.storePointOfInterestExternalResource(poiExternalResource);
                                         }
                                     }
                                 }
                                 
-                                SessionControllerGetter.getPointOfInterestBean().storePointOfInterestOrganizationGroupIds(poi,formValidation.getFormField("organizationGroupIds").getWebValues());
+                                pointOfInterestBean.storePointOfInterestOrganizationGroupIds(poi,formValidation.getFormField("organizationGroupIds").getWebValues());
                                 
                                 String returnIdCallback = request.getParameter("returnIdCallback");
 
@@ -744,7 +756,7 @@ public class PointOfInterestController extends HttpServlet {
                                 request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
                                 request.setAttribute("returnURL","poi?organizationId=" + user.getOrganizationId().getOrganizationId());
                                 // Finding all external resources where entry is missing
-                                request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getPointOfInterestBean().getUnusedExternalResourcesForPointOfInterest(poi));
+                                request.setAttribute("unreferencedExternalResources", pointOfInterestBean.getUnusedExternalResourcesForPointOfInterest(poi));
                                 request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                                 request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                                 request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
@@ -770,7 +782,7 @@ public class PointOfInterestController extends HttpServlet {
                 Integer pointOfInterestId = Integer.valueOf(request.getParameter("pointOfInterestId"));
                 PointOfInterest poi = em.find(PointOfInterest.class, pointOfInterestId);
                 if(
-                        SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
+                        userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
                         || user.getUserId().equals(poi.getUserId().getUserId())
                 )
                 {
@@ -778,10 +790,10 @@ public class PointOfInterestController extends HttpServlet {
                     {
 
                         // Are there forecasts attached to this location
-                        List<ForecastConfiguration> forecastConfigurations = SessionControllerGetter.getForecastBean().getForecastConfigurationsByLocation(poi);
+                        List<ForecastConfiguration> forecastConfigurations = forecastBean.getForecastConfigurationsByLocation(poi);
                         
                         // TODO: Are there observations attached to this location?
-                        List<Observation> observations = SessionControllerGetter.getObservationBean().getObservationsByLocation(poi);
+                        List<Observation> observations = observationBean.getObservationsByLocation(poi);
                         // 
                         // If no strings attached, delete immediately
                         if(forecastConfigurations.isEmpty() && observations.isEmpty())
@@ -794,7 +806,7 @@ public class PointOfInterestController extends HttpServlet {
                         }
                         else
                         {
-                            Map<String, ModelInformation> modelInformationMap = SessionControllerGetter.getForecastBean().getIndexedModelInformation();
+                            Map<String, ModelInformation> modelInformationMap = forecastBean.getIndexedModelInformation();
                             request.setAttribute("returnURL","poi?action=editPoiForm&pointOfInterestId=" + pointOfInterestId);
                             request.setAttribute("poi", poi);
                             request.setAttribute("forecastConfigurations", forecastConfigurations);
@@ -819,13 +831,13 @@ public class PointOfInterestController extends HttpServlet {
                 Integer pointOfInterestId = Integer.valueOf(request.getParameter("pointOfInterestId"));
                 PointOfInterest poi = em.find(PointOfInterest.class, pointOfInterestId);
                 if(
-                        SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
+                        userBean.authorizeUser(user, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
                         || user.getUserId().equals(poi.getUserId().getUserId())
                 )
                 {
                     try
                     {
-                        SessionControllerGetter.getPointOfInterestBean().deletePoi(pointOfInterestId);
+                        pointOfInterestBean.deletePoi(pointOfInterestId);
                         response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://")
                                 .append(ServletUtil.getServerName(request))
                                 .append("/poi")
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/SchedulingController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/SchedulingController.java
index 28dc396a65a9f5cd8360946fabe16d3496a0e17f..da7e5b8895e9282feae0b07dfe838f49649a5cc3 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/SchedulingController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/SchedulingController.java
@@ -28,6 +28,7 @@ import java.text.MessageFormat;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.servlet.ServletException;
@@ -45,7 +46,6 @@ import no.nibio.vips.logic.scheduling.TerminateSchedulerListener;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
 import no.nibio.vips.logic.scheduling.VipsLogicTaskFactory;
 import no.nibio.vips.logic.util.Globals;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.util.ServletUtil;
 import no.nibio.web.forms.FormValidation;
 import no.nibio.web.forms.FormValidationException;
@@ -62,6 +62,11 @@ public class SchedulingController extends HttpServlet {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    UserBean userBean;
+    @EJB
+    SchedulingBean schedulingBean;
+    
     /**
      * Processes requests for both HTTP
      * <code>GET</code> and
@@ -77,8 +82,6 @@ public class SchedulingController extends HttpServlet {
         
         String action = request.getParameter("action");
         VipsLogicUser user = (VipsLogicUser) request.getSession().getAttribute("user");
-        UserBean userBean = SessionControllerGetter.getUserBean();
-        SchedulingBean schedulingBean = SessionControllerGetter.getSchedulingBean();
         
         // Default: Overview of running tasks
         // for SUPERUSERS and ORGANIZATION ADMINS
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java
index 24034d1e7479b47119da499e8e57157c0524628a..5e9d4a3ad79e4e4f7d8b37e63fd8b47aef0e4b10 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java
@@ -32,6 +32,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.NonUniqueResultException;
@@ -52,7 +53,6 @@ import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.entity.misc.UserResources;
 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;
 import no.nibio.web.forms.FormField;
 import no.nibio.web.forms.FormUtil;
@@ -62,13 +62,17 @@ import no.nibio.web.forms.FormValidator;
 
 /**
  * Handles user actions
- * @copyright 2013-2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2013-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class UserController extends HttpServlet {
 
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
+    
+    @EJB
+    UserBean userBean;
+    
     /**
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
      * methods.
@@ -83,7 +87,6 @@ public class UserController extends HttpServlet {
         
         String action = request.getParameter("action");
         VipsLogicUser user = (VipsLogicUser) request.getSession().getAttribute("user");
-        UserBean userBean = SessionControllerGetter.getUserBean();
         
         // Default: View list of users
         // for SUPERUSERS and ORGANIZATION ADMINS
@@ -332,7 +335,7 @@ public class UserController extends HttpServlet {
                                 }
                             }
                             userBean.storeUser(viewUser);
-                            SessionControllerGetter.getUserBean().handleUserStatusChange(oldUserStatusId, viewUser, SessionLocaleUtil.getI18nBundle(request), ServletUtil.getServerName(request));
+                            userBean.handleUserStatusChange(oldUserStatusId, viewUser, SessionLocaleUtil.getI18nBundle(request), ServletUtil.getServerName(request));
                             // Add confirmation message
                             messageKey = "userUpdated";
                         }
@@ -395,7 +398,7 @@ public class UserController extends HttpServlet {
                 {
                     Integer userId = Integer.valueOf(request.getParameter("userId"));
                     VipsLogicUser viewUser = em.find(VipsLogicUser.class, userId);
-                    UserResources userResources = SessionControllerGetter.getUserBean().getUserResources(viewUser);
+                    UserResources userResources = userBean.getUserResources(viewUser);
  
                     // If some resources connected, render form, otherwise, route to user delete
                     if(userResources.isEmpty())
@@ -439,7 +442,7 @@ public class UserController extends HttpServlet {
                     VipsLogicUser viewUser = em.find(VipsLogicUser.class, userId);
                     
                     // Are there resources connected to this user?
-                    UserResources userResources = SessionControllerGetter.getUserBean().getUserResources(viewUser);
+                    UserResources userResources = userBean.getUserResources(viewUser);
                     if(! userResources.isEmpty())
                     {
                         boolean resourcesTransferred = false;
@@ -449,7 +452,7 @@ public class UserController extends HttpServlet {
                             VipsLogicUser transferToUser = em.find(VipsLogicUser.class, transferToUserId);
                             if(transferToUser != null)
                             {
-                                SessionControllerGetter.getUserBean().transferUserResources(viewUser,transferToUser);
+                                userBean.transferUserResources(viewUser,transferToUser);
                                 resourcesTransferred = true;
                             }
                         }
@@ -623,12 +626,12 @@ public class UserController extends HttpServlet {
         else if(action.equals("confirmEmail"))
         {
             String verificationCode = request.getParameter("verificationCode");
-            VipsLogicUser confirmUser = SessionControllerGetter.getUserBean().verifyUserEmail(verificationCode);
+            VipsLogicUser confirmUser = userBean.verifyUserEmail(verificationCode);
             if(confirmUser != null)
             {
                 // Success
                 // Send message to organization admin that user has confirmed his/her email
-                SessionControllerGetter.getUserBean().informAdminOfConfirmedEmail(confirmUser, SessionLocaleUtil.getI18nBundle(request), ServletUtil.getServerName(request));
+                userBean.informAdminOfConfirmedEmail(confirmUser, SessionLocaleUtil.getI18nBundle(request), ServletUtil.getServerName(request));
                 request.setAttribute("messageKey","confirmEmailReceipt");
                 request.getRequestDispatcher("/login.ftl").forward(request, response);
             }
@@ -655,9 +658,9 @@ public class UserController extends HttpServlet {
                     {
                         Integer oldUserStatusId = userToApprove.getUserStatusId();
                         userToApprove.setUserStatusId(Globals.USER_STATUS_APPROVED);
-                        SessionControllerGetter.getUserBean().storeUser(userToApprove);
+                        userBean.storeUser(userToApprove);
                         // Handle user status change
-                        SessionControllerGetter.getUserBean().handleUserStatusChange(oldUserStatusId, userToApprove, SessionLocaleUtil.getI18nBundle(request), ServletUtil.getServerName(request));
+                        userBean.handleUserStatusChange(oldUserStatusId, userToApprove, SessionLocaleUtil.getI18nBundle(request), ServletUtil.getServerName(request));
                         response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://").append(ServletUtil.getServerName(request)).append("/user").append("?messageKey=").append("userApproved").toString());
                     }
                 }
@@ -690,7 +693,7 @@ public class UserController extends HttpServlet {
             creds.put("username", username);
             creds.put("password", password);
 
-            VipsLogicUser searchUser = SessionControllerGetter.getUserBean().authenticateUser(creds);
+            VipsLogicUser searchUser = userBean.authenticateUser(creds);
 
             if(searchUser != null)
             {
@@ -700,7 +703,7 @@ public class UserController extends HttpServlet {
                 userAuth.setUsername((String)request.getSession().getAttribute("openId"));
                 UserAuthenticationPK pk = new UserAuthenticationPK(searchUser.getUserId(), userAuthenticationType.getUserAuthenticationTypeId());
                 userAuth.setUserAuthenticationPK(pk);
-                SessionControllerGetter.getUserBean().storeUserAuthentication(userAuth);
+                userBean.storeUserAuthentication(userAuth);
                 //em.persist(userAuth);
                 request.setAttribute("messageKey", "attachIdToExistingUserReceipt");
                 request.getRequestDispatcher("/login.ftl").forward(request, response);
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 84f69950769af32a4b74f7ae9fa0f0981f3e8092..57d32334b41cfff34cbe8175e5bd4e3e52a1531d 100755
--- a/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
@@ -45,6 +45,7 @@ import java.util.UUID;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
@@ -84,7 +85,7 @@ import org.apache.commons.lang.StringUtils;
 import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
 
 /**
- * @copyright 2013-2017 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2013-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Stateless
@@ -93,6 +94,12 @@ public class ForecastBean {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    ForecastBean forecastBean;
+    
+    @EJB
+    UserBean userBean;
+    
     /**
      * Returns all forecast results.
      * @return 
@@ -143,7 +150,7 @@ public class ForecastBean {
                 return false;
             }
             UUID uUUID = UUID.fromString(userUUID);
-            VipsLogicUser user = SessionControllerGetter.getUserBean().findVipsLogicUser(uUUID);
+            VipsLogicUser user = userBean.findVipsLogicUser(uUUID);
             if(user == null || ! user.getUserId().equals( fc.getVipsLogicUserId().getUserId()))
             {
                 return false;
@@ -674,7 +681,7 @@ public class ForecastBean {
                         List<Result> results = (List<Result>) resp.readEntity(new GenericType<List<Result>>(){});
                         //System.out.println("ForecastConfigId=" + forecastConfiguration.getForecastConfigurationId() + ", resultsize=" + results.size());
                         // We delete all former results before we store the new ones
-                        SessionControllerGetter.getForecastBean().storeResults(forecastConfiguration,results);
+                        forecastBean.storeResults(forecastConfiguration,results);
                     }
                     else
                     {
diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java
index 8d54d5c6cabe7cdf19862187aceb3ae7411be31e..412b233231aad5639f8f1ec8e438e24d8d8dc6e4 100755
--- a/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java
@@ -39,6 +39,7 @@ import java.util.Map.Entry;
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
@@ -58,7 +59,6 @@ import no.nibio.vips.logic.entity.PointOfInterest;
 import no.nibio.vips.logic.entity.PolygonService;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 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.observationdata.ObservationDataSchema;
 import no.nibio.vips.observationdata.ObservationDataSchemaPK;
@@ -77,6 +77,11 @@ public class ObservationBean {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    @EJB
+    UserBean userBean;
+    
     public List<Observation> getObservations(Integer organizationId)
     {
         Organization organization = em.find(Organization.class,organizationId);
@@ -483,7 +488,7 @@ public class ObservationBean {
         {
             return observations;
         }
-         List<PointOfInterest> pois = SessionControllerGetter.getPointOfInterestBean().getPois(locationPointOfInterestIds);
+         List<PointOfInterest> pois = pointOfInterestBean.getPois(locationPointOfInterestIds);
          Map<Integer, PointOfInterest> mappedPois = new HashMap<>();
          pois.stream().forEach((poi) -> {
              mappedPois.put(poi.getPointOfInterestId(), poi);
@@ -504,7 +509,7 @@ public class ObservationBean {
         {
             return observations;
         }
-         List<VipsLogicUser> users = SessionControllerGetter.getUserBean().getUsers(userIds);
+         List<VipsLogicUser> users = userBean.getUsers(userIds);
          Map<Integer, VipsLogicUser> mappedUsers = new HashMap<>();
          users.stream().forEach((user) -> {
              mappedUsers.put(user.getUserId(), user);
diff --git a/src/main/java/no/nibio/vips/logic/controller/session/PointOfInterestBean.java b/src/main/java/no/nibio/vips/logic/controller/session/PointOfInterestBean.java
index 3d83a3b3161151017d5617305c626be38275e9f6..cc7997f767133461935a74f143769c3391fa298a 100755
--- a/src/main/java/no/nibio/vips/logic/controller/session/PointOfInterestBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/PointOfInterestBean.java
@@ -34,6 +34,7 @@ import java.util.Objects;
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 import javax.ejb.LocalBean;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
@@ -67,6 +68,11 @@ public class PointOfInterestBean {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    ForecastBean forecastBean;
+    @EJB
+    ObservationBean observationBean;
+    
     public List<PointOfInterest> getWeatherstations(String countryCode)
     {
         Query q = em.createNamedQuery("PointOfInterest.findByPointOfInterestTypeAndCountryCode");
@@ -324,7 +330,7 @@ public class PointOfInterestBean {
     public void deleteWeatherStation(Integer pointOfInterestId)
     {
         PointOfInterestWeatherStation weatherStation = em.find(PointOfInterestWeatherStation.class, pointOfInterestId);
-        SessionControllerGetter.getForecastBean().deleteForecastConfigurationsForWeatherStation(weatherStation);
+        forecastBean.deleteForecastConfigurationsForWeatherStation(weatherStation);
         em.remove(weatherStation);
     }
 
@@ -360,8 +366,8 @@ public class PointOfInterestBean {
 
     public void deletePoi(Integer pointOfInterestId) {
         PointOfInterest poi = em.find(PointOfInterest.class, pointOfInterestId);
-        SessionControllerGetter.getForecastBean().deleteForecastConfigurationsForLocation(poi);
-        SessionControllerGetter.getObservationBean().deleteObservationsForLocation(poi);
+        forecastBean.deleteForecastConfigurationsForLocation(poi);
+        observationBean.deleteObservationsForLocation(poi);
         em.remove(poi);
     }
 
diff --git a/src/main/java/no/nibio/vips/logic/controller/session/SchedulingBean.java b/src/main/java/no/nibio/vips/logic/controller/session/SchedulingBean.java
index abbfafa0e1ad5087188c56356089b116a9941e40..a0131b2d665cc0e8f31df57fbe4b6786e9dfaceb 100755
--- a/src/main/java/no/nibio/vips/logic/controller/session/SchedulingBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/SchedulingBean.java
@@ -38,6 +38,7 @@ import java.util.Set;
 import java.util.SortedMap;
 import java.util.TimeZone;
 import java.util.TreeMap;
+import javax.ejb.EJB;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
@@ -63,7 +64,6 @@ import no.nibio.vips.logic.scheduling.VipsLogicTaskFactory;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
 import no.nibio.vips.logic.scheduling.model.preprocessor.NaerstadModelPreprocessor;
 import no.nibio.vips.logic.util.Globals;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
 
@@ -77,6 +77,11 @@ public class SchedulingBean {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    UserBean userBean;
+    @EJB
+    ForecastBean forecastBean;
+    
     // There can be only one systemScheduler!
     private static Scheduler systemScheduler;
     
@@ -175,7 +180,7 @@ public class SchedulingBean {
         VIPSLogicTaskCollector modelRunCollector = new VIPSLogicTaskCollector(-1);
         
         // Separating the forecasts for each organization
-        List<Organization> organizations = SessionControllerGetter.getUserBean().getOrganizationsWithActiveForecastConfigurations(SystemTime.getSystemTime());
+        List<Organization> organizations = userBean.getOrganizationsWithActiveForecastConfigurations(SystemTime.getSystemTime());
         if(organizations != null && !organizations.isEmpty())
         {
             for(Organization org:organizations)
@@ -257,7 +262,7 @@ public class SchedulingBean {
             List<Result> results = resp.readEntity(new GenericType<List<Result>>(){});
             
             // We delete all former results before we store the new ones
-            SessionControllerGetter.getForecastBean().storeResults(c,results);
+            forecastBean.storeResults(c,results);
             
             
             
diff --git a/src/main/java/no/nibio/vips/logic/controller/session/UserBean.java b/src/main/java/no/nibio/vips/logic/controller/session/UserBean.java
index 93e95092f25ad123ff5ac355d750bfd411afcf31..cb6f26ede9c7b586b8cb893b269cb7dfc82d60de 100755
--- a/src/main/java/no/nibio/vips/logic/controller/session/UserBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/UserBean.java
@@ -41,6 +41,7 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.ejb.EJB;
 import javax.ejb.LocalBean;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
@@ -59,7 +60,6 @@ import no.nibio.vips.logic.entity.Observation;
 import no.nibio.vips.logic.entity.Organization;
 import no.nibio.vips.logic.entity.OrganizationGroup;
 import no.nibio.vips.logic.entity.PointOfInterest;
-import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.entity.UserAuthentication;
 import no.nibio.vips.logic.entity.UserAuthenticationPK;
 import no.nibio.vips.logic.entity.UserAuthenticationType;
@@ -68,8 +68,8 @@ import no.nibio.vips.logic.entity.UserUuidPK;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.entity.misc.UserResources;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
+import no.nibio.vips.logic.messaging.MessagingBean;
 import no.nibio.vips.logic.util.Globals;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SimpleMailSender;
 import no.nibio.vips.logic.util.StringUtils;
 import no.nibio.vips.util.MD5Encrypter;
@@ -100,6 +100,19 @@ public class UserBean {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    UserBean userBean;
+    @EJB
+    ForecastBean forecastBean;
+    @EJB
+    MessagingBean messagingBean;
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    @EJB
+    MessageBean messageBean;
+    @EJB
+    ObservationBean observationBean;
+    
     private Properties serverProperties;
     private List<Rule> defaultPasswordValidatorRuleList;
     
@@ -216,7 +229,7 @@ public class UserBean {
     {
         // Must double check: NO user can be force deleted without first
         // transferring resources to another user
-        UserResources userResources = SessionControllerGetter.getUserBean().getUserResources(user);
+        UserResources userResources = userBean.getUserResources(user);
         if(! userResources.isEmpty())
         {
             throw new DeleteUserException("User still has resources connected to them.");
@@ -228,12 +241,12 @@ public class UserBean {
             throw new DeleteUserException("User is an archive user for organization " + user.getOrganizationId().getOrganizationName() + ". Can't delete it");
         }
         // Remove all notification subscriptions
-        SessionControllerGetter.getMessagingBean().deleteAllNotificationSubscriptions(user);
+        messagingBean.deleteAllNotificationSubscriptions(user);
         // Remove all User UUIDs
         this.deleteAllUserUuidsForUser(user);
         
         // Delete all of the user's private forecast configurations and results
-        SessionControllerGetter.getForecastBean().deleteAllPrivateForecastConfigurationsForUser(user);
+        forecastBean.deleteAllPrivateForecastConfigurationsForUser(user);
         
         em.remove(user);
     }
@@ -241,12 +254,12 @@ public class UserBean {
     public UserResources getUserResources(VipsLogicUser user)
     {
         UserResources retVal = new UserResources();
-        retVal.setPois(SessionControllerGetter.getPointOfInterestBean().getPoisForUser(user));
-        retVal.setMessageLocales(SessionControllerGetter.getMessageBean().getMessageLocaleList(user));
-        retVal.setForecastConfigurations(SessionControllerGetter.getForecastBean().getForecastConfigurationsForUser(user.getUserId()));
-        List<Observation> observations = SessionControllerGetter.getObservationBean().getObservationsForUser(user);
-        observations.addAll(SessionControllerGetter.getObservationBean().getObservationsLastEditedByUser(user));
-        observations.addAll(SessionControllerGetter.getObservationBean().getObservationsStatusChangedByUser(user));
+        retVal.setPois(pointOfInterestBean.getPoisForUser(user));
+        retVal.setMessageLocales(messageBean.getMessageLocaleList(user));
+        retVal.setForecastConfigurations(forecastBean.getForecastConfigurationsForUser(user.getUserId()));
+        List<Observation> observations = observationBean.getObservationsForUser(user);
+        observations.addAll(observationBean.getObservationsLastEditedByUser(user));
+        observations.addAll(observationBean.getObservationsStatusChangedByUser(user));
         retVal.setObservations(observations);
         return retVal;
     }
diff --git a/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java b/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
index 9ae303f9753a1eb1908652298295024cdd9d3ff1..c9d24318aa54e7c02910b6e29abe187d838efc55 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
@@ -100,7 +100,7 @@ public class MessagingBean {
         // Store it
         em.persist(uMessage);
         
-        ResteasyClient client = new ResteasyClientBuilder().build();
+        ResteasyClient client = (ResteasyClient) ResteasyClientBuilder.newClient();//new ResteasyClientBuilder().build();
         //client.register(new RESTAuthenticator("user", "userPass"));
         client.register(new RESTAuthenticator("VIPSLogic", "plmoknijbuhv000"));
         //ResteasyWebTarget target = client.target("http://kart13utv.ad.skogoglandskap.no:8080");
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 93d453f00bec03d1526a809218f555f15abaaa39..b85bcdf76c8cd64019a244608f9edbd7d05cb7c9 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
@@ -20,10 +20,12 @@
 package no.nibio.vips.logic.messaging.sms;
 
 import com.webcohesion.enunciate.metadata.Facet;
+import javax.ejb.EJB;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.util.SessionControllerGetter;
 
@@ -34,6 +36,9 @@ import no.nibio.vips.logic.util.SessionControllerGetter;
 @Path("rest/sms")
 @Facet("restricted")
 public class SMSHandlingService {
+    
+    @EJB
+    UserBean userBean;
 
     /**
      * Sample of incoming request: /rest/sms/vianett/customer_request
@@ -64,7 +69,7 @@ public class SMSHandlingService {
         reply.setErrorcode("0");
         if(message !=null && sourceaddr != null && username!=null && username.equals("vianett") && password != null && password.equals("plantevern2016"))
         {
-            VipsLogicUser user = SessionControllerGetter.getUserBean().getUserByPhoneNumber(sourceaddr);
+            VipsLogicUser user = userBean.getUserByPhoneNumber(sourceaddr);
             if(user != null)
             {
                 if(message.trim().toUpperCase().equals("STOP"))
@@ -77,7 +82,7 @@ public class SMSHandlingService {
                     user.setApprovesSmsBilling(true);
                     reply.setResponse_msg("Confirmation: Sending and billing of SMS messages from VIPS is started.");
                 }
-                SessionControllerGetter.getUserBean().storeUser(user);
+                userBean.storeUser(user);
                 reply.setResponse_fromalpha("Vips");
                 reply.setResponse_pricegroup("0");
             }
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothController.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothController.java
index 0fa0defcedac622cfd24fbe6f1c3747f26861df0..6a0df4f0e18f9639492996f350f03143ee3cd409 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothController.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothController.java
@@ -20,7 +20,6 @@ package no.nibio.vips.logic.modules.applefruitmoth;
 
 import com.ibm.icu.util.Calendar;
 import java.io.IOException;
-import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -30,10 +29,12 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import javax.ejb.EJB;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.VipsLogicRole;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.util.Globals;
@@ -51,6 +52,12 @@ import no.nibio.web.forms.FormValidator;
  */
 public class AppleFruitMothController extends HttpServlet {
 
+    @EJB
+    UserBean userBean;
+    @EJB
+    AppleFruitMothBean appleFruitMothBean;
+    
+    
     /**
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
      * methods.
@@ -64,13 +71,13 @@ public class AppleFruitMothController extends HttpServlet {
             throws ServletException, IOException {
         response.setContentType("text/html;charset=UTF-8");
         VipsLogicUser user = (VipsLogicUser) request.getSession().getAttribute("user");
-        if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.APPLE_FRUIT_MOTH_ADMINISTRATOR, VipsLogicRole.APPLE_FRUIT_MOTH_BERRY_CLUSTER_COUNTER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+        if(userBean.authorizeUser(user, VipsLogicRole.APPLE_FRUIT_MOTH_ADMINISTRATOR, VipsLogicRole.APPLE_FRUIT_MOTH_BERRY_CLUSTER_COUNTER, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
         {
             String action = request.getParameter("action");
             if(action == null)
             {
                 // Show map and list of existing stations
-                List<ObservationSite> observationSites = SessionControllerGetter.getAppleFruitMothBean().getObservationSitesWithClusterCountLastUpdate();
+                List<ObservationSite> observationSites = appleFruitMothBean.getObservationSitesWithClusterCountLastUpdate();
                 request.setAttribute("observationSites", observationSites);
                 request.getRequestDispatcher("/appleFruitMothStationList.ftl").forward(request, response);
             }
@@ -83,7 +90,7 @@ public class AppleFruitMothController extends HttpServlet {
                     cal.setTime(SystemTime.getSystemTime());
                     Integer lastSeason = cal.get(Calendar.YEAR);
                     Integer currentSeason = request.getParameter("currentSeason") != null ? Integer.valueOf(request.getParameter("currentSeason")) : lastSeason;
-                    ObservationSite observationSite = SessionControllerGetter.getAppleFruitMothBean().getObservationSite(observationSiteId);
+                    ObservationSite observationSite = appleFruitMothBean.getObservationSite(observationSiteId);
                     request.setAttribute("observationSite", observationSite);
                     if(observationSite != null)
                     {
@@ -164,7 +171,7 @@ public class AppleFruitMothController extends HttpServlet {
                 {
                     
                     Integer observationSiteId = Integer.valueOf(request.getParameter("observationSiteId"));
-                    ObservationSite observationSite = SessionControllerGetter.getAppleFruitMothBean().getObservationSite(observationSiteId);
+                    ObservationSite observationSite = appleFruitMothBean.getObservationSite(observationSiteId);
                     if(observationSite != null)
                     {
                         FormValidation formValidation = FormValidator.validateForm("appleFruitMothStationForm", request, getServletContext());
@@ -186,7 +193,7 @@ public class AppleFruitMothController extends HttpServlet {
                             ossc.setThousandBerrySample( !formValidation.getFormField("thousandBerrySample").isEmpty() ? formValidation.getFormField("thousandBerrySample").getValueAsDouble(): null);
                             ossc.setRemarks(formValidation.getFormField("remarks") != null ? formValidation.getFormField("remarks").getWebValue() : "");
                             observationSite.getObservationSiteSeasonCommonDataSet().add(ossc);
-                            SessionControllerGetter.getAppleFruitMothBean().storeObservationSite(observationSite);
+                            appleFruitMothBean.storeObservationSite(observationSite);
                             
                             // Redirect to form
                             response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://")
@@ -219,7 +226,7 @@ public class AppleFruitMothController extends HttpServlet {
                 cal.setTime(SystemTime.getSystemTime());
                 Integer lastSeason = cal.get(Calendar.YEAR);
                 Integer currentSeason = request.getParameter("currentSeason") != null ? Integer.valueOf(request.getParameter("currentSeason")) : lastSeason;
-                ObservationSite observationSite = SessionControllerGetter.getAppleFruitMothBean().getObservationSite(observationSiteId);
+                ObservationSite observationSite = appleFruitMothBean.getObservationSite(observationSiteId);
                 Map<String, ObservationSitePointSeasonData> treeData = new HashMap<>();
 
                 Integer grossClusterAutumnSum = 0;
@@ -282,13 +289,13 @@ public class AppleFruitMothController extends HttpServlet {
                     }
 
                     Integer observationSiteId = Integer.valueOf(request.getParameter("observationSiteId"));
-                    ObservationSite observationSite = SessionControllerGetter.getAppleFruitMothBean().getObservationSite(observationSiteId);
+                    ObservationSite observationSite = appleFruitMothBean.getObservationSite(observationSiteId);
                     
                     ObservationSiteSeasonCommonData seasonCommonData = observationSite.getCommonDataForSeason(currentSeason);
                     if(seasonCommonData != null)
                     {
                         seasonCommonData.setRemarks(request.getParameter("remarks") != null ? request.getParameter("remarks") : "");
-                        SessionControllerGetter.getAppleFruitMothBean().storeObservationSitePointSeasonCommonData(seasonCommonData);
+                        appleFruitMothBean.storeObservationSitePointSeasonCommonData(seasonCommonData);
                     }
                     //System.out.println("sitePointSetLength=" + observationSite.getObservationSitePointSet().size());
                     treeNames.stream().forEach(treeName->{
@@ -298,7 +305,7 @@ public class AppleFruitMothController extends HttpServlet {
                                     .findFirst()
                                     // Need to use orElseGet instead of orElse, otherwise
                                     // a new sitePoint will be created each time
-                                    .orElseGet(()-> SessionControllerGetter.getAppleFruitMothBean().storeObservationSitePoint(new ObservationSitePoint(observationSite, treeName)));
+                                    .orElseGet(()-> appleFruitMothBean.storeObservationSitePoint(new ObservationSitePoint(observationSite, treeName)));
 
                             // TODO: Fill in the correct values from POST data, then store
                             //Set<ObservationSitePointSeasonData> dataSet = point.getObservationSitePointSeasonDataSet();
@@ -316,10 +323,10 @@ public class AppleFruitMothController extends HttpServlet {
                             newData.setSpringDate(springDate);
                             newData.setLastUpdated(new Date());
                             
-                            SessionControllerGetter.getAppleFruitMothBean().storeObservationSitePointSeasonData(newData);
+                            appleFruitMothBean.storeObservationSitePointSeasonData(newData);
                             //dataSet.add(newData);
                             //point.setObservationSitePointSeasonDataSet(dataSet);
-                            //SessionControllerGetter.getAppleFruitMothBean().storeObservationSitePoint(point);
+                            //appleFruitMothBean.storeObservationSitePoint(point);
                             
 
                         } catch (NullPointerException | ParseException ex) {
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 bcc0d958222c07c70ec39899cf5efcdb9506da4d..d133c6548f13e65b93c31c691243a51eb4f5a910 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
@@ -22,6 +22,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.ejb.EJB;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -30,18 +31,20 @@ 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.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.util.ServletUtil;
 
 /**
- * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2016-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/applefruitmoth")
 @Facet("restricted")
 public class AppleFruitMothService {
     
+    @EJB
+    AppleFruitMothBean appleFruitMothBean;
+    
     @Context
     private HttpServletRequest httpServletRequest;
     
@@ -67,7 +70,7 @@ public class AppleFruitMothService {
             @QueryParam("onlyPubliclyAvailable") Boolean onlyPubliclyAvailable
     )
     {
-        Kml retVal = SessionControllerGetter.getAppleFruitMothBean().getObservationSitesKml(season, selectedObservationSiteId, ServletUtil.getServerName(httpServletRequest), onlyPubliclyAvailable);
+        Kml retVal = appleFruitMothBean.getObservationSitesKml(season, selectedObservationSiteId, ServletUtil.getServerName(httpServletRequest), onlyPubliclyAvailable);
         return Response.ok().entity(retVal).build();
     }
     
@@ -76,7 +79,7 @@ public class AppleFruitMothService {
     @Produces("application/vnd.google-earth.kml+xml;charset=utf-8")
     public Response getObservationSitePointsKML(@PathParam("observationSiteId") Integer observationSiteId)
     {
-        Kml retVal = SessionControllerGetter.getAppleFruitMothBean().getObservationSitePointsKml(observationSiteId, ServletUtil.getServerName(httpServletRequest));
+        Kml retVal = appleFruitMothBean.getObservationSitePointsKml(observationSiteId, ServletUtil.getServerName(httpServletRequest));
         return Response.ok().entity(retVal).build();
     }*/
 }
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java
index 0e6fafc1e9005653ddbd95419960ba146050511c..c2abee5cf7c3abf5da9c614593e2f57ed7ea7952 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java
@@ -30,7 +30,6 @@ import de.micromata.opengis.kml.v_2_2_0.Vec2;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -41,8 +40,6 @@ import java.util.stream.Collectors;
 
 import javax.ejb.LocalBean;
 import javax.ejb.Stateless;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 
@@ -53,10 +50,8 @@ import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.operation.MathTransform;
 import org.opengis.referencing.operation.TransformException;
 
-import no.nibio.vips.gis.GISUtil;
 import no.nibio.vips.logic.util.GISEntityUtil;
 import no.nibio.vips.logic.util.Globals;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 
 /**
  * @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
@@ -67,6 +62,7 @@ import no.nibio.vips.logic.util.SessionControllerGetter;
 public class BarkbeetleBean {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
+
     
     /**
      * Get the list of trapsites for the given season
@@ -123,25 +119,7 @@ public class BarkbeetleBean {
         return em.find(TrapsiteType.class, trapsiteTypeId);
     }
     
-    /**
-     * Util method for getting this bean through JNDI
-     * @return 
-     */
-    public static BarkbeetleBean getInstance()
-    {
-        try
-        {
-            InitialContext ic = new InitialContext();
-            BarkbeetleBean retVal = (BarkbeetleBean) ic.lookup(SessionControllerGetter.getJndiPath(BarkbeetleBean.class));
-
-            return retVal;
-        }catch(NamingException ne)
-        {
-            System.out.println("Could not find " + BarkbeetleBean.class.getSimpleName());
-            return null;
-        }
-    }
-
+    
     public List<TrapsiteRegistration> getRegistrationsForSite(SeasonTrapsite trapsite) {
         return em.createNamedQuery("TrapsiteRegistration.findBySeasonTrapsiteId")
                 .setParameter("seasonTrapsiteId", trapsite.getSeasonTrapsiteId())
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleController.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleController.java
index c888a0521b8486315043ed137c229eb26c5609e7..a4d78ce6edde36b58eeedce51208d4fded43e36e 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleController.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleController.java
@@ -35,6 +35,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 import javax.ejb.EJBException;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -42,6 +43,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.Response;
 import no.nibio.vips.gis.GISUtil;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.VipsLogicRole;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.gis.CoordinateXYZ;
@@ -60,7 +62,13 @@ import org.locationtech.jts.geom.Point;
  * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
  */
 public class BarkbeetleController extends HttpServlet {
-   
+    
+        
+    @EJB
+    BarkbeetleBean barkbeetleBean;
+    @EJB
+    UserBean userBean;
+    
     /** 
      * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
      * @param request servlet request
@@ -72,19 +80,19 @@ public class BarkbeetleController extends HttpServlet {
     throws ServletException, IOException {
         response.setContentType("text/html;charset=UTF-8");
         VipsLogicUser user = (VipsLogicUser) request.getSession().getAttribute("user");
-        if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN, VipsLogicRole.BARKBEETLE_REGISTRATOR, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+        if(userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN, VipsLogicRole.BARKBEETLE_REGISTRATOR, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
         {
             request.setAttribute("user",user);
-            request.setAttribute("userIsAdmin",SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER));
-            request.setAttribute("userIsCountyAdmin",SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN));
+            request.setAttribute("userIsAdmin",userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER));
+            request.setAttribute("userIsCountyAdmin",userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN));
             Integer season = request.getParameter("season") != null?  Integer.valueOf(request.getParameter("season"))
                         : LocalDate.ofInstant(SystemTime.getSystemTime().toInstant(),ZoneId.of("Europe/Oslo")).getYear();
             String action = request.getParameter("action");
             if(action == null)
             {
-                List<SeasonTrapsite> seasonTrapSites = BarkbeetleBean.getInstance().getSeasonTrapsites(season);
+                List<SeasonTrapsite> seasonTrapSites = barkbeetleBean.getSeasonTrapsites(season);
                 Collections.sort(seasonTrapSites);
-                Integer firstAvailableSeason = BarkbeetleBean.getInstance().getFirstAvailableSeason();
+                Integer firstAvailableSeason = barkbeetleBean.getFirstAvailableSeason();
                 Integer lastAvailableSeason = Calendar.getInstance().get(Calendar.YEAR) + 1;
                 request.setAttribute("firstAvailableSeason", firstAvailableSeason);
                 request.setAttribute("lastAvailableSeason", lastAvailableSeason);
@@ -99,18 +107,18 @@ public class BarkbeetleController extends HttpServlet {
             else if(action.equals("listSeasonTrapsitesStatus"))
             {
             	request.setAttribute("season", season);
-            	Integer firstAvailableSeason = BarkbeetleBean.getInstance().getFirstAvailableSeason();
+            	Integer firstAvailableSeason = barkbeetleBean.getFirstAvailableSeason();
                 Integer lastAvailableSeason = Calendar.getInstance().get(Calendar.YEAR) + 1;
                 request.setAttribute("firstAvailableSeason", firstAvailableSeason);
                 request.setAttribute("lastAvailableSeason", lastAvailableSeason);
-            	request.setAttribute("seasonTrapsites", BarkbeetleBean.getInstance().getSeasonTrapsites(season));
+            	request.setAttribute("seasonTrapsites", barkbeetleBean.getSeasonTrapsites(season));
             	request.getRequestDispatcher("/modules/barkbeetle/barkbeetleSeasonTrapsitesStatus.ftl").forward(request, response);
             }
             else if(action.equals("seasonTrapsiteMaintenanceList"))
             {
-            	List<SeasonTrapsite> seasonTrapSites = BarkbeetleBean.getInstance().getSeasonTrapsites(season);
+            	List<SeasonTrapsite> seasonTrapSites = barkbeetleBean.getSeasonTrapsites(season);
             	Collections.sort(seasonTrapSites);
-            	Integer firstAvailableSeason = BarkbeetleBean.getInstance().getFirstAvailableSeason();
+            	Integer firstAvailableSeason = barkbeetleBean.getFirstAvailableSeason();
                 Integer lastAvailableSeason = Calendar.getInstance().get(Calendar.YEAR) + 1;
                 request.setAttribute("firstAvailableSeason", firstAvailableSeason);
                 request.setAttribute("lastAvailableSeason", lastAvailableSeason);
@@ -121,18 +129,18 @@ public class BarkbeetleController extends HttpServlet {
             else if(action.equals("editSeasonTrapsite"))
             {
                 SeasonTrapsite trapsite = request.getParameter("seasonTrapsiteId") != null ? 
-                        BarkbeetleBean.getInstance().getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
+                        barkbeetleBean.getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
                         : new SeasonTrapsite();
                 // Only admins and designated registrants can edit the trapsite
-                if(!SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
+                if(!userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
                         && (trapsite != null && ! user.getUserId().equals(trapsite.getUserId().getUserId()))
                         )
                 {
                     response.sendError(403,"Access not authorized"); // HTTP Forbidden
                 }
-                request.setAttribute("trapsiteRegistrators", SessionControllerGetter.getUserBean().getUsersByVipsLogicRoles(new Integer[]{VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_REGISTRATOR, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN}));
+                request.setAttribute("trapsiteRegistrators", userBean.getUsersByVipsLogicRoles(new Integer[]{VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_REGISTRATOR, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN}));
                 
-                List<TrapsiteType> trapsiteTypes = BarkbeetleBean.getInstance().getTrapsiteTypes();
+                List<TrapsiteType> trapsiteTypes = barkbeetleBean.getTrapsiteTypes();
                 request.setAttribute("season", request.getParameter("seasonTrapsiteId") != null ? trapsite.getSeason() : season);
                 request.setAttribute("seasonTrapsite", trapsite);
                 request.setAttribute("seasonTrapsiteTypes", trapsiteTypes);
@@ -142,9 +150,9 @@ public class BarkbeetleController extends HttpServlet {
             else if(action.equals("seasonTrapsiteFormSubmit"))
             {
                 SeasonTrapsite trapsite = (request.getParameter("seasonTrapsiteId") != null && Integer.valueOf(request.getParameter("seasonTrapsiteId")) > 0) ? 
-                                BarkbeetleBean.getInstance().getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
+                                barkbeetleBean.getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
                                 : new SeasonTrapsite();
-                if(!SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
+                if(!userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER)
                         && (trapsite != null && ! user.getUserId().equals(trapsite.getUserId().getUserId()))
                         )
                 {
@@ -161,7 +169,7 @@ public class BarkbeetleController extends HttpServlet {
                     		trapsite.setActivated(true);
                     	}
                         trapsite.setSeason(formValidation.getFormField("season").getValueAsInteger());
-                        trapsite.setTrapsiteType(BarkbeetleBean.getInstance().getTrapsiteType(formValidation.getFormField("trapsiteTypeId").getValueAsInteger()));
+                        trapsite.setTrapsiteType(barkbeetleBean.getTrapsiteType(formValidation.getFormField("trapsiteTypeId").getValueAsInteger()));
                         
                         trapsite.setCountyNo(formValidation.getFormField("countyNo").isEmpty() ? null : formValidation.getFormField("countyNo").getValueAsInteger());
                         trapsite.setCountyName(formValidation.getFormField("countyName").getWebValue());
@@ -177,7 +185,7 @@ public class BarkbeetleController extends HttpServlet {
                         trapsite.setOwnerPhone(formValidation.getFormField("ownerPhone").getWebValue());
                         trapsite.setDateInstalled(formValidation.getFormField("dateInstalled").isEmpty() ? null : formValidation.getFormField("dateInstalled").getValueAsDate());
                         trapsite.setInstallationRemarks(formValidation.getFormField("installationRemarks").getWebValue());
-                        trapsite.setUserId(SessionControllerGetter.getUserBean().getVipsLogicUser(formValidation.getFormField("userId").getValueAsInteger()));
+                        trapsite.setUserId(userBean.getVipsLogicUser(formValidation.getFormField("userId").getValueAsInteger()));
                         trapsite.setLocationUpdated(formValidation.getFormField("locationUpdated").getWebValue().equals("true"));
                         
                         // Handling the GIS
@@ -193,7 +201,7 @@ public class BarkbeetleController extends HttpServlet {
                         Point p3d = gisUtil.createPointWGS84(coordinate);
                         trapsite.setGisGeom(p3d);
                         
-                        trapsite = BarkbeetleBean.getInstance().storeSeasonTrapsite(trapsite);
+                        trapsite = barkbeetleBean.storeSeasonTrapsite(trapsite);
                         
                         // Redirect to form
                         response.sendRedirect(Globals.PROTOCOL + "://"
@@ -214,12 +222,12 @@ public class BarkbeetleController extends HttpServlet {
             else if(action.equals("registerData"))
             {
                 SeasonTrapsite trapsite = request.getParameter("seasonTrapsiteId") != null ? 
-                        BarkbeetleBean.getInstance().getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
+                        barkbeetleBean.getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
                         : null;
                 if(trapsite != null)
                 {
-                    request.setAttribute("userIsAdmin",SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER));
-                    request.setAttribute("userIsCountyAdmin",SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN));
+                    request.setAttribute("userIsAdmin",userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER));
+                    request.setAttribute("userIsCountyAdmin",userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN));
                     request.setAttribute("seasonTrapsite", trapsite);
                     request.setAttribute("isExtended", trapsite.getTrapsiteType().getTrapsiteTypeId().equals(TrapsiteType.TRAPSITE_TYPE_EXTENDED));
                     Set<Integer> missingWeeks = new HashSet<Integer>(trapsite.getTrapsiteType().getTrapsiteTypeId().equals(TrapsiteType.TRAPSITE_TYPE_STANDARD)?
@@ -247,7 +255,7 @@ public class BarkbeetleController extends HttpServlet {
                     WeekFields weekFields = WeekFields.of(norway);
                     request.setAttribute("currentWeek", LocalDate.ofInstant(SystemTime.getSystemTime().toInstant(),ZoneId.of("Europe/Oslo")).get(weekFields.weekOfWeekBasedYear()));
                     //request.setAttribute("currentWeek", 32); // TEST!
-                    request.setAttribute("registrationStatusTypes", BarkbeetleBean.getInstance().getRegistrationStatusTypes());
+                    request.setAttribute("registrationStatusTypes", barkbeetleBean.getRegistrationStatusTypes());
                     request.setAttribute("messageKey", request.getParameter("messageKey"));
                     request.getRequestDispatcher("/modules/barkbeetle/barkbeetleTrapsiteRegistrationForm.ftl").forward(request, response);
                 }
@@ -259,7 +267,7 @@ public class BarkbeetleController extends HttpServlet {
             else if(action.equals("trapsiteRegistrationFormSubmit"))
             {
                 SeasonTrapsite trapsite = request.getParameter("seasonTrapsiteId") != null ? 
-                        BarkbeetleBean.getInstance().getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
+                        barkbeetleBean.getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
                         : null;
                 
                 if(trapsite != null)
@@ -307,11 +315,11 @@ public class BarkbeetleController extends HttpServlet {
                                 registrations.add(tr);
                             }
                         }
-                        trapsite = BarkbeetleBean.getInstance().storeTrapsiteRegistrations(trapsite.getSeasonTrapsiteId(), registrations);
+                        trapsite = barkbeetleBean.storeTrapsiteRegistrations(trapsite.getSeasonTrapsiteId(), registrations);
                         // Also, store the observedAttacksDescription on the SeasonTrapsite object
                         trapsite.setObservedAttacksDescription(request.getParameter("observedAttacksDescription"));
                         trapsite.setMaintenanceDescription(request.getParameter("maintenanceDescription"));
-                        BarkbeetleBean.getInstance().storeSeasonTrapsite(trapsite);
+                        barkbeetleBean.storeSeasonTrapsite(trapsite);
                         
                         // Redirect to form
                         response.sendRedirect(Globals.PROTOCOL + "://"
@@ -333,10 +341,10 @@ public class BarkbeetleController extends HttpServlet {
             // Only admins can do this
             else if(action.equals("seasonTrapsiteDeleteForm"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER))
                 {
                     SeasonTrapsite trapsite = request.getParameter("seasonTrapsiteId") != null ? 
-                        BarkbeetleBean.getInstance().getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
+                        barkbeetleBean.getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
                         : null;
                 
                     if(trapsite != null)
@@ -360,16 +368,16 @@ public class BarkbeetleController extends HttpServlet {
             // Only admins can do this
             else if(action.equals("seasonTrapsiteDelete"))
             {
-                if(SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER))
+                if(userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.SUPERUSER))
                 {
                 	
                     try
                     {
                     	SeasonTrapsite trapsite = request.getParameter("seasonTrapsiteId") != null ? 
-                                BarkbeetleBean.getInstance().getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
+                                barkbeetleBean.getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
                                 : null;
                         
-                        if(trapsite != null && BarkbeetleBean.getInstance().deleteSeasonTrapsite(trapsite.getSeasonTrapsiteId()))
+                        if(trapsite != null && barkbeetleBean.deleteSeasonTrapsite(trapsite.getSeasonTrapsiteId()))
                         {
                         	Integer siteSeason = trapsite.getSeason();
                         	String redirectAction = request.getParameter("redirectAction") != null ? "&action=" + request.getParameter("redirectAction") : "";
@@ -397,9 +405,9 @@ public class BarkbeetleController extends HttpServlet {
             }
             else if(action.equals("listSeasonTrapsiteCandidates"))
             {
-            	List<SeasonTrapsite> seasonTrapSiteCandidates = BarkbeetleBean.getInstance().getSeasonTrapsiteCandidates(season);
+            	List<SeasonTrapsite> seasonTrapSiteCandidates = barkbeetleBean.getSeasonTrapsiteCandidates(season);
                 Collections.sort(seasonTrapSiteCandidates);
-                Integer firstAvailableSeason = BarkbeetleBean.getInstance().getFirstAvailableSeason();
+                Integer firstAvailableSeason = barkbeetleBean.getFirstAvailableSeason();
                 Integer lastAvailableSeason = Calendar.getInstance().get(Calendar.YEAR) + 1;
                 request.setAttribute("firstAvailableSeason", firstAvailableSeason);
                 request.setAttribute("lastAvailableSeason", lastAvailableSeason);
@@ -410,19 +418,19 @@ public class BarkbeetleController extends HttpServlet {
             }
             else if(action.equals("activateSeasonTrapsite"))
             {
-            	if(!SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+            	if(!userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.BARKBEETLE_COUNTY_ADMIN, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     response.sendError(403,"Access not authorized"); // HTTP Forbidden
                 }
             	
             	SeasonTrapsite trapsite = request.getParameter("seasonTrapsiteId") != null ? 
-                        BarkbeetleBean.getInstance().getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
+                        barkbeetleBean.getSeasonTrapsite(Integer.valueOf(request.getParameter("seasonTrapsiteId")))
                         : null;
             
                 if(trapsite != null)
                 {
                 	trapsite.setActivated(Boolean.TRUE);
-                	BarkbeetleBean.getInstance().storeSeasonTrapsite(trapsite);
+                	barkbeetleBean.storeSeasonTrapsite(trapsite);
                 	response.sendRedirect(Globals.PROTOCOL + "://"
                             + ServletUtil.getServerName(request)
                             + "/barkbeetle?action=listSeasonTrapsiteCandidates&messageKey=activateOK&season=" + trapsite.getSeason()
@@ -435,7 +443,7 @@ public class BarkbeetleController extends HttpServlet {
             }
             else if(action.equals("copySeasonTrapsites"))
             {
-            	if(!SessionControllerGetter.getUserBean().authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
+            	if(!userBean.authorizeUser(user, VipsLogicRole.BARKBEETLE_ADMIN, VipsLogicRole.ORGANIZATION_ADMINISTRATOR, VipsLogicRole.SUPERUSER))
                 {
                     response.sendError(403,"Access not authorized"); // HTTP Forbidden
                 }
@@ -443,7 +451,7 @@ public class BarkbeetleController extends HttpServlet {
             	{
             		Integer fromSeason = Integer.valueOf(request.getParameter("fromSeason"));
             		Integer toSeason = Integer.valueOf(request.getParameter("toSeason"));
-            		BarkbeetleBean.getInstance().copySeasonTrapsites(fromSeason, toSeason);
+            		barkbeetleBean.copySeasonTrapsites(fromSeason, toSeason);
             		response.sendRedirect(Globals.PROTOCOL + "://"
                             + ServletUtil.getServerName(request)
                             + "/barkbeetle?action=listSeasonTrapsiteCandidates&season=" + toSeason
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleService.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleService.java
index 21b7d3d4bf53567143861f69058655fdb41d348e..00c596228688af24ae5c6d35e13cc022ef814cfb 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleService.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleService.java
@@ -32,6 +32,7 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 
 import com.webcohesion.enunciate.metadata.Facet;
+import javax.ejb.EJB;
 
 import no.nibio.vips.util.ServletUtil;
 
@@ -47,6 +48,9 @@ public class BarkbeetleService {
     @Context
     private HttpServletRequest httpServletRequest;
     
+    @EJB
+    BarkbeetleBean barkbeetleBean;
+    
     @GET
     @Path("seasontrapsites/{season}/kml")
     @Produces("application/vnd.google-earth.kml+xml;charset=utf-8")
@@ -54,7 +58,7 @@ public class BarkbeetleService {
             @PathParam("season") Integer season,
             @QueryParam("excludeSeasonTrapsiteId") Integer excludeSeasonTrapsiteId)
     {
-        return Response.ok().entity(BarkbeetleBean.getInstance().getSeasonTrapsitesKml(season, excludeSeasonTrapsiteId, ServletUtil.getServerName(httpServletRequest))).build();
+        return Response.ok().entity(barkbeetleBean.getSeasonTrapsitesKml(season, excludeSeasonTrapsiteId, ServletUtil.getServerName(httpServletRequest))).build();
     }
     
     @GET
@@ -64,7 +68,7 @@ public class BarkbeetleService {
             @PathParam("season") Integer season
             )
     {
-        return Response.ok().entity(BarkbeetleBean.getInstance().getSeasonTrapsitesStatusKml(season, ServletUtil.getServerName(httpServletRequest))).build();
+        return Response.ok().entity(barkbeetleBean.getSeasonTrapsitesStatusKml(season, ServletUtil.getServerName(httpServletRequest))).build();
     }
     
     @GET
@@ -72,7 +76,7 @@ public class BarkbeetleService {
     @Produces("text/csv")
     public Response getSeasonTrapsitesReport(@PathParam("season") Integer season)
     {
-    	String csv = BarkbeetleBean.getInstance().getSeasonTrapsitesReportCsv(season);
+    	String csv = barkbeetleBean.getSeasonTrapsitesReportCsv(season);
     	return Response.ok().entity(csv).build();
     }
     
@@ -82,7 +86,7 @@ public class BarkbeetleService {
     //@Produces("text/plain")
     public Response getSeasonCountyAverage(@PathParam("season") Integer season)
     {
-    	String csv = BarkbeetleBean.getInstance().getCountyAverageCsv(season);
+    	String csv = barkbeetleBean.getCountyAverageCsv(season);
     	return Response.ok().entity(csv).build();
     }
     
@@ -91,7 +95,7 @@ public class BarkbeetleService {
     @Produces("text/csv")
     public Response getLatestBivoltCalculations(@PathParam("season") Integer season)
     {
-    	String csv = BarkbeetleBean.getInstance().getLatestBivoltCalculations(season);
+    	String csv = barkbeetleBean.getLatestBivoltCalculations(season);
     	return Response.ok().entity(csv).build();
     }
     
@@ -108,7 +112,7 @@ public class BarkbeetleService {
     		@PathParam("isMaintenanceCompleted") String isMaintenanceCompleted
     		)
     {
-    	BarkbeetleBean.getInstance().setMaintenanceCompleted(seasonTrapsiteId, isMaintenanceCompleted != null && isMaintenanceCompleted.equals("true"));
+    	barkbeetleBean.setMaintenanceCompleted(seasonTrapsiteId, isMaintenanceCompleted != null && isMaintenanceCompleted.equals("true"));
     	return Response.ok().build();
     }
 }
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 3092f7625e3dea370f5cd8fbd5d3bd7993902377..5035869e92d710801be72e8e16ba37ca4c6de46b 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
@@ -25,6 +25,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
@@ -37,12 +38,12 @@ import javax.ws.rs.core.Response;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.entity.WeatherObservation;
+import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.entity.Organism;
 import no.nibio.vips.logic.entity.Organization;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.entity.Preparation;
 import no.nibio.vips.logic.util.RunModelException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.observation.ObservationImpl;
 import no.nibio.vips.pestmanagement.SprayingImpl;
@@ -62,6 +63,9 @@ public class BarleyNetBlotchModelService {
     
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
+    
+    @EJB
+    ForecastBean forecastBean;
 
     @GET
     @Path("barleyvarieties/{organizationId}")
@@ -246,7 +250,7 @@ public class BarleyNetBlotchModelService {
         List<Result> results;
         try
         {
-             results = SessionControllerGetter.getForecastBean().runForecast(config, VIPSCoreUserId);
+             results = forecastBean.runForecast(config, VIPSCoreUserId);
         }
         catch(RunModelException ex)
         {
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 cea3b798f584c3b0b6ba60d8f704d607140d6745..14985497b24aa2cee00a56225310f10c58891101 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
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.TimeZone;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
@@ -44,6 +45,7 @@ import javax.ws.rs.core.Response;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.entity.WeatherObservation;
+import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.entity.Organization;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.util.RunModelException;
@@ -59,10 +61,9 @@ import no.nibio.vips.util.weather.WeatherDataSourceException;
 import no.nibio.vips.util.weather.WeatherDataSourceUtil;
 import no.nibio.vips.util.weather.WeatherForecastProvider;
 import no.nibio.vips.util.weather.WeatherStationProviderFactory;
-import no.nibio.vips.util.weather.YrWeatherForecastProvider;
 
 /**
- * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2015-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/roughage")
@@ -73,6 +74,9 @@ public class RoughageService {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    ForecastBean forecastBean;
+    
     /**
      * Temporary hack to get correct normal data weather stations
      * @return 
@@ -387,7 +391,7 @@ public class RoughageService {
         List<Result> results;
         try
         {
-             results = SessionControllerGetter.getForecastBean().runForecast(config, VIPSCoreUserId);
+             results = forecastBean.runForecast(config, VIPSCoreUserId);
         }
         catch(RunModelException ex)
         {
@@ -458,7 +462,7 @@ public class RoughageService {
             List<Result> normalDataResults;
             try
             {
-                 normalDataResults = SessionControllerGetter.getForecastBean().runForecast(config, VIPSCoreUserId);
+                 normalDataResults = forecastBean.runForecast(config, VIPSCoreUserId);
             }
             catch(RunModelException ex)
             {
@@ -559,7 +563,7 @@ public class RoughageService {
             Organization org = em.find(Organization.class, organizationId);
             Integer VIPSCoreUserId = org.getDefaultVipsCoreUserId();
             
-            results = SessionControllerGetter.getForecastBean().runForecast(modelConfig, VIPSCoreUserId);
+            results = forecastBean.runForecast(modelConfig, VIPSCoreUserId);
             
         } catch (WeatherDataSourceException | RunModelException ex) {
             return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ex.getMessage()).build();
diff --git a/src/main/java/no/nibio/vips/logic/modules/wheatleafblotch/WheatLeafBlotchModelService.java b/src/main/java/no/nibio/vips/logic/modules/wheatleafblotch/WheatLeafBlotchModelService.java
index 839c93cf0ac2375aeee6e0f779b428e7ae411606..77208990a6b33385ef4bb6cceb5092dc8f0f72cd 100644
--- a/src/main/java/no/nibio/vips/logic/modules/wheatleafblotch/WheatLeafBlotchModelService.java
+++ b/src/main/java/no/nibio/vips/logic/modules/wheatleafblotch/WheatLeafBlotchModelService.java
@@ -25,6 +25,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
@@ -37,12 +38,12 @@ import javax.ws.rs.core.Response;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.entity.WeatherObservation;
+import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.entity.Organism;
 import no.nibio.vips.logic.entity.Organization;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.entity.Preparation;
 import no.nibio.vips.logic.util.RunModelException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.observation.ObservationImpl;
 import no.nibio.vips.pestmanagement.SprayingImpl;
@@ -52,7 +53,7 @@ import no.nibio.vips.util.weather.WeatherDataSourceException;
 import no.nibio.vips.util.weather.WeatherDataSourceUtil;
 
 /**
- * @copyright 2018 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2018-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/wheatleafblotchmodel")
@@ -62,6 +63,9 @@ public class WheatLeafBlotchModelService {
     
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
+    
+    @EJB
+    ForecastBean forecastBean;
 
     @GET
     @Path("wheatvarieties/{organizationId}")
@@ -351,7 +355,7 @@ public class WheatLeafBlotchModelService {
         List<Result> results;
         try
         {
-             results = SessionControllerGetter.getForecastBean().runForecast(config, VIPSCoreUserId);
+             results = forecastBean.runForecast(config, VIPSCoreUserId);
         }
         catch(RunModelException ex)
         {
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/TaskLoggerSchedulerListener.java b/src/main/java/no/nibio/vips/logic/scheduling/TaskLoggerSchedulerListener.java
index 67c24f22d8a41a0184c3b1b35cc15959c88aa6a7..51c4382d3b237f2f863d9ce2bb34b6af099758f5 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/TaskLoggerSchedulerListener.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/TaskLoggerSchedulerListener.java
@@ -21,30 +21,33 @@ package no.nibio.vips.logic.scheduling;
 
 import it.sauronsoftware.cron4j.SchedulerListener;
 import it.sauronsoftware.cron4j.TaskExecutor;
-import no.nibio.vips.logic.util.SessionControllerGetter;
+import javax.ejb.EJB;
+import no.nibio.vips.logic.controller.session.SchedulingBean;
 
 /**
  * Logs task events to the database
- * @copyright 2013 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2013-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class TaskLoggerSchedulerListener implements SchedulerListener{
     
+    @EJB
+    SchedulingBean schedulingBean;
     
     @Override
     public void taskLaunching(TaskExecutor te) {
-        SessionControllerGetter.getSchedulingBean().logTaskLaunching(te);
+        schedulingBean.logTaskLaunching(te);
         
     }
 
     @Override
     public void taskSucceeded(TaskExecutor te) {
-        SessionControllerGetter.getSchedulingBean().logTaskSucceeded(te);
+        schedulingBean.logTaskSucceeded(te);
     }
 
     @Override
     public void taskFailed(TaskExecutor te, Throwable thrwbl) {
-        SessionControllerGetter.getSchedulingBean().logTaskFailed(te,thrwbl);
+        schedulingBean.logTaskFailed(te,thrwbl);
     }
 
 }
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/TerminateSchedulerListener.java b/src/main/java/no/nibio/vips/logic/scheduling/TerminateSchedulerListener.java
index 273f7e4fa534d18507dedbf39ba99850449cbabb..59add8bae6d933961fe30b15abda8274d6327a75 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/TerminateSchedulerListener.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/TerminateSchedulerListener.java
@@ -22,16 +22,19 @@ package no.nibio.vips.logic.scheduling;
 import it.sauronsoftware.cron4j.Scheduler;
 import it.sauronsoftware.cron4j.SchedulerListener;
 import it.sauronsoftware.cron4j.TaskExecutor;
+import javax.ejb.EJB;
 import no.nibio.vips.logic.controller.session.SchedulingBean;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 
 /**
  * Add this listener to a scheduler if you want it the scheduler to terminate
  * after a task has completed
- * @copyright 2013 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2013-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class TerminateSchedulerListener implements SchedulerListener{
+    
+    @EJB
+    SchedulingBean schedulingBean;
 
     @Override
     public void taskLaunching(TaskExecutor te) {
@@ -57,7 +60,6 @@ public class TerminateSchedulerListener implements SchedulerListener{
     private void terminateScheduler(Scheduler scheduler)
     {
         scheduler.stop();
-        SchedulingBean schedulingBean = SessionControllerGetter.getSchedulingBean();
         schedulingBean.getOneOffSchedulers().remove(scheduler);
         scheduler = null;
     }
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java
index 56c591f0307468b50ef91b2840ba2de2caf7cd66..6e68fa6b58431719aa9b93b60bef96bd7b775775 100644
--- a/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java
@@ -19,27 +19,26 @@
 
 package no.nibio.vips.logic.scheduling.model.grid.preprocessor;
 
-import org.locationtech.jts.geom.Coordinate;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import javax.ejb.EJB;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.PointWeatherObservationList;
 import no.nibio.vips.entity.WeatherObservation;
 import no.nibio.vips.gis.CoordinateProxy;
+import no.nibio.vips.logic.controller.session.PointOfInterestBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.scheduling.model.ModelRunPreprocessor;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.util.WeatherElements;
 import no.nibio.vips.util.WeatherObservationListException;
@@ -48,10 +47,13 @@ import no.nibio.vips.util.weather.WeatherDataSourceException;
 import no.nibio.vips.util.weather.WeatherDataSourceUtil;
 
 /**
- * @copyright 2018 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2018-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class ZymoseptoriaSimpleRiskGridModelPreprocessor extends ModelRunPreprocessor{
+    
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
 
     @Override
     public ModelConfiguration getModelConfiguration(ForecastConfiguration configuration) throws PreprocessorException {
@@ -60,7 +62,7 @@ public class ZymoseptoriaSimpleRiskGridModelPreprocessor extends ModelRunPreproc
         // Which weather stations??
         // Ilseng and Apelsvoll to start with ;-)
         List<PointOfInterestWeatherStation> stations = Stream.of(configuration.getGridWeatherStationPointOfInterestIds()).map(
-                stationId -> (PointOfInterestWeatherStation) SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(stationId)
+                stationId -> (PointOfInterestWeatherStation) pointOfInterestBean.getPointOfInterest(stationId)
             ).collect(Collectors.toList());
         
         List<PointWeatherObservationList> allObs = new ArrayList<>();
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/AltenariaModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/AltenariaModelPreprocessor.java
index 3ff54e4be9fd052b98124645378a67d6542ea4d5..af43dc78fbade7a9faa5512708d4d84d7199e19d 100644
--- a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/AltenariaModelPreprocessor.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/AltenariaModelPreprocessor.java
@@ -32,13 +32,14 @@ import java.util.List;
 import java.util.TimeZone;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.ejb.EJB;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.WeatherObservation;
+import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.scheduling.model.ModelRunPreprocessor;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.model.ConfigValidationException;
 import no.nibio.vips.util.WeatherElements;
@@ -49,10 +50,15 @@ import no.nibio.vips.util.weather.WeatherDataSourceUtil;
 
 /**
  *
- * @author bhabesh
+ * @author Bhabesh Mukhopadyay
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
-public class AltenariaModelPreprocessor extends ModelRunPreprocessor{
-   public final   Logger      LOGGER              =   Logger.getLogger(this.getClass().getName());
+public class AltenariaModelPreprocessor extends ModelRunPreprocessor {
+   
+    @EJB
+    ForecastBean forecastBean;
+    
+    public final   Logger      LOGGER              =   Logger.getLogger(this.getClass().getName());
     private final boolean DEBUG = false;
     
     /**
@@ -62,15 +68,15 @@ public class AltenariaModelPreprocessor extends ModelRunPreprocessor{
      *
      * purpose     :
      *
-     * date        : Expression date is undefined on line 20, column 19 in Templates/Classes/Code/GeneratedMethodBody. Expression time is undefined on line 20, column 27 in Templates/Classes/Code/GeneratedMethodBody.
+     * date        : 
      */
     @Override
     public ModelConfiguration getModelConfiguration(ForecastConfiguration configuration) throws PreprocessorException
     {
-        String      ALTERNARIA_SPRAYING_DATES_01    = SessionControllerGetter.getForecastBean().getDeCamelizedFieldName("ALTERNARIA", "sprayingDate01");
-        String      ALTERNARIA_SPRAYING_DATES_02    = SessionControllerGetter.getForecastBean().getDeCamelizedFieldName("ALTERNARIA", "sprayingDate02");
-        String      ALTERNARIA_SPRAYING_DATES_03    = SessionControllerGetter.getForecastBean().getDeCamelizedFieldName("ALTERNARIA", "sprayingDate03");
-        String      ALTERNARIA_SPRAYING_DATES_04    = SessionControllerGetter.getForecastBean().getDeCamelizedFieldName("ALTERNARIA", "sprayingDate04");
+        String      ALTERNARIA_SPRAYING_DATES_01    = forecastBean.getDeCamelizedFieldName("ALTERNARIA", "sprayingDate01");
+        String      ALTERNARIA_SPRAYING_DATES_02    = forecastBean.getDeCamelizedFieldName("ALTERNARIA", "sprayingDate02");
+        String      ALTERNARIA_SPRAYING_DATES_03    = forecastBean.getDeCamelizedFieldName("ALTERNARIA", "sprayingDate03");
+        String      ALTERNARIA_SPRAYING_DATES_04    = forecastBean.getDeCamelizedFieldName("ALTERNARIA", "sprayingDate04");
         
         String      paramConfigValue                = null;
         List<Date>  lstSprayingDates                = new ArrayList(){};
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/DeliaRadicumFloralisModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/DeliaRadicumFloralisModelPreprocessor.java
index 4874b52ec5d8f7ccf32df84de4562644c2b42a7e..ccada9b3190ad0d67a615eb117466941b335e26b 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/DeliaRadicumFloralisModelPreprocessor.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/DeliaRadicumFloralisModelPreprocessor.java
@@ -25,7 +25,10 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
+import javax.ejb.EJB;
 import no.nibio.vips.entity.ModelConfiguration;
+import no.nibio.vips.logic.controller.session.ObservationBean;
+import no.nibio.vips.logic.controller.session.OrganismBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.Organism;
 import no.nibio.vips.logic.entity.PointOfInterest;
@@ -42,6 +45,11 @@ import no.nibio.vips.util.WeatherUtil;
  */
 public class DeliaRadicumFloralisModelPreprocessor extends ModelRunPreprocessor{
     public final static String START_DATE_GROWTH = "START_DATE_GROWTH";
+    
+    @EJB
+    OrganismBean organismBean;
+    @EJB
+    ObservationBean observationBean;
 
     @Override
     public ModelConfiguration getModelConfiguration(ForecastConfiguration configuration) throws PreprocessorException {
@@ -78,8 +86,8 @@ public class DeliaRadicumFloralisModelPreprocessor extends ModelRunPreprocessor{
             Date endDateCalculation = wUtil.normalizeToExactDate(SystemTime.getSystemTime(),timeZone);
             config.setConfigParameter("endDateCalculation", format.format(endDateCalculation));
 
-            Organism organism = SessionControllerGetter.getOrganismBean().getOrganismByLatinName("Delia floralis/radicum");
-            List<Observation> pestObservations = SessionControllerGetter.getObservationBean().getObservations(organism.getOrganismId(), location.getPointOfInterestId(),startDateGrowth,SystemTime.getSystemTime());
+            Organism organism = organismBean.getOrganismByLatinName("Delia floralis/radicum");
+            List<Observation> pestObservations = observationBean.getObservations(organism.getOrganismId(), location.getPointOfInterestId(),startDateGrowth,SystemTime.getSystemTime());
 
             config.setConfigParameter("pestObservations", pestObservations);
             config.setModelId(this.getModelId());
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/PsilaRosaeObservationModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/PsilaRosaeObservationModelPreprocessor.java
index 328a00ad30be089684b9020f61d4c4f9a2e01393..4c9fd377ba7173d932db986306e0a122aea1f160 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/PsilaRosaeObservationModelPreprocessor.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/PsilaRosaeObservationModelPreprocessor.java
@@ -19,29 +19,34 @@
 
 package no.nibio.vips.logic.scheduling.model.preprocessor;
 
-import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
+import javax.ejb.EJB;
 import no.nibio.vips.entity.ModelConfiguration;
+import no.nibio.vips.logic.controller.session.ObservationBean;
+import no.nibio.vips.logic.controller.session.OrganismBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.Organism;
 import no.nibio.vips.logic.entity.PointOfInterest;
 import no.nibio.vips.logic.scheduling.model.ModelRunPreprocessor;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.observation.Observation;
 import no.nibio.vips.util.WeatherUtil;
 
 /**
- * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2016-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class PsilaRosaeObservationModelPreprocessor extends ModelRunPreprocessor{
 
+    @EJB
+    OrganismBean organismBean;
+    @EJB
+    ObservationBean observationBean;
+    
     @Override
     public ModelConfiguration getModelConfiguration(ForecastConfiguration configuration) throws PreprocessorException {
         ModelConfiguration config = null;
@@ -61,8 +66,8 @@ public class PsilaRosaeObservationModelPreprocessor extends ModelRunPreprocessor
             Date endDateCalculation = wUtil.normalizeToExactDate(SystemTime.getSystemTime(),timeZone);
             config.setConfigParameter("endDateCalculation", format.format(endDateCalculation));
 
-            Organism organism = SessionControllerGetter.getOrganismBean().getOrganismByLatinName("Psila rosae");
-            List<Observation> pestObservations = SessionControllerGetter.getObservationBean().getObservations(organism.getOrganismId(), location.getPointOfInterestId(),configuration.getDateStart(),SystemTime.getSystemTime());
+            Organism organism = organismBean.getOrganismByLatinName("Psila rosae");
+            List<Observation> pestObservations = observationBean.getObservations(organism.getOrganismId(), location.getPointOfInterestId(),configuration.getDateStart(),SystemTime.getSystemTime());
 
             config.setConfigParameter("pestObservations", pestObservations);
             config.setModelId(this.getModelId());
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaApiicolaModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaApiicolaModelPreprocessor.java
index 1e3e21a59aeb95ae3a7393ad25e347d7c78086c6..a843aa45ef083dfed3a819203b2058ddb3f2734b 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaApiicolaModelPreprocessor.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaApiicolaModelPreprocessor.java
@@ -26,31 +26,37 @@ import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.WeatherObservation;
+import no.nibio.vips.logic.controller.session.ObservationBean;
+import no.nibio.vips.logic.controller.session.OrganismBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.Organism;
 import no.nibio.vips.logic.entity.PointOfInterest;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.scheduling.model.ModelRunPreprocessor;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.model.ConfigValidationException;
 import no.nibio.vips.observation.Observation;
 import no.nibio.vips.util.WeatherElements;
 import no.nibio.vips.util.WeatherObservationListException;
 import no.nibio.vips.util.WeatherUtil;
-import no.nibio.vips.util.XDate;
 import no.nibio.vips.util.weather.WeatherDataSourceException;
 import no.nibio.vips.util.weather.WeatherDataSourceUtil;
 
 /**
- * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2016-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class SeptoriaApiicolaModelPreprocessor extends ModelRunPreprocessor {
+    @EJB
+    OrganismBean organismBean;
+    @EJB
+    ObservationBean observationBean;
+    
 
     @Override
     public ModelConfiguration getModelConfiguration(ForecastConfiguration configuration) throws PreprocessorException {
@@ -59,9 +65,9 @@ public class SeptoriaApiicolaModelPreprocessor extends ModelRunPreprocessor {
         PointOfInterestWeatherStation weatherStation =  (PointOfInterestWeatherStation) configuration.getWeatherStationPointOfInterestId();
         config = new ModelConfiguration();
         
-        Organism organism = SessionControllerGetter.getOrganismBean().getOrganismByLatinName("Septoria apiicola");
+        Organism organism = organismBean.getOrganismByLatinName("Septoria apiicola");
         //System.out.println(organism);
-        List<Observation> pestObservations = SessionControllerGetter.getObservationBean().getObservations(organism.getOrganismId(), location.getPointOfInterestId(),configuration.getDateStart(),SystemTime.getSystemTime());
+        List<Observation> pestObservations = observationBean.getObservations(organism.getOrganismId(), location.getPointOfInterestId(),configuration.getDateStart(),SystemTime.getSystemTime());
         
         //System.out.println("Found " + pestObservations + " observations");
         WeatherDataSourceUtil wdsUtil = new WeatherDataSourceUtil();
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java
index 643fba3ecba5c7964f6f7e1e1cdd0dbe0539c1f3..0cfc5a1382257c08fb70efc4298c9f9f86ba3cf3 100644
--- a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java
@@ -26,6 +26,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
+import javax.ejb.EJB;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.WeatherObservation;
 import no.nibio.vips.logic.controller.session.ForecastBean;
@@ -33,21 +34,22 @@ import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.scheduling.model.ModelRunPreprocessor;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.util.WeatherElements;
 import no.nibio.vips.util.weather.WeatherDataSourceException;
 import no.nibio.vips.util.weather.WeatherDataSourceUtil;
 
 /**
- * @copyright 2019 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2019-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class SeptoriaHumidityModelPreprocessor  extends ModelRunPreprocessor{
     
+    @EJB
+    ForecastBean forecastBean;
+    
     @Override
     public ModelConfiguration getModelConfiguration(ForecastConfiguration configuration) throws PreprocessorException
     {
-        ForecastBean forecastBean = SessionControllerGetter.getForecastBean();
         ModelConfiguration retVal = new ModelConfiguration();
         retVal.setModelId(this.getModelId());
         retVal.setConfigParameter("timeZone", configuration.getTimeZone());
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/tasks/DeleteAllExpiredUserUuidsTask.java b/src/main/java/no/nibio/vips/logic/scheduling/tasks/DeleteAllExpiredUserUuidsTask.java
index 7d2b3d3325d046d02c3a7cb23b7d08af724436a5..6def8cce1611a40eb25f00640829505e87d8bb0c 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/tasks/DeleteAllExpiredUserUuidsTask.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/tasks/DeleteAllExpiredUserUuidsTask.java
@@ -20,16 +20,18 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
+import javax.ejb.EJB;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
-import no.nibio.vips.logic.scheduling.VipsLogicTaskFactory;
-import no.nibio.vips.logic.util.SessionControllerGetter;
-import no.nibio.web.forms.FormField;
 
 /**
- * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2016-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class DeleteAllExpiredUserUuidsTask extends VipsLogicTask{
+    
+    @EJB
+    UserBean userBean;
 
     @Override
     public String getConfigFormDefinition(String language) {
@@ -39,7 +41,7 @@ public class DeleteAllExpiredUserUuidsTask extends VipsLogicTask{
     @Override
     public void execute(TaskExecutionContext tec) throws RuntimeException {
         tec.setCompleteness(0d);
-        SessionControllerGetter.getUserBean().deleteAllExpiredUserUuids();
+        userBean.deleteAllExpiredUserUuids();
         tec.setCompleteness(1d);
     }
 
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunAllForecastConfigurationsForOrganizationTask.java b/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunAllForecastConfigurationsForOrganizationTask.java
index eebc9e72cc8ca03b9f94c2809f7a0e7ff89bcfaa..52592004f66dba866dab5cf086a8aa8eddda27a1 100644
--- a/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunAllForecastConfigurationsForOrganizationTask.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunAllForecastConfigurationsForOrganizationTask.java
@@ -23,7 +23,11 @@ import it.sauronsoftware.cron4j.TaskExecutionContext;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import javax.ejb.EJB;
 import no.nibio.vips.i18n.I18nImpl;
+import no.nibio.vips.logic.controller.session.ForecastBean;
+import no.nibio.vips.logic.controller.session.PointOfInterestBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.ModelInformation;
 import no.nibio.vips.logic.entity.PointOfInterest;
@@ -31,7 +35,6 @@ import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.scheduling.SchedulingUtil;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
 import no.nibio.vips.logic.util.RunModelException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.web.forms.FormField;
 
@@ -40,6 +43,14 @@ import no.nibio.web.forms.FormField;
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class RunAllForecastConfigurationsForOrganizationTask extends RunAllForecastConfigurationsTask{
+    
+    @EJB
+    UserBean userBean;
+    @EJB
+    ForecastBean forecastBean;
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    
     private I18nImpl i18n;
     //private boolean DEBUG=true;
     @Override
@@ -57,9 +68,9 @@ public class RunAllForecastConfigurationsForOrganizationTask extends RunAllForec
         StringBuilder errorMessage = new StringBuilder();
         // Get all organizations, loop, get all current forecasts, loop, run models, store results
         boolean noForecastConfigurationsFound = true;
-        Map<String, ModelInformation> modelInformationMap = SessionControllerGetter.getForecastBean().getIndexedBatchableModelInformation();
+        Map<String, ModelInformation> modelInformationMap = forecastBean.getIndexedBatchableModelInformation();
         
-        List<ForecastConfiguration> currentForecastConfigurations = SessionControllerGetter.getForecastBean().getForecastConfigurationsValidAtTime(this.getOrganization(), SystemTime.getSystemTime());
+        List<ForecastConfiguration> currentForecastConfigurations = forecastBean.getForecastConfigurationsValidAtTime(this.getOrganization(), SystemTime.getSystemTime());
         //System.out.println("Current forecasts for " + organization.getOrganizationName() + ":" + currentForecastConfigurations.size());
         if(currentForecastConfigurations != null && !currentForecastConfigurations.isEmpty())
         {
@@ -75,7 +86,7 @@ public class RunAllForecastConfigurationsForOrganizationTask extends RunAllForec
                     try 
                     {
                         totalNumberofForecastConfigurations++;
-                        SessionControllerGetter.getForecastBean().runForecast(forecastConfiguration);
+                        forecastBean.runForecast(forecastConfiguration);
                         /*
                         if(DEBUG && totalNumberofForecastConfigurations == 2)
                         {
@@ -130,7 +141,7 @@ public class RunAllForecastConfigurationsForOrganizationTask extends RunAllForec
                     .append("\",\"selected\":")
                     .append("false")
                     .append("}\n");
-        List<PointOfInterestWeatherStation> stations = SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForOrganization(this.getOrganization(), Boolean.TRUE);
+        List<PointOfInterestWeatherStation> stations = pointOfInterestBean.getWeatherstationsForOrganization(this.getOrganization(), Boolean.TRUE);
         Collections.sort(stations);
         for(PointOfInterest station:stations)
         {
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunAllForecastConfigurationsTask.java b/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunAllForecastConfigurationsTask.java
index 1a057da43767ec296470e3242448b463fbd2fd2e..20bb66066108a7b01883e8c49bbc648e39acbcff 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunAllForecastConfigurationsTask.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunAllForecastConfigurationsTask.java
@@ -24,7 +24,11 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import javax.ejb.EJB;
 import no.nibio.vips.i18n.I18nImpl;
+import no.nibio.vips.logic.controller.session.ForecastBean;
+import no.nibio.vips.logic.controller.session.PointOfInterestBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.ModelInformation;
 import no.nibio.vips.logic.entity.Organization;
@@ -34,15 +38,22 @@ import no.nibio.vips.logic.scheduling.SchedulingUtil;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
 import no.nibio.vips.logic.util.RunModelException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.web.forms.FormField;
 
 /**
- * @copyright 2013-2018 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2013-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class RunAllForecastConfigurationsTask extends VipsLogicTask{
+    
+    @EJB
+    UserBean userBean;
+    @EJB
+    ForecastBean forecastBean;
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    
     private I18nImpl i18n;
     //private boolean DEBUG=true;
     @Override
@@ -57,7 +68,7 @@ public class RunAllForecastConfigurationsTask extends VipsLogicTask{
         // The config could come from a form
         if(this.getConfiguration() != null && this.getConfiguration().get("organizationId") != null)
         {
-            this.setOrganization(SessionControllerGetter.getUserBean().getOrganization(Integer.valueOf(this.getConfiguration().get("organizationId")[0])));
+            this.setOrganization(userBean.getOrganization(Integer.valueOf(this.getConfiguration().get("organizationId")[0])));
         }
         
         List<Organization> organizations = new ArrayList<>();
@@ -67,7 +78,7 @@ public class RunAllForecastConfigurationsTask extends VipsLogicTask{
         }
         else
         {
-            organizations = SessionControllerGetter.getUserBean().getOrganizations();
+            organizations = userBean.getOrganizations();
         }
         tec.setCompleteness(0d);
         int totalNumberofForecastConfigurations = 0;
@@ -76,11 +87,11 @@ public class RunAllForecastConfigurationsTask extends VipsLogicTask{
         // Get all organizations, loop, get all current forecasts, loop, run models, store results
         boolean noForecastConfigurationsFound = true;
         
-        Map<String, ModelInformation> modelInformationMap = SessionControllerGetter.getForecastBean().getIndexedBatchableModelInformation();
+        Map<String, ModelInformation> modelInformationMap = forecastBean.getIndexedBatchableModelInformation();
 
         for(Organization organization : organizations)
         {
-            List<ForecastConfiguration> currentForecastConfigurations = SessionControllerGetter.getForecastBean().getForecastConfigurationsValidAtTime(organization, SystemTime.getSystemTime());
+            List<ForecastConfiguration> currentForecastConfigurations = forecastBean.getForecastConfigurationsValidAtTime(organization, SystemTime.getSystemTime());
             //System.out.println("Current forecasts for " + organization.getOrganizationName() + ":" + currentForecastConfigurations.size());
             if(currentForecastConfigurations != null && !currentForecastConfigurations.isEmpty())
             {
@@ -97,7 +108,7 @@ public class RunAllForecastConfigurationsTask extends VipsLogicTask{
                         {
                             totalNumberofForecastConfigurations++;
                             //System.out.println("Running forecast #" + forecastConfiguration.getForecastConfigurationId());
-                            SessionControllerGetter.getForecastBean().runForecast(forecastConfiguration);
+                            forecastBean.runForecast(forecastConfiguration);
                             /*
                             if(DEBUG && totalNumberofForecastConfigurations == 2)
                             {
@@ -191,7 +202,7 @@ public class RunAllForecastConfigurationsTask extends VipsLogicTask{
                     .append("\",\"selected\":")
                     .append("false")
                     .append("}\n");
-        List<PointOfInterestWeatherStation> stations = SessionControllerGetter.getPointOfInterestBean().getAllWeatherStations();
+        List<PointOfInterestWeatherStation> stations = pointOfInterestBean.getAllWeatherStations();
         Collections.sort(stations);
         for(PointOfInterest station:stations)
         {
@@ -222,7 +233,7 @@ public class RunAllForecastConfigurationsTask extends VipsLogicTask{
                     .append("\",\"selected\":")
                     .append("false")
                     .append("}\n");
-        List<Organization> organizations = SessionControllerGetter.getUserBean().getOrganizations();
+        List<Organization> organizations = userBean.getOrganizations();
         //Collections.sort(organizations);
         for(Organization organization:organizations)
         {
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunForecastConfigurationsByIdTask.java b/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunForecastConfigurationsByIdTask.java
index b17f0353943734d7f160a1ee827e3165121b5f77..a0a4a639befdf15813041efa20aa5de73ed9cdd7 100644
--- a/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunForecastConfigurationsByIdTask.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunForecastConfigurationsByIdTask.java
@@ -21,14 +21,16 @@ package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
 import java.util.Map;
+import javax.ejb.EJB;
 import no.nibio.vips.i18n.I18nImpl;
+import no.nibio.vips.logic.controller.session.ForecastBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.ModelInformation;
 import no.nibio.vips.logic.scheduling.SchedulingUtil;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
 import no.nibio.vips.logic.util.RunModelException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.web.forms.FormField;
 
 /**
@@ -36,6 +38,12 @@ import no.nibio.web.forms.FormField;
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class RunForecastConfigurationsByIdTask extends VipsLogicTask{
+    
+    @EJB
+    UserBean userBean;
+    @EJB
+    ForecastBean forecastBean;
+    
     private I18nImpl i18n;
     //private boolean DEBUG=true;
     @Override
@@ -57,16 +65,16 @@ public class RunForecastConfigurationsByIdTask extends VipsLogicTask{
         Integer numberOfAttemptedForecastConfigurations = 0;
         Integer numberOfCompletedForecastConfigurations = 0;
         Boolean noForecastConfigurationsFound = forecastConfigurationIds.length == 0;
-        Map<String, ModelInformation> modelInformationMap = SessionControllerGetter.getForecastBean().getIndexedBatchableModelInformation();
+        Map<String, ModelInformation> modelInformationMap = forecastBean.getIndexedBatchableModelInformation();
         for(String forecastConfigurationId:forecastConfigurationIds)
         {
             noForecastConfigurationsFound = false;
-            ForecastConfiguration forecastConfiguration = SessionControllerGetter.getForecastBean().getForecastConfiguration(Long.valueOf(forecastConfigurationId));
+            ForecastConfiguration forecastConfiguration = forecastBean.getForecastConfiguration(Long.valueOf(forecastConfigurationId));
             try 
             {
                 numberOfAttemptedForecastConfigurations++;
                 //System.out.println("Running forecast #" + forecastConfiguration.getForecastConfigurationId());
-                SessionControllerGetter.getForecastBean().runForecast(forecastConfiguration);
+                forecastBean.runForecast(forecastConfiguration);
                 /*
                 if(DEBUG && totalNumberofForecastConfigurations == 2)
                 {
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunGridModelsTask.java b/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunGridModelsTask.java
index 9112bc96d04e67ef168642afcdde895388095429..1aee3407f518a41efae07f78c5aed3d7e0e036a3 100644
--- a/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunGridModelsTask.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/tasks/RunGridModelsTask.java
@@ -20,18 +20,22 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
+import javax.ejb.EJB;
+import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.scheduling.SchedulingUtil;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
 import no.nibio.vips.logic.util.RunModelException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 
 /**
- * @copyright 2018 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2018-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class RunGridModelsTask extends VipsLogicTask{
+    
+    @EJB
+    ForecastBean forecastBean;
 
     @Override
     public String getConfigFormDefinition(String language) {
@@ -44,11 +48,11 @@ public class RunGridModelsTask extends VipsLogicTask{
         //ZymoseptoriaSimpleRiskGridModelPreprocessor pp = new ZymoseptoriaSimpleRiskGridModelPreprocessor();
         // TODO: Must find a forecast configuration id! -1000 !
         
-        ForecastConfiguration fConfig = SessionControllerGetter.getForecastBean().getForecastConfiguration(-1000l);
+        ForecastConfiguration fConfig = forecastBean.getForecastConfiguration(-1000l);
 
         try
         {
-            SessionControllerGetter.getForecastBean().runForecast(fConfig);
+            forecastBean.runForecast(fConfig);
             tec.setCompleteness(1.0);
         }
         catch(PreprocessorException | RunModelException ex)
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/tasks/SendForecastEventNotificationsTask.java b/src/main/java/no/nibio/vips/logic/scheduling/tasks/SendForecastEventNotificationsTask.java
index 36ec8983f5b8089ea935701543472b1986a7fb61..a62cc6888c925642349870d7841704327f1fe507 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/tasks/SendForecastEventNotificationsTask.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/tasks/SendForecastEventNotificationsTask.java
@@ -20,16 +20,18 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
+import javax.ejb.EJB;
+import no.nibio.vips.logic.messaging.MessagingBean;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
-import no.nibio.vips.logic.scheduling.VipsLogicTaskFactory;
-import no.nibio.vips.logic.util.SessionControllerGetter;
-import no.nibio.web.forms.FormField;
 
 /**
- * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2016-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class SendForecastEventNotificationsTask extends VipsLogicTask {
+    
+    @EJB
+    MessagingBean messagingBean;
 
     @Override
     public String getConfigFormDefinition(String language) {
@@ -39,7 +41,7 @@ public class SendForecastEventNotificationsTask extends VipsLogicTask {
     @Override
     public void execute(TaskExecutionContext tec) throws RuntimeException {
         tec.setCompleteness(0d);
-        SessionControllerGetter.getMessagingBean().sendForecastEventNotifications();
+        messagingBean.sendForecastEventNotifications();
         tec.setCompleteness(1d);
     }
     
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateForecastResultCacheTableTask.java b/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateForecastResultCacheTableTask.java
index d3c48a4a35c5f71f729c5fde5cc1333dd1d2ac3d..3ad93b4ee9e224837bac633cbdc9ef40ce1746a3 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateForecastResultCacheTableTask.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateForecastResultCacheTableTask.java
@@ -20,16 +20,17 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
+import javax.ejb.EJB;
+import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
-import no.nibio.vips.logic.scheduling.VipsLogicTaskFactory;
-import no.nibio.vips.logic.util.SessionControllerGetter;
-import no.nibio.web.forms.FormField;
 
 /**
- * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2014-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class UpdateForecastResultCacheTableTask  extends VipsLogicTask{
+    @EJB
+    ForecastBean forecastBean;
 
     @Override
     public String getConfigFormDefinition(String language) {
@@ -39,7 +40,7 @@ public class UpdateForecastResultCacheTableTask  extends VipsLogicTask{
     @Override
     public void execute(TaskExecutionContext tec) throws RuntimeException {
         tec.setCompleteness(0d);
-        SessionControllerGetter.getForecastBean().updateForecastResultCacheTable();
+        forecastBean.updateForecastResultCacheTable();
         tec.setCompleteness(1d);
     }
 
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateForecastSummaryTableTask.java b/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateForecastSummaryTableTask.java
index 19e98ba0038cede64a3ec5027b078b9d4a10e0fb..cc0e41bd41a6cd4da6e8ac6ee00fd0e3ee1e2a71 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateForecastSummaryTableTask.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateForecastSummaryTableTask.java
@@ -20,15 +20,19 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
+import javax.ejb.EJB;
+import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 
 /**
- * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2015-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class UpdateForecastSummaryTableTask  extends VipsLogicTask{
+    
+    @EJB
+    ForecastBean forecastBean;
 
     @Override
     public String getConfigFormDefinition(String language) {
@@ -38,7 +42,7 @@ public class UpdateForecastSummaryTableTask  extends VipsLogicTask{
     @Override
     public void execute(TaskExecutionContext tec) throws RuntimeException {
         tec.setCompleteness(0d);
-        SessionControllerGetter.getForecastBean().updateForecastSummaryTable(SystemTime.getSystemTime());
+        forecastBean.updateForecastSummaryTable(SystemTime.getSystemTime());
         tec.setCompleteness(1d);
     }
 
diff --git a/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateModelInformationTask.java b/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateModelInformationTask.java
index 102c4a399c662f8654f03f8458cca7df25164714..d68a8b291317d2a14a286bd71103b8bbafc346a7 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateModelInformationTask.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/tasks/UpdateModelInformationTask.java
@@ -20,17 +20,19 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
+import javax.ejb.EJB;
+import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
-import no.nibio.vips.logic.scheduling.VipsLogicTaskFactory;
-import no.nibio.vips.logic.util.SessionControllerGetter;
-import no.nibio.web.forms.FormField;
 
 /**
  * Ensures model information is imported from VIPSCoreManager and 
- * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2014-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class UpdateModelInformationTask extends VipsLogicTask{
+    
+    @EJB
+    ForecastBean forecastBean;
 
     /**
      * 
@@ -45,7 +47,7 @@ public class UpdateModelInformationTask extends VipsLogicTask{
     @Override
     public void execute(TaskExecutionContext tec) throws RuntimeException {
         tec.setCompleteness(0d);
-        SessionControllerGetter.getForecastBean().updateModelInformation();
+        forecastBean.updateModelInformation();
         tec.setCompleteness(1d);
     }
     
diff --git a/src/main/java/no/nibio/vips/logic/service/AuthenticationService.java b/src/main/java/no/nibio/vips/logic/service/AuthenticationService.java
index f9e40286478cbc17cd376d89b6a9f297eaa615f3..abb6329764036f310de54db0e822e261298a6cf2 100644
--- a/src/main/java/no/nibio/vips/logic/service/AuthenticationService.java
+++ b/src/main/java/no/nibio/vips/logic/service/AuthenticationService.java
@@ -38,22 +38,25 @@ import javax.ws.rs.core.Response.Status;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.webcohesion.enunciate.metadata.Facet;
 import com.webcohesion.enunciate.metadata.rs.TypeHint;
+import javax.ejb.EJB;
+import no.nibio.vips.logic.controller.session.UserBean;
 
 import no.nibio.vips.logic.entity.UserUuid;
 import no.nibio.vips.logic.entity.VipsLogicUser;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 
 /**
  * Authentication services
- * @copyright 2021 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2021-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/auth")
 public class AuthenticationService {
+    
+    @EJB
+    UserBean userBean;
 	
-	@Context
+    @Context
     private HttpServletRequest httpServletRequest;
 	
 	/**
@@ -80,14 +83,14 @@ public class AuthenticationService {
         creds.put("username", username);
         creds.put("password", password);
 		// Authenticate 
-        VipsLogicUser user = SessionControllerGetter.getUserBean().authenticateUser(creds);
+        VipsLogicUser user = userBean.authenticateUser(creds);
 		// Return success (true/false) and UUID if success
         ObjectMapper objectMapper = new ObjectMapper();
         
         ObjectNode result = objectMapper.createObjectNode();
         if(user != null)
         {
-        	UserUuid uuid = SessionControllerGetter.getUserBean().createAndPersistUserUuid(user);
+        	UserUuid uuid = userBean.createAndPersistUserUuid(user);
         	result.put("success", true);
         	result.put("UUID", uuid.getUserUuidPK().getUserUuid().toString());
         }
@@ -111,11 +114,11 @@ public class AuthenticationService {
 	{
 		String uuidStr = httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION);
 		UUID uuid = UUID.fromString(uuidStr);
-		VipsLogicUser user = SessionControllerGetter.getUserBean().findVipsLogicUser(uuid);
+		VipsLogicUser user = userBean.findVipsLogicUser(uuid);
 		if(user != null)
 		{
 			// Also, renew the uuid by default length
-			SessionControllerGetter.getUserBean().renewUserUuid(uuid);
+			userBean.renewUserUuid(uuid);
 			return Response.ok().entity(user).build();
 		}
 		else
diff --git a/src/main/java/no/nibio/vips/logic/service/GrowthStageService.java b/src/main/java/no/nibio/vips/logic/service/GrowthStageService.java
index 2f27ca8c92d6834d1377fb9951b909c280615b48..05b07d7a026d39ac95b337f49f4d99b1ebc4a1b8 100644
--- a/src/main/java/no/nibio/vips/logic/service/GrowthStageService.java
+++ b/src/main/java/no/nibio/vips/logic/service/GrowthStageService.java
@@ -21,7 +21,6 @@ package no.nibio.vips.logic.service;
 
 import com.vividsolutions.jts.geom.Coordinate;
 import java.time.LocalDate;
-import java.time.Month;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -30,6 +29,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.servlet.http.HttpServletRequest;
@@ -40,13 +40,13 @@ 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.logic.controller.session.PointOfInterestBean;
 import no.nibio.vips.logic.entity.Organism;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.modules.wheatleafblotch.GrowthStageLocationDate;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 
 /**
- * @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2020-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/gs")
@@ -56,6 +56,9 @@ public class GrowthStageService {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    
     /**
      * At what dates can we expect the given crop to be at the given growth stages
      * at the given location?
@@ -213,7 +216,7 @@ public class GrowthStageService {
         .setParameter("cropOrganismId", organismId)
         .getResultList();
         
-        PointOfInterestWeatherStation closestStation = SessionControllerGetter.getPointOfInterestBean().findClosestWeatherStation(this.getLocationCoordinate(location), stationsWithGrowthStageInfoForCrop);
+        PointOfInterestWeatherStation closestStation = pointOfInterestBean.findClosestWeatherStation(this.getLocationCoordinate(location), stationsWithGrowthStageInfoForCrop);
         return em.createNamedQuery("GrowthStageLocationDate.findByCropOrganismIdAndPointOfInterestId")
                 .setParameter("cropOrganismId", em.find(Organism.class, organismId))
                 .setParameter("pointOfInterestId", closestStation)
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 6c7b9be72c68f351893c773d796637157e6d2458..655cf843ad7679c609a0d870362ac03ef1e6b48a 100755
--- a/src/main/java/no/nibio/vips/logic/service/LogicService.java
+++ b/src/main/java/no/nibio/vips/logic/service/LogicService.java
@@ -23,13 +23,6 @@ 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.io.BufferedReader;
-import java.io.IOError;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -41,6 +34,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
@@ -57,6 +51,11 @@ import javax.ws.rs.core.Response;
 import no.nibio.vips.coremanager.service.ManagerResource;
 import no.nibio.vips.entity.WeatherObservation;
 import no.nibio.vips.logic.authenticate.PasswordValidationException;
+import no.nibio.vips.logic.controller.session.ForecastBean;
+import no.nibio.vips.logic.controller.session.MessageBean;
+import no.nibio.vips.logic.controller.session.OrganismBean;
+import no.nibio.vips.logic.controller.session.PointOfInterestBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.CropPest;
 import no.nibio.vips.logic.entity.ForecastResult;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
@@ -71,7 +70,6 @@ import no.nibio.vips.logic.entity.PointOfInterest;
 import no.nibio.vips.logic.entity.PointOfInterestType;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
 import no.nibio.vips.logic.entity.VipsLogicUser;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.util.CSVPrintUtil;
 import no.nibio.vips.util.ServletUtil;
@@ -93,6 +91,17 @@ public class LogicService {
     @Context
     private HttpServletRequest httpServletRequest;
     
+    @EJB
+    ForecastBean forecastBean;
+    @EJB
+    UserBean userBean;
+    @EJB
+    OrganismBean organismBean;
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    @EJB
+    MessageBean messageBean;
+    
     /**
      * Get all results for one pest prediction
      * @param forecastConfigurationId Database id of the configured forecast
@@ -129,9 +138,9 @@ public class LogicService {
             @QueryParam("userUUID") String userUUID
     )
     {
-        if(SessionControllerGetter.getForecastBean().isUserAuthorizedForForecastConfiguration(forecastConfigurationId, userUUID))
+        if(forecastBean.isUserAuthorizedForForecastConfiguration(forecastConfigurationId, userUUID))
         {
-            List<ForecastResult> results = SessionControllerGetter.getForecastBean().getForecastResults(forecastConfigurationId);
+            List<ForecastResult> results = forecastBean.getForecastResults(forecastConfigurationId);
             if(results == null)
             {
                 results = new ArrayList<>();
@@ -159,10 +168,10 @@ public class LogicService {
             @QueryParam("userUUID") String userUUID
     )
     {
-        if(SessionControllerGetter.getForecastBean().isUserAuthorizedForForecastConfiguration(forecastConfigurationId, userUUID))
+        if(forecastBean.isUserAuthorizedForForecastConfiguration(forecastConfigurationId, userUUID))
         {
             String CSVOutput = "";
-            List<ForecastResult> results = SessionControllerGetter.getForecastBean().getForecastResults(forecastConfigurationId);
+            List<ForecastResult> results = forecastBean.getForecastResults(forecastConfigurationId);
             if(results != null && ! results.isEmpty())
             {
                 List<String> parameters = new ArrayList<>();//new String[results.get(0).getKeys().size() + 3];
@@ -214,9 +223,9 @@ public class LogicService {
             @QueryParam("userUUID") String userUUID
     )
     {
-        if(SessionControllerGetter.getForecastBean().isUserAuthorizedForForecastConfiguration(forecastConfigurationId, userUUID))
+        if(forecastBean.isUserAuthorizedForForecastConfiguration(forecastConfigurationId, userUUID))
         {
-            List<ForecastResult> results = SessionControllerGetter.getForecastBean().getForecastResults(forecastConfigurationId, latestDays);
+            List<ForecastResult> results = forecastBean.getForecastResults(forecastConfigurationId, latestDays);
             if(results == null)
             {
                 results = new ArrayList<>();
@@ -244,7 +253,7 @@ public class LogicService {
         {
             Date dateStart = format.parse(dateStartStr);
             Date dateEnd = format.parse(dateEndStr);
-            return Response.ok().entity(SessionControllerGetter.getForecastBean().getForecastResults(forecastConfigurationId, dateStart, dateEnd)).build();
+            return Response.ok().entity(forecastBean.getForecastResults(forecastConfigurationId, dateStart, dateEnd)).build();
         }
         catch(ParseException ex)
         {
@@ -274,11 +283,11 @@ public class LogicService {
         try
         {
             UUID uUUID = UUID.fromString(userUUID);
-            user = SessionControllerGetter.getUserBean().findVipsLogicUser(uUUID);
+            user = userBean.findVipsLogicUser(uUUID);
         }
         catch(NullPointerException | IllegalArgumentException ex) {}
         
-        List<ForecastConfiguration> summaries = SessionControllerGetter.getForecastBean().getForecastConfigurationSummaries(organizationId, user);
+        List<ForecastConfiguration> summaries = forecastBean.getForecastConfigurationSummaries(organizationId, user);
         
         if(includeOrganizationIds != null)
         {
@@ -292,7 +301,7 @@ public class LogicService {
                     {
                         continue;
                     }
-                    summaries.addAll(SessionControllerGetter.getForecastBean().getForecastConfigurationSummaries(includeOrgId, user));
+                    summaries.addAll(forecastBean.getForecastConfigurationSummaries(includeOrgId, user));
                 }
                 catch(NumberFormatException ex){}
             }
@@ -315,10 +324,10 @@ public class LogicService {
     )
     {
         UUID uUUID = UUID.fromString(userUUID);
-        VipsLogicUser user = SessionControllerGetter.getUserBean().findVipsLogicUser(uUUID);
+        VipsLogicUser user = userBean.findVipsLogicUser(uUUID);
         if(user != null)
         {
-            List<ForecastConfiguration> summaries = SessionControllerGetter.getForecastBean().getPrivateForecastConfigurationSummaries(user);
+            List<ForecastConfiguration> summaries = forecastBean.getPrivateForecastConfigurationSummaries(user);
             return Response.ok().entity(summaries).build();
         }
         else
@@ -339,9 +348,9 @@ public class LogicService {
     @Produces("application/json;charset=UTF-8")
     public Response getForecastConfiguration(@PathParam("forecastConfigurationId") Long forecastConfigurationId,@QueryParam("userUUID") String userUUID)
     {
-        if(SessionControllerGetter.getForecastBean().isUserAuthorizedForForecastConfiguration(forecastConfigurationId, userUUID))
+        if(forecastBean.isUserAuthorizedForForecastConfiguration(forecastConfigurationId, userUUID))
         {
-            ForecastConfiguration forecastConfiguration = SessionControllerGetter.getForecastBean().getForecastConfiguration(forecastConfigurationId);
+            ForecastConfiguration forecastConfiguration = forecastBean.getForecastConfiguration(forecastConfigurationId);
             return Response.ok().entity(forecastConfiguration).build();
         }
         else
@@ -361,7 +370,7 @@ public class LogicService {
     @Produces("application/json;charset=UTF-8")
     public Response getForecastConfigurationsForModel(@PathParam("modelId") String modelId, @PathParam("year") Integer year)
     {
-        return Response.ok().entity(SessionControllerGetter.getForecastBean().getForecastConfigurationsForModel(modelId, year)).build();
+        return Response.ok().entity(forecastBean.getForecastConfigurationsForModel(modelId, year)).build();
     }
     
     
@@ -379,10 +388,10 @@ public class LogicService {
         try
         {
             UUID uUUID = UUID.fromString(userUUID);
-            VipsLogicUser user = SessionControllerGetter.getUserBean().findVipsLogicUser(uUUID);
+            VipsLogicUser user = userBean.findVipsLogicUser(uUUID);
             if(user != null)
             {
-                List<ForecastConfiguration> retVal = SessionControllerGetter.getForecastBean().getPrivateForecastConfigurationsForUser(user.getUserId());
+                List<ForecastConfiguration> retVal = forecastBean.getPrivateForecastConfigurationsForUser(user.getUserId());
                 return Response.ok().entity(retVal).build();
             }
             else
@@ -444,7 +453,7 @@ public class LogicService {
                 catch(NumberFormatException ex){}
             }
         }
-        List<ForecastConfiguration> forecastConfigs = SessionControllerGetter.getForecastBean().getForecastConfigurations(orgIds, from, to);
+        List<ForecastConfiguration> forecastConfigs = forecastBean.getForecastConfigurations(orgIds, from, to);
         return Response.ok().entity(forecastConfigs).build();
     }
     
@@ -484,7 +493,7 @@ public class LogicService {
         
 
         // First: Get all users for organization
-        List<VipsLogicUser> organizationUsers = SessionControllerGetter.getUserBean().getUsersByOrganization(organizationId);
+        List<VipsLogicUser> organizationUsers = userBean.getUsersByOrganization(organizationId);
         // Then: Get forecasts for these users, collate and return
         List<ForecastConfiguration> forecasts = new ArrayList<>();
         
@@ -492,8 +501,8 @@ public class LogicService {
         {
             Integer userId = user.getUserId();
             List<ForecastConfiguration> result = cropOrganismIds != null && ! cropOrganismIds.isEmpty() ?
-                    SessionControllerGetter.getForecastBean().getForecastConfigurationsForUserAndCropsAndDate(userId,cropOrganismIds, from, to)
-                    : SessionControllerGetter.getForecastBean().getForecastConfigurationsForUserAndDate(userId, from, to);
+                    forecastBean.getForecastConfigurationsForUserAndCropsAndDate(userId,cropOrganismIds, from, to)
+                    : forecastBean.getForecastConfigurationsForUserAndDate(userId, from, to);
             if(forecasts == null)
                 forecasts = result;
             else
@@ -521,7 +530,7 @@ public class LogicService {
         ULocale currentLocale = SessionLocaleUtil.getCurrentLocale(httpServletRequest);
         try
         {
-            boolean isPasswordValid = SessionControllerGetter.getUserBean().isPasswordValid(password, currentLocale);
+            boolean isPasswordValid = userBean.isPasswordValid(password, currentLocale);
             return Response.ok().entity("true").build();
             
         }
@@ -537,7 +546,7 @@ public class LogicService {
     @Facet("restricted")
     public Response getForecastModelConfiguration(@PathParam("forecastConfigurationId") Long forecastConfigurationId)
     {
-        List<ForecastModelConfiguration> forecastModelConfigurations = SessionControllerGetter.getForecastBean().getForecastModelConfigurations(forecastConfigurationId);
+        List<ForecastModelConfiguration> forecastModelConfigurations = forecastBean.getForecastModelConfigurations(forecastConfigurationId);
         return Response.ok().entity(forecastModelConfigurations).build();
     }
     
@@ -562,7 +571,7 @@ public class LogicService {
             try
             {
                 UUID uUUID = UUID.fromString(userUUID);
-                viewUser = SessionControllerGetter.getUserBean().findVipsLogicUser(uUUID);
+                viewUser = userBean.findVipsLogicUser(uUUID);
             }
             catch(IllegalArgumentException ex)
             {
@@ -577,8 +586,8 @@ public class LogicService {
         }
         else
         {
-            List<Integer> cropOrganismIds = SessionControllerGetter.getOrganismBean().getCropCategoryOrganismIds(cropCategoryIds);
-            Kml retVal = SessionControllerGetter.getForecastBean().getForecastsAggregateKml(organizationIds, cropOrganismIds, SystemTime.getSystemTime(), ServletUtil.getServerName(httpServletRequest), viewUser);
+            List<Integer> cropOrganismIds = organismBean.getCropCategoryOrganismIds(cropCategoryIds);
+            Kml retVal = forecastBean.getForecastsAggregateKml(organizationIds, cropOrganismIds, SystemTime.getSystemTime(), ServletUtil.getServerName(httpServletRequest), viewUser);
             return Response.ok().entity(retVal).build();
         }
     }
@@ -610,15 +619,15 @@ public class LogicService {
                 try
                 {
                     UUID uUUID = UUID.fromString(userUUID);
-                    viewUser = SessionControllerGetter.getUserBean().findVipsLogicUser(uUUID);
+                    viewUser = userBean.findVipsLogicUser(uUUID);
                 }
                 catch(IllegalArgumentException ex)
                 {
                     // Skip this
                 }
             }
-            List<Integer> cropOrganismIds = SessionControllerGetter.getOrganismBean().getCropCategoryOrganismIds(cropCategoryIds);
-            Kml retVal = SessionControllerGetter.getForecastBean().getForecastsAggregateKml(organizationIds, cropOrganismIds, SystemTime.getSystemTime(), ServletUtil.getServerName(httpServletRequest), viewUser);
+            List<Integer> cropOrganismIds = organismBean.getCropCategoryOrganismIds(cropCategoryIds);
+            Kml retVal = forecastBean.getForecastsAggregateKml(organizationIds, cropOrganismIds, SystemTime.getSystemTime(), ServletUtil.getServerName(httpServletRequest), viewUser);
             return Response.ok().entity(retVal).build();
         }
     }
@@ -634,7 +643,7 @@ public class LogicService {
     @Produces("application/json;charset=UTF-8")
     public Response getLatestForecastResultsForPoi(@PathParam("poiId") Integer poiId)
     {
-        Map<String, Object> latestResults = SessionControllerGetter.getForecastBean().getLatestForecastResultsForPoi(poiId);
+        Map<String, Object> latestResults = forecastBean.getLatestForecastResultsForPoi(poiId);
         return Response.ok().entity(latestResults).build();
     }
     
@@ -650,7 +659,7 @@ public class LogicService {
     @Produces("application/vnd.google-earth.kml+xml;charset=utf-8")
     public Response getWeatherStations(@QueryParam("excludeWeatherStationId") Integer excludeWeatherStationId, @QueryParam("highlightWeatherStationId") Integer highlightWeatherStationId, @PathParam("organizationId") Integer organizationId)
     {
-        Kml retVal = SessionControllerGetter.getPointOfInterestBean().getPoisForOrganization(organizationId, excludeWeatherStationId, highlightWeatherStationId, ServletUtil.getServerName(httpServletRequest), SessionLocaleUtil.getI18nBundle(httpServletRequest), PointOfInterestType.POINT_OF_INTEREST_TYPE_WEATHER_STATION);
+        Kml retVal = pointOfInterestBean.getPoisForOrganization(organizationId, excludeWeatherStationId, highlightWeatherStationId, ServletUtil.getServerName(httpServletRequest), SessionLocaleUtil.getI18nBundle(httpServletRequest), PointOfInterestType.POINT_OF_INTEREST_TYPE_WEATHER_STATION);
         return Response.ok().entity(retVal).build();
     }
     
@@ -666,7 +675,7 @@ public class LogicService {
     @Produces("application/vnd.google-earth.kml+xml;charset=utf-8")
     public Response getPois(@QueryParam("excludePoiId") Integer excludePoiId, @QueryParam("highlightPoiId") Integer highlightPoiId, @PathParam("organizationId") Integer organizationId)
     {
-        Kml retVal = SessionControllerGetter.getPointOfInterestBean().getPoisForOrganization(organizationId, excludePoiId, highlightPoiId, ServletUtil.getServerName(httpServletRequest), SessionLocaleUtil.getI18nBundle(httpServletRequest), null);
+        Kml retVal = pointOfInterestBean.getPoisForOrganization(organizationId, excludePoiId, highlightPoiId, ServletUtil.getServerName(httpServletRequest), SessionLocaleUtil.getI18nBundle(httpServletRequest), null);
         return Response.ok().entity(retVal).build();
     }
     
@@ -681,8 +690,8 @@ public class LogicService {
     @Produces("application/json;charset=UTF-8")
     public Response getPoisForOrganization(@PathParam("organizationId") Integer organizationId)
     {
-        Organization organization = SessionControllerGetter.getUserBean().getOrganization(organizationId);
-        List<PointOfInterestWeatherStation> retVal = SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForOrganization(organization, Boolean.TRUE);
+        Organization organization = userBean.getOrganization(organizationId);
+        List<PointOfInterestWeatherStation> retVal = pointOfInterestBean.getWeatherstationsForOrganization(organization, Boolean.TRUE);
         return Response.ok().entity(retVal).build();
     }
     
@@ -696,7 +705,7 @@ public class LogicService {
     @Produces("application/json;charset=UTF-8")
     public Response getPoi(@PathParam("pointOfInterestId") Integer pointOfInterestId)
     {
-        PointOfInterest retVal = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(pointOfInterestId);
+        PointOfInterest retVal = pointOfInterestBean.getPointOfInterest(pointOfInterestId);
         return Response.ok().entity(retVal).build();
     }
     
@@ -710,7 +719,7 @@ public class LogicService {
     @Produces("application/json;charset=UTF-8")
     public Response getPoiByName(@PathParam("poiName") String poiName)
     {
-        PointOfInterest retVal = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(poiName);
+        PointOfInterest retVal = pointOfInterestBean.getPointOfInterest(poiName);
         return retVal != null ? Response.ok().entity(retVal).build() : Response.noContent().build();
     }
     
@@ -730,9 +739,9 @@ public class LogicService {
         {
         	String uuidStr = httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION);
     		UUID uuid = UUID.fromString(uuidStr);
-    		user = SessionControllerGetter.getUserBean().findVipsLogicUser(uuid);
+    		user = userBean.findVipsLogicUser(uuid);
         }
-        List<PointOfInterest> retVal = SessionControllerGetter.getPointOfInterestBean().getRelevantPointOfInterestsForUser(user);
+        List<PointOfInterest> retVal = pointOfInterestBean.getRelevantPointOfInterestsForUser(user);
         return Response.ok().entity(retVal).build();
     }
     
@@ -746,7 +755,7 @@ public class LogicService {
     @Facet("restricted")
     public Response getOrganismList()
     {
-        List<Organism> organismList = SessionControllerGetter.getOrganismBean().getOrganismSubTree(null);
+        List<Organism> organismList = organismBean.getOrganismSubTree(null);
         return Response.ok().entity(organismList).build();
     }
     
@@ -761,7 +770,7 @@ public class LogicService {
     public Response findOrganismsByLatinNames(@QueryParam("keywords") String keywords)
     {
         List<String> latinNames = Arrays.asList(keywords.split(","));
-        List<Organism> organismList = SessionControllerGetter.getOrganismBean().findOrganismsByLatinNames(latinNames);
+        List<Organism> organismList = organismBean.findOrganismsByLatinNames(latinNames);
         return Response.ok().entity(organismList).build();
     }
     
@@ -779,7 +788,7 @@ public class LogicService {
     )
     {
         List<String> localNames = Arrays.asList(keywords.split(",")).stream().map(String::trim).collect(Collectors.toList());
-        List<Organism> organismList = SessionControllerGetter.getOrganismBean().findOrganismsByLocalNames(localNames, locale);
+        List<Organism> organismList = organismBean.findOrganismsByLocalNames(localNames, locale);
         return Response.ok().entity(organismList).build();
     }
     
@@ -793,7 +802,7 @@ public class LogicService {
     @Facet("restricted")
     public Response getCropOrganismList()
     {
-        List<Organism> organismList = SessionControllerGetter.getOrganismBean().getAllCrops();
+        List<Organism> organismList = organismBean.getAllCrops();
         return Response.ok().entity(organismList).build();
     }
     
@@ -813,11 +822,11 @@ public class LogicService {
     	List<Organism> organismList;
     	if(cropOrganismId == null)
     	{
-    		organismList = SessionControllerGetter.getOrganismBean().getAllPests();
+    		organismList = organismBean.getAllPests();
     	}
     	else
     	{
-    		organismList = SessionControllerGetter.getOrganismBean().getCropPests(cropOrganismId);
+    		organismList = organismBean.getCropPests(cropOrganismId);
     	}
         return Response.ok().entity(organismList).build();
     }
@@ -834,7 +843,7 @@ public class LogicService {
     public Response getCropPestList(
     		)
     {
-        return Response.ok().entity(SessionControllerGetter.getOrganismBean().getCropPestsMapped()).build();
+        return Response.ok().entity(organismBean.getCropPestsMapped()).build();
     }
     
     /**
@@ -848,7 +857,7 @@ public class LogicService {
     @Facet("restricted")
     public Response getMessage(@PathParam("messageId") Integer messageId)
     {
-        Message message = SessionControllerGetter.getMessageBean().getMessage(messageId);
+        Message message = messageBean.getMessage(messageId);
         
         return Response.ok().entity(message).build();
     }
@@ -888,7 +897,7 @@ public class LogicService {
                 datePublishedTo = publishedTo == null ? null : format.parse(publishedTo);
             }
             
-            List<Message> messageList = SessionControllerGetter.getMessageBean().getMessageList(organizationId, datePublishedFrom, datePublishedTo);
+            List<Message> messageList = messageBean.getMessageList(organizationId, datePublishedFrom, datePublishedTo);
             return Response.ok().entity(messageList).build();
         }
         catch(ParseException ex){
@@ -909,7 +918,7 @@ public class LogicService {
     @Facet("restricted")
     public Response getMessageListWithTags(@QueryParam("tagId") List<Integer> tagIds, @PathParam("organizationId") Integer organizationId)
     {
-        List<Message> messageListWithTags = SessionControllerGetter.getMessageBean().getCurrentFilteredMessagesForOrganization(tagIds, organizationId);
+        List<Message> messageListWithTags = messageBean.getCurrentFilteredMessagesForOrganization(tagIds, organizationId);
         return Response.ok().entity(messageListWithTags).build();
     }
     
@@ -923,7 +932,7 @@ public class LogicService {
     @Facet("restricted")
     public Response getMessageTagList()
     {
-        List<MessageTag> messageTags = SessionControllerGetter.getMessageBean().getMessageTagList();
+        List<MessageTag> messageTags = messageBean.getMessageTagList();
         return Response.ok().entity(messageTags).build();
     }
     
@@ -1074,8 +1083,8 @@ public class LogicService {
             return Response.status(Response.Status.UNAUTHORIZED).build();
         }
         Date start = new Date();
-        SessionControllerGetter.getForecastBean().updateForecastResultCacheTable();
-        SessionControllerGetter.getForecastBean().updateForecastSummaryTable(SystemTime.getSystemTime());
+        forecastBean.updateForecastResultCacheTable();
+        forecastBean.updateForecastSummaryTable(SystemTime.getSystemTime());
         Long timeLapsed = new Date().getTime() - start.getTime();
         DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         return Response.ok().entity("Forecast caches were successfully updated with data from today (" 
@@ -1097,7 +1106,7 @@ public class LogicService {
         try
         {
             UUID uUUID = UUID.fromString(userUUID);
-            VipsLogicUser user = SessionControllerGetter.getUserBean().findVipsLogicUser(uUUID);
+            VipsLogicUser user = userBean.findVipsLogicUser(uUUID);
             if(user != null)
             {
                 return Response.ok().entity(user).build();
@@ -1127,7 +1136,7 @@ public class LogicService {
         try
         {
             UUID uUUID = UUID.fromString(userUUID);
-            SessionControllerGetter.getUserBean().deleteUserUuid(uUUID);
+            userBean.deleteUserUuid(uUUID);
             return Response.ok().build();
         }
         catch(IllegalArgumentException ex)
@@ -1147,7 +1156,7 @@ public class LogicService {
     @Facet("restricted")
     public Response getCropPest(@PathParam("cropOrganismId") Integer cropOrganismId)
     {
-        CropPest retVal = SessionControllerGetter.getOrganismBean().getCropPestRecursive(cropOrganismId,true);
+        CropPest retVal = organismBean.getCropPestRecursive(cropOrganismId,true);
         if(retVal != null)
         {
             return Response.ok().entity(retVal).build();
@@ -1171,7 +1180,7 @@ public class LogicService {
     {
         if(organizationId != null)
         {
-            return Response.ok().entity(SessionControllerGetter.getOrganismBean().getCropCategories(organizationId)).build();
+            return Response.ok().entity(organismBean.getCropCategories(organizationId)).build();
         }
         else
         {
@@ -1184,7 +1193,7 @@ public class LogicService {
     @Produces("application/json;charset=UTF-8")
     public Response getOrganizations()
     {
-        return Response.ok().entity(SessionControllerGetter.getUserBean().getOrganizations()).build();
+        return Response.ok().entity(userBean.getOrganizations()).build();
     }
     
     @GET
@@ -1192,7 +1201,7 @@ public class LogicService {
     @Produces("application/json;charset=UTF-8")
     public Response getModelInformation(@PathParam("modelId") String modelId)
     {
-        ModelInformation retVal = SessionControllerGetter.getForecastBean().getModelInformation(modelId);
+        ModelInformation retVal = forecastBean.getModelInformation(modelId);
         return retVal != null ? Response.ok().entity(retVal).build() 
                 : Response.status(Response.Status.NOT_FOUND).entity("ERROR: Could not find model with id=" + modelId).build();
     }
diff --git a/src/main/java/no/nibio/vips/logic/service/ModelFormService.java b/src/main/java/no/nibio/vips/logic/service/ModelFormService.java
index 2e7c094d74fbae49e1ab33600b9cedc7924b21c9..5b8cd2d8e21cced2f1163aeb1f61ff7386e3d82e 100644
--- a/src/main/java/no/nibio/vips/logic/service/ModelFormService.java
+++ b/src/main/java/no/nibio/vips/logic/service/ModelFormService.java
@@ -26,6 +26,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.TimeZone;
+import javax.ejb.EJB;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
@@ -35,6 +36,9 @@ import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.entity.WeatherObservation;
 import no.nibio.vips.gis.GISUtil;
+import no.nibio.vips.logic.controller.session.ForecastBean;
+import no.nibio.vips.logic.controller.session.PointOfInterestBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.ForecastModelConfiguration;
 import no.nibio.vips.logic.entity.ForecastModelConfigurationPK;
@@ -44,7 +48,6 @@ import no.nibio.vips.logic.entity.WeatherStationDataSource;
 import no.nibio.vips.logic.scheduling.model.PreprocessorException;
 import no.nibio.vips.logic.scheduling.model.preprocessor.SeptoriaHumidityModelPreprocessor;
 import no.nibio.vips.logic.util.RunModelException;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.util.ParseRESTParamUtil;
 import no.nibio.vips.util.WeatherUtil;
@@ -53,12 +56,19 @@ import no.nibio.vips.util.weather.WeatherDataSourceUtil;
 
 /**
  * This is a collection of services for models run from forms (not as part of batch) 
- * @copyright 2018 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2018-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/modelform")
 @Facet("restricted")
 public class ModelFormService {
+    
+    @EJB
+    UserBean userBean;
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    @EJB
+    ForecastBean forecastBean;
 
     @GET
     @Path("SEPTORIAHU/runmodel")
@@ -108,7 +118,7 @@ public class ModelFormService {
             // Data parsing
 
             Integer organizationId = Integer.valueOf(organizationId_countryCode.split("_")[0]);
-            Organization organization = SessionControllerGetter.getUserBean().getOrganization(organizationId);
+            Organization organization = userBean.getOrganization(organizationId);
             fConf.setTimeZone(organization.getDefaultTimeZone());
             TimeZone timeZone =  TimeZone.getTimeZone(organization.getDefaultTimeZone());
             ParseRESTParamUtil pUtil = new ParseRESTParamUtil();
@@ -141,7 +151,7 @@ public class ModelFormService {
                 GISUtil gisUtil = new GISUtil();
                 Coordinate UTMc = new Coordinate(UTM32vE, UTM32vN); 
                 Coordinate coordinate = gisUtil.convertCoordinate(UTMc, "EPSG:32632", "EPSG:4326");
-                WeatherStationDataSource wsds = SessionControllerGetter.getPointOfInterestBean().getWeatherStationDataSource("DMI PointWeb");
+                WeatherStationDataSource wsds = pointOfInterestBean.getWeatherStationDataSource("DMI PointWeb");
                 ws = new PointOfInterestWeatherStation();
                 ws.setWeatherStationDataSourceId(wsds);
                 ws.setWeatherStationRemoteId(coordinate.y + "," + coordinate.x);// For some reason, The transformation switches X/Y
@@ -152,7 +162,7 @@ public class ModelFormService {
             else
             {
                 // Weather station id maps to a regular weather station
-                ws = (PointOfInterestWeatherStation) SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(Integer.valueOf(weatherStationId));
+                ws = (PointOfInterestWeatherStation) pointOfInterestBean.getPointOfInterest(Integer.valueOf(weatherStationId));
             }
             fConf.setWeatherStationPointOfInterestId(ws);
             fConf.setLocationPointOfInterestId(ws);
@@ -162,7 +172,7 @@ public class ModelFormService {
             Integer VIPSCoreUserId = organization.getDefaultVipsCoreUserId();
             System.out.println("defaultVIPScoreUserId = " + VIPSCoreUserId);
 
-            List<Result>results = SessionControllerGetter.getForecastBean().runForecast(mConf, VIPSCoreUserId);
+            List<Result>results = forecastBean.runForecast(mConf, VIPSCoreUserId);
 
             return Response.ok().entity(results).build();
         }
@@ -174,7 +184,7 @@ public class ModelFormService {
     
     private ForecastModelConfiguration getForecastModelConfiguration(String modelId, String key, String value)
     {
-        ForecastModelConfiguration retVal = new ForecastModelConfiguration(new ForecastModelConfigurationPK(-1, SessionControllerGetter.getForecastBean().getDeCamelizedFieldName(modelId, key)));
+        ForecastModelConfiguration retVal = new ForecastModelConfiguration(new ForecastModelConfigurationPK(-1, forecastBean.getDeCamelizedFieldName(modelId, key)));
         retVal.setParameterValue(value);
         return retVal;
     }
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 b6ea8f02f37f8e7af13dd0ab27f7047f5f4854eb..cf695a52b23ee1c6d39ccc77b6639aa5cfa4b52d 100755
--- a/src/main/java/no/nibio/vips/logic/service/ObservationService.java
+++ b/src/main/java/no/nibio/vips/logic/service/ObservationService.java
@@ -19,16 +19,12 @@
 
 package no.nibio.vips.logic.service;
 
-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.net.URI;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.Instant;
-import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -36,6 +32,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.stream.Collectors;
+import javax.ejb.EJB;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -54,6 +51,9 @@ import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
+import no.nibio.vips.logic.controller.session.ObservationBean;
+import no.nibio.vips.logic.controller.session.OrganismBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 
 import no.nibio.vips.logic.entity.Gis;
 import no.nibio.vips.logic.entity.Observation;
@@ -65,9 +65,7 @@ import no.nibio.vips.logic.entity.rest.PointMappingResponse;
 import no.nibio.vips.logic.entity.rest.ReferencedPoint;
 import no.nibio.vips.logic.util.GISEntityUtil;
 import no.nibio.vips.logic.util.Globals;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import org.jboss.resteasy.annotations.GZIP;
-import org.joda.time.LocalDate;
 import org.wololo.geojson.Feature;
 
 /**
@@ -80,6 +78,13 @@ public class ObservationService {
     @Context
     private HttpServletRequest httpServletRequest;
     
+    @EJB
+    UserBean userBean;
+    @EJB
+    ObservationBean observationBean;
+    @EJB
+    OrganismBean organismBean;
+    
     /*
      * NOTE TO SELF
      * How to query for observations within a bounding box
@@ -152,11 +157,11 @@ public class ObservationService {
         
         if(user == null && userUUID != null)
         {
-            user = SessionControllerGetter.getUserBean().findVipsLogicUser(UUID.fromString(userUUID));
+            user = userBean.findVipsLogicUser(UUID.fromString(userUUID));
         }
         ULocale locale = new ULocale(localeStr != null ? localeStr : 
         	user != null ? user.getOrganizationId().getDefaultLocale() : 
-        		SessionControllerGetter.getUserBean().getOrganization(organizationId).getDefaultLocale());
+        		userBean.getOrganization(organizationId).getDefaultLocale());
         
         List<ObservationListItem> observations = getFilteredObservationsFromBackend(
                         organizationId,
@@ -169,8 +174,8 @@ public class ObservationService {
                 ).stream().map(obs -> { 
                     try {
 						return obs.getListItem(locale.getLanguage(), 
-								SessionControllerGetter.getObservationBean().getLocalizedObservationDataSchema(
-										SessionControllerGetter.getObservationBean().getObservationDataSchema(organizationId, obs.getOrganismId()),
+								observationBean.getLocalizedObservationDataSchema(
+										observationBean.getObservationDataSchema(organizationId, obs.getOrganismId()),
 										httpServletRequest,
 										locale
 										)
@@ -182,7 +187,7 @@ public class ObservationService {
 					}
                 }).collect(Collectors.toList());
         
-        //o.setObservationDataSchema(SessionControllerGetter.getObservationBean().getObservationDataSchema(observer.getOrganizationId().getOrganizationId(), o.getOrganismId()));
+        //o.setObservationDataSchema(observationBean.getObservationDataSchema(observer.getOrganizationId().getOrganizationId(), o.getOrganismId()));
         return Response.ok().entity(observations).build();
     }
             
@@ -208,7 +213,7 @@ public class ObservationService {
         }
         catch(ParseException ex){ System.out.println("ERROR");}
                 
-        return SessionControllerGetter.getObservationBean().getFilteredObservations(
+        return observationBean.getFilteredObservations(
             organizationId,
             pestId,
             cropId,
@@ -244,7 +249,7 @@ public class ObservationService {
         }
         catch(ParseException ex){ System.out.println("ERROR");}
                 
-        List<Observation> filteredObservations = SessionControllerGetter.getObservationBean().getFilteredObservations(
+        List<Observation> filteredObservations = observationBean.getFilteredObservations(
             organizationId,
             pestId,
             cropId,
@@ -269,7 +274,7 @@ public class ObservationService {
     @Produces("application/json;charset=UTF-8")
     public Response getObservedPests(@PathParam("organizationId") Integer organizationId)
     {
-        return Response.ok().entity(SessionControllerGetter.getObservationBean().getObservedPests(organizationId)).build();
+        return Response.ok().entity(observationBean.getObservedPests(organizationId)).build();
     }
     
     /**
@@ -284,7 +289,7 @@ public class ObservationService {
     @Produces("application/json;charset=UTF-8")
     public Response getObservedCrops(@PathParam("organizationId") Integer organizationId)
     {
-        return Response.ok().entity(SessionControllerGetter.getObservationBean().getObservedCrops(organizationId)).build();
+        return Response.ok().entity(observationBean.getObservedCrops(organizationId)).build();
     }
     
     
@@ -298,7 +303,7 @@ public class ObservationService {
     @GZIP
     @Produces("application/json;charset=UTF-8")
     public Response getObservations(@PathParam("organizationId") Integer organizationId){
-        return Response.ok().entity(SessionControllerGetter.getObservationBean().getObservations(organizationId, Observation.STATUS_TYPE_ID_APPROVED)).build();
+        return Response.ok().entity(observationBean.getObservations(organizationId, Observation.STATUS_TYPE_ID_APPROVED)).build();
     }
     
     /**
@@ -313,10 +318,10 @@ public class ObservationService {
     {
     	String uuidStr = httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION);
 		UUID uuid = UUID.fromString(uuidStr);
-		VipsLogicUser user = SessionControllerGetter.getUserBean().findVipsLogicUser(uuid);
+		VipsLogicUser user = userBean.findVipsLogicUser(uuid);
 		if(user != null)
 		{
-			return Response.ok().entity(SessionControllerGetter.getObservationBean().getObservationsForUser(user)).build();
+			return Response.ok().entity(observationBean.getObservationsForUser(user)).build();
 		}
 		else
 		{
@@ -356,7 +361,7 @@ public class ObservationService {
                 {
                     to = format.parse(timeOfObservationTo);
                 }
-                return Response.ok().entity(SessionControllerGetter.getObservationBean().getBroadcastObservations(organizationId, from, to)).build();
+                return Response.ok().entity(observationBean.getBroadcastObservations(organizationId, from, to)).build();
             }
             catch(ParseException ex)
             {
@@ -365,7 +370,7 @@ public class ObservationService {
         }
         else
         {
-            return Response.ok().entity(SessionControllerGetter.getObservationBean().getBroadcastObservations(organizationId, season)).build();
+            return Response.ok().entity(observationBean.getBroadcastObservations(organizationId, season)).build();
         }
     }
     
@@ -377,19 +382,19 @@ public class ObservationService {
             @QueryParam("userUUID") String userUUID
     ){
         // Observation needs to be masked here as well, or does it create trouble for VIPSLogic observation admin?
-        Observation o = SessionControllerGetter.getObservationBean().getObservation(observationId);
+        Observation o = observationBean.getObservation(observationId);
         if(o == null)
         {
             return Response.status(Status.NOT_FOUND).build();
         }
         // Which organization does this observation belong to?
-        VipsLogicUser observer = SessionControllerGetter.getUserBean().getVipsLogicUser(o.getUserId());
-        o.setObservationDataSchema(SessionControllerGetter.getObservationBean().getObservationDataSchema(observer.getOrganizationId().getOrganizationId(), o.getOrganismId()));
+        VipsLogicUser observer = userBean.getVipsLogicUser(o.getUserId());
+        o.setObservationDataSchema(observationBean.getObservationDataSchema(observer.getOrganizationId().getOrganizationId(), o.getOrganismId()));
       
         VipsLogicUser user = (VipsLogicUser) httpServletRequest.getSession().getAttribute("user");
         if(user == null && userUUID != null)
         {
-            user = SessionControllerGetter.getUserBean().findVipsLogicUser(UUID.fromString(userUUID));
+            user = userBean.findVipsLogicUser(UUID.fromString(userUUID));
         }
         // Modification of location information:
         // 1) If location is private, only the owner or super users/org admins may view them
@@ -409,8 +414,8 @@ public class ObservationService {
                 List<Observation> intermediary = new ArrayList<>();
                 intermediary.add(o);
                 intermediary = this.maskObservations(o.getPolygonService(), 
-                        SessionControllerGetter.getObservationBean().getObservationsWithLocations(
-                                SessionControllerGetter.getObservationBean().getObservationsWithGeoInfo(intermediary)
+                        observationBean.getObservationsWithLocations(
+                                observationBean.getObservationsWithGeoInfo(intermediary)
                         )
                     );
                 o = intermediary.get(0);
@@ -433,7 +438,7 @@ public class ObservationService {
         {
             return Response.status(Response.Status.UNAUTHORIZED).build();
         }
-        if(!SessionControllerGetter.getUserBean().authorizeUser(user, 
+        if(!userBean.authorizeUser(user, 
                     VipsLogicRole.OBSERVER, 
                     VipsLogicRole.OBSERVATION_AUTHORITY, 
                     VipsLogicRole.ORGANIZATION_ADMINISTRATOR,
@@ -443,7 +448,7 @@ public class ObservationService {
         {
             return Response.status(Response.Status.FORBIDDEN).build();
         }
-        SessionControllerGetter.getObservationBean().deleteGisObservationByGis(gisId);
+        observationBean.deleteGisObservationByGis(gisId);
         return Response.noContent().build();
     }
     
@@ -461,14 +466,14 @@ public class ObservationService {
         try
         {
             // Create the Observation
-            Observation observation = SessionControllerGetter.getObservationBean().getObservationFromGeoJSON(geoJSON);
+            Observation observation = observationBean.getObservationFromGeoJSON(geoJSON);
             VipsLogicUser user = (VipsLogicUser) httpServletRequest.getSession().getAttribute("user");
             // If no user, send error message back to client
             if(user == null)
             {
                 return Response.status(Response.Status.UNAUTHORIZED).build();
             }
-            if(!SessionControllerGetter.getUserBean().authorizeUser(user, 
+            if(!userBean.authorizeUser(user, 
                     VipsLogicRole.OBSERVER, 
                     VipsLogicRole.OBSERVATION_AUTHORITY, 
                     VipsLogicRole.ORGANIZATION_ADMINISTRATOR,
@@ -481,7 +486,7 @@ public class ObservationService {
             observation.setUserId(user.getUserId());
             observation.setStatusChangedByUserId(user.getUserId());
             observation.setStatusChangedTime(new Date());
-            observation = SessionControllerGetter.getObservationBean().storeObservation(observation);
+            observation = observationBean.storeObservation(observation);
             GISEntityUtil gisUtil = new GISEntityUtil();
             return Response.created(URI.create("/observation/" + observation.getObservationId())).entity(gisUtil.getGeoJSONFromObservation(observation)).build();
         }catch (IOException ex)
@@ -500,7 +505,7 @@ public class ObservationService {
     @Produces("text/plain;charset=UTF-8")
     public Response getFirstObservation(@PathParam("organismId") Integer organismId)
     {
-        Date firstObsTime = SessionControllerGetter.getObservationBean().getFirstObservationTime(organismId);
+        Date firstObsTime = observationBean.getFirstObservationTime(organismId);
         return firstObsTime != null ? Response.ok().entity(firstObsTime).build()
                 : Response.status(404).entity("No observations of organism with id=" + organismId).build();
     }
@@ -516,7 +521,7 @@ public class ObservationService {
     public Response getDateOfLastOrganismSystemUpdate()
     {
     	HashMap<String, Object> result = new HashMap<>();
-    	Instant lastUpdated = SessionControllerGetter.getOrganismBean().getLatestUpdateOfOrganisms();
+    	Instant lastUpdated = organismBean.getLatestUpdateOfOrganisms();
     	result.put("lastUpdated", lastUpdated != null ? lastUpdated: "1970-01-01T00:00:00Z");
     	return Response.ok().entity(result).build();
     }
@@ -540,7 +545,7 @@ public class ObservationService {
             return retVal;
         }
         // Else: This is a registered user without special privileges. Show public observations + user's own
-        retVal.addAll(SessionControllerGetter.getObservationBean().getObservationsForUser(user));
+        retVal.addAll(observationBean.getObservationsForUser(user));
         return retVal;
     }
 
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 2569197651fdbaa9bbb0e78e23040fa6696f517b..ea71a49012d0bd07b15dd309853a343206de5409 100755
--- a/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java
+++ b/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java
@@ -31,6 +31,7 @@ import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TimeZone;
+import javax.ejb.EJB;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -40,6 +41,12 @@ 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.controller.session.ForecastBean;
+import no.nibio.vips.logic.controller.session.MessageBean;
+import no.nibio.vips.logic.controller.session.ObservationBean;
+import no.nibio.vips.logic.controller.session.OrganismBean;
+import no.nibio.vips.logic.controller.session.PointOfInterestBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.CropCategory;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.ForecastSummary;
@@ -78,6 +85,19 @@ public class VIPSMobileService {
     @Context
     private HttpServletRequest httpServletRequest;
     
+    @EJB
+    MessageBean messageBean;
+    @EJB
+    ObservationBean observationBean;
+    @EJB
+    OrganismBean organismBean;
+    @EJB
+    ForecastBean forecastBean;
+    @EJB
+    PointOfInterestBean pointOfInterestBean;
+    @EJB
+    UserBean userBean;
+    
     // TODO: Add observation messages
     @GET
     @Path("melding")
@@ -89,7 +109,7 @@ public class VIPSMobileService {
     {
             Date datePublishedFrom = SystemTime.getSystemTime();
             Date datePublishedTo = datePublishedFrom;
-            List<Message> messageList = SessionControllerGetter.getMessageBean().getMessageList(organizationId, datePublishedFrom, datePublishedTo);
+            List<Message> messageList = messageBean.getMessageList(organizationId, datePublishedFrom, datePublishedTo);
             
             List<VIPSMobileMessage> retVal = new ArrayList<>();
             for(Message message: messageList)
@@ -151,7 +171,7 @@ public class VIPSMobileService {
             Calendar cal = Calendar.getInstance();
             cal.setTime(datePublishedFrom);
             Integer observationMessageTagId = 1;
-            List<Observation> broadcastObservations = SessionControllerGetter.getObservationBean().getBroadcastObservations(organizationId, cal.get(Calendar.YEAR));
+            List<Observation> broadcastObservations = observationBean.getBroadcastObservations(organizationId, cal.get(Calendar.YEAR));
             // Making an observation message valid for 3 months by default
             
             broadcastObservations.stream().filter(
@@ -187,12 +207,12 @@ public class VIPSMobileService {
             @QueryParam("locale") String locale
         )
     {
-        List<Organism> cropList = SessionControllerGetter.getOrganismBean().getAllCrops();
+        List<Organism> cropList = organismBean.getAllCrops();
         Map<Integer, Organism> allCrops = new HashMap<>();
         cropList.forEach((crop) -> {
             allCrops.put(crop.getOrganismId(), crop);
         });
-        List<CropCategory> cropCategories = SessionControllerGetter.getOrganismBean().getCropCategories(organizationId);
+        List<CropCategory> cropCategories = organismBean.getCropCategories(organizationId);
         List<VIPSMobileCropCategory> retVal = new ArrayList<>();
         cropCategories.stream().forEach(
                 cc -> {
@@ -224,7 +244,7 @@ public class VIPSMobileService {
         }
         
         // Get model info
-        Map<String, ModelInformation> modelInformationMap = SessionControllerGetter.getForecastBean().getIndexedModelInformation();
+        Map<String, ModelInformation> modelInformationMap = forecastBean.getIndexedModelInformation();
         
         TimeZone timeZone = timeZoneStr != null ? TimeZone.getTimeZone(timeZoneStr)
                 : TimeZone.getDefault();
@@ -240,7 +260,7 @@ public class VIPSMobileService {
         List<VIPSMobilePresentation> retVal = new ArrayList<>();
         if(!parsedIds.isEmpty())
         {
-            List<ForecastConfiguration> configsWithSummaries = SessionControllerGetter.getForecastBean().getForecastConfigurationWithSummaries(parsedIds);
+            List<ForecastConfiguration> configsWithSummaries = forecastBean.getForecastConfigurationWithSummaries(parsedIds);
             // Initializing the array of summaries
             Date today = new WeatherUtil().normalizeToExactDate(SystemTime.getSystemTime(), timeZone);
             List<Date> datesList = new ArrayList<>();
@@ -346,8 +366,8 @@ public class VIPSMobileService {
         cal.set(Calendar.MONTH, Calendar.JANUARY);
         Date from = cal.getTime();
         
-        PointOfInterestWeatherStation station = (PointOfInterestWeatherStation) SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(klimastasjonId);
-        List<ForecastConfiguration> forecasts = SessionControllerGetter.getForecastBean().getForecastConfigurations(station, from, to);
+        PointOfInterestWeatherStation station = (PointOfInterestWeatherStation) pointOfInterestBean.getPointOfInterest(klimastasjonId);
+        List<ForecastConfiguration> forecasts = forecastBean.getForecastConfigurations(station, from, to);
         List<VIPSMobileForecast> retVal = new ArrayList<>();
         for(ForecastConfiguration forecast:forecasts)
         {
@@ -415,7 +435,7 @@ public class VIPSMobileService {
         }
 
         // First: Get all users for organization
-        List<VipsLogicUser> organizationUsers = SessionControllerGetter.getUserBean().getUsersByOrganization(organizationId);
+        List<VipsLogicUser> organizationUsers = userBean.getUsersByOrganization(organizationId);
         // Then: Get forecasts for these users, collate and return
         List<ForecastConfiguration> forecasts = new ArrayList<>();
         
@@ -423,8 +443,8 @@ public class VIPSMobileService {
         {
             Integer userId = user.getUserId();
             List<ForecastConfiguration> result = cropOrganismIds != null && ! cropOrganismIds.isEmpty() ?
-                    SessionControllerGetter.getForecastBean().getForecastConfigurationsForUserAndCropsAndDate(userId,cropOrganismIds, from, to)
-                    : SessionControllerGetter.getForecastBean().getForecastConfigurationsForUserAndDate(userId, from, to);
+                    forecastBean.getForecastConfigurationsForUserAndCropsAndDate(userId,cropOrganismIds, from, to)
+                    : forecastBean.getForecastConfigurationsForUserAndDate(userId, from, to);
             if(forecasts == null)
                 forecasts = result;
             else
diff --git a/src/main/java/no/nibio/vips/logic/startup/StartupListener.java b/src/main/java/no/nibio/vips/logic/startup/StartupListener.java
index 6bf3ba3f3daaaa6a1c4b713ae410dddac51f7a60..334f052cbb5a4ab2c8f58e72332d5f732c47b97c 100755
--- a/src/main/java/no/nibio/vips/logic/startup/StartupListener.java
+++ b/src/main/java/no/nibio/vips/logic/startup/StartupListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 NIBIO <http://www.nibio.no/>. 
+ * Copyright (c) 2022 NIBIO <http://www.nibio.no/>. 
  * 
  * This file is part of VIPSLogic.
  * VIPSLogic is free software: you can redistribute it and/or modify
@@ -20,22 +20,27 @@
 package no.nibio.vips.logic.startup;
 
 import javax.annotation.Resource;
+import javax.ejb.EJB;
 import javax.servlet.ServletContextEvent;
 import javax.sql.DataSource;
-import no.nibio.vips.logic.util.SessionControllerGetter;
+import no.nibio.vips.logic.controller.session.SchedulingBean;
 import org.flywaydb.core.Flyway;
 
 /**
  * This class is created and method contextInitialized called when the application
  * is deployed (either at startup of application container or when redeploying the app)
  * 
- * @copyright 2013 {@link http://www.nibio.no NIBIO}
+ * @copyright 2013-2022 {@link http://www.nibio.no NIBIO}
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class StartupListener implements javax.servlet.ServletContextListener{
 
     @Resource(lookup="java:/jboss/datasources/vipslogic")
     DataSource vipslogicDS;
+    
+    @EJB
+    SchedulingBean schedulingBean;
+    
     /**
      * Called when the application
      * is deployed (either at startup of application container or when redeploying the app)
@@ -50,11 +55,11 @@ public class StartupListener implements javax.servlet.ServletContextListener{
         flyway.setDataSource(vipslogicDS);
         flyway.migrate();
         
-        SessionControllerGetter.getSchedulingBean().initSystemScheduler();
+        schedulingBean.initSystemScheduler();
         if(System.getProperty("no.nibio.vips.logic.START_SCHEDULING_ON_BOOT").equals("true"))
         {
             System.out.println("VIPSLogic starting scheduling services");
-            SessionControllerGetter.getSchedulingBean().startSystemScheduler();
+            schedulingBean.startSystemScheduler();
         }
         else
         {
@@ -72,6 +77,6 @@ public class StartupListener implements javax.servlet.ServletContextListener{
     public void contextDestroyed(ServletContextEvent sce) {
         System.out.println("VIPSLogic system shutting down");
         // Shutting down scheduler
-        SessionControllerGetter.getSchedulingBean().stopSystemScheduler();
+        schedulingBean.stopSystemScheduler();
     }
 }
diff --git a/src/main/java/no/nibio/vips/logic/util/SessionControllerGetter.java b/src/main/java/no/nibio/vips/logic/util/SessionControllerGetter.java
index b214f0cbff880db06ca5c8111b1179fea24d66ba..51129a619791b6c49cd067d054b031def095cbd4 100755
--- a/src/main/java/no/nibio/vips/logic/util/SessionControllerGetter.java
+++ b/src/main/java/no/nibio/vips/logic/util/SessionControllerGetter.java
@@ -38,7 +38,7 @@ import no.nibio.vips.logic.modules.applefruitmoth.AppleFruitMothBean;
 public class SessionControllerGetter {
     
     private static final String JNDI_PATH = "java:global/VIPSLogic-1.0-SNAPSHOT/";
-
+/*
     public static PointOfInterestBean getPointOfInterestBean()
     {
         try
@@ -176,4 +176,5 @@ public class SessionControllerGetter {
         //System.out.println("JNDI-path=" + retVal);
         return retVal;
     }
+*/
 }
diff --git a/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java b/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java
index 66483d904e11ae8b474e6c71b4ecc4d62285b6d3..d02ba09defb12bf34bf9acd9fd5d9df63783e53f 100755
--- a/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java
+++ b/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java
@@ -19,16 +19,10 @@
 
 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.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.ResourceBundle;
+import javax.ejb.EJB;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
@@ -39,11 +33,11 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
-import no.nibio.vips.logic.i18n.SessionLocaleUtil;
-import no.nibio.vips.logic.util.SessionControllerGetter;
+import no.nibio.vips.logic.controller.session.ObservationBean;
+import no.nibio.vips.logic.controller.session.UserBean;
 
 /**
- * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2016-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Facet("restricted")
@@ -52,6 +46,11 @@ public class ObservationDataService {
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
+    @EJB
+    UserBean userBean;
+    @EJB
+    ObservationBean observationBean;
+    
     @Context
     private HttpServletRequest httpServletRequest;
     
@@ -71,9 +70,9 @@ public class ObservationDataService {
         try
         {
             // Try to find schema for given organism/organization
-            ObservationDataSchema ods = SessionControllerGetter.getObservationBean().getObservationDataSchema(organizationId, organismId);
-            ULocale locale = new ULocale(SessionControllerGetter.getUserBean().getOrganization(organizationId).getDefaultLocale());
-            ods = SessionControllerGetter.getObservationBean().getLocalizedObservationDataSchema(ods, httpServletRequest, locale);
+            ObservationDataSchema ods = observationBean.getObservationDataSchema(organizationId, organismId);
+            ULocale locale = new ULocale(userBean.getOrganization(organizationId).getDefaultLocale());
+            ods = observationBean.getLocalizedObservationDataSchema(ods, httpServletRequest, locale);
             return Response.ok().entity(ods.getDataSchema()).build();
             
         }
diff --git a/src/main/java/no/nibio/web/forms/FormValidator.java b/src/main/java/no/nibio/web/forms/FormValidator.java
index 8490ea6ea723986c40a038ba06f47bfb5564d529..ee267cfac0b53d964b1993f9bd4e05e0bedc27bc 100755
--- a/src/main/java/no/nibio/web/forms/FormValidator.java
+++ b/src/main/java/no/nibio/web/forms/FormValidator.java
@@ -37,11 +37,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
+import javax.ejb.EJB;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import no.nibio.vips.logic.authenticate.PasswordValidationException;
+import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
-import no.nibio.vips.logic.util.SessionControllerGetter;
 import org.apache.commons.validator.EmailValidator;
 
 /**
@@ -52,11 +53,14 @@ import org.apache.commons.validator.EmailValidator;
  * client side validation). They use the same JSON file for form validation. 
  * Changes in logic server side should be reflected client side.
  * 
- * @copyright 2013 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2013-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class FormValidator {
     
+    @EJB
+    static UserBean userBean;
+    
     public static String RELATION_TYPE_EQUALS = "EQUALS";
     public static String RELATION_TYPE_AFTER = "AFTER";
 
@@ -229,7 +233,7 @@ public class FormValidator {
             {
                 try
                 {
-                    SessionControllerGetter.getUserBean().isPasswordValid(field.getWebValue(), ULocale.forLocale(resourceBundle.getLocale()));
+                    userBean.isPasswordValid(field.getWebValue(), ULocale.forLocale(resourceBundle.getLocale()));
                 }
                 catch(PasswordValidationException ex)
                 {
diff --git a/src/main/webapp/test/testbatch.jsp b/src/main/webapp/test/testbatch.jsp
index f18b45e9dcc8edb8412c8fd2c72b0cc61f038c63..76dea8f5f811f5bafacdd0a9b63ff28badecc4ac 100755
--- a/src/main/webapp/test/testbatch.jsp
+++ b/src/main/webapp/test/testbatch.jsp
@@ -16,7 +16,7 @@
 <%@page import="no.nibio.vips.logic.util.SessionControllerGetter"%>
 <%
     ForecastBean forecastBean = SessionControllerGetter.getForecastBean();
-    UserBean userBean = SessionControllerGetter.getUserBean();
+    UserBean userBean = userBean;
     Organization organization = userBean.getOrganization(2); // NIBIO plantehelse
     Calendar cal = Calendar.getInstance();
     cal.set(Calendar.MONTH, Calendar.JUNE);
@@ -43,7 +43,7 @@
             %>
             <ul>
             <%
-            for(Organization org : SessionControllerGetter.getUserBean().getOrganizations())
+            for(Organization org : userBean.getOrganizations())
             {
                 List<ForecastConfiguration> currentForecastConfigurations = SessionControllerGetter.getForecastBean().getForecastConfigurationsValidAtTime(org, SystemTime.getSystemTime());
                 for(ForecastConfiguration forecastConfiguration:currentForecastConfigurations)
diff --git a/src/test/java/no/nibio/vips/logic/messaging/UniversalMessagingTest.java b/src/test/java/no/nibio/vips/logic/messaging/UniversalMessagingTest.java
index 553e67bfccdbc986ee6eba939620ab285c41dc35..abaca8508ee6774b253a8428068bb6ff76f26dec 100755
--- a/src/test/java/no/nibio/vips/logic/messaging/UniversalMessagingTest.java
+++ b/src/test/java/no/nibio/vips/logic/messaging/UniversalMessagingTest.java
@@ -133,7 +133,7 @@ public class UniversalMessagingTest {
             }
             um.setDistributionList(rList);
 
-            ResteasyClient client = new ResteasyClientBuilder().build();
+            ResteasyClient client = (ResteasyClient) ResteasyClientBuilder.newClient();
             //client.register(new RESTAuthenticator("user", "userPass"));
             client.register(new RESTAuthenticator("VIPSLogic", "plmoknijbuhv000"));
             //ResteasyWebTarget target = client.target("http://kart13utv.ad.skogoglandskap.no:8080");