diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3840a1f6b9ad80cfa7559d07be554668f604cdac..14858c51ac161489e90e086da2236c81e0e64dc2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -46,3 +46,124 @@ include:
 
   - local: "devops/gc/pipeline/override-stages.yml"
 
+
+.maven:
+  image: maven:3.9.3-eclipse-temurin-17
+  tags: ['osdu-medium']
+  variables:
+    MAVEN_REPO_PATH: "$CI_PROJECT_DIR/.m2/repository"
+    MAVEN_CLI_OPTS: "--batch-mode --settings=$CI_PROJECT_DIR/.mvn/community-maven.settings.xml"
+
+  cache:
+    paths:
+      - $MAVEN_REPO_PATH
+
+  artifacts:
+    paths:
+      - ./**/target/*.jar
+      - ./**/maven-*-output.txt
+    when: always
+    expire_in: 2 days
+
+  before_script:
+    - | # Check for the presence of a maven wrapper script
+      apt-get update && apt-get install -y python3
+      if [ -e "$CI_PROJECT_DIR/mvnw" ]; then
+        export MAVEN_BINARY="$CI_PROJECT_DIR/mvnw"
+        unset MAVEN_CONFIG
+        mkdir -pv .mvn/wrapper
+      else
+        export MAVEN_BINARY="mvn"
+      fi
+    - export MAVEN="$MAVEN_BINARY $MAVEN_CLI_OPTS -Dmaven.repo.local=$MAVEN_REPO_PATH"
+    - echo $MAVEN_BINARY
+    - echo $MAVEN_CLI_OPTS
+    - echo $MAVEN_REPO_PATH
+    - echo $MAVEN
+    - mkdir -pv $MAVEN_REPO_PATH
+    - export ALL_MAVEN_BUILD_DIRS_Z=$(mktemp)
+    - python3 --version
+
+    # This scans for all pom.xml files that aren't listed as a child pom (as
+    # determine by the presence of a <parent> tag).
+    - |
+      (python3 | sort -z > $ALL_MAVEN_BUILD_DIRS_Z) <<EOF
+      from xml.dom.minidom import parse
+      import os
+      import sys
+
+      allPomFiles = set()
+      submoduleFiles = set()
+
+      for root, dirnames, filenames in os.walk(os.environ['CI_PROJECT_DIR']):
+          if 'pom.xml' in filenames:
+              pomFile = os.path.join(root, 'pom.xml')
+              allPomFiles.add(pomFile)
+
+              dom = parse(pomFile)
+              for modules in dom.getElementsByTagName('modules'):
+                  for module in modules.getElementsByTagName('module'):
+                      submoduleFiles.add(os.path.join(root, module.firstChild.nodeValue, "pom.xml"))
+
+      for pomFile in allPomFiles:
+          if pomFile not in submoduleFiles:
+              dir = os.path.dirname(pomFile)
+              sys.stdout.write(dir + '\0')
+      EOF
+    - xargs -0rn 1 echo < $ALL_MAVEN_BUILD_DIRS_Z
+
+    # This creates a script for running maven, capturing output to a file.
+    # - First argument is the directory to build from
+    # - Second argument is the name to use for the logfile
+    # - The remaining arguments are the maven command to run
+    - export MAVEN_BUILD=$(tempfile -m 755 -p build -s .sh)
+    - echo "#!/bin/bash" > $MAVEN_BUILD
+    - |
+      cat >> $MAVEN_BUILD <<EOF
+      id=maven_build_\$(echo "\$@" | sha1sum | head -c 7)
+      cd "\$1"; shift
+      outputFile="\$1"; shift
+
+      echo "********************************************************************************"
+      echo -e "\e[0Ksection_start:\$(date +%s):\${id}\r\e[0K\e[1m\$(pwd)\e[0m"
+      echo -e "\e[32;1m\$MAVEN" "\$@" "\e[0m"
+
+      if \$MAVEN "\$@" > "\$outputFile" 2>&1; then
+          tail -n 25 "\$outputFile";
+          echo -e "\e[36m**** Showing the last 25 lines of the passed build (above). See Job artifacts for full log details *****\e[0m";
+          echo -e "\e[0Ksection_end:\$(date +%s):\${id}\r\e[0K"
+      else
+          tail -n 200 "\$outputFile";
+          echo -e "\e[31m**** Showing the last 200 lines of the failed build (above). See Job artifacts for full log details *****\e[0m";
+          echo -e "\e[0Ksection_end:\$(date +%s):\${id}\r\e[0K"
+          exit 255;
+      fi
+      EOF
+
+    # This creates a script for applying the $MAVEN_BUILD script to all build directories
+    - export MAVEN_FOREACH=$(tempfile -m 755 -p fr-ec -s .sh)
+    - echo "#!/bin/sh" > $MAVEN_FOREACH
+    - echo 'xargs -0rI {} $MAVEN_BUILD {} "$@" < $ALL_MAVEN_BUILD_DIRS_Z' >> $MAVEN_FOREACH
+
+gemnasium-maven-dependency_scanning:
+  variables:
+    DS_JAVA_VERSION: 17
+
+azure_containerize:
+  variables:
+    AZURE_CONTAINERIZE_REPOSITORY: "-b jdk-17 https://gitlab-ci-token:${CI_JOB_TOKEN}@community.opengroup.org/osdu/platform/deployment-and-operations/base-containers-azure/service-base-image"
+
+azure_test:
+  image: community.opengroup.org:5555/osdu/platform/deployment-and-operations/base-containers-azure/azure-maven17:v0.0.1
+
+aws-test-java:
+  image: $CI_REGISTRY/osdu/platform/deployment-and-operations/base-containers-aws/aws-maven/aws-maven:v2.0
+
+aws-mongodb-test-java:
+  image: $CI_REGISTRY/osdu/platform/deployment-and-operations/base-containers-aws/aws-maven/aws-maven:v2.0
+
+
+fossa-analyze:
+  image: $CI_REGISTRY/divido/fossa-with-cache:v0.9-jdk17
+fossa-check-notice:
+  image: $CI_REGISTRY/divido/fossa-with-cache:v0.9-jdk17