diff --git a/.gitignore b/.gitignore
index 0efe793b666a005b665be120a32db0150a920249..00495cbe6924de1f4139019446d17f77a2d63a88 100755
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@ jboss/
 .vscode/settings.json
 .settings/org.eclipse.core.resources.prefs
 pom_with_models.xml
+my_models.xml
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0df62eeb8fda04eff3ad10b4546f2abaf42a9751..87f4ccdc688b49bd6e8724c431521fad1259a546 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -15,7 +15,7 @@ variables:
   MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dmaven.artifact.threads=10"
   MAIN_BRANCH: "main"
   RELEASE_BRANCH: "release"
-  CLI_PATH: "/disks/data01/wildfly/wildfly-26.1.3.Final/bin"
+  CLI_PATH: "/disks/data01/wildfly/wildfly-34.0.1.Final/bin"
   TMP_PATH: "/home/deployer/gitlab_tmp"
   DEPLOYMENT_PATH: "/home/wildfly/deployments"
   ARCHIVE_PATH: "/home/wildfly/archive"
@@ -30,24 +30,71 @@ before_script:
   - git config --global user.email "${GITLAB_USER_EMAIL}"
   - echo "Get common settings"
   - git clone $COMMON_CONFIG_REMOTE $COMMON_CONFIG_LOCAL
-  - cd $COMMON_CONFIG_LOCAL
-  - cp $SETTINGS_XML ../$SETTINGS_XML
-  - cd ..
+  - cp $COMMON_CONFIG_LOCAL/$SETTINGS_XML .
   - rm -rf $COMMON_CONFIG_LOCAL
-  - apt-get update -y && apt-get install -y python && apt-get install -y rsync openssh-client
-  - "python build_pom_with_models.py"
+  - apt-get update -y && apt-get install -y python3 && apt-get install -y rsync openssh-client
+  - "python3 build_pom_with_models.py"
 
-build:
+build-for-staging:
   stage: build
   script:
     - "./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS package -DskipTests"
   tags:
-    - vips-java
+    - java
+  artifacts:
+    paths:
+      - target/*.war
+  rules:
+    - if: '$CI_COMMIT_REF_NAME == $MAIN_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"'
+
+build-for-production:
+  stage: build
+  script:
+    # Use access token given by CI/CD variable ACCESS_TOKEN to authenticate
+    # This is necessary in order to push changes to git
+    - &authenticate
+      - export NEW_REPO_URL=https://root:$ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git
+      - git remote set-url --push origin $NEW_REPO_URL
+      - git fetch origin --prune --prune-tags
+
+    # Checkout release branch
+    - &checkout_release
+      - git stash -a
+      - git checkout $RELEASE_BRANCH
+      - git reset --hard origin/$RELEASE_BRANCH
+      - git stash pop
+
+    # Set release version. Commit and push if tag for release version does not already exist.
+    - "./mvnw $MAVEN_CLI_OPTS $MAVEN_OPTS validate -DremoveSnapshot"
+    - "python3 build_pom_with_models.py"
+    - export RELEASE_VERSION=$(./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS --batch-mode --no-transfer-progress --non-recursive help:evaluate -Dexpression=project.version | grep -v "\[.*")
+    - echo "New version in release '$RELEASE_VERSION'"
+    # If tag for new release version already exist, exit with error
+    - export RELEASE_TAG="v${RELEASE_VERSION}"
+    - echo "Release tag '$RELEASE_TAG'"
+    - export EXISTING_TAGS=$(git ls-remote --tags origin | cut -f 2 | grep "refs/tags/$RELEASE_TAG$")
+    - echo "Existing tags '$EXISTING_TAGS'"
+    - if [ -n "$EXISTING_TAGS" ]; then
+      echo "Tag $RELEASE_TAG already exists"; exit 1;
+      fi
+    # If release tag does not already exist, commit and push pom with new version
+    - git add pom.xml
+    - |
+      if git diff --cached --quiet -- pom.xml; then
+          echo "No changes to commit for pom.xml, skipping commit and push"
+      else
+          git commit -m "[ci skip] Set release version ${RELEASE_VERSION}"
+          git push origin $RELEASE_BRANCH
+      fi
+    # Build new war file
+    - echo "Build war file with version '$RELEASE_VERSION'"
+    - "./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS package -DskipTests"
+  tags:
+    - java
   artifacts:
     paths:
       - target/*.war
   rules:
-    - if: $CI_COMMIT_REF_NAME == $MAIN_BRANCH
     - if: $CI_COMMIT_REF_NAME == $RELEASE_BRANCH
 
 test:
@@ -55,16 +102,16 @@ test:
   script:
     - "./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS test"
   tags:
-    - vips-java
+    - java
   rules:
-    - if: $CI_COMMIT_REF_NAME == $MAIN_BRANCH
+    - if: '$CI_COMMIT_REF_NAME == $MAIN_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"'
     - if: $CI_COMMIT_REF_NAME == $RELEASE_BRANCH
 
 deploy-to-staging:
   stage: deploy
   script:
     # Authentication setup
-    - mkdir -p ~/.ssh
+    - mkdir -p ~/.ssh 
     - echo "$SSH_PRIVATE_KEY" >> ~/.ssh/id_dsa
     - chmod 600 ~/.ssh/id_dsa
     - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
@@ -83,7 +130,7 @@ deploy-to-staging:
     - ssh $SERVER_USER@$SERVER_IP "$CLI_PATH/jboss-cli.sh --user=$WILDFLY_ADMIN_USERNAME --password=$WILDFLY_ADMIN_PASSWORD --connect --command='undeploy $CURRENTLY_DEPLOYED'"
     # Deploy war file using JBoss CLI and credentials given in CI/CD variables
     - echo "Deploy $WAR_FILE using JBoss CLI"
-    - ssh $SERVER_USER@$SERVER_IP "/disks/data01/wildfly/wildfly-25.0.1.Final/bin/jboss-cli.sh --user=$WILDFLY_ADMIN_USERNAME --password=$WILDFLY_ADMIN_PASSWORD --connect --file=$TMP_PATH/deploy.cli" > deployment.log 2>&1
+    - ssh $SERVER_USER@$SERVER_IP "$CLI_PATH/jboss-cli.sh --user=$WILDFLY_ADMIN_USERNAME --password=$WILDFLY_ADMIN_PASSWORD --connect --file=$TMP_PATH/deploy.cli" > deployment.log 2>&1
     # Restart should not be necessary
     - echo "Restart WildFly"
     - ssh $SERVER_USER@$SERVER_IP "sudo systemctl restart wildfly"
@@ -93,9 +140,9 @@ deploy-to-staging:
   after_script:
     - echo "Deployment complete"
   tags:
-    - vips-java
+    - java
   rules:
-    - if: $CI_COMMIT_REF_NAME == $MAIN_BRANCH
+    - if: '$CI_COMMIT_REF_NAME == $MAIN_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"'
   environment:
     name: staging
     url: https://vipscore02test.nibio.no
@@ -109,14 +156,14 @@ upload-snapshot:
       fi
     - "./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS deploy -DskipTests"
   tags:
-    - vips-java
+    - java
   rules:
-    - if: $CI_COMMIT_REF_NAME == $MAIN_BRANCH
+    - if: '$CI_COMMIT_REF_NAME == $MAIN_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"'
 
 deploy-to-production:
   stage: deploy
   script:
-    # Authentication setup
+    # Authentication setup, for running commands on server
     - mkdir -p ~/.ssh
     - echo "$SSH_PRIVATE_KEY" >> ~/.ssh/id_dsa
     - chmod 600 ~/.ssh/id_dsa
@@ -133,10 +180,10 @@ deploy-to-production:
     # Find name of currently deployed application. Undeploy.
     - CURRENTLY_DEPLOYED=$(ssh $SERVER_USER@$SERVER_IP "$CLI_PATH/jboss-cli.sh --user=$WILDFLY_ADMIN_USERNAME --password=$WILDFLY_ADMIN_PASSWORD --connect --commands=ls\ deployment | tr ' ' '\n'  | grep VIPSCore-.*war")
     - echo $CURRENTLY_DEPLOYED
-    - ssh $SERVER_USER@$SERVER_IP "$CLI_PATH/jboss-cli.sh --user=$WILDFLY_ADMIN_USERNAME --password=$WILDFLY_ADMIN_PASSWORD --connect --command='undeploy $CURRENTLY_DEPLOYED'"
+    - if [ -n "$CURRENTLY_DEPLOYED" ]; then ssh $SERVER_USER@$SERVER_IP "$CLI_PATH/jboss-cli.sh --user=$WILDFLY_ADMIN_USERNAME --password=$WILDFLY_ADMIN_PASSWORD --connect --command='undeploy $CURRENTLY_DEPLOYED'"; fi
     # Deploy war file using JBoss CLI and credentials given in CI/CD variables
     - echo "Deploy $WAR_FILE using JBoss CLI"
-    - ssh $SERVER_USER@$SERVER_IP "/disks/data01/wildfly/wildfly-25.0.1.Final/bin/jboss-cli.sh --user=$WILDFLY_ADMIN_USERNAME --password=$WILDFLY_ADMIN_PASSWORD --connect --file=$TMP_PATH/deploy.cli" > deployment.log 2>&1
+    - ssh $SERVER_USER@$SERVER_IP "$CLI_PATH/jboss-cli.sh --user=$WILDFLY_ADMIN_USERNAME --password=$WILDFLY_ADMIN_PASSWORD --connect --file=$TMP_PATH/deploy.cli" > deployment.log 2>&1
     # Restart should not be necessary
     - echo "Restart WildFly"
     - ssh $SERVER_USER@$SERVER_IP "sudo systemctl restart wildfly"
@@ -146,7 +193,7 @@ deploy-to-production:
   after_script:
     - echo "Deployment complete"
   tags:
-    - vips-java
+    - java
   rules:
     - if: $CI_COMMIT_REF_NAME == $RELEASE_BRANCH
   environment:
@@ -157,57 +204,44 @@ upload-and-tag-release:
   stage: upload
   script:
     # Use access token given by CI/CD variable ACCESS_TOKEN to authenticate
-    - &authenticate
-      - export NEW_REPO_URL=https://root:$ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git
-      - git remote set-url --push origin $NEW_REPO_URL
-      - git fetch origin --prune --prune-tags
+    # This is necessary in order to push changes to git
+    - export NEW_REPO_URL=https://root:$ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git
+    - git remote set-url --push origin $NEW_REPO_URL
+    - git fetch origin --prune --prune-tags
 
     # Checkout release branch
-    - &checkout_release
-      - git stash -a
-      - git checkout $RELEASE_BRANCH
-      - git reset --hard origin/$RELEASE_BRANCH
-      - git stash pop
+    - git stash -a
+    - git checkout $RELEASE_BRANCH
+    - git reset --hard origin/$RELEASE_BRANCH
+    - git stash pop
 
     # Set release version and deploy. Commit, tag and push.
-    - &release_and_tag # Change version in pom.xml - build new pom_with_models.xml
-      - "./mvnw $MAVEN_CLI_OPTS $MAVEN_OPTS validate -DremoveSnapshot"
-      - "python build_pom_with_models.py"
-      - export RELEASE_VERSION=$(./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS --batch-mode --no-transfer-progress --non-recursive help:evaluate -Dexpression=project.version | grep -v "\[.*")
-      - echo "New version in release '$RELEASE_VERSION'"
-      - export RELEASE_TAG="v${RELEASE_VERSION}"
-      - echo "Release tag '$RELEASE_TAG'"
-      - export EXISTING_TAGS=$(git ls-remote --tags origin | cut -f 2 | grep "refs/tags/$RELEASE_TAG$")
-      - echo "Existing tags '$EXISTING_TAGS'"
-      - if [ -n "$EXISTING_TAGS" ]; then
-        echo "Tag $RELEASE_TAG already exists"; exit 1;
-        fi
-      - "./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS deploy -DskipTests"
-      - git add pom.xml
-      - git commit -m "[ci skip] Set release version ${RELEASE_VERSION}"
-      - git tag -a $RELEASE_TAG -m "Tag release ${RELEASE_TAG}"
-      - git push origin $RELEASE_TAG
-      - git push origin $RELEASE_BRANCH
+    - "python3 build_pom_with_models.py"
+    - export RELEASE_VERSION=$(./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS --batch-mode --no-transfer-progress --non-recursive help:evaluate -Dexpression=project.version | grep -v "\[.*")
+    - export RELEASE_TAG="v${RELEASE_VERSION}"
+    - echo "Version to deploy '$RELEASE_VERSION', will be tagged '$RELEASE_TAG'"
+    - "./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS deploy -DskipTests"
+    # NB! Wanted to use deploy:deploy-file with already built war file above, but this requires url to be specifically set
+    - git tag -a $RELEASE_TAG -m "Tag release ${RELEASE_TAG}"
+    - git push origin $RELEASE_TAG
 
     # Checkout main branch
-    - &checkout_main
-      - git stash -a
-      - git checkout $MAIN_BRANCH
-      - git reset --hard origin/$MAIN_BRANCH
-      - git stash pop
+    - git stash -a
+    - git checkout $MAIN_BRANCH
+    - git reset --hard origin/$MAIN_BRANCH
+    - git stash pop
 
     # Merge release branch, bump patch version, push commits.
-    - &merge_and_bump
-      - git merge -m "[ci skip] Merge branch '${RELEASE_BRANCH}' into ${MAIN_BRANCH}" --no-ff $RELEASE_BRANCH
-      # Change version in pom.xml - build new pom_with_models.xml
-      - "./mvnw $MAVEN_CLI_OPTS $MAVEN_OPTS validate -DbumpPatch"
-      - "python build_pom_with_models.py"
-      - export SNAPSHOT_VERSION=$(./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS --batch-mode --no-transfer-progress --non-recursive help:evaluate -Dexpression=project.version | grep -v "\[.*")
-      - echo "New version in main '$SNAPSHOT_VERSION'"
-      - git add pom.xml
-      - git commit -m "[ci skip] Set snapshot version ${SNAPSHOT_VERSION}"
-      - git push origin $MAIN_BRANCH
+    - git merge -m "[ci skip] Merge branch '${RELEASE_BRANCH}' into ${MAIN_BRANCH}" --no-ff $RELEASE_BRANCH
+    # Change version in pom.xml - build new pom_with_models.xml
+    - "./mvnw $MAVEN_CLI_OPTS $MAVEN_OPTS validate -DbumpPatch"
+    - "python3 build_pom_with_models.py"
+    - export SNAPSHOT_VERSION=$(./mvnw $MAVEN_POM_WITH_MODELS $MAVEN_CLI_OPTS $MAVEN_OPTS --batch-mode --no-transfer-progress --non-recursive help:evaluate -Dexpression=project.version | grep -v "\[.*")
+    - echo "New version in main '$SNAPSHOT_VERSION'"
+    - git add pom.xml
+    - git commit -m "[ci skip] Set snapshot version ${SNAPSHOT_VERSION}"
+    - git push origin $MAIN_BRANCH
   tags:
-    - vips-java
+    - java
   rules:
     - if: $CI_COMMIT_REF_NAME == $RELEASE_BRANCH
diff --git a/README.md b/README.md
index c9b7feb3679c2e922489b235c3d97d5155334212..65c1c0b5cae4bd4cce64bc38976df6e7a9739e4c 100644
--- a/README.md
+++ b/README.md
@@ -34,11 +34,11 @@ $ mvnw.cmd clean install
 
 **PLEASE NOTE that this builds the package without any models. See "Adding models" below for more information**
 
-Download and install [WildFly](https://www.wildfly.org/) >= 25.0.1
+Download and install [WildFly](https://www.wildfly.org/) == 34.0.1
 
 Deploy the build from this project in Wildfly.
 
-Wildfly should run on Java >= 11
+Wildfly should run on Java >= 17
 
 ### Adding models
 
@@ -59,6 +59,17 @@ To build with your preferred set of models, create a new file called e.g. `my_mo
 $ build_with_models.py my_models.xml
 ```
 
+To create Maven `<dependencies/>` XML with the latest versions of all models on NIBIO's GitLab, use the `build_models_xml.py` script, like this:
+
+```bash
+# Write latest production version dependency elements XML to my_models.xml
+$ ./build_models_xml.py > my_models.xml
+
+# Write latest SNAPSHOT version dependency elements XML to my_models.xml
+$ ./build_models_xml.py -s > my_models.xml
+
+```
+
 ## Implement a model
 
 See [implement_model.md](./docs/implement_model.md)
diff --git a/build_models_xml.py b/build_models_xml.py
index b9459940c2421a7b9be906df103a04c0fb5d703c..1389ca60b2a5e379e931da629c5ee589fafcb769 100755
--- a/build_models_xml.py
+++ b/build_models_xml.py
@@ -59,29 +59,53 @@ if response.status_code == 200:
 
 models = {}
 
-model_prefixes = ["no/nibio/vips/model","fi/luke/vips/model"]
+model_prefixes = ["no/nibio/vips/model", "fi/luke/vips/model"]
+
+# Returns -1 if number_a < number_b, 1 if number_a > number_b, 0 if equal
+def compare_version_numbers(number_a, number_b):
+    # Make sure we remove "-SNAPSHOT"
+    number_a = number_a.split("-")[0]
+    number_b = number_b.split("-")[0]
+    number_a_parts = list(map(int,number_a.split(".")))
+    number_b_parts = list(map(int,number_b.split(".")))
+    for idx in range(len(number_a_parts)):
+        if idx > len(number_b_parts) -1:
+            # Versions are equal so far, but number_b is out of parts. Thus: number_a must be a greater version
+            return 1
+        if number_a_parts[idx] < number_b_parts[idx]:
+            return -1
+        elif number_a_parts[idx] > number_b_parts[idx]:
+            return 1
+    # No differences found in the parts that number_a and number_b have in common.
+    # If number_a and number_b have same number of parts, they must be equal
+    # If number_b still has parts left, it must be greater
+    return -1 if len(number_b_parts) > len(number_a_parts) else 0
+
 
 # Filter models and store only the most recent version (highest alphanumeric number)
 for package in all_packages:
     for model_prefix in model_prefixes:
-        if package["name"].find(model_prefix) >=0 and ((snapshot and package["version"].find("SNAPSHOT")>=0) or (not snapshot and package["version"].find("SNAPSHOT")<0)):
+        if package["name"].find(model_prefix) >= 0 and ((snapshot and package["version"].find("SNAPSHOT") >= 0) or (not snapshot and package["version"].find("SNAPSHOT") < 0)):
             model_name = package["name"][len(model_prefix) + 1:]
-            if models.get(model_name, None) == None:
+            if models.get(model_name, None) is None:
                 models[model_name] = {}
-                models[model_name]["groupId"] = model_prefix.replace("/",".")
+                models[model_name]["groupId"] = model_prefix.replace("/", ".")
                 models[model_name]["version"] = package["version"]
             else:
-                models[model_name]["version"] = package["version"] if package["version"] > models[model_name]["version"] else models[model_name]["version"]
+                # Compare models so that 1.1.10 > 1.1.9
+                models[model_name]["version"] = package["version"] if compare_version_numbers(package["version"], models[model_name]["version"]) > 0 else models[model_name]["version"]
+                #models[model_name]["version"] = package["version"] if package["version"] > models[model_name]["version"] else models[model_name]["version"]
+                #print("%s %s" % (model_name, package["version"]))
 
 # Build partial Maven XML
 dependencies = ET.Element("dependencies")
 for model_name, value in models.items():
     dependency = ET.SubElement(dependencies, "dependency")
-    ET.SubElement(dependency,"groupId").text = value["groupId"]
+    ET.SubElement(dependency, "groupId").text = value["groupId"]
     ET.SubElement(dependency, "artifactId").text = model_name
     ET.SubElement(dependency, "version").text = value["version"]
 
 # Dumps the indented XML to stdout
 tree = ET.ElementTree(dependencies)
-ET.indent(tree, space="\t",level=0)
+ET.indent(tree, space="\t", level=0)
 ET.dump(tree)
diff --git a/build_pom_with_models.py b/build_pom_with_models.py
index ae699271d7e5a3b38bca79d0c1e3cb5933d7013d..22f0e12d7d435cab31b76290e5709ad77abab446 100755
--- a/build_pom_with_models.py
+++ b/build_pom_with_models.py
@@ -1,8 +1,7 @@
 #!/usr/bin/python3
 
 '''
-Merges pom.xml and models.xml (default) into pom_with_models.xml and
-runs mvn clean install -f pom_with_models.xml
+Merges pom.xml and models.xml (default) into pom_with_models.xml
 
 Copyright (C) 2023 NIBIO
 
@@ -49,6 +48,6 @@ for dep in model_dep_elements:
     pom_deps_element.appendChild(dep)
 
 # Write the modified pom dom to file
-pom_with_models_file = open(merged_pom_filename,"w")
+pom_with_models_file = open(merged_pom_filename, "w")
 pom_dom.writexml(pom_with_models_file)
 pom_with_models_file.close()
diff --git a/build_with_models.py b/build_with_models.py
index c6b0a8560680582c6a9d25149ae469a084567ada..29c90b1f8914d9f3ff85fd47d33a8a1d7f023086 100755
--- a/build_with_models.py
+++ b/build_with_models.py
@@ -49,7 +49,7 @@ for dep in model_dep_elements:
     pom_deps_element.appendChild(dep)
 
 # Write the modified pom dom to file
-pom_with_models_file = open(merged_pom_filename,"w")
+pom_with_models_file = open(merged_pom_filename, "w")
 pom_dom.writexml(pom_with_models_file)
 pom_with_models_file.close()
 
diff --git a/models.xml b/models.xml
index b24a3dfb48a8ef1113c539f1797228d763d13766..45ec129b0884d1efe81915e8bbcbb80534cbb78a 100644
--- a/models.xml
+++ b/models.xml
@@ -2,111 +2,116 @@
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>RoughageNutritionModel</artifactId>
-		<version>1.1.6-SNAPSHOT</version>
+		<version>1.1.13</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>AlternariaModel</artifactId>
-		<version>1.1.5-SNAPSHOT</version>
+		<version>1.1.15</version>
+	</dependency>
+	<dependency>
+		<groupId>fi.luke.vips.model</groupId>
+		<artifactId>FinnCerealModels</artifactId>
+		<version>1.1.10</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
-		<artifactId>NaerstadModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<artifactId>Model_LEAFBLOTCH</artifactId>
+		<version>1.1.10</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
-		<artifactId>BarleyNetBlotchModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<artifactId>NaerstadModel</artifactId>
+		<version>1.1.10</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>SeptoriaHumidityModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.10</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>AppleScabModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
-		<artifactId>BremiaLactucaeModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<artifactId>DeliaRadicumModel</artifactId>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>DeliaRadicumFloralisObservationModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
-		<artifactId>DeliaRadicumModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
-	</dependency>
-	<dependency>
-		<groupId>fi.luke.vips.model</groupId>
-		<artifactId>FinnCerealModels</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<artifactId>BremiaLactucaeModel</artifactId>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>DOWNCASTModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
-	</dependency>
-	<dependency>
-		<groupId>no.nibio.vips.model</groupId>
-		<artifactId>LygusRugulipennisModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>GrassDryingModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
-		<artifactId>MamestraBrassicaeModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<artifactId>LygusRugulipennisModel</artifactId>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>Model_MAIZEPHENO</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
-		<artifactId>Model_LEAFBLOTCH</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<artifactId>MamestraBrassicaeModel</artifactId>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>OatFloweringModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
-		<artifactId>PsilaRosaeObservationModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<artifactId>NegativePrognosisModel</artifactId>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
-		<artifactId>NegativePrognosisModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<artifactId>PsilaRosaeObservationModel</artifactId>
+		<version>1.1.9</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>PsilaRosaeTempModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.9</version>
+	</dependency>
+	<dependency>
+		<groupId>no.nibio.vips.model</groupId>
+		<artifactId>BarleyNetBlotchModel</artifactId>
+		<version>1.1.10</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>SeptoriaApiicolaModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.8</version>
 	</dependency>
 	<dependency>
 		<groupId>no.nibio.vips.model</groupId>
 		<artifactId>SeptoriaReferenceHumidityModel</artifactId>
-		<version>1.1.4-SNAPSHOT</version>
+		<version>1.1.8</version>
+	</dependency>
+	<dependency>
+		<groupId>no.nibio.vips.model</groupId>
+		<artifactId>DayDegreesModel</artifactId>
+		<version>0.1.2</version>
 	</dependency>
 </dependencies>
diff --git a/pom.xml b/pom.xml
index 56322f4cc69fed7628d22887f437ac43433198ad..57f43820e78e6c0e847f7f2a5b929859e61fa8b0 100755
--- a/pom.xml
+++ b/pom.xml
@@ -4,12 +4,12 @@
     <parent>
         <groupId>no.nibio.vips</groupId>
         <artifactId>vips-parent-pom</artifactId>
-        <version>1.0.0</version>
+        <version>1.1.0</version>
     </parent>
     <groupId>no.nibio</groupId>
     <artifactId>VIPSCore</artifactId>
     <packaging>war</packaging>
-    <version>2.0.5-SNAPSHOT</version>
+     <version>3.0.1-SNAPSHOT</version>
 
     <name>VIPSCore</name>
     <url>http://maven.apache.org</url>
@@ -32,12 +32,12 @@
         <dependency>
         <groupId>io.github.classgraph</groupId>
         <artifactId>classgraph</artifactId>
-        <version>4.8.165</version>
+        <version>4.8.179</version>
     </dependency>
         <dependency>
             <groupId>com.thetransactioncompany</groupId>
             <artifactId>cors-filter</artifactId>
-            <version>2.10</version>
+            <version>3.0</version>
         </dependency>
 
         <dependency>
@@ -66,13 +66,7 @@
         <dependency>
             <groupId>no.nibio.vips</groupId>
             <artifactId>VIPSCommon</artifactId>
-            <version>2.0.2</version>
-        </dependency>
-        <dependency>
-            <groupId>javax</groupId>
-            <artifactId>javaee-web-api</artifactId>
-            <version>8.0.1</version>
-            <type>jar</type>
+            <version>3.0.0</version>
         </dependency>
         <dependency>
             <groupId>junit</groupId>
@@ -80,11 +74,6 @@
             <version>4.13.2</version>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>axis</groupId>
-            <artifactId>axis</artifactId>
-            <version>1.4</version>
-        </dependency>
         <dependency>
             <groupId>commons-logging</groupId>
             <artifactId>commons-logging</artifactId>
@@ -92,16 +81,10 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
-            <version>2.5</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet.jsp</groupId>
-            <artifactId>jsp-api</artifactId>
-            <version>2.2</version>
-            <scope>provided</scope>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <version>6.1.0</version>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>commons-validator</groupId>
@@ -110,9 +93,9 @@
             <type>jar</type>
         </dependency>
         <dependency>
-            <groupId>javax</groupId>
-            <artifactId>javaee-api</artifactId>
-            <version>8.0.1</version>
+            <groupId>jakarta.platform</groupId>
+            <artifactId>jakarta.jakartaee-api</artifactId>
+            <version>10.0.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -145,8 +128,8 @@
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>3.12.1</version>
                 <configuration>
-                    <source>11</source>
-                    <target>11</target>
+                    <source>17</source>
+                    <target>17</target>
                 </configuration>
             </plugin>
             <plugin>
diff --git a/src/main/java/no/nibio/vips/core/VIPSCoreApplication.java b/src/main/java/no/nibio/vips/core/VIPSCoreApplication.java
index 52f93d819f72e2923c3eadb005b727137d57d0b6..7e141f8c64d0495715090ec1299d14fdc7eaa2ab 100755
--- a/src/main/java/no/nibio/vips/core/VIPSCoreApplication.java
+++ b/src/main/java/no/nibio/vips/core/VIPSCoreApplication.java
@@ -20,8 +20,8 @@
 package no.nibio.vips.core;
 
 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;
 
 
 /**
diff --git a/src/main/java/no/nibio/vips/core/config/JacksonConfig.java b/src/main/java/no/nibio/vips/core/config/JacksonConfig.java
index ce4eb98517711dcaaa3ed71a5220627f76d3a38d..9e136d4ad282c847e985e75b6b932318149d8569 100755
--- a/src/main/java/no/nibio/vips/core/config/JacksonConfig.java
+++ b/src/main/java/no/nibio/vips/core/config/JacksonConfig.java
@@ -20,14 +20,14 @@ package no.nibio.vips.core.config;
 
 import com.bedatadriven.jackson.datatype.jts.JtsModule;
 import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.ext.ContextResolver;
-import javax.ws.rs.ext.Provider;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.ext.ContextResolver;
+import jakarta.ws.rs.ext.Provider;
 import net.ipmdecisions.weather.entity.LocationWeatherData;
 import no.nibio.vips.ipmdecisions.LocationWeatherDataDeserializer;
 
diff --git a/src/main/java/no/nibio/vips/core/service/ModelResourceImpl.java b/src/main/java/no/nibio/vips/core/service/ModelResourceImpl.java
index 257b3b8bd13d9c36b86482c3225e16d4ef0f0124..969307326fd47ba826d1a050967606d28a8179dc 100755
--- a/src/main/java/no/nibio/vips/core/service/ModelResourceImpl.java
+++ b/src/main/java/no/nibio/vips/core/service/ModelResourceImpl.java
@@ -18,19 +18,20 @@
 
 package no.nibio.vips.core.service;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-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.WebApplicationException;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
+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.WebApplicationException;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.Response;
 import no.nibio.vips.entity.ModelConfiguration;
 import no.nibio.vips.entity.Result;
 import no.nibio.vips.ipmdecisions.DataTransformer;
@@ -115,7 +116,7 @@ public class ModelResourceImpl implements ModelResource{
                 { 
                     retVal.append(mF.getModelInstance(key).getModelName(language));
                 }
-                catch(DuplicateModelIdException ex)
+                catch(DuplicateModelIdException | SecurityException | NoSuchMethodException | InvocationTargetException ex)
                 {
                     retVal.append(ex.getMessage());
                 }
@@ -149,7 +150,7 @@ public class ModelResourceImpl implements ModelResource{
         {
             try {
                 retVal.append(key).append(" ").append(mF.getModelInstance(key).getModelName(language)).append("\n");
-            } catch (InstantiationException | IllegalAccessException | NoSuchModelException | DuplicateModelIdException ex) {
+            } catch (InstantiationException | IllegalAccessException | NoSuchModelException | DuplicateModelIdException | SecurityException | NoSuchMethodException | InvocationTargetException ex) {
                 retVal.append(key).append(" ").append(ex.getMessage()).append("\n");
                 Logger.getLogger(ModelResourceImpl.class.getName()).log(Level.SEVERE, null, ex);
             }
@@ -231,7 +232,7 @@ public class ModelResourceImpl implements ModelResource{
             {
                  sampleConfig = ModelFactory.getInstance().getModelInstance(modelId).getSampleConfig();
             }
-            catch(NoSuchModelException | DuplicateModelIdException ex)
+            catch(NoSuchModelException | DuplicateModelIdException | SecurityException | NoSuchMethodException | InvocationTargetException ex)
             {
                 sampleConfig = ex.getMessage();
             }
@@ -261,7 +262,7 @@ public class ModelResourceImpl implements ModelResource{
             }
             else throw new ModelExcecutionException("Model returned NULL Result");
         }
-        catch(InstantiationException | IllegalAccessException | ConfigValidationException | ModelExcecutionException | NoSuchModelException | DuplicateModelIdException ex)
+        catch(InstantiationException | IllegalAccessException | ConfigValidationException | ModelExcecutionException | NoSuchModelException | DuplicateModelIdException | SecurityException | NoSuchMethodException | InvocationTargetException ex)
         {
             Logger.getLogger(ModelResourceImpl.class.getName()).log(Level.SEVERE, null, ex);
             return Response.serverError().entity(ex.getMessage()).build();
diff --git a/src/main/java/no/nibio/vips/core/startup/StartupListener.java b/src/main/java/no/nibio/vips/core/startup/StartupListener.java
index a4dcfd1fde4a4ff171d1cd806587e99b739867b5..badb23779c430f94bc4fe8e648a6eec666e7208d 100755
--- a/src/main/java/no/nibio/vips/core/startup/StartupListener.java
+++ b/src/main/java/no/nibio/vips/core/startup/StartupListener.java
@@ -18,8 +18,7 @@
 
 package no.nibio.vips.core.startup;
 
-import javax.servlet.ServletContextEvent;
-
+import jakarta.servlet.ServletContextEvent;
 import no.nibio.vips.model.factory.ModelFactory;
 /**
  * This class is created and method contextInitialized called when the application
@@ -28,7 +27,7 @@ import no.nibio.vips.model.factory.ModelFactory;
  * @copyright 2013 {@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{
 
     /**
      * Called when the application
diff --git a/src/main/java/no/nibio/vips/model/factory/ModelFactory.java b/src/main/java/no/nibio/vips/model/factory/ModelFactory.java
index c49e78217d44b1ef6a0b1df2ece4fd5d65674170..635339f6797026a497f6ffb61fd48046e23c220f 100755
--- a/src/main/java/no/nibio/vips/model/factory/ModelFactory.java
+++ b/src/main/java/no/nibio/vips/model/factory/ModelFactory.java
@@ -18,9 +18,6 @@
 
 package no.nibio.vips.model.factory;
 
-import io.github.classgraph.ClassGraph;
-import io.github.classgraph.ClassInfo;
-import io.github.classgraph.ScanResult;
 import java.lang.reflect.InvocationTargetException;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -28,6 +25,9 @@ import java.util.Map;
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import io.github.classgraph.ClassGraph;
+import io.github.classgraph.ClassInfo;
+import io.github.classgraph.ScanResult;
 import no.nibio.vips.model.Model;
 
 /**
@@ -96,34 +96,6 @@ public class ModelFactory {
      * Builds an inventory. 
      */
     private void init(){
-        /* 
-         * Reflections API insists on using at least one package prefix. So we scan
-         * through all TLDs. List is compiled from 
-         * http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains
-         */ 
-        String[] defaultTopDomains = {
-            "aero","asia","biz","cat","com","coop","info","int","jobs","mobi",
-            "museum","name","net","org","post","pro","tel","travel","edu","gov",
-            "ac","ad","ae","af","ag","ai","al","am","an","ao","aq","ar","as","at",
-            "au","aw","ax","az","ba","bb","bd","be","bf","bg","bh","bi","bj","bm",
-            "bn","bo","br","bs","bt","bv","bw","by","bz","ca","cc","cd","cf","cg",
-            "ch","ci","ck","cl","cm","cn","co","cr","cs","cu","cv","cx","cy","cz",
-            "dd","de","dj","dk","dm","do","dz","ec","ee","eg","eh","er","es","et",
-            "eu","fi","fj","fk","fm","fo","fr","ga","gb","gd","ge","gf","gg","gh",
-            "gi","gl","gm","gn","gp","gq","gr","gs","gt","gu","gw","gy","hk","hm",
-            "hn","hr","ht","hu","id","ie","il","im","in","io","iq","ir","is","it",
-            "je","jm","jo","jp","ke","kg","kh","ki","km","kn","kp","kr","kw","ky",
-            "kz","la","lb","lc","li","lk","lr","ls","lt","lu","lv","ly","ma","mc",
-            "md","me","mg","mh","mk","ml","mm","mn","mo","mp","mq","mr","ms","mt",
-            "mu","mv","mw","mx","my","mz","na","nc","ne","nf","ng","ni","nl","no",
-            "np","nr","nu","nz","om","pa","pe","pf","pg","ph","pk","pl","pm","pn",
-            "pr","ps","pt","pw","py","qa","re","ro","rs","ru","rw","sa","sb","sc",
-            "sd","se","sg","sh","si","sj","sk","sl","sm","sn","so","sr","ss","st",
-            "su","sv","sx","sy","sz","tc","td","tf","tg","th","tj","tk","tl","tm",
-            "tn","to","tp","tr","tt","tv","tw","tz","ua","ug","uk","us","uy","uz",
-            "va","vc","ve","vg","vi","vn","vu","wf","ws","ye","yt","yu","za","zm",
-            "zw",
-        };
         
         /**
          * Warning: This generates a WARNING from a filesystem/JARfile scan error
@@ -131,19 +103,14 @@ public class ModelFactory {
          * this in log files. 
          */
 
-        Set<Class<? extends Model>> subTypes = new HashSet();
+        Set<Class<? extends Model>> subTypes = new HashSet<>();
         
-        /*for(String topDomain: defaultTopDomains)
-        {
-            reflections = new Reflections(topDomain);
-            subTypes.addAll(reflections.getSubTypesOf(Model.class));   
-        }*/
         boolean verboseClassGraph = System.getProperty("no.nibio.vips.core.VERBOSE_CLASSGRAPH") != null && System.getProperty("no.nibio.vips.core.VERBOSE_CLASSGRAPH").equals("true");
-        try (ScanResult scanResult =                // Assign scanResult in try-with-resources
+        try (ScanResult scanResult =        // Assign scanResult in try-with-resources
         new ClassGraph()                    // Create a new ClassGraph instance
-            .verbose(verboseClassGraph)                      // If you want to enable logging to stderr
-            .enableClassInfo()            // Scan classes, methods, fields, annotations
-            //.acceptPackages("com.xyz")      // Scan com.xyz and subpackages
+            .verbose(verboseClassGraph)     // If you want to enable logging to stderr
+            .enableClassInfo()              // Scan classes, methods, fields, annotations
+            //.acceptPackages("no.nibio")   // Scan no.nibio and subpackages
             .scan()) {                      // Perform the scan and return a ScanResult
             
             //ClassInfoList classInfoList = 
@@ -156,7 +123,7 @@ public class ModelFactory {
         /**
          * Iterates and instantiates one object for each class
          */
-        this.models = new HashMap();
+        this.models = new HashMap<>();
         for(Class<? extends Model> subType : subTypes)
         {
                try {
@@ -303,7 +270,10 @@ public class ModelFactory {
                 InstantiationException, 
                 IllegalAccessException, 
                 DuplicateModelIdException, 
-                NoSuchModelException
+                NoSuchModelException,
+                SecurityException,
+                NoSuchMethodException,
+                InvocationTargetException
     {
         if(this.isDuplicateModelId(modelId))
         {
@@ -313,7 +283,7 @@ public class ModelFactory {
         {
             throw new NoSuchModelException("ERROR: No model found with id = " + modelId);
         }
-        return this.models.get(modelId).getClass().newInstance();
+        return this.models.get(modelId).getClass().getDeclaredConstructor().newInstance();
     }
 
     private void addDuplicateModelId(String modelId) {