From 1438a56652514aa4415908747cd877a5daefe0a0 Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Fri, 3 Jan 2025 12:52:58 +0100
Subject: [PATCH] feat: Compiles, but fails on PostGIS deps

---
 Dockerfile                                    |   4 +-
 enunciate.xml                                 |   2 +-
 pom.xml                                       |  79 ++---
 .../vips/logic/VIPSLogicApplication.java      |   4 +-
 .../authenticate/AuthenticationFilter.java    |  20 +-
 .../servlet/CropCategoryController.java       |  12 +-
 .../ForecastConfigurationController.java      |  14 +-
 .../servlet/FrontpageController.java          |   8 +-
 .../controller/servlet/HttpErrorServlet.java  |  12 +-
 .../controller/servlet/LoginController.java   |  14 +-
 .../controller/servlet/MessageController.java |  38 +--
 .../NotificationSubscriptionController.java   |  14 +-
 .../servlet/ObservationController.java        |  37 +--
 .../servlet/OrganismController.java           |  17 +-
 .../servlet/OrganizationController.java       |  10 +-
 .../servlet/OrganizationGroupController.java  |  10 +-
 .../servlet/PointOfInterestController.java    |  14 +-
 .../servlet/SchedulingController.java         |  14 +-
 .../controller/servlet/UserController.java    |  18 +-
 .../WeatherStationDataSourceController.java   |  10 +-
 .../controller/session/ForecastBean.java      |  24 +-
 .../logic/controller/session/MessageBean.java |  16 +-
 .../controller/session/ObservationBean.java   |  18 +-
 .../session/ObservationTimeSeriesBean.java    |   8 +-
 .../controller/session/OrganismBean.java      |  12 +-
 .../session/PointOfInterestBean.java          |  14 +-
 .../controller/session/SchedulingBean.java    |  20 +-
 .../logic/controller/session/UserBean.java    |  16 +-
 .../no/nibio/vips/logic/entity/Country.java   |  26 +-
 .../nibio/vips/logic/entity/CropCategory.java |  48 ++--
 .../vips/logic/entity/CropCategoryLocal.java  |  14 +-
 .../logic/entity/CropCategoryLocalPK.java     |  10 +-
 .../no/nibio/vips/logic/entity/CropPest.java  |  30 +-
 .../no/nibio/vips/logic/entity/Currency.java  |  20 +-
 .../no/nibio/vips/logic/entity/DbUpdate.java  |  22 +-
 .../vips/logic/entity/ExternalResource.java   |  30 +-
 .../logic/entity/ExternalResourceType.java    |  20 +-
 .../logic/entity/ForecastConfiguration.java   |  49 ++--
 .../entity/ForecastModelConfiguration.java    |  20 +-
 .../entity/ForecastModelConfigurationPK.java  |  10 +-
 .../vips/logic/entity/ForecastResult.java     |  24 +-
 .../vips/logic/entity/ForecastSummary.java    |  18 +-
 .../vips/logic/entity/ForecastSummaryPK.java  |  12 +-
 .../java/no/nibio/vips/logic/entity/Gis.java  |  18 +-
 .../vips/logic/entity/HierarchyCategory.java  |  24 +-
 .../logic/entity/HierarchyCategoryLocale.java |  18 +-
 .../entity/HierarchyCategoryLocalePK.java     |  10 +-
 .../no/nibio/vips/logic/entity/MapLayer.java  |  20 +-
 .../no/nibio/vips/logic/entity/Message.java   |  49 ++--
 .../logic/entity/MessageIllustration.java     |  20 +-
 .../MessageIllustrationCaptionLocale.java     |  22 +-
 .../MessageIllustrationCaptionLocalePK.java   |  10 +-
 .../logic/entity/MessageIllustrationPK.java   |  10 +-
 .../vips/logic/entity/MessageLocale.java      |  28 +-
 .../vips/logic/entity/MessageLocalePK.java    |  10 +-
 .../nibio/vips/logic/entity/MessageTag.java   |  28 +-
 .../vips/logic/entity/MessageTagLocale.java   |  20 +-
 .../vips/logic/entity/MessageTagLocalePK.java |  10 +-
 .../vips/logic/entity/ModelInformation.java   |   6 +-
 .../nibio/vips/logic/entity/Observation.java  |  27 +-
 .../logic/entity/ObservationFormShortcut.java |  26 +-
 .../entity/ObservationFormShortcutLocale.java |  20 +-
 .../logic/entity/ObservationIllustration.java |  12 +-
 .../entity/ObservationIllustrationPK.java     |  10 +-
 .../vips/logic/entity/ObservationMethod.java  |  20 +-
 .../logic/entity/ObservationStatusType.java   |  18 +-
 .../logic/entity/ObservationTimeSeries.java   |  10 +-
 .../no/nibio/vips/logic/entity/Organism.java  |  30 +-
 .../entity/OrganismExternalResource.java      |  20 +-
 .../entity/OrganismExternalResourcePK.java    |   8 +-
 .../vips/logic/entity/OrganismLocale.java     |  14 +-
 .../vips/logic/entity/OrganismLocalePK.java   |  10 +-
 .../nibio/vips/logic/entity/Organization.java |  30 +-
 .../vips/logic/entity/OrganizationGroup.java  |  20 +-
 .../vips/logic/entity/PointOfInterest.java    |  50 ++--
 .../PointOfInterestExternalResource.java      |  22 +-
 .../PointOfInterestExternalResourcePK.java    |   8 +-
 .../logic/entity/PointOfInterestType.java     |  26 +-
 .../entity/PointOfInterestTypeApiarySite.java |   6 +-
 .../logic/entity/PointOfInterestTypeFarm.java |   6 +-
 .../entity/PointOfInterestTypeField.java      |   6 +-
 .../entity/PointOfInterestTypeNursery.java    |   6 +-
 .../entity/PointOfInterestTypeRegion.java     |   6 +-
 .../logic/entity/PointOfInterestTypeTrap.java |   6 +-
 .../entity/PointOfInterestWeatherStation.java |  28 +-
 .../vips/logic/entity/PolygonService.java     |  20 +-
 .../nibio/vips/logic/entity/Preparation.java  |  24 +-
 .../vips/logic/entity/PreparationType.java    |  20 +-
 .../nibio/vips/logic/entity/TaskHistory.java  |  28 +-
 .../vips/logic/entity/TaskHistoryStatus.java  |  20 +-
 .../vips/logic/entity/UserAuthentication.java |  22 +-
 .../logic/entity/UserAuthenticationPK.java    |   8 +-
 .../logic/entity/UserAuthenticationType.java  |  22 +-
 .../logic/entity/UserPointOfInterest.java     |  14 +-
 .../logic/entity/UserPointOfInterestPK.java   |   8 +-
 .../no/nibio/vips/logic/entity/UserUuid.java  |  16 +-
 .../nibio/vips/logic/entity/UserUuidPK.java   |  12 +-
 .../vips/logic/entity/VipsCoreInstance.java   |   4 +-
 .../vips/logic/entity/VipsLogicRole.java      |  18 +-
 .../vips/logic/entity/VipsLogicUser.java      |  40 +--
 .../logic/entity/WeatherForecastProvider.java |  18 +-
 .../entity/WeatherStationDataSource.java      |  20 +-
 .../nibio/vips/logic/gis/GeometryEntity.java  |  10 +-
 .../logic/i18n/CharacterEncodingFilter.java   |  12 +-
 .../vips/logic/i18n/LocalizationFilter.java   |  14 +-
 .../logic/i18n/ResourceBundleJSServlet.java   |   8 +-
 .../vips/logic/i18n/SessionLocaleUtil.java    |   2 +-
 .../vips/logic/messaging/ForecastEvent.java   |  18 +-
 ...ForecastEventNotificationSubscription.java |  44 +--
 .../messaging/ForecastNotificationLog.java    |  16 +-
 .../messaging/ForecastNotificationLogPK.java  |  12 +-
 .../MessageNotificationSubscription.java      |  45 +--
 .../logic/messaging/MessageRecipient.java     |   6 +-
 .../vips/logic/messaging/MessagingBean.java   |  12 +-
 .../ObservationNotificationSubscription.java  |  27 +-
 .../logic/messaging/UniversalMessage.java     |  37 ++-
 .../messaging/UniversalMessageFormat.java     |  12 +-
 .../UniversalMessagingServiceClient.java      |  10 +-
 .../send/MailMsgDeliveryHandler.java          |  25 +-
 .../send/SmsMsgDeliveryHandler.java           |   2 +-
 .../messaging/sms/SMSHandlingService.java     |  10 +-
 .../applefruitmoth/AppleFruitMothBean.java    |  12 +-
 .../AppleFruitMothController.java             |  10 +-
 .../applefruitmoth/AppleFruitMothService.java |  18 +-
 .../applefruitmoth/ObservationSite.java       |  32 +--
 .../applefruitmoth/ObservationSitePoint.java  |  34 +--
 .../ObservationSitePointSeasonData.java       |  20 +-
 .../ObservationSitePointSeasonDataPK.java     |   8 +-
 .../ObservationSiteSeasonCommonData.java      |  20 +-
 .../ObservationSiteSeasonCommonDataPK.java    |   8 +-
 .../modules/barkbeetle/BarkbeetleBean.java    |  10 +-
 .../barkbeetle/BarkbeetleController.java      |  12 +-
 .../modules/barkbeetle/BarkbeetleService.java |  24 +-
 .../barkbeetle/RegistrationStatusType.java    |  18 +-
 .../modules/barkbeetle/SeasonTrapsite.java    |  42 +--
 .../barkbeetle/SeasonTrapsiteBivolt.java      |  26 +-
 .../barkbeetle/TrapsiteRegistration.java      |  24 +-
 .../barkbeetle/TrapsiteRegistrationPK.java    |   8 +-
 .../modules/barkbeetle/TrapsiteType.java      |  18 +-
 .../BarleyNetBlotchModelService.java          |  20 +-
 .../modules/barleynetblotch/Factors.java      |  16 +-
 .../PreparationEffectFactor.java              |  16 +-
 .../modules/roughage/RoughageService.java     |  22 +-
 .../TerminateSchedulerListener.java           |   2 +-
 .../AltenariaModelPreprocessor.java           |   2 +-
 ...DeliaRadicumFloralisModelPreprocessor.java |   2 +-
 ...silaRosaeObservationModelPreprocessor.java |   2 +-
 .../SeptoriaApiicolaModelPreprocessor.java    |   2 +-
 .../SeptoriaHumidityModelPreprocessor.java    |   2 +-
 .../tasks/DeleteAllExpiredUserUuidsTask.java  |   2 +-
 ...castConfigurationsForOrganizationTask.java |   2 +-
 .../RunAllForecastConfigurationsTask.java     |   2 +-
 .../RunForecastConfigurationsByIdTask.java    |   2 +-
 .../SendForecastEventNotificationsTask.java   |   2 +-
 .../UpdateForecastResultCacheTableTask.java   |   2 +-
 .../tasks/UpdateForecastSummaryTableTask.java |   2 +-
 .../tasks/UpdateModelInformationTask.java     |   2 +-
 .../logic/service/AuthenticationService.java  |  24 +-
 .../nibio/vips/logic/service/JSONBConfig.java |  20 +-
 .../vips/logic/service/JacksonConfig.java     |  10 +-
 .../vips/logic/service/LogicService.java      |  36 +--
 .../vips/logic/service/ModelFormService.java  |  12 +-
 .../logic/service/ObservationService.java     |  22 +-
 .../service/ObservationTimeSeriesService.java |  20 +-
 .../nibio/vips/logic/service/POIService.java  |  14 +-
 .../vips/logic/service/VIPSMobileService.java |  18 +-
 .../vips/logic/startup/StartupListener.java   |   8 +-
 .../vips/logic/util/CorsProxyServlet.java     |   8 +-
 .../vips/logic/util/IntegerArrayUserType.java | 272 ------------------
 .../logic/util/JsonPostgreSQLDialect.java     |  35 ---
 .../util/PostgresJSONStringConverter.java     |   4 +-
 .../vips/logic/util/RESTAuthenticator.java    |   6 +-
 .../vips/logic/util/SimpleMailSender.java     |  12 +-
 .../vips/logic/util/StringJsonUserType.java   | 196 ++-----------
 .../vips/logic/web/TemplateConfigFilter.java  |  14 +-
 .../vips/logic/web/js/JSEnvironment.java      |   8 +-
 .../observationdata/ObservationDataBean.java  |  10 +-
 .../ObservationDataSchema.java                |  23 +-
 .../ObservationDataSchemaPK.java              |   8 +-
 .../ObservationDataService.java               |  22 +-
 .../java/no/nibio/web/forms/FormUtil.java     |  11 +-
 .../no/nibio/web/forms/FormValidator.java     |   6 +-
 src/main/resources/META-INF/persistence.xml   |  10 +-
 src/main/webapp/WEB-INF/web.xml               |   4 +-
 src/main/webapp/templates/403.ftl             |   2 +-
 src/main/webapp/templates/error_unknown.ftl   |   4 +-
 .../entity/rest/PointMappingRequestTest.java  |  10 +-
 .../messaging/UniversalMessagingTest.java     |   2 +-
 188 files changed, 1497 insertions(+), 2016 deletions(-)
 delete mode 100755 src/main/java/no/nibio/vips/logic/util/IntegerArrayUserType.java
 delete mode 100755 src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java

diff --git a/Dockerfile b/Dockerfile
index 9c7a35ff..46ace016 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -65,8 +65,8 @@ RUN echo '<?xml version="1.0" encoding="UTF-8"?>\
         <resource-root path="postgis-jdbc-${POSTGIS_VERSION}.jar"/>\
     </resources>\
     <dependencies>\
-        <module name="javax.api"/>\
-        <module name="javax.transaction.api"/>\
+        <module name="jakarta.api"/>\
+        <module name="jakarta.transaction.api"/>\
     </dependencies>\
 </module>' > ${JBOSS_HOME}/modules/org/postgresql/main/module.xml
 RUN cp /root/.m2/repository/org/postgresql/postgresql/${POSTGRES_VERSION}/postgresql-${POSTGRES_VERSION}.jar ${JBOSS_HOME}/modules/org/postgresql/main
diff --git a/enunciate.xml b/enunciate.xml
index 982546e6..0ff5edfb 100644
--- a/enunciate.xml
+++ b/enunciate.xml
@@ -31,7 +31,7 @@
       <exclude pattern="uk.**"/>
       <exclude pattern="it.**"/>
       <exclude pattern="antlr.**"/>
-      <exclude pattern="javax.**"/>
+      <exclude pattern="jakarta.**"/>
   </api-classes>
   <facets>
         <exclude name="restricted"/>
diff --git a/pom.xml b/pom.xml
index 9641cf33..7ec89af9 100755
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
     <groupId>no.nibio.vips.</groupId>
     <artifactId>VIPSLogic</artifactId>
     <packaging>war</packaging>
-    <version>2024.3</version>
+    <version>2025.1</version>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
@@ -70,27 +70,45 @@
             <version>10.4.1</version>
         </dependency>
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>4.0.1</version>
+            <groupId>jakarta.platform</groupId>
+            <artifactId>jakarta.jakartaee-api</artifactId>
+            <version>10.0.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+        <groupId>jakarta.persistence</groupId>
+        <artifactId>jakarta.persistence-api</artifactId>
+        <version>3.2.0</version>
+        <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <version>6.1.0</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+        <groupId>com.sun.mail</groupId>
+        <artifactId>jakarta.mail</artifactId>
+        <version>2.0.1</version>
+        </dependency>
         <dependency>
             <groupId>org.jboss.resteasy</groupId>
             <artifactId>resteasy-client</artifactId>
-            <version>4.7.9.Final</version>
+            <version>6.2.11.Final</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.jboss.resteasy</groupId>
             <artifactId>resteasy-core</artifactId>
-            <version>4.7.9.Final</version>
+            <version>6.2.11.Final</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.jboss.resteasy</groupId>
             <artifactId>resteasy-jackson2-provider</artifactId>
-            <version>4.7.9.Final</version>
+            <version>6.2.11.Final</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -105,9 +123,9 @@
             <type>jar</type>
         </dependency>
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <version>4.5.14</version>
+            <groupId>org.apache.httpcomponents.client5</groupId>
+            <artifactId>httpclient5</artifactId>
+            <version>5.4.1</version>
             <type>jar</type>
             <scope>provided</scope>
         </dependency>
@@ -153,7 +171,7 @@
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-core</artifactId>
-            <version>5.6.15.Final</version>
+            <version>6.6.1.Final</version>
             <exclusions>
                 <exclusion>
                     <groupId>org.dom4j</groupId>
@@ -162,14 +180,10 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.hibernate</groupId>
+            <groupId>org.hibernate.orm</groupId>
             <artifactId>hibernate-spatial</artifactId>
-            <version>5.6.15.Final</version>
+            <version>6.6.1.Final</version>
             <exclusions>
-                <exclusion>
-                    <artifactId>postgresql</artifactId>
-                    <groupId>postgresql</groupId>
-                </exclusion>
                 <exclusion>
                     <groupId>org.dom4j</groupId>
                     <artifactId>dom4j</artifactId>
@@ -180,9 +194,14 @@
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
-            <version>42.7.1</version>
+            <version>42.7.4</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>io.hypersistence</groupId>
+            <artifactId>hypersistence-utils-hibernate-63</artifactId>
+            <version>3.9.0</version>
+        </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.datatype</groupId>
             <artifactId>jackson-datatype-jsr310</artifactId>
@@ -209,21 +228,7 @@
         <dependency>
             <groupId>no.nibio.vips</groupId>
             <artifactId>VIPSCommon</artifactId>
-            <version>2.1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>javax</groupId>
-            <artifactId>javaee-web-api</artifactId>
-            <version>8.0.1</version>
-            <type>jar</type>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax</groupId>
-            <artifactId>javaee-api</artifactId>
-            <version>8.0.1</version>
-            <type>jar</type>
-            <scope>provided</scope>
+            <version>3.0.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.freemarker</groupId>
@@ -236,9 +241,9 @@
             <version>2.2.5</version>
         </dependency>
         <dependency>
-            <groupId>commons-fileupload</groupId>
-            <artifactId>commons-fileupload</artifactId>
-            <version>1.5</version>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-fileupload2-jakarta-servlet6</artifactId>
+            <version>2.0.0-M2</version>
         </dependency>
         <dependency>
             <groupId>com.ibm.icu</groupId>
@@ -253,7 +258,7 @@
         <dependency>
             <groupId>com.webcohesion.enunciate</groupId>
             <artifactId>enunciate-core-annotations</artifactId>
-            <version>2.17.1</version>
+            <version>2.18.1</version>
         </dependency>
         <dependency>
             <groupId>com.bedatadriven</groupId>
diff --git a/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java b/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java
index 68256d9a..9eb180af 100755
--- a/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java
+++ b/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java
@@ -19,8 +19,8 @@
 package no.nibio.vips.logic;
 
 import java.util.Set;
-import javax.ws.rs.ApplicationPath;
-import javax.ws.rs.core.Application;
+import jakarta.ws.rs.ApplicationPath;
+import jakarta.ws.rs.core.Application;
 
 /**
  * Responsible for adding REST resources
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 475c68bf..3617ff88 100755
--- a/src/main/java/no/nibio/vips/logic/authenticate/AuthenticationFilter.java
+++ b/src/main/java/no/nibio/vips/logic/authenticate/AuthenticationFilter.java
@@ -20,16 +20,16 @@ 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.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.ejb.EJB;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.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;
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 4d72c996..388bb923 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
@@ -22,11 +22,11 @@ import java.io.IOException;
 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 jakarta.ejb.EJB;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.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;
@@ -101,7 +101,7 @@ public class CropCategoryController extends HttpServlet {
                     Integer cropCategoryId = formValidation.getFormField("cropCategoryId").getValueAsInteger();
                     List<Integer> cropCategoryCropOrganismIds = FormUtil.getIdsFromMultipleSelect(formValidation.getFormField("cropCategoryCropOrganismIds").getWebValues());
                     CropCategory cropCategory = organismBean.getCropCategory(cropCategoryId);
-                    cropCategory.setCropOrganismIds(cropCategoryCropOrganismIds.toArray(new Integer[cropCategoryCropOrganismIds.size()]));
+                    cropCategory.setCropOrganismIds(cropCategoryCropOrganismIds);
                     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 98c8b1a8..6c6a499c 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
@@ -25,13 +25,13 @@ 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;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import com.ibm.icu.util.Calendar;
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/FrontpageController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/FrontpageController.java
index a0dc3857..b2f57564 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/FrontpageController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/FrontpageController.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.logic.controller.servlet;
 
 import java.io.IOException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 /**
  * @copyright 2013 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/HttpErrorServlet.java b/src/main/java/no/nibio/vips/logic/controller/servlet/HttpErrorServlet.java
index 4c76f564..d739be32 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/HttpErrorServlet.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/HttpErrorServlet.java
@@ -20,10 +20,10 @@ package no.nibio.vips.logic.controller.servlet;
 
 import java.io.IOException;
 import java.util.Enumeration;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 /**
  *
@@ -44,8 +44,8 @@ public class HttpErrorServlet extends HttpServlet {
             throws ServletException, IOException {
         response.setContentType("text/html;charset=UTF-8");
         
-        request.setAttribute("message", request.getAttribute("javax.servlet.error.message"));
-        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
+        request.setAttribute("message", request.getAttribute("jakarta.servlet.error.message"));
+        Integer statusCode = (Integer) request.getAttribute("jakarta.servlet.error.status_code");
         /**
         // Explore the attributes sent to error template
         for(Enumeration<String> e = request.getAttributeNames();e.hasMoreElements();)
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 e89580f9..4b69de63 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
@@ -26,13 +26,13 @@ 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 jakarta.ejb.EJB;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.ws.rs.core.Response;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 
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 d148016a..80c4b2ca 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
@@ -26,15 +26,15 @@ 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;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import no.nibio.vips.logic.controller.session.MessageBean;
 import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.Message;
@@ -51,10 +51,10 @@ import no.nibio.web.forms.FormUtil;
 import no.nibio.web.forms.FormValidation;
 import no.nibio.web.forms.FormValidationException;
 import no.nibio.web.forms.FormValidator;
-import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.FileUploadException;
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.fileupload2.core.FileItem;
+import org.apache.commons.fileupload2.core.FileUploadException;
+import org.apache.commons.fileupload2.core.DiskFileItemFactory;
+import org.apache.commons.fileupload2.jakarta.servlet6.JakartaServletFileUpload;
 
 /**
  * @copyright 2014-2022 <a href="http://www.nibio.no/">NIBIO</a>
@@ -273,18 +273,10 @@ public class MessageController extends HttpServlet {
             {
                 Map<String,String[]> parameterMap;
                 List<FileItem> items = null;
-                if(ServletFileUpload.isMultipartContent(request))
+                if(JakartaServletFileUpload.isMultipartContent(request))
                 {
-                    // Create a factory for disk-based file items
-                    DiskFileItemFactory factory = new DiskFileItemFactory();
-
-                    // Configure a repository (to ensure a secure temp location is used)
-                    ServletContext servletContext = this.getServletConfig().getServletContext();
-                    File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
-                    factory.setRepository(repository);
-
                     // Create a new file upload handler
-                    ServletFileUpload upload = new ServletFileUpload(factory);
+                    JakartaServletFileUpload upload = new JakartaServletFileUpload();
 
                     // Parse the request
                     items = upload.parseRequest(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 b93644d8..d8cb4769 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
@@ -22,13 +22,13 @@ import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 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 jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.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;
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 5c320adc..91a147a5 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
@@ -32,14 +32,14 @@ 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;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.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;
@@ -65,10 +65,10 @@ import no.nibio.web.forms.FormUtil;
 import no.nibio.web.forms.FormValidation;
 import no.nibio.web.forms.FormValidationException;
 import no.nibio.web.forms.FormValidator;
-import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.FileUploadException;
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.fileupload2.core.FileItem;
+import org.apache.commons.fileupload2.core.FileUploadException;
+import org.apache.commons.fileupload2.core.DiskFileItemFactory;
+import org.apache.commons.fileupload2.jakarta.servlet6.JakartaServletFileUpload;
 
 /**
  * @copyright 2014-2022 <a href="http://www.nibio.no/">NIBIO</a>
@@ -410,18 +410,11 @@ public class ObservationController extends HttpServlet {
                     {
                         Map<String,String[]> parameterMap;
                         List<FileItem> items = null;
-                        if(ServletFileUpload.isMultipartContent(request))
+                        if(JakartaServletFileUpload.isMultipartContent(request))
                         {
-                            // Create a factory for disk-based file items
-                            DiskFileItemFactory factory = new DiskFileItemFactory();
-
-                            // Configure a repository (to ensure a secure temp location is used)
-                            ServletContext servletContext = this.getServletConfig().getServletContext();
-                            File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
-                            factory.setRepository(repository);
-
+                           
                             // Create a new file upload handler
-                            ServletFileUpload upload = new ServletFileUpload(factory);
+                            JakartaServletFileUpload upload = new JakartaServletFileUpload();
 
                             // Parse the request
                             items = upload.parseRequest(request);
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 19e14371..2579fb86 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
@@ -23,13 +23,13 @@ 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 jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.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;
@@ -377,8 +377,7 @@ public class OrganismController extends HttpServlet {
                 {
                     Integer cropOrganismId = formValidation.getFormField("cropOrganismId").getValueAsInteger();
                     boolean includeAllChildCrops = formValidation.getFormField("includeAllChildCrops").getWebValue() != null;
-                    List<Integer> poTemp = FormUtil.getIdsFromMultipleSelect(formValidation.getFormField("pestOrganismIds").getWebValues());
-                    Integer[] pestOrganismIds = poTemp.toArray(new Integer[poTemp.size()]);
+                    List<Integer> pestOrganismIds = FormUtil.getIdsFromMultipleSelect(formValidation.getFormField("pestOrganismIds").getWebValues());
                     CropPest cropPest = em.find(CropPest.class, cropOrganismId);
                     if(cropPest == null)
                     {
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 ed2e9fd7..d14421db 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
@@ -22,11 +22,11 @@ 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 jakarta.ejb.EJB;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import no.nibio.vips.gis.GISUtil;
 import no.nibio.vips.gis.LonLatStringFormatException;
 import no.nibio.vips.logic.controller.session.PointOfInterestBean;
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 113eca49..a1325ecc 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
@@ -19,11 +19,11 @@ 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 jakarta.ejb.EJB;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.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;
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 e1a80dd7..d8833ffd 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
@@ -27,13 +27,13 @@ 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;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import no.nibio.vips.logic.entity.Country;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.ModelInformation;
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 24ee6bd1..1ab060eb 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
@@ -27,13 +27,13 @@ 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;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import no.nibio.vips.logic.controller.session.SchedulingBean;
 import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.TaskHistory;
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 8f984d62..290ffb4f 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
@@ -31,15 +31,15 @@ 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;
-import javax.persistence.PersistenceContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.NonUniqueResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import no.nibio.vips.i18n.LanguageUtil;
 import no.nibio.vips.logic.controller.session.DeleteUserException;
 import no.nibio.vips.logic.controller.session.UserBean;
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/WeatherStationDataSourceController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/WeatherStationDataSourceController.java
index 766d208f..8848614f 100644
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/WeatherStationDataSourceController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/WeatherStationDataSourceController.java
@@ -21,11 +21,11 @@ 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 jakarta.ejb.EJB;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
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 b1c1744f..58af01d2 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
@@ -30,18 +30,18 @@ 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;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.ws.rs.ProcessingException;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ejb.EJB;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import jakarta.ws.rs.ProcessingException;
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 import org.apache.commons.lang.StringUtils;
 import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
 import org.slf4j.LoggerFactory;
diff --git a/src/main/java/no/nibio/vips/logic/controller/session/MessageBean.java b/src/main/java/no/nibio/vips/logic/controller/session/MessageBean.java
index 13d140ac..6fe8c2e7 100755
--- a/src/main/java/no/nibio/vips/logic/controller/session/MessageBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/MessageBean.java
@@ -26,11 +26,11 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
 import no.nibio.vips.logic.entity.Message;
 import no.nibio.vips.logic.entity.MessageIllustration;
 import no.nibio.vips.logic.entity.MessageIllustrationCaptionLocale;
@@ -43,7 +43,7 @@ import no.nibio.vips.logic.entity.Organization;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.web.forms.FormField;
-import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload2.core.FileItem;
 import org.apache.commons.io.FilenameUtils;
 
 /**
@@ -186,7 +186,7 @@ public class MessageBean {
                 cropCategoryIds.add(Integer.valueOf(cropCategoryId));
             }
         }
-        message.setCropCategoryIds(cropCategoryIds.toArray(new Integer[cropCategoryIds.size()]));
+        message.setCropCategoryIds(cropCategoryIds);
        
         return message;
     }
@@ -224,7 +224,7 @@ public class MessageBean {
         }
 
         // Store file
-        item.write(illustration);
+        item.write(illustration.toPath());
         
         // Update MessageIllustrations
         message = em.merge(message);
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 99a5f3c3..0c171c17 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
@@ -33,13 +33,13 @@ import java.util.*;
 import java.util.Map.Entry;
 import java.util.function.Function;
 import java.util.stream.Collectors;
-import javax.ejb.EJB;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.ejb.EJB;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import jakarta.servlet.http.HttpServletRequest;
 
 import no.nibio.vips.logic.entity.*;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
@@ -47,7 +47,7 @@ import no.nibio.vips.logic.util.SystemTime;
 import org.apache.commons.codec.binary.Base64;
 import no.nibio.vips.observationdata.ObservationDataSchema;
 import no.nibio.vips.observationdata.ObservationDataSchemaPK;
-import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload2.core.FileItem;
 import org.apache.commons.io.FilenameUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -409,7 +409,7 @@ public class ObservationBean {
         }
 
         // Store file
-        item.write(illustration);
+        item.write(illustration.toPath());
 
         // Update MessageIllustrations
         observation = em.merge(observation);
diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java
index 9f115807..627002b9 100644
--- a/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.logic.controller.session;
 
 import java.util.*;
-import javax.ejb.EJB;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.ejb.EJB;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 import no.nibio.vips.logic.entity.ObservationTimeSeries;
 import no.nibio.vips.logic.entity.PointOfInterest;
 import no.nibio.vips.logic.entity.VipsLogicUser;
diff --git a/src/main/java/no/nibio/vips/logic/controller/session/OrganismBean.java b/src/main/java/no/nibio/vips/logic/controller/session/OrganismBean.java
index 44146a19..52b99767 100755
--- a/src/main/java/no/nibio/vips/logic/controller/session/OrganismBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/OrganismBean.java
@@ -33,11 +33,11 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
 import no.nibio.vips.logic.entity.CropCategory;
 import no.nibio.vips.logic.entity.CropPest;
 import no.nibio.vips.logic.entity.DbUpdate;
@@ -419,7 +419,7 @@ public class OrganismBean {
         cropCategories.stream()
                 .filter((cc) -> (cc.getCropOrganismIds() != null))
                 .forEachOrdered((cc) -> {
-                    retVal.addAll(Arrays.asList(cc.getCropOrganismIds()));
+                    retVal.addAll(cc.getCropOrganismIds());
                 });
         
         return retVal;
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 22229cf8..5a4cd503 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
@@ -33,13 +33,13 @@ import java.util.List;
 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;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
+import jakarta.ejb.EJB;
+import jakarta.ejb.LocalBean;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
 import no.nibio.vips.gis.GISUtil;
 import no.nibio.vips.logic.entity.ExternalResource;
 import no.nibio.vips.logic.entity.ExternalResourceType;
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 4ba5b84b..44f498c3 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
@@ -37,16 +37,16 @@ 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;
-import javax.persistence.Query;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ejb.EJB;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 import no.nibio.vips.coremanager.service.ManagerResource;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.ModelRunRequest;
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 c6f0a121..d56eb126 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,14 +41,14 @@ 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.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.ConstraintViolation;
-import javax.validation.ConstraintViolationException;
-import javax.ws.rs.core.HttpHeaders;
+import jakarta.ejb.EJB;
+import jakarta.ejb.LocalBean;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.*;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.ConstraintViolation;
+import jakarta.validation.ConstraintViolationException;
+import jakarta.ws.rs.core.HttpHeaders;
 
 import no.nibio.vips.logic.authenticate.PasswordValidationException;
 import no.nibio.vips.logic.entity.*;
diff --git a/src/main/java/no/nibio/vips/logic/entity/Country.java b/src/main/java/no/nibio/vips/logic/entity/Country.java
index 1f68fc8f..acea2f44 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Country.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Country.java
@@ -21,19 +21,19 @@ package no.nibio.vips.logic.entity;
 import java.io.Serializable;
 import java.util.Locale;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/src/main/java/no/nibio/vips/logic/entity/CropCategory.java b/src/main/java/no/nibio/vips/logic/entity/CropCategory.java
index 43cc4587..f1d249e6 100755
--- a/src/main/java/no/nibio/vips/logic/entity/CropCategory.java
+++ b/src/main/java/no/nibio/vips/logic/entity/CropCategory.java
@@ -19,27 +19,28 @@
 package no.nibio.vips.logic.entity;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.hypersistence.utils.hibernate.type.array.ListArrayType;
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import java.util.stream.Collectors;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
-import no.nibio.vips.logic.util.IntegerArrayUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
+
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -48,7 +49,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "crop_category")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "CropCategory.findAll", query = "SELECT c FROM CropCategory c"),
     @NamedQuery(name = "CropCategory.findByCropCategoryId", query = "SELECT c FROM CropCategory c WHERE c.cropCategoryId = :cropCategoryId"),
@@ -70,9 +70,9 @@ public class CropCategory implements Serializable {
     private String defaultName;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "cropCategoryId", fetch = FetchType.EAGER)
     private Set<CropCategoryLocal> cropCategoryLocalSet;
-    @Type(type = "IntegerArray")
     @Column(name = "crop_organism_ids")
-    private Integer[] cropOrganismIds;
+    @Type(ListArrayType.class)
+    private List<Integer> cropOrganismIds;
     @Column(name = "organization_id")
     private Integer organizationId;
     @Column(name = "max_hierarchy_category_id")
@@ -101,11 +101,11 @@ public class CropCategory implements Serializable {
         this.defaultName = defaultName;
     }
 
-    public Integer[] getCropOrganismIds() {
+    public List<Integer> getCropOrganismIds() {
         return cropOrganismIds;
     }
 
-    public void setCropOrganismIds(Integer[] cropOrganismIds) {
+    public void setCropOrganismIds(List<Integer> cropOrganismIds) {
         this.cropOrganismIds = cropOrganismIds;
     }
 
@@ -203,18 +203,18 @@ public class CropCategory implements Serializable {
         }
         else
         {
-            cropSet = new HashSet<>(Arrays.asList(this.getCropOrganismIds()));
+            cropSet = new HashSet<>(this.getCropOrganismIds());
         }
         cropSet.add(organismId);
-        this.setCropOrganismIds(cropSet.toArray(new Integer[cropSet.size()]));
+        this.setCropOrganismIds(cropSet.stream().collect(Collectors.toList()));
     }
 
     public void removeCropOrganismId(Integer organismId) {
         if(this.getCropOrganismIds() != null)
         {
-            Set<Integer> cropSet = new HashSet<>(Arrays.asList(this.getCropOrganismIds()));
+            Set<Integer> cropSet = new HashSet<>(this.getCropOrganismIds());
             cropSet.remove(organismId);
-            this.setCropOrganismIds(cropSet.toArray(new Integer[cropSet.size()]));
+            this.setCropOrganismIds(cropSet.stream().collect(Collectors.toList()));
         }
     }
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/CropCategoryLocal.java b/src/main/java/no/nibio/vips/logic/entity/CropCategoryLocal.java
index 75211980..98074bf6 100755
--- a/src/main/java/no/nibio/vips/logic/entity/CropCategoryLocal.java
+++ b/src/main/java/no/nibio/vips/logic/entity/CropCategoryLocal.java
@@ -19,13 +19,13 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/CropCategoryLocalPK.java b/src/main/java/no/nibio/vips/logic/entity/CropCategoryLocalPK.java
index b8e75cd1..3e0ebfa9 100755
--- a/src/main/java/no/nibio/vips/logic/entity/CropCategoryLocalPK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/CropCategoryLocalPK.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/CropPest.java b/src/main/java/no/nibio/vips/logic/entity/CropPest.java
index 0443494b..614352ff 100755
--- a/src/main/java/no/nibio/vips/logic/entity/CropPest.java
+++ b/src/main/java/no/nibio/vips/logic/entity/CropPest.java
@@ -19,19 +19,18 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
+import java.util.List;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlRootElement;
-import no.nibio.vips.logic.util.IntegerArrayUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
+import io.hypersistence.utils.hibernate.type.array.ListArrayType;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -39,7 +38,6 @@ import org.hibernate.annotations.TypeDefs;
  */
 @Entity
 @Table(name = "crop_pest")
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 @XmlRootElement
 @NamedQueries({
     @NamedQuery(name = "CropPest.findAll", query = "SELECT c FROM CropPest c"),
@@ -55,9 +53,9 @@ public class CropPest implements Serializable {
     @NotNull
     @Column(name = "crop_organism_id")
     private Integer cropOrganismId;
-    @Type(type = "IntegerArray")
+    @Type(ListArrayType.class)
     @Column(name = "pest_organism_ids")
-    private Integer[] pestOrganismIds;
+    private List<Integer> pestOrganismIds;
     @Column(name = "include_all_child_crops")
     private Boolean includeAllChildCrops;
 
@@ -76,11 +74,11 @@ public class CropPest implements Serializable {
         this.cropOrganismId = cropOrganismId;
     }
 
-    public Integer[] getPestOrganismIds() {
+    public List<Integer> getPestOrganismIds() {
         return pestOrganismIds;
     }
 
-    public void setPestOrganismIds(Integer[] pestOrganismIds) {
+    public void setPestOrganismIds(List<Integer> pestOrganismIds) {
         this.pestOrganismIds = pestOrganismIds;
     }
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/Currency.java b/src/main/java/no/nibio/vips/logic/entity/Currency.java
index 5b2e74be..f7fe3adc 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Currency.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Currency.java
@@ -20,16 +20,16 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Collection;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/DbUpdate.java b/src/main/java/no/nibio/vips/logic/entity/DbUpdate.java
index 6b74e19d..48172b8d 100644
--- a/src/main/java/no/nibio/vips/logic/entity/DbUpdate.java
+++ b/src/main/java/no/nibio/vips/logic/entity/DbUpdate.java
@@ -20,17 +20,17 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/ExternalResource.java b/src/main/java/no/nibio/vips/logic/entity/ExternalResource.java
index 19007bed..6fe731e7 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ExternalResource.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ExternalResource.java
@@ -20,21 +20,21 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/src/main/java/no/nibio/vips/logic/entity/ExternalResourceType.java b/src/main/java/no/nibio/vips/logic/entity/ExternalResourceType.java
index f6076e67..6d2cdc4d 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ExternalResourceType.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ExternalResourceType.java
@@ -19,16 +19,16 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java b/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java
index 7be6c11a..dbb041d3 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java
@@ -20,34 +20,32 @@ package no.nibio.vips.logic.entity;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.hypersistence.utils.hibernate.type.array.ListArrayType;
 import java.util.List;
 import java.util.TimeZone;
-import javax.persistence.Transient;
-import no.nibio.vips.logic.util.IntegerArrayUserType;
+import jakarta.persistence.Transient;
 import no.nibio.vips.util.WeatherUtil;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2014-2024 <a href="http://www.nibio.no/">NIBIO</a>
@@ -56,7 +54,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "forecast_configuration")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "ForecastConfiguration.findAll", query = "SELECT f FROM ForecastConfiguration f WHERE f.isPrivate = FALSE"),
     @NamedQuery(name = "ForecastConfiguration.findByForecastConfigurationId", query = "SELECT f FROM ForecastConfiguration f WHERE f.forecastConfigurationId = :forecastConfigurationId"),
@@ -134,9 +131,9 @@ public class ForecastConfiguration implements Serializable, Comparable {
         this.useGridWeatherData = useGridWeatherData;
     }
 
-    @Type(type = "IntegerArray")
+    @Type(ListArrayType.class)
     @Column(name = "grid_weather_station_point_of_interest_ids")
-    private Integer[] gridWeatherStationPointOfInterestIds;
+    private List<Integer> gridWeatherStationPointOfInterestIds;
     
     @Transient
     private WeatherUtil weatherUtil;
@@ -439,14 +436,14 @@ public class ForecastConfiguration implements Serializable, Comparable {
     /**
      * @return the gridWeatherStationPointOfInterestIds
      */
-    public Integer[] getGridWeatherStationPointOfInterestIds() {
+    public List<Integer> getGridWeatherStationPointOfInterestIds() {
         return gridWeatherStationPointOfInterestIds;
     }
 
     /**
      * @param gridWeatherStationPointOfInterestIds the gridWeatherStationPointOfInterestIds to set
      */
-    public void setGridWeatherStationPointOfInterestIds(Integer[] gridWeatherStationPointOfInterestIds) {
+    public void setGridWeatherStationPointOfInterestIds(List<Integer> gridWeatherStationPointOfInterestIds) {
         this.gridWeatherStationPointOfInterestIds = gridWeatherStationPointOfInterestIds;
     }
 }
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastModelConfiguration.java b/src/main/java/no/nibio/vips/logic/entity/ForecastModelConfiguration.java
index a37304d0..4a2d41e8 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastModelConfiguration.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastModelConfiguration.java
@@ -19,16 +19,16 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastModelConfigurationPK.java b/src/main/java/no/nibio/vips/logic/entity/ForecastModelConfigurationPK.java
index e0a82aea..84cf5675 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastModelConfigurationPK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastModelConfigurationPK.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 /**
  * @copyright 2013 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java b/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java
index 1b4f7e40..54a66fa8 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java
@@ -26,18 +26,18 @@ import java.util.Map;
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.Transient;
 import javax.xml.bind.annotation.XmlRootElement;
 import no.nibio.vips.entity.Result;
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java b/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java
index 5cb3f66e..88f201dc 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java
@@ -20,14 +20,14 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -41,7 +41,7 @@ import javax.xml.bind.annotation.XmlRootElement;
     @NamedQuery(name = "ForecastSummary.findAll", query = "SELECT f FROM ForecastSummary f"),
     @NamedQuery(name = "ForecastSummary.findByForecastConfigurationId", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.forecastConfigurationId = :forecastConfigurationId"),
     @NamedQuery(name = "ForecastSummary.findByForecastConfigurationIds", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.forecastConfigurationId IN(:forecastConfigurationIds)"),
-    @NamedQuery(name = "ForecastSummary.findByOrganizationId", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.forecastConfigurationId IN(SELECT f1.forecastConfigurationId FROM ForecastConfiguration f1 WHERE f1.vipsLogicUserId IN (SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId=:organizationId))"),    
+    @NamedQuery(name = "ForecastSummary.findByOrganizationId", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.forecastConfigurationId IN(SELECT f1.forecastConfigurationId FROM ForecastConfiguration f1 WHERE f1.vipsLogicUserId.userId IN (SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId))"),    
     @NamedQuery(name = "ForecastSummary.findBySummaryForDate", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.summaryForDate = :summaryForDate"),
     @NamedQuery(name = "ForecastSummary.findBySummaryCreatedTime", query = "SELECT f FROM ForecastSummary f WHERE f.summaryCreatedTime = :summaryCreatedTime"),
     @NamedQuery(name = "ForecastSummary.findByWarningStatus", query = "SELECT f FROM ForecastSummary f WHERE f.warningStatus = :warningStatus")})
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastSummaryPK.java b/src/main/java/no/nibio/vips/logic/entity/ForecastSummaryPK.java
index 4980278e..1df735c7 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastSummaryPK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastSummaryPK.java
@@ -20,12 +20,12 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/Gis.java b/src/main/java/no/nibio/vips/logic/entity/Gis.java
index e61037ea..1fe5fef3 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Gis.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Gis.java
@@ -22,15 +22,15 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 import javax.xml.bind.annotation.XmlRootElement;
 //import org.hibernate.annotations.Type;
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/HierarchyCategory.java b/src/main/java/no/nibio/vips/logic/entity/HierarchyCategory.java
index 3133b171..6e36162c 100755
--- a/src/main/java/no/nibio/vips/logic/entity/HierarchyCategory.java
+++ b/src/main/java/no/nibio/vips/logic/entity/HierarchyCategory.java
@@ -20,18 +20,18 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/src/main/java/no/nibio/vips/logic/entity/HierarchyCategoryLocale.java b/src/main/java/no/nibio/vips/logic/entity/HierarchyCategoryLocale.java
index e31e3744..f898e378 100755
--- a/src/main/java/no/nibio/vips/logic/entity/HierarchyCategoryLocale.java
+++ b/src/main/java/no/nibio/vips/logic/entity/HierarchyCategoryLocale.java
@@ -19,15 +19,15 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/HierarchyCategoryLocalePK.java b/src/main/java/no/nibio/vips/logic/entity/HierarchyCategoryLocalePK.java
index d4542edf..469898f2 100755
--- a/src/main/java/no/nibio/vips/logic/entity/HierarchyCategoryLocalePK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/HierarchyCategoryLocalePK.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 /**
  * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/MapLayer.java b/src/main/java/no/nibio/vips/logic/entity/MapLayer.java
index f18cf17f..7fe45941 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MapLayer.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MapLayer.java
@@ -20,16 +20,16 @@ package no.nibio.vips.logic.entity;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/Message.java b/src/main/java/no/nibio/vips/logic/entity/Message.java
index 1bd92c60..c58853e0 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Message.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Message.java
@@ -24,29 +24,27 @@ import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.Transient;
 import javax.xml.bind.annotation.XmlRootElement;
-import no.nibio.vips.logic.util.IntegerArrayUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
+import io.hypersistence.utils.hibernate.type.array.ListArrayType;
 
 /**
  * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
@@ -55,7 +53,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "message")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "Message.findAll", query = "SELECT m FROM Message m"),
     @NamedQuery(name = "Message.findByMessageId", query = "SELECT m FROM Message m WHERE m.messageId = :messageId"),
@@ -75,7 +72,7 @@ public class Message implements Serializable {
     private Set<MessageIllustration> messageIllustrationSet;
     private Set<MessageLocale> messageLocaleSet;
     private Integer organizationId;
-    private Integer[] cropCategoryIds;
+    private List<Integer> cropCategoryIds;
 
     public Message() {
     }
@@ -276,16 +273,16 @@ public class Message implements Serializable {
     /**
      * @return the cropCategoryIds
      */
-    @Type(type = "IntegerArray")
+    @Type(ListArrayType.class)
     @Column(name="crop_category_ids")
-    public Integer[] getCropCategoryIds() {
+    public List<Integer> getCropCategoryIds() {
         return cropCategoryIds;
     }
 
     /**
      * @param cropCategoryIds the cropCategoryIds to set
      */
-    public void setCropCategoryIds(Integer[] cropCategoryIds) {
+    public void setCropCategoryIds(List<Integer> cropCategoryIds) {
         this.cropCategoryIds = cropCategoryIds;
     }
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageIllustration.java b/src/main/java/no/nibio/vips/logic/entity/MessageIllustration.java
index c695472e..55b3e70c 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MessageIllustration.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageIllustration.java
@@ -20,16 +20,16 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationCaptionLocale.java b/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationCaptionLocale.java
index da38390a..3a21bf65 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationCaptionLocale.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationCaptionLocale.java
@@ -19,17 +19,17 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinColumns;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationCaptionLocalePK.java b/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationCaptionLocalePK.java
index fe5a6c87..5cf78327 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationCaptionLocalePK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationCaptionLocalePK.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 /**
  * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationPK.java b/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationPK.java
index b33858ef..b0da8810 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationPK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageIllustrationPK.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 /**
  * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageLocale.java b/src/main/java/no/nibio/vips/logic/entity/MessageLocale.java
index e91b5fe9..4bf86c97 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MessageLocale.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageLocale.java
@@ -20,20 +20,20 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageLocalePK.java b/src/main/java/no/nibio/vips/logic/entity/MessageLocalePK.java
index a894bcd5..3e6960eb 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MessageLocalePK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageLocalePK.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 /**
  * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageTag.java b/src/main/java/no/nibio/vips/logic/entity/MessageTag.java
index 226e1129..e2c33d28 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MessageTag.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageTag.java
@@ -20,20 +20,20 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageTagLocale.java b/src/main/java/no/nibio/vips/logic/entity/MessageTagLocale.java
index 90e4fd9e..0c80e15b 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MessageTagLocale.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageTagLocale.java
@@ -19,16 +19,16 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/MessageTagLocalePK.java b/src/main/java/no/nibio/vips/logic/entity/MessageTagLocalePK.java
index 3c0814ec..b36a727b 100755
--- a/src/main/java/no/nibio/vips/logic/entity/MessageTagLocalePK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/MessageTagLocalePK.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 /**
  * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/ModelInformation.java b/src/main/java/no/nibio/vips/logic/entity/ModelInformation.java
index ed19d222..9c3240d9 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ModelInformation.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ModelInformation.java
@@ -20,9 +20,9 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.*;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/Observation.java b/src/main/java/no/nibio/vips/logic/entity/Observation.java
index 0b244dcf..478e8dd6 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Observation.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Observation.java
@@ -19,8 +19,8 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.*;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlRootElement;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.util.ArrayList;
@@ -28,15 +28,14 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.Size;
 import no.nibio.vips.logic.util.GISEntityUtil;
 import no.nibio.vips.gis.GISUtil;
 import no.nibio.vips.logic.entity.rest.ObservationListItem;
-import no.nibio.vips.logic.util.StringJsonUserType;
 import no.nibio.vips.observationdata.ObservationDataSchema;
-import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
+import org.hibernate.annotations.JdbcTypeCode;
+import org.hibernate.type.SqlTypes;
+
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -45,7 +44,7 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "observation")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
+//@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
 
 @NamedQueries({
     @NamedQuery(name = "Observation.findAll", query = "SELECT o FROM Observation o"),
@@ -58,11 +57,11 @@ import org.hibernate.annotations.TypeDefs;
     @NamedQuery(name = "Observation.findByUserIdAndPeriod", query = "SELECT o FROM Observation o WHERE o.timeOfObservation BETWEEN :start AND :end AND o.userId IN(:userId)"),
     @NamedQuery(name = "Observation.findByUserIdAndStatusTypeId", query = "SELECT o FROM Observation o WHERE o.userId IN(:userId) AND o.statusTypeId= :statusTypeId"),
     @NamedQuery(name = "Observation.findByUserIdAndOrganism", query = "SELECT o FROM Observation o WHERE o.userId IN(:userId) AND o.organism =  :organism"),
-    @NamedQuery(name = "Observation.findByOrganizationId", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))"),
-    @NamedQuery(name = "Observation.findByOrganizationIdAndPeriod", query = "SELECT o FROM Observation o WHERE o.timeOfObservation BETWEEN :start AND :end AND o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))"),
-    @NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeId", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)) AND o.statusTypeId= :statusTypeId"),
-    @NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeIdAndBroadcastMessage", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)) AND o.statusTypeId= :statusTypeId AND o.broadcastMessage IS TRUE"),
-    @NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeIdAndBroadcastMessageAndPeriod", query = "SELECT o FROM Observation o WHERE o.timeOfObservation BETWEEN :start AND :end AND o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)) AND o.statusTypeId= :statusTypeId AND o.broadcastMessage IS TRUE"),
+    @NamedQuery(name = "Observation.findByOrganizationId", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId.organizationId = :organizationId OR  v.organizationId.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId.organizationId = :organizationId))"),
+    @NamedQuery(name = "Observation.findByOrganizationIdAndPeriod", query = "SELECT o FROM Observation o WHERE o.timeOfObservation BETWEEN :start AND :end AND o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))"),
+    @NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeId", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId.organizationId = :organizationId OR  v.organizationId.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId.organizationId = :organizationId)) AND o.statusTypeId= :statusTypeId"),
+    @NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeIdAndBroadcastMessage", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)) AND o.statusTypeId= :statusTypeId AND o.broadcastMessage IS TRUE"),
+    @NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeIdAndBroadcastMessageAndPeriod", query = "SELECT o FROM Observation o WHERE o.timeOfObservation BETWEEN :start AND :end AND o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)) AND o.statusTypeId= :statusTypeId AND o.broadcastMessage IS TRUE"),
     @NamedQuery(name = "Observation.findByOrganism", query = "SELECT o FROM Observation o WHERE o.organism =  :organism"),
     @NamedQuery(name = "Observation.findFirstByOrganism", query = "SELECT o FROM Observation o WHERE o.organism =  :organism AND o.timeOfObservation = (SELECT MIN(ob.timeOfObservation) FROM Observation ob WHERE ob.organism = :organism)"),
     @NamedQuery(name = "Observation.findByTimeOfObservation", query = "SELECT o FROM Observation o WHERE o.timeOfObservation = :timeOfObservation")
@@ -467,7 +466,7 @@ public class Observation implements Serializable, no.nibio.vips.observation.Obse
     /**
      * @return the observationData
      */
-    @Type(type = "StringJsonObject")
+    @JdbcTypeCode(SqlTypes.JSON)
     @Column(name = "observation_data")
     @Override
     public String getObservationData() {
diff --git a/src/main/java/no/nibio/vips/logic/entity/ObservationFormShortcut.java b/src/main/java/no/nibio/vips/logic/entity/ObservationFormShortcut.java
index ab8bf912..38036f49 100644
--- a/src/main/java/no/nibio/vips/logic/entity/ObservationFormShortcut.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ObservationFormShortcut.java
@@ -20,19 +20,19 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/ObservationFormShortcutLocale.java b/src/main/java/no/nibio/vips/logic/entity/ObservationFormShortcutLocale.java
index 824637fc..f3217280 100644
--- a/src/main/java/no/nibio/vips/logic/entity/ObservationFormShortcutLocale.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ObservationFormShortcutLocale.java
@@ -19,16 +19,16 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/ObservationIllustration.java b/src/main/java/no/nibio/vips/logic/entity/ObservationIllustration.java
index dcb3a55e..5e114908 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ObservationIllustration.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ObservationIllustration.java
@@ -19,12 +19,12 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/ObservationIllustrationPK.java b/src/main/java/no/nibio/vips/logic/entity/ObservationIllustrationPK.java
index b0eae958..28682806 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ObservationIllustrationPK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ObservationIllustrationPK.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/ObservationMethod.java b/src/main/java/no/nibio/vips/logic/entity/ObservationMethod.java
index f9148efa..57efa069 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ObservationMethod.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ObservationMethod.java
@@ -20,16 +20,16 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/src/main/java/no/nibio/vips/logic/entity/ObservationStatusType.java b/src/main/java/no/nibio/vips/logic/entity/ObservationStatusType.java
index f00be185..a8451fe4 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ObservationStatusType.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ObservationStatusType.java
@@ -19,15 +19,15 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java b/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java
index d7adac27..24315611 100644
--- a/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java
@@ -18,12 +18,9 @@
 package no.nibio.vips.logic.entity;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import no.nibio.vips.logic.util.StringJsonUserType;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
-import javax.persistence.*;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlRootElement;
 import java.io.Serializable;
 import java.util.Date;
@@ -31,12 +28,11 @@ import java.util.Date;
 @Entity
 @Table(name = "observation_time_series")
 @XmlRootElement
-@TypeDefs({@TypeDef(name = "StringJsonObject", typeClass = StringJsonUserType.class)})
 @NamedQueries({
         @NamedQuery(name = "ObservationTimeSeries.findAll", query = "SELECT ots FROM ObservationTimeSeries ots"),
         @NamedQuery(name = "ObservationTimeSeries.findByObservationTimeSeriesId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.observationTimeSeriesId = :id"),
         @NamedQuery(name = "ObservationTimeSeries.findByObservationTimeSeriesIds", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.observationTimeSeriesId IN :observationTimeSeriesIds"),
-        @NamedQuery(name = "ObservationTimeSeries.findByOrganizationId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))"),
+        @NamedQuery(name = "ObservationTimeSeries.findByOrganizationId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId.organizationId = :organizationId OR  v.organizationId.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId.organizationId = :organizationId))"),
         @NamedQuery(name = "ObservationTimeSeries.findByUserId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(:userId)")
 })
 public class ObservationTimeSeries implements Serializable {
diff --git a/src/main/java/no/nibio/vips/logic/entity/Organism.java b/src/main/java/no/nibio/vips/logic/entity/Organism.java
index fa0e0c80..07a86feb 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Organism.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Organism.java
@@ -23,21 +23,21 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/OrganismExternalResource.java b/src/main/java/no/nibio/vips/logic/entity/OrganismExternalResource.java
index 7c2194f0..91532935 100755
--- a/src/main/java/no/nibio/vips/logic/entity/OrganismExternalResource.java
+++ b/src/main/java/no/nibio/vips/logic/entity/OrganismExternalResource.java
@@ -20,16 +20,16 @@ package no.nibio.vips.logic.entity;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/OrganismExternalResourcePK.java b/src/main/java/no/nibio/vips/logic/entity/OrganismExternalResourcePK.java
index 3f55e086..48836b1c 100755
--- a/src/main/java/no/nibio/vips/logic/entity/OrganismExternalResourcePK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/OrganismExternalResourcePK.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2013 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/OrganismLocale.java b/src/main/java/no/nibio/vips/logic/entity/OrganismLocale.java
index 829e8bb4..6eeefa62 100755
--- a/src/main/java/no/nibio/vips/logic/entity/OrganismLocale.java
+++ b/src/main/java/no/nibio/vips/logic/entity/OrganismLocale.java
@@ -19,13 +19,13 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/OrganismLocalePK.java b/src/main/java/no/nibio/vips/logic/entity/OrganismLocalePK.java
index 452fb3d8..a82fe9c7 100755
--- a/src/main/java/no/nibio/vips/logic/entity/OrganismLocalePK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/OrganismLocalePK.java
@@ -18,11 +18,11 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 
 /**
  * @copyright 2013 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/Organization.java b/src/main/java/no/nibio/vips/logic/entity/Organization.java
index 4e5d7e67..ae079270 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Organization.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Organization.java
@@ -21,24 +21,24 @@ package no.nibio.vips.logic.entity;
 import org.locationtech.jts.geom.Point;
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import javax.persistence.FetchType;
-import javax.persistence.OneToOne;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.OneToOne;
 import org.hibernate.annotations.Type;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/OrganizationGroup.java b/src/main/java/no/nibio/vips/logic/entity/OrganizationGroup.java
index 9c62dcce..a015bf6c 100755
--- a/src/main/java/no/nibio/vips/logic/entity/OrganizationGroup.java
+++ b/src/main/java/no/nibio/vips/logic/entity/OrganizationGroup.java
@@ -19,16 +19,16 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java
index 1994194e..f3faa768 100755
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java
@@ -21,31 +21,31 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.DiscriminatorColumn;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Inheritance;
+import jakarta.persistence.InheritanceType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.locationtech.jts.geom.Geometry;
 import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.FetchType;
-import javax.persistence.OneToMany;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.DiscriminatorType;
+import jakarta.persistence.DiscriminatorValue;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.OneToMany;
 import no.nibio.vips.gis.GISUtil;
 import org.wololo.geojson.Feature;
 
@@ -63,9 +63,9 @@ import org.wololo.geojson.Feature;
     @NamedQuery(name = "PointOfInterest.findAll", query = "SELECT p FROM PointOfInterest p ORDER BY p.name ASC"),
     @NamedQuery(name = "PointOfInterest.findByPointOfInterestId", query = "SELECT p FROM PointOfInterest p WHERE p.pointOfInterestId = :pointOfInterestId"),
     @NamedQuery(name = "PointOfInterest.findByPointOfInterestIds", query = "SELECT p FROM PointOfInterest p WHERE p.pointOfInterestId IN :pointOfInterestIds"),
-    @NamedQuery(name = "PointOfInterest.findByOrganizationId", query = "SELECT p FROM PointOfInterest p WHERE p.user IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId=:organizationId OR u.organizationId IN (SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))  ORDER BY p.name ASC"),
-    @NamedQuery(name = "PointOfInterest.findByOrganizationIdAndPoiTypes", query = "SELECT p FROM PointOfInterest p WHERE p.pointOfInterestTypeId in :pointOfInterestTypes AND p.user IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId=:organizationId OR u.organizationId IN (SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))  ORDER BY p.name ASC"),
-    @NamedQuery(name = "PointOfInterest.findForecastLocationsByOrganizationId", query = "SELECT p FROM PointOfInterest p WHERE p.isForecastLocation IS TRUE AND p.user IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId=:organizationId OR u.organizationId IN (SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))  ORDER BY p.name ASC"),
+    @NamedQuery(name = "PointOfInterest.findByOrganizationId", query = "SELECT p FROM PointOfInterest p WHERE p.user.userId IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId = :organizationId OR u.organizationId.organizationId IN (SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))  ORDER BY p.name ASC"),
+    @NamedQuery(name = "PointOfInterest.findByOrganizationIdAndPoiTypes", query = "SELECT p FROM PointOfInterest p WHERE p.pointOfInterestTypeId in :pointOfInterestTypes AND p.user.userId IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId = :organizationId OR u.organizationId.organizationId IN (SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))  ORDER BY p.name ASC"),
+    @NamedQuery(name = "PointOfInterest.findForecastLocationsByOrganizationId", query = "SELECT p FROM PointOfInterest p WHERE p.isForecastLocation IS TRUE AND p.user.userId IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId = :organizationId OR u.organizationId.organizationId IN (SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))  ORDER BY p.name ASC"),
     @NamedQuery(name = "PointOfInterest.findByName", query = "SELECT p FROM PointOfInterest p WHERE p.name = :name"),
     @NamedQuery(name = "PointOfInterest.findByNameCaseInsensitive", query = "SELECT p FROM PointOfInterest p WHERE lower(p.name) = lower(:name)"),
     @NamedQuery(name = "PointOfInterest.findByUserId", query = "SELECT p FROM PointOfInterest p WHERE p.user = :userId ORDER BY p.name ASC")
@@ -141,7 +141,7 @@ public class PointOfInterest implements Serializable, Comparable {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Basic(optional = false)
-    @Column(name = "point_of_interest_id")
+    @Column(name = "point_of_interest_id", insertable = false, updatable = false)
     public Integer getPointOfInterestId() {
         return pointOfInterestId;
     }
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestExternalResource.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestExternalResource.java
index e3dae66c..2bff2efe 100755
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestExternalResource.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestExternalResource.java
@@ -20,17 +20,17 @@ package no.nibio.vips.logic.entity;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestExternalResourcePK.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestExternalResourcePK.java
index 627ae3c9..979d1ac6 100755
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestExternalResourcePK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestExternalResourcePK.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestType.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestType.java
index 834fd4ec..5d1f4da6 100755
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestType.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestType.java
@@ -19,18 +19,18 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.DiscriminatorColumn;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Inheritance;
+import jakarta.persistence.InheritanceType;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -52,7 +52,7 @@ public class PointOfInterestType implements Serializable {
     @Id
     @Basic(optional = false)
     @NotNull
-    @Column(name = "point_of_interest_type_id")
+    @Column(name = "point_of_interest_type_id", insertable = false, updatable = false)
     private Integer pointOfInterestTypeId;
     @Size(max = 255)
     @Column(name = "default_name")
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeApiarySite.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeApiarySite.java
index b89fc8c0..c5bd42d1 100644
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeApiarySite.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeApiarySite.java
@@ -19,9 +19,9 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.Table;
+import jakarta.persistence.DiscriminatorValue;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
 
 /**
  * @copyright 2023 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeFarm.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeFarm.java
index 377f0990..03a7df7b 100644
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeFarm.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeFarm.java
@@ -19,9 +19,9 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.Table;
+import jakarta.persistence.DiscriminatorValue;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
 
 /**
  * @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeField.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeField.java
index 5e9c40c0..7954cee2 100644
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeField.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeField.java
@@ -19,9 +19,9 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.Table;
+import jakarta.persistence.DiscriminatorValue;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
 
 /**
  * @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeNursery.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeNursery.java
index bcc4945c..c67cc749 100644
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeNursery.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeNursery.java
@@ -19,9 +19,9 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.Table;
+import jakarta.persistence.DiscriminatorValue;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
 
 /**
  * @copyright 2023 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeRegion.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeRegion.java
index 42293401..279bb5eb 100644
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeRegion.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeRegion.java
@@ -19,9 +19,9 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.Table;
+import jakarta.persistence.DiscriminatorValue;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
 
 /**
  * @copyright 2018 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeTrap.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeTrap.java
index e9a62eaa..146eaa68 100644
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeTrap.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestTypeTrap.java
@@ -18,9 +18,9 @@
 
 package no.nibio.vips.logic.entity;
 
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.Table;
+import jakarta.persistence.DiscriminatorValue;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
 import java.io.Serializable;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestWeatherStation.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestWeatherStation.java
index e4d82027..cc9c380d 100755
--- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterestWeatherStation.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterestWeatherStation.java
@@ -19,19 +19,19 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.DiscriminatorValue;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import javax.persistence.Transient;
+import jakarta.persistence.Transient;
 
 /**
  * Extension of {@see PointOfInterest}, with additional info for weather stations
@@ -46,12 +46,12 @@ import javax.persistence.Transient;
     @NamedQuery(name = "PointOfInterestWeatherStation.findAll", query = "SELECT p FROM PointOfInterestWeatherStation p"),
     @NamedQuery(name = "PointOfInterestWeatherStation.findAllByActivity", query = "SELECT p FROM PointOfInterestWeatherStation p WHERE p.active = :active"),
     @NamedQuery(name = "PointOfInterestWeatherStation.findByPointOfInterestId", query = "SELECT p FROM PointOfInterestWeatherStation p WHERE p.pointOfInterestId = :pointOfInterestId"),
-    @NamedQuery(name = "PointOfInterestWeatherStation.findByOrganizationId", query = "SELECT p FROM PointOfInterestWeatherStation p WHERE p.user IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId=:organizationId)"),
-    @NamedQuery(name = "PointOfInterestWeatherStation.findByActivityAndOrganizationId", query = "SELECT p FROM PointOfInterestWeatherStation p WHERE p.active = :active AND p.user IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId=:organizationId)"),
+    @NamedQuery(name = "PointOfInterestWeatherStation.findByOrganizationId", query = "SELECT p FROM PointOfInterestWeatherStation p WHERE p.user.userId IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId.organizationId = :organizationId)"),
+    @NamedQuery(name = "PointOfInterestWeatherStation.findByActivityAndOrganizationId", query = "SELECT p FROM PointOfInterestWeatherStation p WHERE p.active = :active AND p.user.userId IN(SELECT u.userId FROM VipsLogicUser u WHERE u.organizationId.organizationId = :organizationId)"),
     @NamedQuery(name = "PointOfInterestWeatherStation.findByUserId", query = "SELECT p FROM PointOfInterestWeatherStation p WHERE p.user = :userId"),
     @NamedQuery(name = "PointOfInterestWeatherStation.findByNames", query = "SELECT p FROM PointOfInterestWeatherStation p WHERE p.name IN :names")
 })
-public class PointOfInterestWeatherStation extends PointOfInterest implements Serializable {
+public class PointOfInterestWeatherStation extends PointOfInterest {
     @Size(max = 255)
     private String weatherStationRemoteId;
     private WeatherStationDataSource weatherStationDataSourceId;
diff --git a/src/main/java/no/nibio/vips/logic/entity/PolygonService.java b/src/main/java/no/nibio/vips/logic/entity/PolygonService.java
index 9097f946..1c5e0669 100644
--- a/src/main/java/no/nibio/vips/logic/entity/PolygonService.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PolygonService.java
@@ -19,16 +19,16 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/Preparation.java b/src/main/java/no/nibio/vips/logic/entity/Preparation.java
index 428b7c3b..92beeb81 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Preparation.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Preparation.java
@@ -20,18 +20,18 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.math.BigInteger;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/PreparationType.java b/src/main/java/no/nibio/vips/logic/entity/PreparationType.java
index 48ca4c65..393444e8 100755
--- a/src/main/java/no/nibio/vips/logic/entity/PreparationType.java
+++ b/src/main/java/no/nibio/vips/logic/entity/PreparationType.java
@@ -21,16 +21,16 @@ package no.nibio.vips.logic.entity;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.io.Serializable;
 import java.util.Collection;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
diff --git a/src/main/java/no/nibio/vips/logic/entity/TaskHistory.java b/src/main/java/no/nibio/vips/logic/entity/TaskHistory.java
index 1fcc220c..853526d6 100755
--- a/src/main/java/no/nibio/vips/logic/entity/TaskHistory.java
+++ b/src/main/java/no/nibio/vips/logic/entity/TaskHistory.java
@@ -20,20 +20,20 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/TaskHistoryStatus.java b/src/main/java/no/nibio/vips/logic/entity/TaskHistoryStatus.java
index 2a81d1de..7d9731e6 100755
--- a/src/main/java/no/nibio/vips/logic/entity/TaskHistoryStatus.java
+++ b/src/main/java/no/nibio/vips/logic/entity/TaskHistoryStatus.java
@@ -20,16 +20,16 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/src/main/java/no/nibio/vips/logic/entity/UserAuthentication.java b/src/main/java/no/nibio/vips/logic/entity/UserAuthentication.java
index 11632649..4de3cf78 100755
--- a/src/main/java/no/nibio/vips/logic/entity/UserAuthentication.java
+++ b/src/main/java/no/nibio/vips/logic/entity/UserAuthentication.java
@@ -20,17 +20,17 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/UserAuthenticationPK.java b/src/main/java/no/nibio/vips/logic/entity/UserAuthenticationPK.java
index dd4fbbf5..bffab63e 100755
--- a/src/main/java/no/nibio/vips/logic/entity/UserAuthenticationPK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/UserAuthenticationPK.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2013 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/UserAuthenticationType.java b/src/main/java/no/nibio/vips/logic/entity/UserAuthenticationType.java
index e1a66461..2b3c981a 100755
--- a/src/main/java/no/nibio/vips/logic/entity/UserAuthenticationType.java
+++ b/src/main/java/no/nibio/vips/logic/entity/UserAuthenticationType.java
@@ -20,17 +20,17 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/src/main/java/no/nibio/vips/logic/entity/UserPointOfInterest.java b/src/main/java/no/nibio/vips/logic/entity/UserPointOfInterest.java
index 0b8a5996..9e5acd71 100755
--- a/src/main/java/no/nibio/vips/logic/entity/UserPointOfInterest.java
+++ b/src/main/java/no/nibio/vips/logic/entity/UserPointOfInterest.java
@@ -19,13 +19,13 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/UserPointOfInterestPK.java b/src/main/java/no/nibio/vips/logic/entity/UserPointOfInterestPK.java
index 6f34d94d..ffdc59ff 100755
--- a/src/main/java/no/nibio/vips/logic/entity/UserPointOfInterestPK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/UserPointOfInterestPK.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2013 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/entity/UserUuid.java b/src/main/java/no/nibio/vips/logic/entity/UserUuid.java
index 539f0c28..20725773 100755
--- a/src/main/java/no/nibio/vips/logic/entity/UserUuid.java
+++ b/src/main/java/no/nibio/vips/logic/entity/UserUuid.java
@@ -21,14 +21,14 @@ package no.nibio.vips.logic.entity;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.UUID;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/UserUuidPK.java b/src/main/java/no/nibio/vips/logic/entity/UserUuidPK.java
index 9168cdfb..0b08ba1c 100755
--- a/src/main/java/no/nibio/vips/logic/entity/UserUuidPK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/UserUuidPK.java
@@ -20,10 +20,12 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.UUID;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
+import org.hibernate.annotations.JdbcTypeCode;
+import org.hibernate.type.SqlTypes;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
@@ -34,7 +36,7 @@ public class UserUuidPK implements Serializable {
     @Basic(optional = false)
     @NotNull
     @Column(name = "user_uuid")
-    @org.hibernate.annotations.Type(type="pg-uuid") // Ugly implementation specific hack
+    @JdbcTypeCode(SqlTypes.UUID)
     private UUID userUuid;
     @Basic(optional = false)
     @NotNull
diff --git a/src/main/java/no/nibio/vips/logic/entity/VipsCoreInstance.java b/src/main/java/no/nibio/vips/logic/entity/VipsCoreInstance.java
index 81808efc..d7ecef92 100755
--- a/src/main/java/no/nibio/vips/logic/entity/VipsCoreInstance.java
+++ b/src/main/java/no/nibio/vips/logic/entity/VipsCoreInstance.java
@@ -19,8 +19,8 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.*;
-import javax.validation.constraints.Size;
+import jakarta.persistence.*;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/VipsLogicRole.java b/src/main/java/no/nibio/vips/logic/entity/VipsLogicRole.java
index 0bafed3d..8aa56169 100755
--- a/src/main/java/no/nibio/vips/logic/entity/VipsLogicRole.java
+++ b/src/main/java/no/nibio/vips/logic/entity/VipsLogicRole.java
@@ -19,15 +19,15 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/VipsLogicUser.java b/src/main/java/no/nibio/vips/logic/entity/VipsLogicUser.java
index 27102b4d..6e7c51be 100755
--- a/src/main/java/no/nibio/vips/logic/entity/VipsLogicUser.java
+++ b/src/main/java/no/nibio/vips/logic/entity/VipsLogicUser.java
@@ -19,25 +19,25 @@ package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.Pattern;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -54,7 +54,7 @@ import java.util.UUID;
     @NamedQuery(name = "VipsLogicUser.findAll", query = "SELECT v FROM VipsLogicUser v"),
     @NamedQuery(name = "VipsLogicUser.findByUserId", query = "SELECT v FROM VipsLogicUser v WHERE v.userId = :userId"),
     @NamedQuery(name = "VipsLogicUser.findByUserIds", query = "SELECT v FROM VipsLogicUser v WHERE v.userId IN :userIds"),
-    @NamedQuery(name = "VipsLogicUser.findByOrganizationId", query = "SELECT v FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)"),
+    @NamedQuery(name = "VipsLogicUser.findByOrganizationId", query = "SELECT v FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR  v.organizationId.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)"),
     @NamedQuery(name = "VipsLogicUser.findByOrganizationIds", query = "SELECT v FROM VipsLogicUser v WHERE v.organizationId.organizationId IN (:organizationIds)"),
     @NamedQuery(name = "VipsLogicUser.findByEmail", query = "SELECT v FROM VipsLogicUser v WHERE v.email = :email"),
     @NamedQuery(name = "VipsLogicUser.findByEmailVerificationCode", query = "SELECT v FROM VipsLogicUser v WHERE v.emailVerificationCode = :emailVerificationCode"),
diff --git a/src/main/java/no/nibio/vips/logic/entity/WeatherForecastProvider.java b/src/main/java/no/nibio/vips/logic/entity/WeatherForecastProvider.java
index f2f1ae24..56788fa2 100755
--- a/src/main/java/no/nibio/vips/logic/entity/WeatherForecastProvider.java
+++ b/src/main/java/no/nibio/vips/logic/entity/WeatherForecastProvider.java
@@ -19,15 +19,15 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/WeatherStationDataSource.java b/src/main/java/no/nibio/vips/logic/entity/WeatherStationDataSource.java
index b31bd3aa..54c5720f 100755
--- a/src/main/java/no/nibio/vips/logic/entity/WeatherStationDataSource.java
+++ b/src/main/java/no/nibio/vips/logic/entity/WeatherStationDataSource.java
@@ -19,16 +19,16 @@
 package no.nibio.vips.logic.entity;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java b/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java
index a996188d..4ebbca82 100755
--- a/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java
+++ b/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java
@@ -20,11 +20,11 @@ package no.nibio.vips.logic.gis;
 
 import org.locationtech.jts.geom.Geometry;
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
 import org.hibernate.annotations.Type;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/i18n/CharacterEncodingFilter.java b/src/main/java/no/nibio/vips/logic/i18n/CharacterEncodingFilter.java
index ff1f0cc7..0d11b222 100755
--- a/src/main/java/no/nibio/vips/logic/i18n/CharacterEncodingFilter.java
+++ b/src/main/java/no/nibio/vips/logic/i18n/CharacterEncodingFilter.java
@@ -19,12 +19,12 @@
 package no.nibio.vips.logic.i18n;
 
 import java.io.IOException;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
 
 /**
  * <p>
diff --git a/src/main/java/no/nibio/vips/logic/i18n/LocalizationFilter.java b/src/main/java/no/nibio/vips/logic/i18n/LocalizationFilter.java
index b5b2ca78..db56f942 100755
--- a/src/main/java/no/nibio/vips/logic/i18n/LocalizationFilter.java
+++ b/src/main/java/no/nibio/vips/logic/i18n/LocalizationFilter.java
@@ -25,13 +25,13 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
 import no.nibio.vips.i18n.LanguageUtil;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/i18n/ResourceBundleJSServlet.java b/src/main/java/no/nibio/vips/logic/i18n/ResourceBundleJSServlet.java
index 25108073..2db6aec7 100755
--- a/src/main/java/no/nibio/vips/logic/i18n/ResourceBundleJSServlet.java
+++ b/src/main/java/no/nibio/vips/logic/i18n/ResourceBundleJSServlet.java
@@ -21,10 +21,10 @@ package no.nibio.vips.logic.i18n;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ResourceBundle;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.commons.lang.StringEscapeUtils;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/i18n/SessionLocaleUtil.java b/src/main/java/no/nibio/vips/logic/i18n/SessionLocaleUtil.java
index 9b7ea1ef..2b15ec0b 100755
--- a/src/main/java/no/nibio/vips/logic/i18n/SessionLocaleUtil.java
+++ b/src/main/java/no/nibio/vips/logic/i18n/SessionLocaleUtil.java
@@ -20,7 +20,7 @@ package no.nibio.vips.logic.i18n;
 
 import com.ibm.icu.util.ULocale;
 import java.util.ResourceBundle;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 
 /**
  * Presents a uniform way of getting locale information
diff --git a/src/main/java/no/nibio/vips/logic/messaging/ForecastEvent.java b/src/main/java/no/nibio/vips/logic/messaging/ForecastEvent.java
index 35b6c532..d4400138 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/ForecastEvent.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/ForecastEvent.java
@@ -19,15 +19,15 @@
 package no.nibio.vips.logic.messaging;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/messaging/ForecastEventNotificationSubscription.java b/src/main/java/no/nibio/vips/logic/messaging/ForecastEventNotificationSubscription.java
index 157953ea..7849d587 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/ForecastEventNotificationSubscription.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/ForecastEventNotificationSubscription.java
@@ -19,15 +19,13 @@
 package no.nibio.vips.logic.messaging;
 
 import java.util.List;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import no.nibio.vips.logic.util.IntegerArrayUserType;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
+import io.hypersistence.utils.hibernate.type.array.ListArrayType;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -35,7 +33,6 @@ import org.hibernate.annotations.TypeDefs;
  */
 @Entity
 @Table(name = "forecast_event_notification_subscription", schema = "messaging")
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 public class ForecastEventNotificationSubscription {
 
     @Id
@@ -46,13 +43,13 @@ public class ForecastEventNotificationSubscription {
     @Column(name = "universal_message_format_id")
     private Integer universalMessageFormatId;
     
-    @Type(type = "IntegerArray")
+    @Type(ListArrayType.class)
     @Column(name = "weather_station_ids")
-    private Integer[] weatherStationIds;
+    private List<Integer> weatherStationIds;
     
-    @Type(type = "IntegerArray")
+    @Type(ListArrayType.class)
     @Column(name = "crop_category_ids")
-    private Integer[] cropCategoryIds;
+    private List<Integer> cropCategoryIds;
 
     /**
      * @return the userId
@@ -85,42 +82,29 @@ public class ForecastEventNotificationSubscription {
     /**
      * @return the weatherStationIds
      */
-    public Integer[] getWeatherStationIds() {
+    public List<Integer> getWeatherStationIds() {
         return weatherStationIds;
     }
 
     /**
      * @param weatherStationIds the weatherStationIds to set
      */
-    public void setWeatherStationIds(Integer[] weatherStationIds) {
+    public void setWeatherStationIds(List<Integer> weatherStationIds) {
         this.weatherStationIds = weatherStationIds;
     }
     
-    /**
-     * Convenience method
-     * @param weatherStationIds 
-     */
-    public void setWeatherStationIds(List<Integer> weatherStationIds)
-    {
-        this.weatherStationIds = weatherStationIds.toArray(new Integer[weatherStationIds.size()]);
-    }
 
     /**
      * @return the cropCategoryIds
      */
-    public Integer[] getCropCategoryIds() {
+    public List<Integer> getCropCategoryIds() {
         return cropCategoryIds;
     }
 
     /**
      * @param cropCategoryIds the cropCategoryIds to set
      */
-    public void setCropCategoryIds(Integer[] cropCategoryIds) {
+    public void setCropCategoryIds(List<Integer> cropCategoryIds) {
         this.cropCategoryIds = cropCategoryIds;
     }
-    
-    public void setCropCategoryIds(List<Integer> cropCategoryIds)
-    {
-        this.cropCategoryIds = cropCategoryIds.toArray(new Integer[cropCategoryIds.size()]);
-    }
 }
diff --git a/src/main/java/no/nibio/vips/logic/messaging/ForecastNotificationLog.java b/src/main/java/no/nibio/vips/logic/messaging/ForecastNotificationLog.java
index dac54b75..63617d27 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/ForecastNotificationLog.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/ForecastNotificationLog.java
@@ -20,14 +20,14 @@ package no.nibio.vips.logic.messaging;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/messaging/ForecastNotificationLogPK.java b/src/main/java/no/nibio/vips/logic/messaging/ForecastNotificationLogPK.java
index 083328ee..435c12e8 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/ForecastNotificationLogPK.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/ForecastNotificationLogPK.java
@@ -20,12 +20,12 @@ package no.nibio.vips.logic.messaging;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/messaging/MessageNotificationSubscription.java b/src/main/java/no/nibio/vips/logic/messaging/MessageNotificationSubscription.java
index 2231f3b1..ea0adc8c 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/MessageNotificationSubscription.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessageNotificationSubscription.java
@@ -20,15 +20,13 @@ package no.nibio.vips.logic.messaging;
 
 import java.io.Serializable;
 import java.util.List;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import no.nibio.vips.logic.util.IntegerArrayUserType;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
+import io.hypersistence.utils.hibernate.type.array.ListArrayType;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -36,7 +34,6 @@ import org.hibernate.annotations.TypeDefs;
  */
 @Entity
 @Table(name = "message_notification_subscription", schema = "messaging")
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 public class MessageNotificationSubscription implements Serializable {
 
     @Id
@@ -47,13 +44,13 @@ public class MessageNotificationSubscription implements Serializable {
     @Column(name = "universal_message_format_id")
     private Integer universalMessageFormatId;
     
-    @Type(type = "IntegerArray")
+    @Type(ListArrayType.class)
     @Column(name = "message_tag_ids")
-    private Integer[] messageTagIds;
+    private List<Integer> messageTagIds;
     
-    @Type(type = "IntegerArray")
+    @Type(ListArrayType.class)
     @Column(name = "crop_category_ids")
-    private Integer[] cropCategoryIds;
+    private List<Integer> cropCategoryIds;
 
     public Integer getUserId() {
         return this.userId;
@@ -105,43 +102,29 @@ public class MessageNotificationSubscription implements Serializable {
     /**
      * @return the messageTagIds
      */
-    public Integer[] getMessageTagIds() {
+    public List<Integer> getMessageTagIds() {
         return messageTagIds;
     }
 
     /**
      * @param messageTagIds the messageTagIds to set
      */
-    public void setMessageTagIds(Integer[] messageTagIds) {
+    public void setMessageTagIds(List<Integer> messageTagIds) {
         this.messageTagIds = messageTagIds;
     }
     
-    /**
-     * For your convenience
-     * @param messageTagIds 
-     */
-    public void setMessageTagIds(List<Integer> messageTagIds)
-    {
-        this.messageTagIds = messageTagIds.toArray(new Integer[messageTagIds.size()]);
-    }
-
     /**
      * @return the cropCategoryIds
      */
-    public Integer[] getCropCategoryIds() {
+    public List<Integer> getCropCategoryIds() {
         return cropCategoryIds;
     }
 
     /**
      * @param cropCategoryIds the cropCategoryIds to set
      */
-    public void setCropCategoryIds(Integer[] cropCategoryIds) {
+    public void setCropCategoryIds(List<Integer> cropCategoryIds) {
         this.cropCategoryIds = cropCategoryIds;
     }
-    
-    public void setCropCategoryIds(List<Integer> cropCategoryIds)
-    {
-        this.cropCategoryIds = cropCategoryIds.toArray(new Integer[cropCategoryIds.size()]);
-    }
 
 }
diff --git a/src/main/java/no/nibio/vips/logic/messaging/MessageRecipient.java b/src/main/java/no/nibio/vips/logic/messaging/MessageRecipient.java
index ee231e54..c6a692d1 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/MessageRecipient.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessageRecipient.java
@@ -19,9 +19,9 @@
 package no.nibio.vips.logic.messaging;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
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 f05822ac..6b9a9b96 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
@@ -29,11 +29,11 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.ResourceBundle;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.logic.entity.ForecastConfiguration;
 import no.nibio.vips.logic.entity.ForecastResult;
@@ -165,7 +165,7 @@ public class MessagingBean {
                 "	SELECT mns.user_id FROM messaging.message_notification_subscription mns, public.vips_logic_user u \n" +
                 "	WHERE  mns.user_id = u.user_id \n" +
                 "       and u.organization_id = " + message.getOrganizationId() +
-                (message.getCropCategoryIds() != null && message.getCropCategoryIds().length != 0 ? "       AND mns.crop_category_ids && ARRAY" + Arrays.asList(message.getCropCategoryIds()).toString() + " \n" : "") +
+                (message.getCropCategoryIds() != null && message.getCropCategoryIds().size() != 0 ? "       AND mns.crop_category_ids && ARRAY" + Arrays.asList(message.getCropCategoryIds()).toString() + " \n" : "") +
                 (message.getMessageTagIds() != null && !message.getMessageTagIds().isEmpty() ? "       AND mns.message_tag_ids && ARRAY" + message.getMessageTagIds().toString() + " \n" : "" )+ // && is the array_overlaps operator
                 "       AND (mns.universal_message_format_id <> " + UniversalMessageFormat.FORMAT_SMS + " OR (mns.universal_message_format_id = " + UniversalMessageFormat.FORMAT_SMS + " AND u.approves_sms_billing IS TRUE))" + 
                 "); \n";
diff --git a/src/main/java/no/nibio/vips/logic/messaging/ObservationNotificationSubscription.java b/src/main/java/no/nibio/vips/logic/messaging/ObservationNotificationSubscription.java
index 7df24d95..08c6139a 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/ObservationNotificationSubscription.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/ObservationNotificationSubscription.java
@@ -20,15 +20,14 @@ package no.nibio.vips.logic.messaging;
 
 import java.io.Serializable;
 import java.util.List;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import no.nibio.vips.logic.util.IntegerArrayUserType;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
+import io.hypersistence.utils.hibernate.type.array.ListArrayType;
+
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -36,7 +35,6 @@ import org.hibernate.annotations.TypeDefs;
  */
 @Entity
 @Table(name = "observation_notification_subscription", schema = "messaging")
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 public class ObservationNotificationSubscription implements Serializable {
 
     @Id
@@ -47,9 +45,9 @@ public class ObservationNotificationSubscription implements Serializable {
     @Column(name = "universal_message_format_id")
     private Integer universalMessageFormatId;
     
-    @Type(type = "IntegerArray")
+    @Type(ListArrayType.class)
     @Column(name = "crop_category_ids")
-    private Integer[] cropCategoryIds;
+    private List<Integer> cropCategoryIds;
 
     public Integer getUserId() {
         return this.userId;
@@ -101,20 +99,17 @@ public class ObservationNotificationSubscription implements Serializable {
     /**
      * @return the cropCategoryIds
      */
-    public Integer[] getCropCategoryIds() {
+    public List<Integer> getCropCategoryIds() {
         return cropCategoryIds;
     }
 
     /**
      * @param cropCategoryIds the cropCategoryIds to set
      */
-    public void setCropCategoryIds(Integer[] cropCategoryIds) {
-        this.cropCategoryIds = cropCategoryIds;
-    }
     
     public void setCropCategoryIds(List<Integer> cropCategoryIds)
     {
-        this.cropCategoryIds = cropCategoryIds.toArray(new Integer[cropCategoryIds.size()]);
+        this.cropCategoryIds = cropCategoryIds;
     }
 
 }
diff --git a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
index db8020bf..504306ac 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
@@ -31,25 +31,25 @@ import java.util.List;
 import java.util.ResourceBundle;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.Transient;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import com.ibm.icu.util.ULocale;
 import no.nibio.vips.logic.util.StringJsonUserType;
+import org.hibernate.annotations.JdbcTypeCode;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
+import org.hibernate.type.SqlTypes;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -58,7 +58,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "universal_message", schema = "messaging")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "UniversalMessage.findAll", query = "SELECT u FROM UniversalMessage u"),
     @NamedQuery(name = "UniversalMessage.findByUniversalMessageId", query = "SELECT u FROM UniversalMessage u WHERE u.universalMessageId = :universalMessageId"),
@@ -73,14 +72,12 @@ public class UniversalMessage implements Serializable {
     @Column(name = "expires_at")
     @Temporal(TemporalType.TIMESTAMP)
     private Date expiresAt;
-    //@Column(name = "distribution_list", columnDefinition = "json")
-    //@Convert(converter = PostgresJSONStringConverter.class)
-    // Documentation on StackOverflow: http://stackoverflow.com/questions/15974474/mapping-postgresql-json-column-to-hibernate-value-type
-    @Type(type = "StringJsonObject")
+
+    @JdbcTypeCode(SqlTypes.JSON)
     @Column(name = "distribution_list")
     private String distributionList;
     
-    @Type(type = "StringJsonObject")
+    @JdbcTypeCode(SqlTypes.JSON)
     @Column(name = "message_local_versions")
     private String messageLocalVersions;
     
diff --git a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessageFormat.java b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessageFormat.java
index 5a257076..d87384d4 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessageFormat.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessageFormat.java
@@ -19,12 +19,12 @@
 package no.nibio.vips.logic.messaging;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java
index f0583c3e..3ca28aa6 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.messaging;
 
 import com.webcohesion.enunciate.metadata.Facet;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.Response;
 
 /**
  * @copyright 2015 <a href="http://www.bioforsk.no/">Bioforsk</a>
diff --git a/src/main/java/no/nibio/vips/logic/messaging/distribution/send/MailMsgDeliveryHandler.java b/src/main/java/no/nibio/vips/logic/messaging/distribution/send/MailMsgDeliveryHandler.java
index 310eb316..7c8efb8d 100644
--- a/src/main/java/no/nibio/vips/logic/messaging/distribution/send/MailMsgDeliveryHandler.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/distribution/send/MailMsgDeliveryHandler.java
@@ -22,14 +22,14 @@ import java.text.MessageFormat;
 import java.util.Date;
 import java.util.Properties;
 
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-import javax.mail.internet.MimeUtility;
-
-import com.sun.mail.smtp.SMTPTransport;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
+import jakarta.mail.Session;
+import jakarta.mail.internet.InternetAddress;
+import jakarta.mail.internet.MimeMessage;
+import jakarta.mail.internet.MimeUtility;
+
+import jakarta.mail.Transport;
 import no.nibio.vips.logic.messaging.distribution.entity.DistributionTypeEnum;
 import no.nibio.vips.logic.messaging.distribution.entity.MsgReceiver;
 import no.nibio.vips.logic.messaging.distribution.entity.MsgToSend;
@@ -65,7 +65,7 @@ public class MailMsgDeliveryHandler implements IDeliveryMsgHandler {
             throws MessagingException, UnsupportedEncodingException {
         boolean result = false;
 
-        SMTPTransport t = null;
+        Transport t = null;
         String message = "Failed to send message to " + mailaddress + " using server " + mailserver;
         try {
 
@@ -115,11 +115,12 @@ public class MailMsgDeliveryHandler implements IDeliveryMsgHandler {
 
             LOGGER.debug("Message ready to send : " + mailMessageBody);
             
-            t = (SMTPTransport) session.getTransport(ssl ? "smtps" : "smtp");
+            t = (Transport) session.getTransport(ssl ? "smtps" : "smtp");
             t.connect();
             t.sendMessage(msg, msg.getAllRecipients());
-            
-            LOGGER.debug("Mail was sent successfully. Response: " + t.getLastServerResponse());
+
+            // TODO: Replace with TransportListener  (After upgrading to Jakarta)       
+            //LOGGER.debug("Mail was sent successfully. Response: " + t.getLastServerResponse());
 
         } finally {
             try {
diff --git a/src/main/java/no/nibio/vips/logic/messaging/distribution/send/SmsMsgDeliveryHandler.java b/src/main/java/no/nibio/vips/logic/messaging/distribution/send/SmsMsgDeliveryHandler.java
index 860f4514..b92c1236 100644
--- a/src/main/java/no/nibio/vips/logic/messaging/distribution/send/SmsMsgDeliveryHandler.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/distribution/send/SmsMsgDeliveryHandler.java
@@ -27,7 +27,7 @@ import java.net.URLConnection;
 import java.net.URLEncoder;
 import java.text.MessageFormat;
 
-import javax.mail.MessagingException;
+import jakarta.mail.MessagingException;
 import no.nibio.vips.logic.messaging.distribution.entity.MsgReceiver;
 import no.nibio.vips.logic.messaging.distribution.entity.MsgToSend;
 import no.nibio.vips.logic.messaging.distribution.entity.VipsMessage;
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 76ffc282..b07721ff 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/sms/SMSHandlingService.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/sms/SMSHandlingService.java
@@ -19,11 +19,11 @@
 package no.nibio.vips.logic.messaging.sms;
 
 import com.webcohesion.enunciate.metadata.Facet;
-import javax.ejb.EJB;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
+import jakarta.ejb.EJB;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
 import no.nibio.vips.logic.controller.session.UserBean;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothBean.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothBean.java
index 278d8742..e002bd0c 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothBean.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/AppleFruitMothBean.java
@@ -32,12 +32,12 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import javax.ejb.LocalBean;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
+import jakarta.ejb.LocalBean;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
 import no.nibio.vips.logic.util.Globals;
 
 /**
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 f21aeb2f..5916fcaa 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
@@ -28,11 +28,11 @@ 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 jakarta.ejb.EJB;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.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;
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 fe21310e..8c5013e8 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
@@ -21,15 +21,15 @@ 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;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
+import jakarta.ejb.EJB;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.Response;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.util.ServletUtil;
 
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java
index 0a380253..93c21bb6 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java
@@ -23,22 +23,22 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import no.nibio.vips.logic.entity.Gis;
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePoint.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePoint.java
index 64ad9e59..82c177d4 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePoint.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePoint.java
@@ -20,23 +20,23 @@ package no.nibio.vips.logic.modules.applefruitmoth;
 
 import java.io.Serializable;
 import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import no.nibio.vips.logic.entity.Gis;
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePointSeasonData.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePointSeasonData.java
index 2e35f610..c54d2aa6 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePointSeasonData.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePointSeasonData.java
@@ -21,16 +21,16 @@ package no.nibio.vips.logic.modules.applefruitmoth;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePointSeasonDataPK.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePointSeasonDataPK.java
index 1f85c533..b62e6d09 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePointSeasonDataPK.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSitePointSeasonDataPK.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.logic.modules.applefruitmoth;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSiteSeasonCommonData.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSiteSeasonCommonData.java
index 6635b194..33df5074 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSiteSeasonCommonData.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSiteSeasonCommonData.java
@@ -21,16 +21,16 @@ package no.nibio.vips.logic.modules.applefruitmoth;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSiteSeasonCommonDataPK.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSiteSeasonCommonDataPK.java
index 42f89a65..fc3d3bb1 100755
--- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSiteSeasonCommonDataPK.java
+++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSiteSeasonCommonDataPK.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.logic.modules.applefruitmoth;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
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 a6e3a4af..290cfa5e 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
@@ -39,14 +39,14 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 
-import javax.ejb.LocalBean;
-import javax.ejb.Stateless;
+import jakarta.ejb.LocalBean;
+import jakarta.ejb.Stateless;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.geotools.geometry.jts.JTS;
 import org.geotools.referencing.CRS;
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 7e622af6..0a2dcdbb 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
@@ -33,12 +33,12 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 import java.util.stream.Collectors;
-import javax.ejb.EJB;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Response;
+import jakarta.ejb.EJB;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.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;
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 ebcde20a..76ddf51b 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
@@ -18,17 +18,17 @@
 
 package no.nibio.vips.logic.modules.barkbeetle;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.PATCH;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.PATCH;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.Response;
 
 import org.jboss.resteasy.annotations.GZIP;
 
@@ -38,7 +38,7 @@ import com.webcohesion.enunciate.metadata.Facet;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.util.ServletUtil;
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/RegistrationStatusType.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/RegistrationStatusType.java
index dcf98f16..fe4e2e18 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/RegistrationStatusType.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/RegistrationStatusType.java
@@ -19,15 +19,15 @@
 package no.nibio.vips.logic.modules.barkbeetle;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsite.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsite.java
index b5e16c38..07899fda 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsite.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsite.java
@@ -30,27 +30,27 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.Lob;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.PrimaryKeyJoinColumn;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import no.nibio.vips.logic.entity.VipsLogicUser;
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsiteBivolt.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsiteBivolt.java
index bc1cf214..98cf8708 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsiteBivolt.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/SeasonTrapsiteBivolt.java
@@ -21,19 +21,19 @@ package no.nibio.vips.logic.modules.barkbeetle;
 import java.io.Serializable;
 import java.math.BigInteger;
 import java.util.Date;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.MapsId;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.MapsId;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteRegistration.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteRegistration.java
index d1ec56d1..19d15235 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteRegistration.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteRegistration.java
@@ -20,18 +20,18 @@ package no.nibio.vips.logic.modules.barkbeetle;
 
 import java.io.Serializable;
 import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.Transient;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteRegistrationPK.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteRegistrationPK.java
index 398c4932..6ca9b6a8 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteRegistrationPK.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteRegistrationPK.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.logic.modules.barkbeetle;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteType.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteType.java
index 0b6d8ba5..867706c3 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteType.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/TrapsiteType.java
@@ -19,15 +19,15 @@
 package no.nibio.vips.logic.modules.barkbeetle;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
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 1d30bc9b..0b36340b 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
@@ -21,16 +21,16 @@ package no.nibio.vips.logic.modules.barleynetblotch;
 import com.webcohesion.enunciate.metadata.Facet;
 
 import java.util.*;
-import javax.ejb.EJB;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Response;
+import jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.Response;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.entity.WeatherObservation;
diff --git a/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/Factors.java b/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/Factors.java
index 81cb89a3..db0d8275 100755
--- a/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/Factors.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/Factors.java
@@ -21,14 +21,14 @@ package no.nibio.vips.logic.modules.barleynetblotch;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/PreparationEffectFactor.java b/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/PreparationEffectFactor.java
index b79579ab..21bd0d61 100755
--- a/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/PreparationEffectFactor.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barleynetblotch/PreparationEffectFactor.java
@@ -20,14 +20,14 @@ package no.nibio.vips.logic.modules.barleynetblotch;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
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 5f08a872..9c63267b 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
@@ -30,18 +30,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.TimeZone;
 import java.util.stream.Collectors;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.entity.WeatherObservation;
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 911ee8e7..0a317ef6 100755
--- a/src/main/java/no/nibio/vips/logic/scheduling/TerminateSchedulerListener.java
+++ b/src/main/java/no/nibio/vips/logic/scheduling/TerminateSchedulerListener.java
@@ -21,7 +21,7 @@ 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 jakarta.ejb.EJB;
 import no.nibio.vips.logic.controller.session.SchedulingBean;
 
 /**
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 62f1a688..7b1db122 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
@@ -31,7 +31,7 @@ import java.util.List;
 import java.util.TimeZone;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.WeatherObservation;
 import no.nibio.vips.logic.controller.session.ForecastBean;
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 9d5fa878..6e3420a7 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
@@ -24,7 +24,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.logic.controller.session.ObservationBean;
 import no.nibio.vips.logic.controller.session.OrganismBean;
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 4e9f5b79..c9767cdc 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
@@ -22,7 +22,7 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.logic.controller.session.ObservationBean;
 import no.nibio.vips.logic.controller.session.OrganismBean;
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 1cb407f2..322042f0 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
@@ -25,7 +25,7 @@ import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.stream.Collectors;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.WeatherObservation;
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 4ac0300b..470373f4 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
@@ -25,7 +25,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.WeatherObservation;
 import no.nibio.vips.logic.controller.session.ForecastBean;
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 0ef2ce63..978b77a3 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
@@ -19,7 +19,7 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 
 import no.nibio.vips.logic.controller.session.SessionControllerGetter;
 import no.nibio.vips.logic.controller.session.UserBean;
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 84a41cc2..6b1ec301 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
@@ -22,7 +22,7 @@ import it.sauronsoftware.cron4j.TaskExecutionContext;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.i18n.I18nImpl;
 import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.controller.session.PointOfInterestBean;
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 7f08a039..e5eaf1db 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
@@ -23,7 +23,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
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 04069629..907f8a2e 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
@@ -20,7 +20,7 @@ package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
 import java.util.Map;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.i18n.I18nImpl;
 import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.controller.session.SessionControllerGetter;
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 25bb6d3b..74a0f841 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
@@ -19,7 +19,7 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 
 import no.nibio.vips.logic.controller.session.SessionControllerGetter;
 import no.nibio.vips.logic.messaging.MessagingBean;
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 3824b616..91e4acc2 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
@@ -19,7 +19,7 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.controller.session.SessionControllerGetter;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
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 8533acad..4cf5d4d5 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
@@ -19,7 +19,7 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.controller.session.SessionControllerGetter;
 import no.nibio.vips.logic.scheduling.VipsLogicTask;
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 b87173d4..523a9aa0 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
@@ -19,7 +19,7 @@
 package no.nibio.vips.logic.scheduling.tasks;
 
 import it.sauronsoftware.cron4j.TaskExecutionContext;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.logic.controller.session.ForecastBean;
 import no.nibio.vips.logic.controller.session.SessionControllerGetter;
 import no.nibio.vips.logic.scheduling.TaskResult;
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 c2155424..5433ab8f 100644
--- a/src/main/java/no/nibio/vips/logic/service/AuthenticationService.java
+++ b/src/main/java/no/nibio/vips/logic/service/AuthenticationService.java
@@ -21,24 +21,24 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-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 jakarta.servlet.http.HttpServletRequest;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.HttpHeaders;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.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.rs.TypeHint;
-import javax.ejb.EJB;
+import jakarta.ejb.EJB;
 import no.nibio.vips.logic.controller.session.UserBean;
 
 import no.nibio.vips.logic.entity.UserUuid;
diff --git a/src/main/java/no/nibio/vips/logic/service/JSONBConfig.java b/src/main/java/no/nibio/vips/logic/service/JSONBConfig.java
index 814f9ce1..6fef0190 100644
--- a/src/main/java/no/nibio/vips/logic/service/JSONBConfig.java
+++ b/src/main/java/no/nibio/vips/logic/service/JSONBConfig.java
@@ -18,15 +18,15 @@
 
 package no.nibio.vips.logic.service;
 
-import javax.json.bind.Jsonb;
-import javax.json.bind.JsonbBuilder;
-import javax.json.bind.JsonbConfig;
-import javax.json.bind.annotation.JsonbDateFormat;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.ext.ContextResolver;
-import javax.ws.rs.ext.Provider;
+import jakarta.json.bind.Jsonb;
+import jakarta.json.bind.JsonbBuilder;
+import jakarta.json.bind.JsonbConfig;
+import jakarta.json.bind.annotation.JsonbDateFormat;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.ext.ContextResolver;
+import jakarta.ws.rs.ext.Provider;
 
 import java.util.logging.Level;  
 import java.util.logging.Logger; 
@@ -40,7 +40,7 @@ import java.util.logging.Logger;
 @Provider
 @Produces(MediaType.APPLICATION_JSON)
 //@Consumes(MediaType.APPLICATION_JSON)
-public class JSONBConfig implements ContextResolver<javax.json.bind.Jsonb>
+public class JSONBConfig implements ContextResolver<jakarta.json.bind.Jsonb>
 {
     //private final ObjectMapper objectMapper;
     private final Jsonb jsonB;  
diff --git a/src/main/java/no/nibio/vips/logic/service/JacksonConfig.java b/src/main/java/no/nibio/vips/logic/service/JacksonConfig.java
index 78a7a337..6c64b6db 100755
--- a/src/main/java/no/nibio/vips/logic/service/JacksonConfig.java
+++ b/src/main/java/no/nibio/vips/logic/service/JacksonConfig.java
@@ -25,11 +25,11 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import java.text.SimpleDateFormat;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.ext.ContextResolver;
-import javax.ws.rs.ext.Provider;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.ext.ContextResolver;
+import jakarta.ws.rs.ext.Provider;
 
 /**
  * Add this to no.nibio.vips.logic.VIPSLogicApplication if you want all
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 ccb2553b..28c15783 100755
--- a/src/main/java/no/nibio/vips/logic/service/LogicService.java
+++ b/src/main/java/no/nibio/vips/logic/service/LogicService.java
@@ -33,24 +33,24 @@ import java.util.Set;
 import java.util.TimeZone;
 import java.util.UUID;
 import java.util.stream.Collectors;
-import javax.ejb.EJB;
-import javax.persistence.NonUniqueResultException;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
+import jakarta.ejb.EJB;
+import jakarta.persistence.NonUniqueResultException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.HttpHeaders;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
 import org.apache.commons.validator.routines.EmailValidator;
 import org.jboss.resteasy.annotations.GZIP;
 import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
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 de319c70..861b1b07 100644
--- a/src/main/java/no/nibio/vips/logic/service/ModelFormService.java
+++ b/src/main/java/no/nibio/vips/logic/service/ModelFormService.java
@@ -24,12 +24,12 @@ import org.locationtech.jts.geom.Coordinate;
 import com.webcohesion.enunciate.metadata.Facet;
 
 import java.util.*;
-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 javax.ws.rs.core.Response;
+import jakarta.ejb.EJB;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.Response;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.gis.GISUtil;
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 75d4ac8b..ec922c16 100755
--- a/src/main/java/no/nibio/vips/logic/service/ObservationService.java
+++ b/src/main/java/no/nibio/vips/logic/service/ObservationService.java
@@ -44,17 +44,17 @@ import org.slf4j.LoggerFactory;
 import org.wololo.geojson.Feature;
 import org.wololo.geojson.GeoJSON;
 
-import javax.ejb.EJB;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.*;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
+import jakarta.ejb.EJB;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
 import java.io.IOException;
 import java.net.URI;
 import java.text.ParseException;
diff --git a/src/main/java/no/nibio/vips/logic/service/ObservationTimeSeriesService.java b/src/main/java/no/nibio/vips/logic/service/ObservationTimeSeriesService.java
index 3d428239..600ba450 100644
--- a/src/main/java/no/nibio/vips/logic/service/ObservationTimeSeriesService.java
+++ b/src/main/java/no/nibio/vips/logic/service/ObservationTimeSeriesService.java
@@ -17,16 +17,16 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.wololo.geojson.Feature;
 
-import javax.ejb.EJB;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.*;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
+import jakarta.ejb.EJB;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
 import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
diff --git a/src/main/java/no/nibio/vips/logic/service/POIService.java b/src/main/java/no/nibio/vips/logic/service/POIService.java
index 987896a2..4ca5a1f5 100644
--- a/src/main/java/no/nibio/vips/logic/service/POIService.java
+++ b/src/main/java/no/nibio/vips/logic/service/POIService.java
@@ -21,13 +21,13 @@ import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.*;
-import javax.ws.rs.core.Context;
-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 jakarta.servlet.http.HttpServletRequest;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.HttpHeaders;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import no.nibio.vips.logic.controller.session.PointOfInterestBean;
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 2c8c8736..6fd9c714 100755
--- a/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java
+++ b/src/main/java/no/nibio/vips/logic/service/VIPSMobileService.java
@@ -30,15 +30,15 @@ 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;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
+import jakarta.ejb.EJB;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.Context;
+import jakarta.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;
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 6e3c8b33..2a7a7202 100755
--- a/src/main/java/no/nibio/vips/logic/startup/StartupListener.java
+++ b/src/main/java/no/nibio/vips/logic/startup/StartupListener.java
@@ -18,9 +18,9 @@
 
 package no.nibio.vips.logic.startup;
 
-import javax.annotation.Resource;
-import javax.ejb.EJB;
-import javax.servlet.ServletContextEvent;
+import jakarta.annotation.Resource;
+import jakarta.ejb.EJB;
+import jakarta.servlet.ServletContextEvent;
 import javax.sql.DataSource;
 import no.nibio.vips.logic.controller.session.SchedulingBean;
 import org.flywaydb.core.Flyway;
@@ -32,7 +32,7 @@ import org.flywaydb.core.Flyway;
  * @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{
+public class StartupListener implements jakarta.servlet.ServletContextListener{
 
     @Resource(lookup="java:/jboss/datasources/vipslogic")
     DataSource vipslogicDS;
diff --git a/src/main/java/no/nibio/vips/logic/util/CorsProxyServlet.java b/src/main/java/no/nibio/vips/logic/util/CorsProxyServlet.java
index e8d735e5..bf97a497 100644
--- a/src/main/java/no/nibio/vips/logic/util/CorsProxyServlet.java
+++ b/src/main/java/no/nibio/vips/logic/util/CorsProxyServlet.java
@@ -25,10 +25,10 @@ import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 /**
  * Simple HTTP(S) proxy to avoid the CORS issues with using external web services
diff --git a/src/main/java/no/nibio/vips/logic/util/IntegerArrayUserType.java b/src/main/java/no/nibio/vips/logic/util/IntegerArrayUserType.java
deleted file mode 100755
index 94ea3338..00000000
--- a/src/main/java/no/nibio/vips/logic/util/IntegerArrayUserType.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (c) 2015 NIBIO <http://www.nibio.no/>. 
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-package no.nibio.vips.logic.util;
-
-import java.io.Serializable;
-import java.sql.Array;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import org.hibernate.HibernateException;
-import org.hibernate.engine.spi.SessionImplementor;
-import org.hibernate.engine.spi.SharedSessionContractImplementor;
-import org.hibernate.usertype.UserType;
-
-/**
- * Adapted from this: http://stackoverflow.com/questions/21940642/hibernate-postgres-array-type
- * @copyright 2015-2019 <a href="http://www.nibio.no/">NIBIO</a>
- * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
- */
-
-public class IntegerArrayUserType implements UserType {
-
-    /**
-     * Return the SQL type codes for the columns mapped by this type. The
-     * codes are defined on <tt>java.sql.Types</tt>.
-     *
-     * @return int[] the typecodes
-     * @see java.sql.Types
-     */
-    @Override
-    public int[] sqlTypes() {
-        return new int[] { Types.ARRAY };
-    }
-
-    /**
-     * The class returned by <tt>nullSafeGet()</tt>.
-     *
-     * @return Class
-     */
-    @Override
-    public Class returnedClass() {
-        return Integer[].class;
-    }
-
-    /**
-     * Compare two instances of the class mapped by this type for persistence "equality".
-     * Equality of the persistent state.
-     *
-     * @param x
-     * @param y
-     * @return boolean
-     */
-    @Override
-    public boolean equals(Object x, Object y) throws HibernateException {
-
-        if( x== null){
-
-            return y== null;
-        }
-
-        return x.equals( y);
-    }
-
-    /**
-     * Get a hashcode for the instance, consistent with persistence "equality"
-     */
-    @Override
-    public int hashCode(Object x) throws HibernateException {
-
-        return x.hashCode();
-    }
-
-    /**
-     * Retrieve an instance of the mapped class from a JDBC resultset. Implementors
-     * should handle possibility of null values.
-     *
-     * @param rs      a JDBC result set
-     * @param names   the column names
-     * @param session
-     * @param owner   the containing entity  @return Object
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    //@Override
-    public Object nullSafeGet(
-            ResultSet rs, 
-            String[] names, 
-            SessionImplementor session, 
-            Object owner) throws HibernateException, SQLException {
-       if (rs.wasNull()) {
-        return null;
-    }
-
-       try
-       {
-        Integer[] array = (Integer[]) rs.getArray(names[0]).getArray();
-        return array;
-       }
-       catch(NullPointerException ex)
-       {
-           return new Integer[0];
-       }
-    }
-
-    /**
-     * Write an instance of the mapped class to a prepared statement. Implementors
-     * should handle possibility of null values. A multi-column type should be written
-     * to parameters starting from <tt>index</tt>.
-     *
-     * @param st      a JDBC prepared statement
-     * @param value   the object to write
-     * @param index   statement parameter index
-     * @param session
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    //@Override
-    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
-        if (value == null) {
-            st.setNull(index, Types.OTHER);
-            return;
-        }
-
-        Integer[] castObject = (Integer[]) value;
-        Array array = session.connection().createArrayOf("integer", castObject); // The postgres array data type
-        st.setArray(index, array);
-    }
-
-    /**
-     * Return a deep copy of the persistent state, stopping at entities and at
-     * collections. It is not necessary to copy immutable objects, or null
-     * values, in which case it is safe to simply return the argument.
-     *
-     * @param value the object to be cloned, which may be null
-     * @return Object a copy
-     */
-    @Override
-    public Object deepCopy(Object value) throws HibernateException {
-
-        return value;
-    }
-
-    /**
-     * Are objects of this type mutable?
-     *
-     * @return boolean
-     */
-    @Override
-    public boolean isMutable() {
-        return true;
-    }
-
-    /**
-     * Transform the object into its cacheable representation. At the very least this
-     * method should perform a deep copy if the type is mutable. That may not be enough
-     * for some implementations, however; for example, associations must be cached as
-     * identifier values. (optional operation)
-     *
-     * @param value the object to be cached
-     * @return a cachable representation of the object
-     * @throws org.hibernate.HibernateException
-     *
-     */
-    @Override
-    public Serializable disassemble(Object value) throws HibernateException {
-        return (Integer[])this.deepCopy( value);
-    }
-
-    /**
-     * Reconstruct an object from the cacheable representation. At the very least this
-     * method should perform a deep copy if the type is mutable. (optional operation)
-     *
-     * @param cached the object to be cached
-     * @param owner  the owner of the cached object
-     * @return a reconstructed object from the cachable representation
-     * @throws org.hibernate.HibernateException
-     *
-     */
-    @Override
-    public Object assemble(Serializable cached, Object owner) throws HibernateException {
-        return this.deepCopy( cached);
-    }
-
-    /**
-     * During merge, replace the existing (target) value in the entity we are merging to
-     * with a new (original) value from the detached entity we are merging. For immutable
-     * objects, or null values, it is safe to simply return the first parameter. For
-     * mutable objects, it is safe to return a copy of the first parameter. For objects
-     * with component values, it might make sense to recursively replace component values.
-     *
-     * @param original the value from the detached entity being merged
-     * @param target   the value in the managed entity
-     * @return the value to be merged
-     */
-    @Override
-    public Object replace(Object original, Object target, Object owner) throws HibernateException {
-        return original;
-    }
-
-    /**
-     * Retrieve an instance of the mapped class from a JDBC resultset. Implementors
-     * should handle possibility of null values.
-     *
-     * @param rs      a JDBC result set
-     * @param strings   the column names
-     * @param ssci
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    @Override
-    public Object nullSafeGet(ResultSet rs, String[] strings, SharedSessionContractImplementor ssci, Object o) throws HibernateException, SQLException {
-        if (rs.wasNull()) {
-            return null;
-        }
-        try
-        {
-            Integer[] array = (Integer[]) rs.getArray(strings[0]).getArray();
-            return array;
-        }
-        catch(NullPointerException ex)
-        {
-           return new Integer[0];
-        }
-    }
-
-    /**
-     * Write an instance of the mapped class to a prepared statement. Implementors
-     * should handle possibility of null values. A multi-column type should be written
-     * to parameters starting from <tt>index</tt>.
-     *
-     * @param ps      a JDBC prepared statement
-     * @param o   the object to write
-     * @param i   statement parameter index
-     * @param ssci
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    @Override
-    public void nullSafeSet(PreparedStatement ps, Object o, int i, SharedSessionContractImplementor ssci) throws HibernateException, SQLException {
-        if (o == null) {
-            ps.setNull(i, Types.OTHER);
-            return;
-        }
-
-        Integer[] castObject = (Integer[]) o;
-        Array array = ssci.connection().createArrayOf("integer", castObject); // The postgres array data type
-        ps.setArray(i, array);
-    }
-
-
-}
diff --git a/src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java b/src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java
deleted file mode 100755
index 2e7dda6a..00000000
--- a/src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2015 NIBIO <http://www.nibio.no/>. 
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
-package no.nibio.vips.logic.util;
-
-import java.sql.Types;
-import org.hibernate.dialect.PostgreSQL9Dialect;
-
-/**
- * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
- * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
- */
-public class JsonPostgreSQLDialect extends PostgreSQL9Dialect{
-    public JsonPostgreSQLDialect() {
-
-        super();
-
-        this.registerColumnType(Types.JAVA_OBJECT, "json");
-    }
-}
diff --git a/src/main/java/no/nibio/vips/logic/util/PostgresJSONStringConverter.java b/src/main/java/no/nibio/vips/logic/util/PostgresJSONStringConverter.java
index d269df6f..aafb201d 100755
--- a/src/main/java/no/nibio/vips/logic/util/PostgresJSONStringConverter.java
+++ b/src/main/java/no/nibio/vips/logic/util/PostgresJSONStringConverter.java
@@ -19,8 +19,8 @@
 package no.nibio.vips.logic.util;
 
 import java.sql.SQLException;
-import javax.persistence.AttributeConverter;
-import javax.persistence.Converter;
+import jakarta.persistence.AttributeConverter;
+import jakarta.persistence.Converter;
 import org.postgresql.util.PGobject;
 
 /**
diff --git a/src/main/java/no/nibio/vips/logic/util/RESTAuthenticator.java b/src/main/java/no/nibio/vips/logic/util/RESTAuthenticator.java
index c17fc1af..b7c20af1 100755
--- a/src/main/java/no/nibio/vips/logic/util/RESTAuthenticator.java
+++ b/src/main/java/no/nibio/vips/logic/util/RESTAuthenticator.java
@@ -20,9 +20,9 @@ package no.nibio.vips.logic.util;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
-import javax.ws.rs.client.ClientRequestContext;
-import javax.ws.rs.client.ClientRequestFilter;
-import javax.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.client.ClientRequestContext;
+import jakarta.ws.rs.client.ClientRequestFilter;
+import jakarta.ws.rs.core.MultivaluedMap;
 import javax.xml.bind.DatatypeConverter;
 
 
diff --git a/src/main/java/no/nibio/vips/logic/util/SimpleMailSender.java b/src/main/java/no/nibio/vips/logic/util/SimpleMailSender.java
index 682a18a1..7dc0c19c 100755
--- a/src/main/java/no/nibio/vips/logic/util/SimpleMailSender.java
+++ b/src/main/java/no/nibio/vips/logic/util/SimpleMailSender.java
@@ -21,8 +21,8 @@ package no.nibio.vips.logic.util;
 
 import java.util.Iterator;
 import java.util.List;
-import javax.mail.*;
-import javax.mail.internet.*;
+import jakarta.mail.*;
+import jakarta.mail.internet.*;
 import java.util.Properties;
 
 
@@ -70,8 +70,8 @@ public class SimpleMailSender {
 
             Transport.send(message);
         }
-        catch(javax.mail.internet.AddressException ae){ae.printStackTrace();}
-        catch(javax.mail.MessagingException me) {me.printStackTrace();}
+        catch(jakarta.mail.internet.AddressException ae){ae.printStackTrace();}
+        catch(jakarta.mail.MessagingException me) {me.printStackTrace();}
     }
 
     /**
@@ -106,8 +106,8 @@ public class SimpleMailSender {
 
             Transport.send(message);
         }
-        catch(javax.mail.internet.AddressException ae){ae.printStackTrace();}
-        catch(javax.mail.MessagingException me) {me.printStackTrace();}
+        catch(jakarta.mail.internet.AddressException ae){ae.printStackTrace();}
+        catch(jakarta.mail.MessagingException me) {me.printStackTrace();}
     }
     
 }
\ No newline at end of file
diff --git a/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java b/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java
index 1672d607..7ecd7ec8 100755
--- a/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java
+++ b/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java
@@ -23,224 +23,74 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Types;
-import org.hibernate.HibernateException;
-import org.hibernate.engine.spi.SessionImplementor;
 import org.hibernate.engine.spi.SharedSessionContractImplementor;
 import org.hibernate.usertype.UserType;
 
 /**
- * @copyright 2015-2019 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2015-2025 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 
-public class StringJsonUserType implements UserType {
+public class StringJsonUserType implements UserType<String> {
 
-    /**
-     * Return the SQL type codes for the columns mapped by this type. The
-     * codes are defined on <tt>java.sql.Types</tt>.
-     *
-     * @return int[] the typecodes
-     * @see java.sql.Types
-     */
     @Override
-    public int[] sqlTypes() {
-        return new int[] { Types.JAVA_OBJECT};
+    public int getSqlType() {
+        return Types.OTHER;
     }
 
-    /**
-     * The class returned by <tt>nullSafeGet()</tt>.
-     *
-     * @return Class
-     */
     @Override
-    public Class returnedClass() {
+    public Class<String> returnedClass() {
         return String.class;
     }
 
-    /**
-     * Compare two instances of the class mapped by this type for persistence "equality".
-     * Equality of the persistent state.
-     *
-     * @param x
-     * @param y
-     * @return boolean
-     */
     @Override
-    public boolean equals(Object x, Object y) throws HibernateException {
-
-        if( x== null){
-
-            return y== null;
-        }
-
-        return x.equals( y);
+    public boolean equals(String x, String y) {
+        return x.equals(y);
     }
 
-    /**
-     * Get a hashcode for the instance, consistent with persistence "equality"
-     */
     @Override
-    public int hashCode(Object x) throws HibernateException {
-
+    public int hashCode(String x) {
         return x.hashCode();
     }
 
-    /**
-     * Retrieve an instance of the mapped class from a JDBC resultset. Implementors
-     * should handle possibility of null values.
-     *
-     * @param rs      a JDBC result set
-     * @param names   the column names
-     * @param session
-     * @param owner   the containing entity  @return Object
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    //@Override
-    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
-        if(rs.getString(names[0]) == null){
-            return null;
-        }
-        return rs.getString(names[0]);
+    @Override
+    public String nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException {
+        return rs.getString(position);
     }
 
-    /**
-     * Write an instance of the mapped class to a prepared statement. Implementors
-     * should handle possibility of null values. A multi-column type should be written
-     * to parameters starting from <tt>index</tt>.
-     *
-     * @param st      a JDBC prepared statement
-     * @param value   the object to write
-     * @param index   statement parameter index
-     * @param session
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    //@Override
-    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
-        if (value == null) {
+    @Override
+    public void nullSafeSet(PreparedStatement st, String value, int index, SharedSessionContractImplementor session) throws SQLException {
+        if (value != null) {
+            st.setObject(index, value, Types.OTHER);
+        } else {
             st.setNull(index, Types.OTHER);
-            return;
         }
-
-        st.setObject(index, value, Types.OTHER);
     }
 
-    /**
-     * Return a deep copy of the persistent state, stopping at entities and at
-     * collections. It is not necessary to copy immutable objects, or null
-     * values, in which case it is safe to simply return the argument.
-     *
-     * @param value the object to be cloned, which may be null
-     * @return Object a copy
-     */
     @Override
-    public Object deepCopy(Object value) throws HibernateException {
-
+    public String deepCopy(String value) {
         return value;
     }
 
-    /**
-     * Are objects of this type mutable?
-     *
-     * @return boolean
-     */
     @Override
     public boolean isMutable() {
-        return true;
+        return false;
     }
 
-    /**
-     * Transform the object into its cacheable representation. At the very least this
-     * method should perform a deep copy if the type is mutable. That may not be enough
-     * for some implementations, however; for example, associations must be cached as
-     * identifier values. (optional operation)
-     *
-     * @param value the object to be cached
-     * @return a cachable representation of the object
-     * @throws org.hibernate.HibernateException
-     *
-     */
     @Override
-    public Serializable disassemble(Object value) throws HibernateException {
-        return (String)this.deepCopy( value);
+    public Serializable disassemble(String value) {
+        return value;
     }
 
-    /**
-     * Reconstruct an object from the cacheable representation. At the very least this
-     * method should perform a deep copy if the type is mutable. (optional operation)
-     *
-     * @param cached the object to be cached
-     * @param owner  the owner of the cached object
-     * @return a reconstructed object from the cachable representation
-     * @throws org.hibernate.HibernateException
-     *
-     */
     @Override
-    public Object assemble(Serializable cached, Object owner) throws HibernateException {
-        return this.deepCopy( cached);
+    public String assemble(Serializable cached, Object owner) {
+        return (String) cached;
     }
 
-    /**
-     * During merge, replace the existing (target) value in the entity we are merging to
-     * with a new (original) value from the detached entity we are merging. For immutable
-     * objects, or null values, it is safe to simply return the first parameter. For
-     * mutable objects, it is safe to return a copy of the first parameter. For objects
-     * with component values, it might make sense to recursively replace component values.
-     *
-     * @param original the value from the detached entity being merged
-     * @param target   the value in the managed entity
-     * @return the value to be merged
-     */
     @Override
-    public Object replace(Object original, Object target, Object owner) throws HibernateException {
+    public String replace(String original, String target, Object owner) {
         return original;
     }
 
-    
-    /**
-     * Retrieve an instance of the mapped class from a JDBC resultset. Implementors
-     * should handle possibility of null values.
-     *
-     * @param rs      a JDBC result set
-     * @param strings   the column names
-     * @param ssci
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    @Override
-    public Object nullSafeGet(ResultSet rs, String[] strings, SharedSessionContractImplementor ssci, Object o) throws HibernateException, SQLException {
-        if(rs.getString(strings[0]) == null){
-            return null;
-        }
-        return rs.getString(strings[0]);
-    }
-
-    /**
-     * Write an instance of the mapped class to a prepared statement. Implementors
-     * should handle possibility of null values. A multi-column type should be written
-     * to parameters starting from <tt>index</tt>.
-     *
-     * @param ps      a JDBC prepared statement
-     * @param o   the object to write
-     * @param i   statement parameter index
-     * @param ssci
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    @Override
-    public void nullSafeSet(PreparedStatement ps, Object o, int i, SharedSessionContractImplementor ssci) throws HibernateException, SQLException {
-        if (o == null) {
-            ps.setNull(i, Types.OTHER);
-            return;
-        }
-
-        ps.setObject(i, o, Types.OTHER);
-    }
-
 
 }
diff --git a/src/main/java/no/nibio/vips/logic/web/TemplateConfigFilter.java b/src/main/java/no/nibio/vips/logic/web/TemplateConfigFilter.java
index 8de57a78..ceb6c257 100755
--- a/src/main/java/no/nibio/vips/logic/web/TemplateConfigFilter.java
+++ b/src/main/java/no/nibio/vips/logic/web/TemplateConfigFilter.java
@@ -20,13 +20,13 @@ package no.nibio.vips.logic.web;
 
 import java.io.IOException;
 import java.util.Date;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
 import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.vips.util.ServletUtil;
 
diff --git a/src/main/java/no/nibio/vips/logic/web/js/JSEnvironment.java b/src/main/java/no/nibio/vips/logic/web/js/JSEnvironment.java
index 9c0683c6..17211ad6 100755
--- a/src/main/java/no/nibio/vips/logic/web/js/JSEnvironment.java
+++ b/src/main/java/no/nibio/vips/logic/web/js/JSEnvironment.java
@@ -20,10 +20,10 @@ package no.nibio.vips.logic.web.js;
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
 
 /**
diff --git a/src/main/java/no/nibio/vips/observationdata/ObservationDataBean.java b/src/main/java/no/nibio/vips/observationdata/ObservationDataBean.java
index 357d5924..f05aee44 100644
--- a/src/main/java/no/nibio/vips/observationdata/ObservationDataBean.java
+++ b/src/main/java/no/nibio/vips/observationdata/ObservationDataBean.java
@@ -7,11 +7,11 @@ import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.Map.Entry;
 
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.ejb.Stateless;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.http.HttpServletRequest;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonMappingException;
diff --git a/src/main/java/no/nibio/vips/observationdata/ObservationDataSchema.java b/src/main/java/no/nibio/vips/observationdata/ObservationDataSchema.java
index 72434325..6b5c4b9b 100755
--- a/src/main/java/no/nibio/vips/observationdata/ObservationDataSchema.java
+++ b/src/main/java/no/nibio/vips/observationdata/ObservationDataSchema.java
@@ -19,17 +19,15 @@
 package no.nibio.vips.observationdata;
 
 import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 import javax.xml.bind.annotation.XmlRootElement;
-import no.nibio.vips.logic.util.StringJsonUserType;
-import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
+import org.hibernate.annotations.JdbcTypeCode;
+import org.hibernate.type.SqlTypes;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -38,7 +36,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "observation_data_schema")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "ObservationDataSchema.findAll", query = "SELECT o FROM ObservationDataSchema o"),
     @NamedQuery(name = "ObservationDataSchema.findByPK", query = "SELECT o FROM ObservationDataSchema o WHERE o.observationDataSchemaPK.organizationId = :organizationId AND o.observationDataSchemaPK.organismId = :organismId"),
@@ -49,10 +46,10 @@ public class ObservationDataSchema implements Serializable {
     private static final long serialVersionUID = 1L;
     @EmbeddedId
     protected ObservationDataSchemaPK observationDataSchemaPK;
-    @Type(type = "StringJsonObject")
+    @JdbcTypeCode(SqlTypes.JSON)
     @Column(name = "data_schema")
     private String dataSchema;
-    @Type(type = "StringJsonObject")
+    @JdbcTypeCode(SqlTypes.JSON)
     @Column(name = "data_model")
     private String dataModel;
 
diff --git a/src/main/java/no/nibio/vips/observationdata/ObservationDataSchemaPK.java b/src/main/java/no/nibio/vips/observationdata/ObservationDataSchemaPK.java
index 9fdaaa02..774e1746 100755
--- a/src/main/java/no/nibio/vips/observationdata/ObservationDataSchemaPK.java
+++ b/src/main/java/no/nibio/vips/observationdata/ObservationDataSchemaPK.java
@@ -19,10 +19,10 @@
 package no.nibio.vips.observationdata;
 
 import java.io.Serializable;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
diff --git a/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java b/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java
index b2143e09..d2c1ce08 100755
--- a/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java
+++ b/src/main/java/no/nibio/vips/observationdata/ObservationDataService.java
@@ -21,17 +21,17 @@ package no.nibio.vips.observationdata;
 import com.ibm.icu.util.ULocale;
 import com.webcohesion.enunciate.metadata.Facet;
 import java.io.IOException;
-import javax.ejb.EJB;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
+import jakarta.ejb.EJB;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.NoResultException;
+import jakarta.persistence.PersistenceContext;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.Response;
 import no.nibio.vips.logic.controller.session.ObservationBean;
 import no.nibio.vips.logic.controller.session.UserBean;
 
diff --git a/src/main/java/no/nibio/web/forms/FormUtil.java b/src/main/java/no/nibio/web/forms/FormUtil.java
index 26cac47f..1817d7d4 100755
--- a/src/main/java/no/nibio/web/forms/FormUtil.java
+++ b/src/main/java/no/nibio/web/forms/FormUtil.java
@@ -18,7 +18,9 @@
 
 package no.nibio.web.forms;
 
+import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -30,7 +32,7 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import no.nibio.vips.logic.util.Globals;
-import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload2.core.FileItem;
 
 /**
  * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
@@ -46,9 +48,10 @@ public class FormUtil {
      * @return
      * @throws UnsupportedEncodingException 
      */
-    public static Map<String, String[]> getParameterMap(List<FileItem> items, String encoding) throws UnsupportedEncodingException
+    public static Map<String, String[]> getParameterMap(List<FileItem> items, String encoding) throws UnsupportedEncodingException, IOException
     {
         Map<String, String[]> retVal = new HashMap<>();
+        Charset charset = Charset.forName(encoding);
         for(FileItem item:items)
         {
             if(item.isFormField())
@@ -57,13 +60,13 @@ public class FormUtil {
                 if(retVal.containsKey(item.getFieldName()))
                 {
                     List<String> oldValue = new ArrayList(Arrays.asList(retVal.get(item.getFieldName())));
-                    oldValue.add(item.getString(encoding));
+                    oldValue.add(item.getString(charset));
                     String[] newValue = new String[oldValue.size()];
                     retVal.put(item.getFieldName(),oldValue.toArray(newValue));
                 }
                 else
                 {
-                    String[] value = {item.getString(encoding)};
+                    String[] value = {item.getString(charset)};
                     retVal.put(item.getFieldName(), value);
                 }
             }
diff --git a/src/main/java/no/nibio/web/forms/FormValidator.java b/src/main/java/no/nibio/web/forms/FormValidator.java
index d6d0ef0f..2d3659cb 100755
--- a/src/main/java/no/nibio/web/forms/FormValidator.java
+++ b/src/main/java/no/nibio/web/forms/FormValidator.java
@@ -36,9 +36,9 @@ 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 jakarta.ejb.EJB;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpServletRequest;
 import no.nibio.vips.logic.authenticate.PasswordValidationException;
 import no.nibio.vips.logic.controller.session.SessionControllerGetter;
 import no.nibio.vips.logic.controller.session.UserBean;
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
index 3c40ebdc..71fa3863 100755
--- a/src/main/resources/META-INF/persistence.xml
+++ b/src/main/resources/META-INF/persistence.xml
@@ -19,12 +19,12 @@
 -->
 <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
   <persistence-unit name="VIPSLogic-PU" transaction-type="JTA">
-    <provider>org.hibernate.ejb.HibernatePersistence</provider>
     <jta-data-source>java:/jboss/datasources/vipslogic</jta-data-source>
-    <class>no.nibio.vips.logic.messaging.MessageNotificationSubscription</class>
-    <exclude-unlisted-classes>false</exclude-unlisted-classes>
     <properties>
-      <property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect"/>
-    </properties>
+            <!-- Hibernate properties -->
+            <property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisPG10Dialect"/>
+            <property name="hibernate.show_sql" value="true"/>
+            <property name="hibernate.format_sql" value="true"/>
+        </properties>
   </persistence-unit>
 </persistence>
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 2f2ca6f0..d532ad2e 100755
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -242,7 +242,7 @@
             org.jboss.resteasy.plugins.server.servlet.FilterDispatcher
         </filter-class>
         <init-param>
-            <param-name>javax.ws.rs.Application</param-name>
+            <param-name>jakarta.ws.rs.Application</param-name>
             <param-value>no.nibio.vips.logic.VIPSLogicApplication</param-value>
         </init-param>
     </filter>
@@ -253,7 +253,7 @@
     <!-- FreeMarker configuration -->
     <servlet>
         <servlet-name>freemarker</servlet-name>
-        <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
+        <servlet-class>freemarker.ext.jakarta.servlet.FreemarkerServlet</servlet-class>
         <!-- FreemarkerServlet settings: -->
         <init-param>
             <param-name>TemplatePath</param-name>
diff --git a/src/main/webapp/templates/403.ftl b/src/main/webapp/templates/403.ftl
index c47107d8..34559c41 100755
--- a/src/main/webapp/templates/403.ftl
+++ b/src/main/webapp/templates/403.ftl
@@ -10,7 +10,7 @@
  <h1>ERROR 403 - Forbidden</h1>
   <p>${message}</p>
   
-  <#assign nextPage= Request["javax.servlet.forward.servlet_path"] + "?" + Request["javax.servlet.forward.query_string"]!"">
+  <#assign nextPage= Request["jakarta.servlet.forward.servlet_path"] + "?" + Request["jakarta.servlet.forward.query_string"]!"">
   <p><a href="/login?nextPage=${nextPage?url}">To login page</a></p>
 </#macro>
 <@page_html/>
diff --git a/src/main/webapp/templates/error_unknown.ftl b/src/main/webapp/templates/error_unknown.ftl
index 9a731004..5623b9b8 100755
--- a/src/main/webapp/templates/error_unknown.ftl
+++ b/src/main/webapp/templates/error_unknown.ftl
@@ -19,12 +19,12 @@
 <#macro navbar_collapse>
 </#macro>
 <#macro page_head>
-        <title>ERROR ${Request["javax.servlet.error.status_code"]}</title>
+        <title>ERROR ${Request["jakarta.servlet.error.status_code"]}</title>
 </#macro>
 <#macro page_contentwrap_start></#macro>
 <#macro page_contentwrap_end></#macro>
 <#macro page_contents>
- <h1>ERROR ${Request["javax.servlet.error.status_code"]}</h1>
+ <h1>ERROR ${Request["jakarta.servlet.error.status_code"]}</h1>
   <p>${message}</p>
   <p><a href="/">To front page</a></p>
 </#macro>
diff --git a/src/test/java/no/nibio/vips/logic/entity/rest/PointMappingRequestTest.java b/src/test/java/no/nibio/vips/logic/entity/rest/PointMappingRequestTest.java
index ddb73f2d..d0ea65c4 100644
--- a/src/test/java/no/nibio/vips/logic/entity/rest/PointMappingRequestTest.java
+++ b/src/test/java/no/nibio/vips/logic/entity/rest/PointMappingRequestTest.java
@@ -19,11 +19,11 @@ package no.nibio.vips.logic.entity.rest;
 
 import java.util.ArrayList;
 import java.util.List;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.MediaType;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
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 b69b046f..1bd00d82 100755
--- a/src/test/java/no/nibio/vips/logic/messaging/UniversalMessagingTest.java
+++ b/src/test/java/no/nibio/vips/logic/messaging/UniversalMessagingTest.java
@@ -22,7 +22,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 import no.nibio.vips.logic.util.RESTAuthenticator;
 import org.jboss.resteasy.client.jaxrs.ResteasyClient;
 import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
-- 
GitLab