diff --git a/.github/workflows/selenuim-test.yml b/.github/workflows/selenuim-test.yml
index 600989c214e..8c97724b08c 100644
--- a/.github/workflows/selenuim-test.yml
+++ b/.github/workflows/selenuim-test.yml
@@ -19,7 +19,7 @@ jobs:
       - uses: ankane/setup-mariadb@v1
         with:
           mariadb-version: "10.11"
-          database: angel_selenuim_test
+          database: angel_selenium_test
 
       - uses: actions/checkout@v2
 
@@ -63,7 +63,7 @@ jobs:
 
       - name: Run tests
         if: ${{ steps.skip_check.outputs.should_skip != 'true' }}
-        run: ./gradlew selenium-test:test -x client-html:test -PdbUrl=jdbc:mariadb://localhost:3306/angel_selenuim_test?user=root --stacktrace
+        run: ./gradlew selenium-test:test -x client-html:test -PdbUrl=jdbc:mariadb://localhost:3306/angel_selenium_test?user=root --stacktrace
 
       - name: Publish test results
         uses: EnricoMi/publish-unit-test-result-action@v1
diff --git a/api-doc/build.gradle b/api-doc/build.gradle
index 59d14a65954..083f7de04a6 100644
--- a/api-doc/build.gradle
+++ b/api-doc/build.gradle
@@ -1,3 +1,14 @@
+/*
+ * Copyright ish group pty ltd 2020.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the
+ * GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
 apply from: "$rootDir/nodeSetup.gradle"
 
 task apiDoc(type: NpmTask, dependsOn: [':server-api:apiDocs_mergeSwagger', 'npmInstall']) {
@@ -9,22 +20,24 @@ task apiDoc(type: NpmTask, dependsOn: [':server-api:apiDocs_mergeSwagger', 'npmI
     npmCommand = ['run']
     args = ['build']
 
-    outputs.dir("${buildDir}/api-docs")
+    outputs.dir("${layout.buildDirectory.get()}/api-docs")
 }
 
-build.dependsOn(apiDoc)
-
 task packageApiDoc (type: Zip, dependsOn: apiDoc) {
     group = "documentation"
     from apiDoc.outputs.files
     archiveClassifier = 'documentation'
 }
 
+tasks.named('build') {
+    dependsOn apiDoc
+}
+
 publishing {
     publications {
-        docs(MavenPublication) {
+        create("docs", MavenPublication) {
             artifact(packageApiDoc) {
-                artifactId "apiDoc"
+                artifactId = "apiDoc"
             }
         }
     }
diff --git a/api-test/build.gradle b/api-test/build.gradle
index 0c5e014c0c5..1cf78cecd83 100644
--- a/api-test/build.gradle
+++ b/api-test/build.gradle
@@ -1,5 +1,3 @@
-import test.PrepareTestDatabase
-
 /*
  * Copyright ish group pty ltd 2020.
  *
@@ -11,6 +9,17 @@ import test.PrepareTestDatabase
  * See the GNU Affero General Public License for more details.
  */
 
+import test.PrepareTestDatabase
+
+plugins {
+    id 'java'
+}
+
+java {
+    sourceCompatibility = JavaVersion.VERSION_11
+    targetCompatibility = JavaVersion.VERSION_11
+}
+
 ext {
     karateVersion = '1.0.1'
 }
@@ -29,9 +38,6 @@ dependencies {
     testImplementation "org.eclipse.jetty:jetty-client:$jettyVersion"
 }
 
-sourceCompatibility = 11
-targetCompatibility = 11
-
 task copyConfig(type: Copy) {
     from("$rootDir/api-test/src/test/resources/") {
         include 'onCourse.yml'
@@ -52,7 +58,9 @@ test {
         events "failed", "standardOut"
     }
 
-    tasks.getByName('prepareTestDatabase').mustRunAfter(':server:startDaemon').mustRunAfter('copyConfig')
+    tasks.named('prepareTestDatabase').get()
+            .mustRunAfter(':server:startDaemon')
+            .mustRunAfter('copyConfig')
 
     dependsOn "copyConfig"
     dependsOn ":server:startDaemon"
diff --git a/build.gradle b/build.gradle
index 1d4e72d41e9..50fb777702e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,6 +5,7 @@
  *
  *  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.
  */
+
 buildscript {
 	ext {
 		log4j2Version = '2.17.2'
@@ -14,7 +15,7 @@ buildscript {
 		googleGuiceVersion = '4.2.2'
 		groovyVersion = '2.5.15'
 		bouncycastleVersion = '1.67'
-		bootiqueVersion = '1.2'
+		bootiqueVersion = '2.0'
 		cfxVersion = '3.3.5'
 		//latest jackson version 2.12.2 (no any conflicts with spring, see AbstractApplicationContext), same version jasper uses also
 		jacksonVersion = '2.12.2'
@@ -31,11 +32,11 @@ buildscript {
 }
 
 plugins {
-	id 'com.github.ben-manes.versions' version '0.39.0' // adds the task 'dependencyUpdates -Drevision=release'
-	id 'com.github.node-gradle.node' version '3.1.1' apply false
-	id 'com.github.psxpaul.execfork' version '0.1.15' apply false
+	id 'com.github.ben-manes.versions' version '0.51.0' // adds the task 'dependencyUpdates -Drevision=release'
+	id 'com.github.node-gradle.node' version '7.0.1' apply false
+	id 'com.github.psxpaul.execfork' version '0.2.2' apply false
 	id 'idea'
-	id 'org.barfuin.gradle.taskinfo' version '1.2.0' // adds the task 'tiTree [some task]' and the task 'tiOrder [some task]'
+	id 'org.barfuin.gradle.taskinfo' version '2.2.0' // adds the task 'tiTree [some task]' and the task 'tiOrder [some task]'
 
 	id 'java'
 	id 'groovy'
@@ -64,7 +65,11 @@ subprojects {
 	// added it exactly here since api dep doesn't work without that plugin
 	apply plugin: 'java-library'
 
-	sourceCompatibility = 11
+	java {
+		sourceCompatibility = JavaVersion.VERSION_11
+	}
+
+	group = 'ish.oncourse.angel'
 	// get the version from the command line properties
 	version = project.hasProperty('releaseVersion') && project.releaseVersion ? project.releaseVersion : "99-SNAPSHOT"
 	version = version.replace('v','') // remove the leading v from the version
@@ -90,22 +95,15 @@ subprojects {
 
 		implementation 'javax.annotation:javax.annotation-api:1.3.2'
 
-
-
 		testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.0'
 		testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.0'
 		testImplementation 'org.junit.vintage:junit-vintage-engine:5.8.0' // needed for dbunit https://sourceforge.net/p/dbunit/feature-requests/222/
 		testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
 		testImplementation 'org.dbunit:dbunit:2.7.0'
+
 		testImplementation "org.codehaus.groovy:groovy-test-junit5:$groovyVersion"
 		testImplementation "org.codehaus.groovy:groovy-sql:$groovyVersion"
 	}
-// uncomment when dbunit is detached from junit
-//	configurations {
-//		testImplementation.exclude group: 'junit' // exclude junit4
-//	}
-
-	group = 'ish.oncourse.angel'
 
 	publishing {
 		repositories {
@@ -133,15 +131,11 @@ subprojects {
 			'Trusted-Library': 'true'
 	}
 
-	ext {
-		testFailed = false
-	}
-
 	test {
+		boolean testFailed = false
 		useJUnitPlatform()
 
-		systemProperties 'java.awt.headless': 'true',
-		    'java.locale.providers': 'COMPAT,SPI'
+		systemProperties 'java.awt.headless': 'true', 'java.locale.providers': 'COMPAT,SPI'
 		maxHeapSize = '3000M'
 		maxParallelForks = 1
 		ignoreFailures = true
@@ -152,7 +146,7 @@ subprojects {
 		}
 
 		reports {
-			junitXml.enabled = true
+			junitXml.required = true
 		}
 
 		afterSuite { desc, result ->
@@ -169,9 +163,9 @@ subprojects {
 }
 
 task testReport(type: TestReport) {
-	destinationDir = file("$buildDir/reports/tests")
+	destinationDirectory = file("${layout.buildDirectory.get()}/reports/tests")
 	// Include the results from the `test` task in all subprojects
-	reportOn subprojects*.test
+	testResults.from = subprojects*.test
 }
 
 // Skip beta and other non-final releases in the update report
diff --git a/buildSrc/apidoc/src/main/groovy/au/com/ish/docs/DslGroovyRootDocBuilder.groovy b/buildSrc/apidoc/src/main/groovy/au/com/ish/docs/DslGroovyRootDocBuilder.groovy
index 2eddb15dac0..57e0b44085c 100644
--- a/buildSrc/apidoc/src/main/groovy/au/com/ish/docs/DslGroovyRootDocBuilder.groovy
+++ b/buildSrc/apidoc/src/main/groovy/au/com/ish/docs/DslGroovyRootDocBuilder.groovy
@@ -3,7 +3,7 @@
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
- * You may obtain ssh copy of the License at
+ * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -18,6 +18,7 @@ package au.com.ish.docs
 import groovyjarjarantlr.RecognitionException
 import groovyjarjarantlr.TokenStreamException
 import groovyjarjarantlr.collections.AST
+import org.apache.groovy.antlr.override.GroovydocVisitor
 import org.apache.commons.lang3.StringUtils
 import org.codehaus.groovy.antlr.AntlrASTProcessor
 import org.codehaus.groovy.antlr.SourceBuffer
@@ -29,13 +30,13 @@ import org.codehaus.groovy.antlr.java.JavaRecognizer
 import org.codehaus.groovy.antlr.parser.GroovyLexer
 import org.codehaus.groovy.antlr.parser.GroovyRecognizer
 import org.codehaus.groovy.antlr.treewalker.PreOrderTraversal
-import org.codehaus.groovy.antlr.treewalker.SourceCodeTraversal
 import org.codehaus.groovy.antlr.treewalker.Visitor
+import org.codehaus.groovy.ast.ModuleNode
+import org.codehaus.groovy.control.*
 import org.codehaus.groovy.groovydoc.GroovyClassDoc
 import org.codehaus.groovy.groovydoc.GroovyRootDoc
 import org.codehaus.groovy.runtime.ResourceGroovyMethods
 import org.codehaus.groovy.tools.groovydoc.LinkArgument
-import org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDocAssembler
 import org.codehaus.groovy.tools.groovydoc.SimpleGroovyExecutableMemberDoc
 import org.codehaus.groovy.tools.groovydoc.SimpleGroovyPackageDoc
 import org.codehaus.groovy.tools.groovydoc.SimpleGroovyRootDoc
@@ -68,32 +69,56 @@ class DslGroovyRootDocBuilder {
 			JavaLexer lexer = new JavaLexer(unicodeReader)
 			unicodeReader.setLexer(lexer)
 			parser = JavaRecognizer.make(lexer)
-			parser.setSourceBuffer(sourceBuffer)
-			parser.compilationUnit()
 		} else {
 			GroovyLexer lexer = new GroovyLexer(unicodeReader)
 			unicodeReader.setLexer(lexer)
 			parser = GroovyRecognizer.make(lexer)
-			parser.setSourceBuffer(sourceBuffer)
-			parser.compilationUnit()
 		}
-
-		AST ast = parser.getAST()
-		if (isJava) {
-			// modify the Java AST into ssh Groovy AST (just token types)
-			Visitor java2groovyConverter = new Java2GroovyConverter(parser.getTokenNames())
-			AntlrASTProcessor java2groovyTraverser = new PreOrderTraversal(java2groovyConverter)
-			java2groovyTraverser.process(ast)
-
-			// now mutate (groovify) the ast into groovy
-			Visitor groovifier = new Groovifier(parser.getTokenNames(), false)
-			AntlrASTProcessor groovifierTraverser = new PreOrderTraversal(groovifier)
-			groovifierTraverser.process(ast)
+        if (isJava) {
+            parser.setSourceBuffer(sourceBuffer)
+            parser.compilationUnit()
+            AST ast = parser.getAST()
+
+            // modify the Java AST into a Groovy AST (just token types)
+            Visitor java2groovyConverter = new Java2GroovyConverter(parser.getTokenNames())
+            AntlrASTProcessor java2groovyTraverser = new PreOrderTraversal(java2groovyConverter)
+            java2groovyTraverser.process(ast)
+
+            // now mutate (groovify) the ast into groovy
+            Visitor groovifier = new Groovifier(parser.getTokenNames(), false)
+            AntlrASTProcessor groovifierTraverser = new PreOrderTraversal(groovifier)
+            groovifierTraverser.process(ast)
+        }
+
+		CompilerConfiguration config = new CompilerConfiguration()
+		config.getOptimizationOptions().put(CompilerConfiguration.GROOVYDOC, true)
+		CompilationUnit compUnit = new CompilationUnit(config)
+		SourceUnit unit = new SourceUnit(file, src, config, null, new ErrorCollector(config));
+		compUnit.addSource(unit);
+		int phase = Phases.CONVERSION;
+		if (properties.containsKey("phaseOverride")) {
+			String raw = properties.getProperty("phaseOverride")
+			try {
+				phase = Integer.parseInt(raw)
+			} catch(NumberFormatException ignore) {
+				raw = raw.toUpperCase();
+				switch(raw) {
+				// some dup here but kept simple since we may swap Phases to an enum
+					case "CONVERSION": phase = 3; break;
+					case "SEMANTIC_ANALYSIS": phase = 4; break;
+					case "CANONICALIZATION": phase = 5; break;
+					case "INSTRUCTION_SELECTION": phase = 6; break;
+					case "CLASS_GENERATION": phase = 7; break;
+					default:
+						System.err.println("Ignoring unrecognised or unsuitable phase and keeping default");
+				}
+			}
 		}
-		Visitor visitor = new SimpleGroovyClassDocAssembler(packagePath, file, sourceBuffer, links, properties, !isJava)
-		AntlrASTProcessor traverser = new SourceCodeTraversal(visitor)
-		traverser.process(ast)
-		return ((SimpleGroovyClassDocAssembler)visitor).getGroovyClassDocs()
+		compUnit.compile(phase);
+		ModuleNode root = unit.getAST()
+		GroovydocVisitor visitor = new GroovydocVisitor(unit, packagePath, links, properties)
+		root.getClasses().forEach(clazz -> visitor.visitClass(clazz))
+		return visitor.getGroovyClassDocs()
 	}
 
 	protected void setOverview() {
diff --git a/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/ArrayGroovyMethods.java b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/ArrayGroovyMethods.java
new file mode 100644
index 00000000000..3d5a52aa086
--- /dev/null
+++ b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/ArrayGroovyMethods.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright ish group pty ltd 2024.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ *  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.
+ */
+
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.groovy.antlr.override;
+
+import org.codehaus.groovy.runtime.DefaultGroovyMethods;
+import org.codehaus.groovy.runtime.DefaultGroovyMethodsSupport;
+import org.codehaus.groovy.util.ArrayIterator;
+
+/**
+ * Defines new groovy methods which appear on arrays inside the Groovy environment.
+ * Static methods are used with the first parameter being the destination class,
+ * i.e. <code>public static int[] each(int[] self, Closure closure)</code>
+ * provides an <code>each({i -> })</code> method for <code>int[]</code>.
+ * <p>
+ * NOTE: While this class contains many 'public' static methods, it is
+ * primarily regarded as an internal class (its internal package name
+ * suggests this also). We value backwards compatibility of these
+ * methods when used within Groovy but value less backwards compatibility
+ * at the Java method call level. I.e. future versions of Groovy may
+ * remove or move a method call in this file but would normally
+ * aim to keep the method available from within Groovy.
+ */
+
+// TODO: Remove after update Groovy v4, this part of code is taken from this version
+
+public class ArrayGroovyMethods extends DefaultGroovyMethodsSupport {
+
+    private ArrayGroovyMethods() {
+    }
+
+    /**
+     * Concatenates the string representation of each item in this array,
+     * with the given String as a separator between each item.
+     *
+     * <pre class="groovyTestCase">
+     * Serializable[] array = [1,2L,-3G]
+     * assert array.join("+") == "1+2+-3"
+     * </pre>
+     *
+     * @param self      an array of Object
+     * @param separator a String separator
+     * @return the joined String
+     * @since 1.0
+     */
+    public static String join(Object[] self, String separator) {
+        return DefaultGroovyMethods.join(new ArrayIterator<>(self), separator);
+    }
+}
\ No newline at end of file
diff --git a/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/FormatHelper.java b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/FormatHelper.java
new file mode 100644
index 00000000000..8e9d443b69b
--- /dev/null
+++ b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/FormatHelper.java
@@ -0,0 +1,562 @@
+/*
+ * Copyright ish group pty ltd 2024.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ *  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.
+ */
+
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.groovy.antlr.override;
+
+import groovy.lang.GroovyRuntimeException;
+import groovy.lang.GroovySystem;
+import groovy.lang.MetaClassRegistry;
+import groovy.lang.Range;
+import groovy.lang.Writable;
+import groovy.transform.NamedParam;
+import groovy.transform.NamedParams;
+import org.apache.groovy.io.StringBuilderWriter;
+import org.codehaus.groovy.control.ResolveVisitor;
+import org.codehaus.groovy.runtime.DefaultGroovyMethods;
+import org.codehaus.groovy.runtime.NullObject;
+import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
+import org.w3c.dom.Element;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.Writer;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static java.lang.Math.max;
+import static java.util.Arrays.stream;
+
+/**
+ * Formatting methods
+ */
+
+// TODO: Remove after update Groovy v4, this part of code is taken from this version
+
+public class FormatHelper {
+
+    private FormatHelper() {}
+
+    private static final String SQ = "'";
+    private static final String DQ = "\"";
+
+    private static final Object[] EMPTY_ARGS = {};
+
+    // heuristic size to pre-allocate stringbuffers for collections of items
+    private static final int ITEM_ALLOCATE_SIZE = 5;
+
+    public static final MetaClassRegistry metaRegistry = GroovySystem.getMetaClassRegistry();
+    private static final String XMLUTIL_CLASS_FULL_NAME = "groovy.xml.XmlUtil";
+    private static final String SERIALIZE_METHOD_NAME = "serialize";
+
+    static final Set<String> DEFAULT_IMPORT_PKGS = new HashSet<>();
+    static final Set<String> DEFAULT_IMPORT_CLASSES = new HashSet<>();
+
+    static {
+        for (String pkgName : ResolveVisitor.DEFAULT_IMPORTS) {
+            FormatHelper.DEFAULT_IMPORT_PKGS.add(pkgName.substring(0, pkgName.length() - 1));
+        }
+        FormatHelper.DEFAULT_IMPORT_CLASSES.add("java.math.BigDecimal");
+        FormatHelper.DEFAULT_IMPORT_CLASSES.add("java.math.BigInteger");
+    }
+
+    public static String toString(Object arguments) {
+        return format(arguments, false, -1, false);
+    }
+
+    public static String inspect(Object self) {
+        return format(self, true);
+    }
+
+    public static String format(Object arguments, boolean verbose) {
+        return format(arguments, verbose, -1);
+    }
+
+    public static String format(Object arguments, boolean inspect, boolean escapeBackslashes) {
+        return format(arguments, inspect, -1);
+    }
+
+    public static String format(Object arguments, boolean verbose, int maxSize) {
+        return format(arguments, verbose, maxSize, false);
+    }
+
+    public static String format(Object arguments, boolean inspect, boolean escapeBackslashes, int maxSize) {
+        return format(arguments, inspect, escapeBackslashes, maxSize, false);
+    }
+
+    /**
+     * Output the {@code toString} for the argument(s) with various options to configure.
+     * Configuration options:
+     * <pre>
+     * <dl>
+     *     <dt>safe</dt><dd>provides protection if the {@code toString} throws an exception, in which case the exception is swallowed and a dumber default {@code toString} is used</dd>
+     *     <dt>maxSize</dt><dd>will attempt to truncate the output to fit approx the maxSize number of characters, -1 means don't truncate</dd>
+     *     <dt>inspect</dt><dd>if false, render a value by its {@code toString}, otherwise use its {@code inspect} value</dd>
+     *     <dt>escapeBackSlashes</dt><dd>whether characters like tab, newline, etc. are converted to their escaped rendering ('\t', '\n', etc.)</dd>
+     *     <dt>verbose</dt><dd>shorthand to turn on both {@code inspect} and {@code escapeBackslashes}</dd>
+     * </dl>
+     * </pre>
+     *
+     * @param options a map of configuration options
+     * @param arguments the argument(s) to calculate the {@code toString} for
+     * @return the string rendering of the argument(s)
+     * @see DefaultGroovyMethods#inspect(Object)
+     */
+    public static String toString(@NamedParams({
+            @NamedParam(value = "safe", type = Boolean.class),
+            @NamedParam(value = "maxSize", type = Integer.class),
+            @NamedParam(value = "verbose", type = Boolean.class),
+            @NamedParam(value = "escapeBackslashes", type = Boolean.class),
+            @NamedParam(value = "inspect", type = Boolean.class)
+    }) Map<String, Object> options, Object arguments) {
+        Object safe = options.get("safe");
+        if (!(safe instanceof Boolean)) safe = false;
+        Object maxSize = options.get("maxSize");
+        if (!(maxSize instanceof Integer)) maxSize = -1;
+        Object verbose = options.get("verbose");
+        Object inspect = options.get("inspect");
+        Object escapeBackslashes = options.get("escapeBackslashes");
+        if (!(inspect instanceof Boolean)) inspect = false;
+        if (!(escapeBackslashes instanceof Boolean)) escapeBackslashes = false;
+        if (!(verbose instanceof Boolean)) verbose = false;
+        if (Boolean.TRUE.equals(verbose)) {
+            inspect = true;
+            escapeBackslashes = true;
+        }
+        return format(arguments, (boolean) inspect, (boolean) escapeBackslashes, (int) maxSize, (boolean) safe);
+    }
+
+    public static String format(Object arguments, boolean verbose, int maxSize, boolean safe) {
+        return format(arguments, verbose, verbose, maxSize, safe);
+    }
+
+    public static String format(Object arguments, boolean inspect, boolean escapeBackslashes, int maxSize, boolean safe) {
+        if (arguments == null) {
+            final NullObject nullObject = NullObject.getNullObject();
+            return (String) nullObject.getMetaClass().invokeMethod(nullObject, "toString", EMPTY_ARGS);
+        }
+        if (arguments.getClass().isArray()) {
+            if (arguments instanceof Object[]) {
+                return toArrayString((Object[]) arguments, inspect, escapeBackslashes, maxSize, safe);
+            }
+            if (arguments instanceof char[]) {
+                return new String((char[]) arguments);
+            }
+            // other primitives
+            return formatCollection(DefaultTypeTransformation.arrayAsCollection(arguments), inspect, escapeBackslashes, maxSize, safe);
+        }
+        if (arguments instanceof Range) {
+            Range range = (Range) arguments;
+            try {
+                if (inspect) {
+                    return range.inspect();
+                } else {
+                    return range.toString();
+                }
+            } catch (RuntimeException ex) {
+                if (!safe) throw ex;
+                return handleFormattingException(arguments, ex);
+            } catch (Exception ex) {
+                if (!safe) throw new GroovyRuntimeException(ex);
+                return handleFormattingException(arguments, ex);
+            }
+        }
+        if (arguments instanceof Collection) {
+            return formatCollection((Collection) arguments, inspect, escapeBackslashes, maxSize, safe);
+        }
+        if (arguments instanceof Map) {
+            return formatMap((Map) arguments, inspect, escapeBackslashes, maxSize, safe);
+        }
+        if (arguments instanceof Element) {
+            try {
+                Method serialize = Class.forName(XMLUTIL_CLASS_FULL_NAME).getMethod(SERIALIZE_METHOD_NAME, Element.class);
+                return (String) serialize.invoke(null, arguments);
+            } catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        if (arguments instanceof CharSequence) {
+            String arg = escapeBackslashes ? escapeBackslashes(arguments.toString()) : arguments.toString();
+            if (arguments instanceof String) {
+                if (!inspect) return arg;
+                return !escapeBackslashes && multiline(arg) ? "'''" + arg + "'''" : SQ + arg.replace(SQ, "\\'") + SQ;
+            }
+            if (!inspect) return arg;
+            return !escapeBackslashes && multiline(arg) ? "\"\"\"" + arg + "\"\"\"" : DQ + arg.replace(DQ, "\\\"") + DQ;
+        }
+        try {
+            // TODO: For GROOVY-2599 do we need something like below but it breaks other things
+//            return (String) invokeMethod(arguments, "toString", EMPTY_ARGS);
+            return arguments.toString();
+        } catch (RuntimeException ex) {
+            if (!safe) throw ex;
+            return handleFormattingException(arguments, ex);
+        } catch (Exception ex) {
+            if (!safe) throw new GroovyRuntimeException(ex);
+            return handleFormattingException(arguments, ex);
+        }
+    }
+
+    private static boolean multiline(String s) {
+        return s.contains("\n") || s.contains("\r");
+    }
+
+    public static String escapeBackslashes(String orig) {
+        // must replace backslashes first, as the other replacements add backslashes not to be escaped
+        return orig
+                .replace("\\", "\\\\")           // backslash
+                .replace("\n", "\\n")            // line feed
+                .replace("\r", "\\r")            // carriage return
+                .replace("\t", "\\t")            // tab
+                .replace("\f", "\\f");           // form feed
+    }
+
+    private static String handleFormattingException(Object item, Exception ex) {
+
+        String hash;
+        try {
+            hash = Integer.toHexString(item.hashCode());
+        } catch (Exception ignored) {
+            hash = "????";
+        }
+        return "<" + typeName(item) + "@" + hash + ">";
+    }
+
+    private static String formatMap(Map map, boolean inspect, boolean escapeBackslashes, int maxSize, boolean safe) {
+        if (map.isEmpty()) {
+            return "[:]";
+        }
+        StringBuilder buffer = new StringBuilder(ITEM_ALLOCATE_SIZE * map.size() * 2);
+        buffer.append('[');
+        boolean first = true;
+        for (Object o : map.entrySet()) {
+            if (first) {
+                first = false;
+            } else {
+                buffer.append(", ");
+            }
+            if (maxSize != -1 && buffer.length() > maxSize) {
+                buffer.append("...");
+                break;
+            }
+            Map.Entry entry = (Map.Entry) o;
+            if (entry.getKey() == map) {
+                buffer.append("(this Map)");
+            } else {
+                buffer.append(format(entry.getKey(), inspect, escapeBackslashes, sizeLeft(maxSize, buffer), safe));
+            }
+            buffer.append(":");
+            if (entry.getValue() == map) {
+                buffer.append("(this Map)");
+            } else {
+                buffer.append(format(entry.getValue(), inspect, escapeBackslashes, sizeLeft(maxSize, buffer), safe));
+            }
+        }
+        buffer.append(']');
+        return buffer.toString();
+    }
+
+    private static int sizeLeft(int maxSize, StringBuilder buffer) {
+        return maxSize == -1 ? maxSize : max(0, maxSize - buffer.length());
+    }
+
+    private static String formatCollection(Collection collection, boolean inspect, boolean escapeBackslashes, int maxSize, boolean safe) {
+        StringBuilder buffer = new StringBuilder(ITEM_ALLOCATE_SIZE * collection.size());
+        buffer.append('[');
+        boolean first = true;
+        for (Object item : collection) {
+            if (first) {
+                first = false;
+            } else {
+                buffer.append(", ");
+            }
+            if (maxSize != -1 && buffer.length() > maxSize) {
+                buffer.append("...");
+                break;
+            }
+            if (item == collection) {
+                buffer.append("(this Collection)");
+            } else {
+                buffer.append(format(item, inspect, escapeBackslashes, sizeLeft(maxSize, buffer), safe));
+            }
+        }
+        buffer.append(']');
+        return buffer.toString();
+    }
+
+    /**
+     * A helper method to format the arguments types as a comma-separated list.
+     *
+     * @param arguments the type to process
+     * @return the string representation of the type
+     */
+    public static String toTypeString(Object[] arguments) {
+        return toTypeString(arguments, -1);
+    }
+
+    /**
+     * A helper method to format the arguments types as a comma-separated list.
+     *
+     * @param arguments the type to process
+     * @param maxSize   stop after approximately this many characters and append '...', -1 means don't stop
+     * @return the string representation of the type
+     */
+    public static String toTypeString(Object[] arguments, int maxSize) {
+        if (arguments == null) {
+            return "null";
+        }
+        if (arguments.length == 0) {
+            return "";
+        }
+        if (maxSize < 0) {
+            return stream(arguments)
+                    .map(arg -> arg != null ? typeName(arg) : "null")
+                    .collect(java.util.stream.Collectors.joining(", "));
+        }
+
+        var plainForm = new StringBuilder();
+        var shortForm = new StringBuilder();
+        for (int i = 0; i < arguments.length; i += 1) {
+            String type = arguments[i] != null ? typeName(arguments[i]) : "null";
+
+            if (plainForm.length() < maxSize) {
+                if (i > 0) plainForm.append(", ");
+                plainForm.append(type);
+            } else if (plainForm.charAt(plainForm.length() - 1) != '.') {
+                plainForm.append("...");
+            }
+
+            if (shortForm.length() < maxSize) {
+                if (i > 0) shortForm.append(", ");
+                String[] tokens = type.split("\\.");
+                for (int j = 0; j < tokens.length - 1; j += 1) {
+                    // GROOVY-11270: reduce "foo.bar.Baz" to "f.b.Baz"
+                    shortForm.appendCodePoint(tokens[j].codePointAt(0)).append('.');
+                }
+                shortForm.append(tokens[tokens.length - 1]);
+            } else {
+                shortForm.append("...");
+                break;
+            }
+        }
+
+        return (plainForm.length() <= maxSize ? plainForm : shortForm).toString();
+    }
+
+    /**
+     * Gets the type name
+     *
+     * @param argument the object to find the type for
+     * @return the type name (slightly pretty format taking into account default imports)
+     */
+    static String typeName(Object argument) {
+        Class<?> aClass = argument.getClass();
+        String pkgName = aClass.getPackage() == null ? "" : aClass.getPackage().getName();
+        boolean useShort = DEFAULT_IMPORT_PKGS.contains(pkgName) || DEFAULT_IMPORT_CLASSES.contains(aClass.getName());
+        return useShort ? aClass.getSimpleName() : aClass.getName();
+    }
+
+    /**
+     * A helper method to return the string representation of a map with bracket boundaries "[" and "]".
+     *
+     * @param arg the map to process
+     * @return the string representation of the map
+     */
+    public static String toMapString(Map arg) {
+        return toMapString(arg, -1);
+    }
+
+    /**
+     * A helper method to return the string representation of a map with bracket boundaries "[" and "]".
+     *
+     * @param arg     the map to process
+     * @param maxSize stop after approximately this many characters and append '...', -1 means don't stop
+     * @return the string representation of the map
+     */
+    public static String toMapString(Map arg, int maxSize) {
+        return formatMap(arg, false, false, maxSize, false);
+    }
+
+    /**
+     * A helper method to return the string representation of a list with bracket boundaries "[" and "]".
+     *
+     * @param arg the collection to process
+     * @return the string representation of the collection
+     */
+    public static String toListString(Collection arg) {
+        return toListString(arg, -1);
+    }
+
+    /**
+     * A helper method to return the string representation of a list with bracket boundaries "[" and "]".
+     *
+     * @param arg     the collection to process
+     * @param maxSize stop after approximately this many characters and append '...'
+     * @return the string representation of the collection
+     */
+    public static String toListString(Collection arg, int maxSize) {
+        return toListString(arg, maxSize, false);
+    }
+
+    /**
+     * A helper method to return the string representation of a list with bracket boundaries "[" and "]".
+     *
+     * @param arg     the collection to process
+     * @param maxSize stop after approximately this many characters and append '...', -1 means don't stop
+     * @param safe    whether to use a default object representation for any item in the collection if an exception occurs when generating its toString
+     * @return the string representation of the collection
+     */
+    public static String toListString(Collection arg, int maxSize, boolean safe) {
+        return formatCollection(arg, false, false, maxSize, safe);
+    }
+
+    /**
+     * A helper method to return the string representation of an array of objects
+     * with brace boundaries "[" and "]".
+     *
+     * @param arguments the array to process
+     * @return the string representation of the array
+     */
+    public static String toArrayString(Object[] arguments) {
+        return toArrayString(arguments, false, false, -1, false);
+    }
+
+    private static String toArrayString(Object[] array, boolean inspect, boolean escapeBackslashes, int maxSize, boolean safe) {
+        if (array == null) {
+            return "null";
+        }
+        boolean first = true;
+        StringBuilder argBuf = new StringBuilder(array.length);
+        argBuf.append('[');
+
+        for (Object item : array) {
+            if (first) {
+                first = false;
+            } else {
+                argBuf.append(", ");
+            }
+            if (maxSize != -1 && argBuf.length() > maxSize) {
+                argBuf.append("...");
+                break;
+            }
+            if (item == array) {
+                argBuf.append("(this array)");
+            } else {
+                argBuf.append(format(item, inspect, escapeBackslashes, sizeLeft(maxSize, argBuf), safe));
+            }
+        }
+        argBuf.append(']');
+        return argBuf.toString();
+    }
+
+    /**
+     * A helper method to return the string representation of an array of objects
+     * with brace boundaries "[" and "]".
+     *
+     * @param arguments the array to process
+     * @param maxSize   stop after approximately this many characters and append '...'
+     * @param safe      whether to use a default object representation for any item in the array if an exception occurs when generating its toString
+     * @return the string representation of the array
+     */
+    public static String toArrayString(Object[] arguments, int maxSize, boolean safe) {
+        return toArrayString(arguments, false, false, maxSize, safe);
+    }
+
+    /**
+     * Writes an object to a Writer using Groovy's default representation for the object.
+     */
+    public static void write(Writer out, Object object) throws IOException {
+        if (object instanceof String) {
+            out.write((String) object);
+        } else if (object instanceof Object[]) {
+            out.write(toArrayString((Object[]) object));
+        } else if (object instanceof Map) {
+            out.write(toMapString((Map) object));
+        } else if (object instanceof Collection) {
+            out.write(toListString((Collection) object));
+        } else if (object instanceof Writable) {
+            Writable writable = (Writable) object;
+            writable.writeTo(out);
+        } else if (object instanceof InputStream || object instanceof Reader) {
+            // Copy stream to stream
+            Reader reader;
+            if (object instanceof InputStream) {
+                reader = new InputStreamReader((InputStream) object);
+            } else {
+                reader = (Reader) object;
+            }
+
+            try (Reader r = reader) {
+                char[] chars = new char[8192];
+                for (int i; (i = r.read(chars)) != -1; ) {
+                    out.write(chars, 0, i);
+                }
+            }
+        } else {
+            out.write(toString(object));
+        }
+    }
+
+    /**
+     * Appends an object to an Appendable using Groovy's default representation for the object.
+     */
+    public static void append(Appendable out, Object object) throws IOException {
+        if (object instanceof String) {
+            out.append((String) object);
+        } else if (object instanceof Object[]) {
+            out.append(toArrayString((Object[]) object));
+        } else if (object instanceof Map) {
+            out.append(toMapString((Map) object));
+        } else if (object instanceof Collection) {
+            out.append(toListString((Collection) object));
+        } else if (object instanceof Writable) {
+            Writable writable = (Writable) object;
+            Writer stringWriter = new StringBuilderWriter();
+            writable.writeTo(stringWriter);
+            out.append(stringWriter.toString());
+        } else if (object instanceof InputStream || object instanceof Reader) {
+            // Copy stream to stream
+            try (Reader reader =
+                         object instanceof InputStream
+                                 ? new InputStreamReader((InputStream) object)
+                                 : (Reader) object) {
+                char[] chars = new char[8192];
+                for (int i; (i = reader.read(chars)) != -1; ) {
+                    for (int j = 0; j < i; j++) {
+                        out.append(chars[j]);
+                    }
+                }
+            }
+        } else {
+            out.append(toString(object));
+        }
+    }
+}
diff --git a/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/GroovydocVisitor.java b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/GroovydocVisitor.java
new file mode 100644
index 00000000000..f8d5a0dcaeb
--- /dev/null
+++ b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/GroovydocVisitor.java
@@ -0,0 +1,394 @@
+/*
+ * Copyright ish group pty ltd 2024.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ *  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.
+ */
+
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+// TODO: Remove after update Groovy v4, this part of code is taken from this version
+package org.apache.groovy.antlr.override;
+
+import groovy.lang.groovydoc.Groovydoc;
+import org.codehaus.groovy.ast.*;
+import org.codehaus.groovy.ast.expr.DeclarationExpression;
+import org.codehaus.groovy.ast.expr.VariableExpression;
+import org.codehaus.groovy.control.ResolveVisitor;
+import org.codehaus.groovy.control.SourceUnit;
+import org.codehaus.groovy.groovydoc.GroovyClassDoc;
+import org.codehaus.groovy.groovydoc.GroovyFieldDoc;
+import org.codehaus.groovy.groovydoc.GroovyMethodDoc;
+import org.codehaus.groovy.tools.groovydoc.*;
+
+import java.lang.reflect.Modifier;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.apache.groovy.antlr.override.RecordTypeASTTransformation.recordNative;
+import static org.codehaus.groovy.transform.trait.Traits.isTrait;
+
+/**
+ * A visitor which collects Groovydoc information.
+ */
+public class GroovydocVisitor extends ClassCodeVisitorSupport {
+    private final SourceUnit unit;
+    private final List<LinkArgument> links;
+    private String packagePath;
+    private SimpleGroovyClassDoc currentClassDoc = null;
+    private Map<String, GroovyClassDoc> classDocs = new HashMap<>();
+    private final Properties properties;
+    private static final String FS = "/";
+
+    public GroovydocVisitor(final SourceUnit unit, String packagePath, List<LinkArgument> links) {
+        this(unit, packagePath, links, new Properties());
+    }
+
+    public GroovydocVisitor(final SourceUnit unit, String packagePath, List<LinkArgument> links, Properties properties) {
+        this.unit = unit;
+        this.packagePath = packagePath;
+        this.links = links;
+        this.properties = properties;
+    }
+
+    @Override
+    protected SourceUnit getSourceUnit() {
+        return unit;
+    }
+
+    @Override
+    public void visitClass(ClassNode node) {
+        final Map<String, String> aliases = new HashMap<>();
+        final List<String> imports = new ArrayList<>();
+        for (ImportNode iNode : node.getModule().getImports()) {
+            String name = iNode.getClassName();
+            imports.add(name.replace('.', '/'));
+            if (iNode.getAlias() != null && !iNode.getAlias().isEmpty()) {
+                aliases.put(iNode.getAlias(), name.replace('.', '/'));
+            }
+        }
+        for (ImportNode iNode : node.getModule().getStarImports()) {
+            String name = iNode.getPackageName()+"*";
+            imports.add(name.replace('.', '/'));
+        }
+        String name = node.getNameWithoutPackage();
+
+        if (node instanceof InnerClassNode) {
+            name = name.replace('$', '.');
+        }
+        currentClassDoc = new SimpleGroovyClassDoc(withDefaultImports(imports), aliases, name, links);
+        if (node.isEnum()) {
+            currentClassDoc.setTokenType(org.codehaus.groovy.tools.groovydoc.SimpleGroovyDoc.ENUM_DEF);
+        } else if (recordNative(node)) { // node is record
+            currentClassDoc.setTokenType(org.apache.groovy.antlr.override.SimpleGroovyDoc.RECORD_DEF);
+        } else if (node.isAnnotationDefinition()) {
+            currentClassDoc.setTokenType(org.codehaus.groovy.tools.groovydoc.SimpleGroovyDoc.ANNOTATION_DEF);
+        } else if (isTrait(node)) {
+            currentClassDoc.setTokenType(org.codehaus.groovy.tools.groovydoc.SimpleGroovyDoc.TRAIT_DEF);
+        } else if (node.isInterface()) {
+            currentClassDoc.setTokenType(org.codehaus.groovy.tools.groovydoc.SimpleGroovyDoc.INTERFACE_DEF);
+        }
+        if (node.isScript()) {
+            if ("false".equals(properties.getProperty("processScripts", "true"))) return;
+            currentClassDoc.setScript(true);
+        }
+        for (ClassNode iface : node.getInterfaces()) {
+            currentClassDoc.addInterfaceName(makeType(iface));
+        }
+        currentClassDoc.setRawCommentText(getDocContent(node.getGroovydoc()));
+        currentClassDoc.setNameWithTypeArgs(name + genericTypesAsString(node.getGenericsTypes()));
+        if (!node.isInterface() && !node.isEnum() && node.getSuperClass() != null) {
+            String superName = makeType(node.getSuperClass());
+            currentClassDoc.setSuperClassName(superName);
+            String superSimpleName = node.getSuperClass().getNameWithoutPackage();
+            if (!classDocs.containsKey(superSimpleName)) {
+                SimpleGroovyClassDoc superDoc = new SimpleGroovyClassDoc(imports, superName);
+                superDoc.setFullPathName(superName);
+            }
+        }
+        processModifiers(currentClassDoc, node, node.getModifiers());
+        processAnnotations(currentClassDoc, node);
+        if (Modifier.isAbstract(node.getModifiers())) {
+            currentClassDoc.setAbstract(true);
+        }
+        currentClassDoc.setFullPathName(packagePath + FS + name);
+        currentClassDoc.setGroovy(true);
+        classDocs.put(currentClassDoc.getFullPathName(), currentClassDoc);
+        super.visitClass(node);
+        SimpleGroovyClassDoc parent = currentClassDoc;
+        if (currentClassDoc.isClass() && currentClassDoc.constructors().length == 0) {
+            // add default no-arg constructor, but not for interfaces, traits, enums, or annotation definitions
+            SimpleGroovyConstructorDoc cons = new SimpleGroovyConstructorDoc(name, currentClassDoc);
+            cons.setPublic(true);
+            currentClassDoc.add(cons);
+        }
+        Iterator<InnerClassNode> innerClasses = node.getInnerClasses();
+        while (innerClasses.hasNext()) {
+            visitClass(innerClasses.next());
+            parent.addNested(currentClassDoc);
+            currentClassDoc = parent;
+        }
+    }
+
+    private List<String> withDefaultImports(List<String> imports) {
+        imports = imports != null ? imports : new ArrayList<>();
+        imports.add(packagePath + "/*");  // everything in this package
+        for (String pkg : ResolveVisitor.DEFAULT_IMPORTS) {
+            imports.add(pkg.replace('.', '/') + "*");
+        }
+        return imports;
+    }
+
+    private static final Pattern JAVADOC_COMMENT_PATTERN = Pattern.compile("(?s)/\\*\\*(.*?)\\*/");
+
+    private String getDocContent(Groovydoc groovydoc) {
+        if (groovydoc == null) return "";
+        String result = groovydoc.getContent();
+        if (result == null) result = "";
+        Matcher m = JAVADOC_COMMENT_PATTERN.matcher(result);
+        if (m.find()) {
+            result = m.group(1).trim();
+        }
+        return result;
+    }
+
+    private void processAnnotations(SimpleGroovyProgramElementDoc element, AnnotatedNode node) {
+        for (AnnotationNode an : node.getAnnotations()) {
+            String name = an.getClassNode().getName();
+            element.addAnnotationRef(new SimpleGroovyAnnotationRef(name, an.getText()));
+        }
+    }
+
+    private void processAnnotations(SimpleGroovyParameter param, AnnotatedNode node) {
+        for (AnnotationNode an : node.getAnnotations()) {
+            String name = an.getClassNode().getName();
+            param.addAnnotationRef(new SimpleGroovyAnnotationRef(name, an.getText()));
+        }
+    }
+
+    @Override
+    public void visitConstructor(ConstructorNode node) {
+        if (node.isSynthetic()) return;
+        SimpleGroovyConstructorDoc cons = new SimpleGroovyConstructorDoc(currentClassDoc.simpleTypeName(), currentClassDoc);
+        setConstructorOrMethodCommon(node, cons);
+        currentClassDoc.add(cons);
+        super.visitConstructor(node);
+    }
+
+    @Override
+    public void visitMethod(MethodNode node) {
+        if (currentClassDoc.isEnum() && "$INIT".equals(node.getName()))
+            return;
+        if (node.isSynthetic()) return;
+        if ("false".equals(properties.getProperty("includeMainForScripts", "true"))
+                && currentClassDoc.isScript() && "main".equals(node.getName()) && node.isStatic() && node.getParameters().length == 1)
+            return;
+
+        SimpleGroovyMethodDoc meth = new SimpleGroovyMethodDoc(node.getName(), currentClassDoc);
+        meth.setReturnType(new SimpleGroovyType(makeType(node.getReturnType())));
+        setConstructorOrMethodCommon(node, meth);
+        currentClassDoc.add(meth);
+        processPropertiesFromGetterSetter(meth);
+        super.visitMethod(node);
+        meth.setTypeParameters(genericTypesAsString(node.getGenericsTypes()));
+    }
+
+    private String genericTypesAsString(GenericsType[] genericsTypes) {
+        if (genericsTypes == null || genericsTypes.length == 0)
+            return "";
+        return "<" + ArrayGroovyMethods.join(genericsTypes, ", ") + ">";
+    }
+
+    private void processPropertiesFromGetterSetter(SimpleGroovyMethodDoc currentMethodDoc) {
+        String methodName = currentMethodDoc.name();
+        int len = methodName.length();
+        String prefix;
+        String propName;
+        if (len > 3 && methodName.startsWith("get")) {
+            prefix = "get";
+            propName = methodName.substring(3);
+        } else if (len > 3 && methodName.startsWith("set")) {
+            prefix = "set";
+            propName = methodName.substring(3);
+        } else if (len > 2 && methodName.startsWith("is")) {
+            prefix = "is";
+            propName = methodName.substring(2);
+        } else {
+            // Not a (get/set/is) method that contains a property name
+            return;
+        }
+
+        for (GroovyFieldDoc field : currentClassDoc.properties()) {
+            if (propName.equals(field.name())) return;
+        }
+        SimpleGroovyClassDoc classDoc = currentClassDoc;
+        // TODO: not sure why but groovy.ui.view.BasicContentPane#buildOutputArea classDoc is null
+        if (classDoc == null) {
+            return;
+        }
+        GroovyMethodDoc[] methods = classDoc.methods();
+
+        //find expected method name
+        String expectedMethodName;
+        if ("set".equals(prefix) && (currentMethodDoc.parameters().length >= 1 && !currentMethodDoc.parameters()[0].typeName().equals("boolean"))) {
+            expectedMethodName = "get" + propName;
+        } else if ("get".equals(prefix) && !currentMethodDoc.returnType().typeName().equals("boolean")) {
+            expectedMethodName = "set" + propName;
+        } else if ("is".equals(prefix)) {
+            expectedMethodName = "set" + propName;
+        } else {
+            expectedMethodName = "is" + propName;
+        }
+
+        for (GroovyMethodDoc methodDoc : methods) {
+            if (methodDoc.name().equals(expectedMethodName)) {
+
+                //extract the field name
+                String fieldName = propName.substring(0, 1).toLowerCase() + propName.substring(1);
+                SimpleGroovyFieldDoc currentFieldDoc = new SimpleGroovyFieldDoc(fieldName, classDoc);
+
+                //find the type of the field; if it's a setter, need to get the type of the params
+                if (expectedMethodName.startsWith("set") && methodDoc.parameters().length >= 1) {
+                    String typeName = methodDoc.parameters()[0].typeName();
+                    currentFieldDoc.setType(new SimpleGroovyType(typeName));
+                } else {
+                    //if it's not setter, get the type info of the return type of the get* method
+                    currentFieldDoc.setType(methodDoc.returnType());
+                }
+
+                if (methodDoc.isPublic() && currentMethodDoc.isPublic()) {
+                    classDoc.addProperty(currentFieldDoc);
+                    break;
+                }
+            }
+        }
+    }
+
+    @Override
+    public void visitProperty(PropertyNode node) {
+        String name = node.getName();
+        SimpleGroovyFieldDoc fieldDoc = new SimpleGroovyFieldDoc(name, currentClassDoc);
+        fieldDoc.setType(new SimpleGroovyType(makeType(node.getType())));
+        int mods = node.getModifiers();
+        if (!hasAnno(node.getField(), "PackageScope")) {
+            processModifiers(fieldDoc, node.getField(), mods);
+            Groovydoc groovydoc = node.getGroovydoc();
+            fieldDoc.setRawCommentText(groovydoc == null ? "" : getDocContent(groovydoc));
+            currentClassDoc.addProperty(fieldDoc);
+        }
+        processAnnotations(fieldDoc, node.getField());
+        super.visitProperty(node);
+    }
+
+    private String makeType(ClassNode node) {
+        final ClassNode cn = node.isArray() ? node.getComponentType() : node;
+        return cn.getName().replace('.', '/').replace('$', '.')
+            + genericTypesAsString(cn.getGenericsTypes())
+            + (node.isArray() ? "[]" : "");
+    }
+
+    @Override
+    public void visitDeclarationExpression(DeclarationExpression expression) {
+        if (currentClassDoc.isScript()) {
+            if (hasAnno(expression, "Field")) {
+                VariableExpression varx = expression.getVariableExpression();
+                SimpleGroovyFieldDoc field = new SimpleGroovyFieldDoc(varx.getName(), currentClassDoc);
+                field.setType(new SimpleGroovyType(makeType(varx.getType())));
+                int mods = varx.getModifiers();
+                processModifiers(field, varx, mods);
+                boolean isProp = (mods & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED)) == 0;
+                if (isProp) {
+                    currentClassDoc.addProperty(field);
+                } else {
+                    currentClassDoc.add(field);
+                }
+            }
+        }
+        super.visitDeclarationExpression(expression);
+    }
+
+    private void processModifiers(SimpleGroovyProgramElementDoc element, AnnotatedNode node, int mods) {
+        if (Modifier.isStatic(mods)) {
+            element.setStatic(true);
+        }
+        if (hasAnno(node, "PackageScope")) {
+            element.setPackagePrivate(true);
+        } else {
+            if (Modifier.isPublic(mods)) {
+                element.setPublic(true);
+            } else if (Modifier.isProtected(mods)) {
+                element.setProtected(true);
+            } else if (Modifier.isPrivate(mods)) {
+                element.setPrivate(true);
+            } else {
+                element.setPackagePrivate(true);
+            }
+        }
+        if (Modifier.isFinal(mods)) {
+            element.setFinal(true);
+        }
+    }
+
+    @Override
+    public void visitField(FieldNode node) {
+        if (node.isSynthetic()) return;
+        String name = node.getName();
+        SimpleGroovyFieldDoc fieldDoc = new SimpleGroovyFieldDoc(name, currentClassDoc);
+        fieldDoc.setType(new SimpleGroovyType(makeType(node.getType())));
+        processModifiers(fieldDoc, node, node.getModifiers());
+        processAnnotations(fieldDoc, node);
+        fieldDoc.setRawCommentText(getDocContent(node.getGroovydoc()));
+        if (node.isEnum()) {
+            currentClassDoc.addEnumConstant(fieldDoc);
+        } else {
+            currentClassDoc.add(fieldDoc);
+        }
+        super.visitField(node);
+    }
+
+    private void setConstructorOrMethodCommon(MethodNode node, SimpleGroovyExecutableMemberDoc methOrCons) {
+        methOrCons.setRawCommentText(getDocContent(node.getGroovydoc()));
+        processModifiers(methOrCons, node, node.getModifiers());
+        processAnnotations(methOrCons, node);
+        if (node.isAbstract()) {
+            methOrCons.setAbstract(true);
+        }
+        for (Parameter param : node.getParameters()) {
+            SimpleGroovyParameter p = new SimpleGroovyParameter(param.getName());
+            p.setType(new SimpleGroovyType(makeType(param.getType())));
+            processAnnotations(p, param);
+            methOrCons.add(p);
+        }
+    }
+
+    private boolean hasAnno(AnnotatedNode node, String annoSuffix) {
+        for (AnnotationNode annotationNode : node.getAnnotations()) {
+            // check name to cover non/resolved cases
+            if (annotationNode.getClassNode().getName().endsWith(annoSuffix)) return true;
+        }
+        return false;
+    }
+
+    public Map<String, GroovyClassDoc> getGroovyClassDocs() {
+        return classDocs;
+    }
+}
diff --git a/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/Opcodes.java b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/Opcodes.java
new file mode 100644
index 00000000000..6528e723451
--- /dev/null
+++ b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/Opcodes.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright ish group pty ltd 2024.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ *  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.
+ */
+
+package org.apache.groovy.antlr.override;
+
+// TODO: Remove after update Groovy v4, this part of code is taken from this version
+
+public class Opcodes {
+
+    public static final int ACC_PUBLIC = 0x0001; // class, field, method;
+    public static final int ACC_PRIVATE = 0x0002; // class, field, method
+    public static final int ACC_PROTECTED = 0x0004; // class, field, method
+}
diff --git a/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/README.md b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/README.md
new file mode 100644
index 00000000000..ba16b94509c
--- /dev/null
+++ b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/README.md
@@ -0,0 +1,21 @@
+GroovyDocVisitor is a special class for Parsing Groovy documents that was introduced in version > 4. 
+
+Since this class is not yet in the version used, it was copied into the project and also included manually.
+
+After updating Groovy > 4, all contents of the package 
+
+`buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override` 
+
+can be removed and standard Document Parsing mechanisms can be used.
+
+// TODO after Groovy update
+
+Change class [DslGroovyRootDocBuilder.groovy](..%2F..%2F..%2F..%2F..%2F..%2Fgroovy%2Fau%2Fcom%2Fish%2Fdocs%2FDslGroovyRootDocBuilder.groovy)
+
+````
+private Map<String, GroovyClassDoc> parseGroovy(String src, String packagePath, String file) {
+    ...
+}
+````
+
+Acourding to https://issues.apache.org/jira/browse/GROOVY-11269
\ No newline at end of file
diff --git a/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/RecordTypeASTTransformation.java b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/RecordTypeASTTransformation.java
new file mode 100644
index 00000000000..f973dca8aa7
--- /dev/null
+++ b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/RecordTypeASTTransformation.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright ish group pty ltd 2024.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ *  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.
+ */
+
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.groovy.antlr.override;
+
+import org.apache.groovy.lang.annotation.Incubating;
+import org.codehaus.groovy.ast.ClassNode;
+import org.codehaus.groovy.control.CompilePhase;
+import org.codehaus.groovy.transform.GroovyASTTransformation;
+
+/**
+ * Handles generation of code for the @RecordType annotation.
+ */
+
+// TODO: Remove after update Groovy v4, this part of code is taken from this version
+
+@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
+public class RecordTypeASTTransformation {
+
+    private static final String RECORD_CLASS_NAME = "java.lang.Record";
+
+    /**
+     * Indicates that the given classnode is a native JVM record class.
+     * For classes being compiled, this will only be valid after the
+     * {@code RecordTypeASTTransformation} transform has been invoked.
+     */
+    @Incubating
+    public static boolean recordNative(final ClassNode node) {
+        return node.getUnresolvedSuperClass() != null && RECORD_CLASS_NAME.equals(node.getUnresolvedSuperClass().getName());
+    }
+
+}
diff --git a/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/SimpleGroovyDoc.java b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/SimpleGroovyDoc.java
new file mode 100644
index 00000000000..b792999d1e6
--- /dev/null
+++ b/buildSrc/apidoc/src/main/java/org/apache/groovy/antlr/override/SimpleGroovyDoc.java
@@ -0,0 +1,17 @@
+/*
+ * Copyright ish group pty ltd 2024.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ *  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.
+ */
+
+package org.apache.groovy.antlr.override;
+
+// TODO: Remove after update Groovy v4, this part of code is taken from this version
+
+public class SimpleGroovyDoc {
+
+    public static final int RECORD_DEF = 16;
+
+}
diff --git a/buildSrc/aql/build.gradle b/buildSrc/aql/build.gradle
index 94b5484ec88..10e701fc5b6 100644
--- a/buildSrc/aql/build.gradle
+++ b/buildSrc/aql/build.gradle
@@ -10,11 +10,16 @@
  */
 
 plugins {
+    id 'java'
     id 'java-gradle-plugin'
     id 'groovy'
     id 'antlr'
 }
 
+java {
+    sourceCompatibility = JavaVersion.VERSION_11
+}
+
 repositories {
     mavenCentral()
 }
@@ -26,5 +31,3 @@ ext {
 dependencies {
     antlr "org.antlr:antlr4:$antlrVersion"
 }
-
-sourceCompatibility = JavaVersion.VERSION_11
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 33989d16b65..f6317caf140 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -9,6 +9,14 @@
  * See the GNU Affero General Public License for more details.
  */
 
+plugins {
+    id 'java'
+}
+
+java {
+    sourceCompatibility = JavaVersion.VERSION_11
+}
+
 repositories {
     mavenCentral()
 }
@@ -18,5 +26,3 @@ subprojects {
         runtimeOnly project(path)
     }
 }
-
-sourceCompatibility = JavaVersion.VERSION_11
diff --git a/buildSrc/swagger/build.gradle b/buildSrc/swagger/build.gradle
index e40119a544a..cd471de1e9b 100644
--- a/buildSrc/swagger/build.gradle
+++ b/buildSrc/swagger/build.gradle
@@ -10,10 +10,15 @@
  */
 
 plugins {
+    id 'java'
     id 'java-gradle-plugin'
     id 'groovy'
 }
 
+java {
+    sourceCompatibility = JavaVersion.VERSION_11
+}
+
 repositories {
     mavenCentral()
 }
@@ -21,5 +26,3 @@ repositories {
 dependencies {
     implementation 'io.swagger:swagger-codegen:2.4.0'
 }
-
-sourceCompatibility = JavaVersion.VERSION_11
diff --git a/buildSrc/testDataset/build.gradle b/buildSrc/testDataset/build.gradle
index 1c594e30e5a..758c79b565e 100644
--- a/buildSrc/testDataset/build.gradle
+++ b/buildSrc/testDataset/build.gradle
@@ -1,9 +1,25 @@
+/*
+ * Copyright ish group pty ltd 2020.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the
+ * GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
 plugins {
     id 'java-gradle-plugin'
     id 'groovy'
     id 'java'
 }
 
+java {
+    sourceCompatibility = JavaVersion.VERSION_11
+    targetCompatibility = JavaVersion.VERSION_11
+}
+
 repositories {
     mavenCentral()
 }
@@ -12,7 +28,4 @@ dependencies {
     implementation 'org.dbunit:dbunit:2.6.0'
     implementation "org.mariadb.jdbc:mariadb-java-client:2.7.4"
     implementation 'commons-io:commons-io:2.11.0'
-}
-
-sourceCompatibility = 11
-targetCompatibility = 11
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/client-html/build.gradle b/client-html/build.gradle
index 5b082dbe480..3e68a61b769 100644
--- a/client-html/build.gradle
+++ b/client-html/build.gradle
@@ -12,11 +12,14 @@ plugins {
 
 apply from: "$rootDir/nodeSetup.gradle"
 
+sourceSets {
+    main.resources.srcDirs 'src/js', 'build/generated-sources/swagger-js', 'build/generated-sources/aql-model', 'build/generated-sources/aql-parser'
+}
 
 task webpack(type: NpmTask, dependsOn: 'queryGrammar') {
     inputs.files("webpack.config.js", "tsconfig.json", "package-lock.json", "package.json", "jest.config.js")
     inputs.dir("src")
-    outputs.dir("$buildDir/assets")
+    outputs.dir("${layout.buildDirectory.get()}/assets")
     inputs.property('version', version)
     npmCommand = ['run']
     args = ['build:prod', "BUILD_NUMBER=${version ?: '99-SNAPSHOT'}"]
@@ -35,7 +38,7 @@ task npm_outdated(type: NpmTask) {
 
 task queryGrammar(type: NpmTask, dependsOn: [':server-api:swagger', 'npmInstall', 'generateQueryLanguageModel']) {
     inputs.dir("$rootDir/buildSrc/aql/src/main/resources/")
-    outputs.dir("$buildDir/generated-sources/aql-parser")
+    outputs.dir("${layout.buildDirectory.get()}/generated-sources/aql-parser")
     npmCommand = ['run']
     args = ['antlr4ts']
 }
@@ -45,21 +48,24 @@ task jest(type: NpmTask, dependsOn: 'queryGrammar') {
     args = ['test']
 }
 
-if("true" != System.getProperty('ish.devMode'))
-    test.dependsOn(jest)
-
-sourceSets {
-    main.resources.srcDirs 'src/js', 'build/generated-sources/swagger-js', 'build/generated-sources/aql-model', 'build/generated-sources/aql-parser'
-}
-
-build.dependsOn(webpack)
-
 generateQueryLanguageModel {
     source = fileTree("$rootDir/types/src/main/groovy")
             .plus(fileTree("$rootDir/types/src/main/java"))
             .plus(fileTree("$rootDir/server/src/main/java"))
 
-    destinationDir = file("$buildDir/generated-sources/aql-model")
+    destinationDir = file("${layout.buildDirectory.get()}/generated-sources/aql-model")
+}
+
+if("true" != System.getProperty('ish.devMode')) {
+    tasks.named('test') {
+        dependsOn jest
+    }
 }
 
-processResources.dependsOn(':server-api:swagger', "generateQueryLanguageModel")
+tasks.named('build') {
+    dependsOn webpack
+}
+
+tasks.named('processResources') {
+    dependsOn(':server-api:swagger', "generateQueryLanguageModel", "queryGrammar")
+}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 2a563242c11..d6e308a6378 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/nodeSetup.gradle b/nodeSetup.gradle
index f9fe775b862..11375b06218 100644
--- a/nodeSetup.gradle
+++ b/nodeSetup.gradle
@@ -1,9 +1,20 @@
+/*
+ * Copyright ish group pty ltd 2020.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the
+ * GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
 apply plugin: 'com.github.node-gradle.node'
 
 node {
     version = '20.16.0'
     download = System.properties['os.name'] != "FreeBSD" // FreeBSD has no binaries this plugin can install
-    workDir = file("${project.buildDir}/nodejs")
+    workDir = file("${layout.buildDirectory.get()}/nodejs")
     npmInstallCommand = System.getenv("CI") ? 'ci' : 'install'
 }
 
diff --git a/selenium-test/build.gradle b/selenium-test/build.gradle
index ae62d45e62f..af9e32dc158 100644
--- a/selenium-test/build.gradle
+++ b/selenium-test/build.gradle
@@ -1,3 +1,14 @@
+/*
+ * Copyright ish group pty ltd 2020.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the
+ * GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
 import test.PrepareTestDatabase
 
 buildscript {
@@ -10,13 +21,15 @@ plugins {
     id 'java'
 }
 
+java {
+    sourceCompatibility = JavaVersion.VERSION_11
+    targetCompatibility = JavaVersion.VERSION_11
+}
+
 repositories {
     mavenCentral()
 }
 
-sourceCompatibility = 11
-targetCompatibility = 11
-
 dependencies {
 
     api(project(':server-api')) {
@@ -49,12 +62,12 @@ task copyConfig(type: Copy) {
         include 'logSetup.xml'
     }
     into "$rootDir/server/build"
-    def dbUrl = project.hasProperty('dbUrl') ? project.getProperty('dbUrl') : 'jdbc:mariadb://localhost/angel_selenium_test?user=root&password=11111111'
+    def dbUrl = project.hasProperty('dbUrl') ? project.getProperty('dbUrl') : 'jdbc:mariadb://localhost/angel_selenium_test'
     expand(dbUrl: dbUrl)
 }
 
 task prepareTestDatabase(type: PrepareTestDatabase) {
-    databaseUrl = project.hasProperty('dbUrl') ? project.getProperty('dbUrl') : 'jdbc:mariadb://localhost/angel_selenium_test?user=root&password=11111111'
+    databaseUrl = project.hasProperty('dbUrl') ? project.getProperty('dbUrl') : 'jdbc:mariadb://localhost/angel_selenium_test'
     dataSetDirectory = "$rootDir/selenium-test/src/test/resources/ish.oncourse.selenium.test"
 }
 
@@ -66,11 +79,14 @@ test {
     jvmArgs = ['-Xmx3000m', '-Xms3000m']
     useJUnitPlatform()
 
-    tasks.getByName('prepareTestDatabase')
+    tasks.named('prepareTestDatabase').get()
             .mustRunAfter(':server:startDaemon')
             .mustRunAfter('copyConfig')
 
     dependsOn "copyConfig"
     dependsOn ":server:startDaemon"
     dependsOn "prepareTestDatabase"
+
+    // ensure tests are always run
+    outputs.upToDateWhen { false }
 }
\ No newline at end of file
diff --git a/server-api/build.gradle b/server-api/build.gradle
index 9d621e142d9..c1c67e24304 100644
--- a/server-api/build.gradle
+++ b/server-api/build.gradle
@@ -9,11 +9,23 @@
  * See the GNU Affero General Public License for more details.
  */
 
-
 plugins {
+    id 'java'
     id 'java-library'
 }
 
+java {
+    sourceCompatibility = JavaVersion.VERSION_11
+}
+
+sourceSets {
+    main {
+        groovy {
+            srcDirs += "${project.projectDir}/build/generated-sources/src/main/groovy"
+        }
+    }
+}
+
 configurations {
     swagger
 }
@@ -23,7 +35,10 @@ sourceSets.main.groovy.srcDir 'src/main/java'
 sourceSets.test.java.srcDirs = []
 sourceSets.test.groovy.srcDir 'src/test/java'
 
-sourceCompatibility = 11
+tasks.withType(GroovyCompile).configureEach {
+    options.incremental = true
+}
+compileGroovy.groovyOptions.configurationScript = file("${rootDir}/gradle/groovyConfig.groovy")
 
 dependencies {
     implementation "org.apache.cayenne:cayenne-server:$cayenneVersion"
@@ -43,23 +58,14 @@ dependencies {
     api "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion"
     api "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonVersion"
 
-    api "io.bootique.jetty:bootique-jetty:$bootiqueVersion"
-}
-
-sourceSets {
-    main {
-        groovy {
-            srcDirs += "${project.projectDir}/build/generated-sources/src/main/groovy"
-        }
+    implementation ("io.bootique.jetty:bootique-jetty:$bootiqueVersion") {
+        exclude group: 'org.eclipse.jetty', module: 'jetty-servlet'
+        exclude group: 'org.eclipse.jetty', module: 'jetty-server'
     }
+    implementation "org.eclipse.jetty:jetty-servlets:$jettyVersion"
+    implementation "org.eclipse.jetty.http2:http2-server:$jettyVersion"
 }
 
-tasks.withType(GroovyCompile).configureEach {
-    options.incremental = true
-}
-compileGroovy.groovyOptions.configurationScript = file("${rootDir}/gradle/groovyConfig.groovy")
-
-
 task swagger (type: Swagger) {
     schema = file("${project.projectDir}/src/main/resources/server-api.yaml")
     sourceFolder = file("${project.projectDir}/src/main/groovy")
@@ -73,7 +79,7 @@ task swagger (type: Swagger) {
 // Some documentation scripts can only work on a single merged swagger file
 task apiDocs_mergeSwagger(type: SwaggerMerge) {
     schema = file("${rootDir}/server-api/src/main/resources/server-api.yaml")
-    outputFile = file("${buildDir}/swagger-merged/swagger.yaml")
+    outputFile = file("${layout.buildDirectory.get()}/swagger-merged/swagger.yaml")
 }
 
 compileGroovy {
@@ -87,9 +93,9 @@ clean.doFirst {
 
 publishing {
     publications {
-        jar(MavenPublication) {
+        create("jar", MavenPublication) {
             from components.java
         }
     }
 
-}
+}
\ No newline at end of file
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/ServerApiModule.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/ServerApiModule.groovy
index f2fff3be056..de4741dcf71 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/ServerApiModule.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/ServerApiModule.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api
 
-import com.google.inject.Binder
+import io.bootique.di.Binder
 import io.bootique.ConfigModule
 import ish.oncourse.server.api.cxf.CXFModule
 import ish.oncourse.server.api.v1.service.*
@@ -21,108 +21,108 @@ class ServerApiModule extends ConfigModule {
 
     @Override
     void configure(Binder binder) {
-        CXFModule.contributeResources(binder).addBinding().to(AccessApi)
-        CXFModule.contributeResources(binder).addBinding().to(AccountApi)
-        CXFModule.contributeResources(binder).addBinding().to(ApplicationApi)
-        CXFModule.contributeResources(binder).addBinding().to(ArticleProductApi)
-        CXFModule.contributeResources(binder).addBinding().to(AssessmentApi)
-        CXFModule.contributeResources(binder).addBinding().to(AssessmentSubmissionApi)
-        CXFModule.contributeResources(binder).addBinding().to(AuditApi)
-        CXFModule.contributeResources(binder).addBinding().to(AuthenticationApi)
-        CXFModule.contributeResources(binder).addBinding().to(AvetmissExportApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(BankingApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(CertificateApi)
-        CXFModule.contributeResources(binder).addBinding().to(ConcessionApi)
-        CXFModule.contributeResources(binder).addBinding().to(ContactApi)
-        CXFModule.contributeResources(binder).addBinding().to(ContactMergeApi)
-        CXFModule.contributeResources(binder).addBinding().to(ContactInsightApi)
-        CXFModule.contributeResources(binder).addBinding().to(ControlApi)
-        CXFModule.contributeResources(binder).addBinding().to(CorporatePassApi)
-        CXFModule.contributeResources(binder).addBinding().to(CourseApi)
-        CXFModule.contributeResources(binder).addBinding().to(CourseClassApi)
-        CXFModule.contributeResources(binder).addBinding().to(FacultyApi)
-        CXFModule.contributeResources(binder).addBinding().to(ExportApi)
-        CXFModule.contributeResources(binder).addBinding().to(CustomFieldApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(DashboardApi)
-        CXFModule.contributeResources(binder).addBinding().to(DataCollectionApi)
-        CXFModule.contributeResources(binder).addBinding().to(DiscountApi)
-        CXFModule.contributeResources(binder).addBinding().to(DocumentApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(EmailTemplateApi)
-        CXFModule.contributeResources(binder).addBinding().to(EnrolmentApi)
-        CXFModule.contributeResources(binder).addBinding().to(EntityApi)
-        CXFModule.contributeResources(binder).addBinding().to(ExportTemplateApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(FilterApi)
-        CXFModule.contributeResources(binder).addBinding().to(FundingContractApi)
-        CXFModule.contributeResources(binder).addBinding().to(FundingUploadApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(GradingApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(HolidayApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(IntegrationApi)
-        CXFModule.contributeResources(binder).addBinding().to(InvoiceApi)
-        CXFModule.contributeResources(binder).addBinding().to(ImportApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(LeadApi)
-        CXFModule.contributeResources(binder).addBinding().to(MessageApi)
-        CXFModule.contributeResources(binder).addBinding().to(MembershipProductApi)
-        CXFModule.contributeResources(binder).addBinding().to(ModuleApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(OutcomeApi)
-        CXFModule.contributeResources(binder).addBinding().to(ReportOverlayApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(PaymentApi)
-        CXFModule.contributeResources(binder).addBinding().to(PaymentInApi)
-        CXFModule.contributeResources(binder).addBinding().to(PaymentOutApi)
-        CXFModule.contributeResources(binder).addBinding().to(PayrollApi)
-        CXFModule.contributeResources(binder).addBinding().to(PayslipApi)
-        CXFModule.contributeResources(binder).addBinding().to(PdfApi)
-        CXFModule.contributeResources(binder).addBinding().to(PdfTemplateApi)
-        CXFModule.contributeResources(binder).addBinding().to(PreferenceApi)
-        CXFModule.contributeResources(binder).addBinding().to(PriorLearningApi)
-        CXFModule.contributeResources(binder).addBinding().to(ProductItemApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(QualificationApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(RoomApi)
-        CXFModule.contributeResources(binder).addBinding().to(RoomValidationApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(ScriptApi)
-        CXFModule.contributeResources(binder).addBinding().to(SiteApi)
-        CXFModule.contributeResources(binder).addBinding().to(SurveyApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(TagApi)
-        CXFModule.contributeResources(binder).addBinding().to(TaxApi)
-        CXFModule.contributeResources(binder).addBinding().to(TransactionApi)
-        CXFModule.contributeResources(binder).addBinding().to(TutorRoleApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(UserApi)
-        CXFModule.contributeResources(binder).addBinding().to(UserPreferenceApi)
-        CXFModule.contributeResources(binder).addBinding().to(UserRoleApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(VoucherProductApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(WaitingListApi)
-
-        CXFModule.contributeResources(binder).addBinding().to(TimetableApi)
-        CXFModule.contributeResources(binder).addBinding().to(FinalisePeriodApi)
-        CXFModule.contributeResources(binder).addBinding().to(NoteApi)
-        CXFModule.contributeResources(binder).addBinding().to(CourseClassTutorApi)
-        CXFModule.contributeResources(binder).addBinding().to(ClassCostApi)
-        CXFModule.contributeResources(binder).addBinding().to(AttendanceApi)
-        CXFModule.contributeResources(binder).addBinding().to(AssessmentClassApi)
-        CXFModule.contributeResources(binder).addBinding().to(SessionApi)
-        CXFModule.contributeResources(binder).addBinding().to(CheckoutApi)
-        CXFModule.contributeResources(binder).addBinding().to(EntityRelationTypeApi)
-        CXFModule.contributeResources(binder).addBinding().to(TokenApi)
-        CXFModule.contributeResources(binder).addBinding().to(LogsApi)
+        CXFModule.contributeResources(binder).add(AccessApi)
+        CXFModule.contributeResources(binder).add(AccountApi)
+        CXFModule.contributeResources(binder).add(ApplicationApi)
+        CXFModule.contributeResources(binder).add(ArticleProductApi)
+        CXFModule.contributeResources(binder).add(AssessmentApi)
+        CXFModule.contributeResources(binder).add(AssessmentSubmissionApi)
+        CXFModule.contributeResources(binder).add(AuditApi)
+        CXFModule.contributeResources(binder).add(AuthenticationApi)
+        CXFModule.contributeResources(binder).add(AvetmissExportApi)
+
+        CXFModule.contributeResources(binder).add(BankingApi)
+
+        CXFModule.contributeResources(binder).add(CertificateApi)
+        CXFModule.contributeResources(binder).add(ConcessionApi)
+        CXFModule.contributeResources(binder).add(ContactApi)
+        CXFModule.contributeResources(binder).add(ContactMergeApi)
+        CXFModule.contributeResources(binder).add(ContactInsightApi)
+        CXFModule.contributeResources(binder).add(ControlApi)
+        CXFModule.contributeResources(binder).add(CorporatePassApi)
+        CXFModule.contributeResources(binder).add(CourseApi)
+        CXFModule.contributeResources(binder).add(CourseClassApi)
+        CXFModule.contributeResources(binder).add(FacultyApi)
+        CXFModule.contributeResources(binder).add(ExportApi)
+        CXFModule.contributeResources(binder).add(CustomFieldApi)
+
+        CXFModule.contributeResources(binder).add(DashboardApi)
+        CXFModule.contributeResources(binder).add(DataCollectionApi)
+        CXFModule.contributeResources(binder).add(DiscountApi)
+        CXFModule.contributeResources(binder).add(DocumentApi)
+
+        CXFModule.contributeResources(binder).add(EmailTemplateApi)
+        CXFModule.contributeResources(binder).add(EnrolmentApi)
+        CXFModule.contributeResources(binder).add(EntityApi)
+        CXFModule.contributeResources(binder).add(ExportTemplateApi)
+
+        CXFModule.contributeResources(binder).add(FilterApi)
+        CXFModule.contributeResources(binder).add(FundingContractApi)
+        CXFModule.contributeResources(binder).add(FundingUploadApi)
+
+        CXFModule.contributeResources(binder).add(GradingApi)
+
+        CXFModule.contributeResources(binder).add(HolidayApi)
+
+        CXFModule.contributeResources(binder).add(IntegrationApi)
+        CXFModule.contributeResources(binder).add(InvoiceApi)
+        CXFModule.contributeResources(binder).add(ImportApi)
+
+        CXFModule.contributeResources(binder).add(LeadApi)
+        CXFModule.contributeResources(binder).add(MessageApi)
+        CXFModule.contributeResources(binder).add(MembershipProductApi)
+        CXFModule.contributeResources(binder).add(ModuleApi)
+
+        CXFModule.contributeResources(binder).add(OutcomeApi)
+        CXFModule.contributeResources(binder).add(ReportOverlayApi)
+
+        CXFModule.contributeResources(binder).add(PaymentApi)
+        CXFModule.contributeResources(binder).add(PaymentInApi)
+        CXFModule.contributeResources(binder).add(PaymentOutApi)
+        CXFModule.contributeResources(binder).add(PayrollApi)
+        CXFModule.contributeResources(binder).add(PayslipApi)
+        CXFModule.contributeResources(binder).add(PdfApi)
+        CXFModule.contributeResources(binder).add(PdfTemplateApi)
+        CXFModule.contributeResources(binder).add(PreferenceApi)
+        CXFModule.contributeResources(binder).add(PriorLearningApi)
+        CXFModule.contributeResources(binder).add(ProductItemApi)
+
+        CXFModule.contributeResources(binder).add(QualificationApi)
+
+        CXFModule.contributeResources(binder).add(RoomApi)
+        CXFModule.contributeResources(binder).add(RoomValidationApi)
+
+        CXFModule.contributeResources(binder).add(ScriptApi)
+        CXFModule.contributeResources(binder).add(SiteApi)
+        CXFModule.contributeResources(binder).add(SurveyApi)
+
+        CXFModule.contributeResources(binder).add(TagApi)
+        CXFModule.contributeResources(binder).add(TaxApi)
+        CXFModule.contributeResources(binder).add(TransactionApi)
+        CXFModule.contributeResources(binder).add(TutorRoleApi)
+
+        CXFModule.contributeResources(binder).add(UserApi)
+        CXFModule.contributeResources(binder).add(UserPreferenceApi)
+        CXFModule.contributeResources(binder).add(UserRoleApi)
+
+        CXFModule.contributeResources(binder).add(VoucherProductApi)
+
+        CXFModule.contributeResources(binder).add(WaitingListApi)
+
+        CXFModule.contributeResources(binder).add(TimetableApi)
+        CXFModule.contributeResources(binder).add(FinalisePeriodApi)
+        CXFModule.contributeResources(binder).add(NoteApi)
+        CXFModule.contributeResources(binder).add(CourseClassTutorApi)
+        CXFModule.contributeResources(binder).add(ClassCostApi)
+        CXFModule.contributeResources(binder).add(AttendanceApi)
+        CXFModule.contributeResources(binder).add(AssessmentClassApi)
+        CXFModule.contributeResources(binder).add(SessionApi)
+        CXFModule.contributeResources(binder).add(CheckoutApi)
+        CXFModule.contributeResources(binder).add(EntityRelationTypeApi)
+        CXFModule.contributeResources(binder).add(TokenApi)
+        CXFModule.contributeResources(binder).add(LogsApi)
 
         //------
-        CXFModule.contributeFeatures(binder).addBinding().to(JAXRSBeanValidationFeature)
+        CXFModule.contributeFeatures(binder).add(JAXRSBeanValidationFeature)
     }
 }
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFApplication.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFApplication.groovy
index cd92ab77454..94e284523fc 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFApplication.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFApplication.groovy
@@ -13,20 +13,15 @@ package ish.oncourse.server.api.cxf
 
 import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider
 import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
-import org.apache.cxf.jaxrs.provider.JavaTimeTypesParamConverterProvider
 
 import javax.ws.rs.core.Application
 
-/**
- * Created by akoira on 2/5/17.
- */
 class CXFApplication extends Application{
 
     private Set<Object> singletons = new HashSet<>()
     private Set<Class> classes = new HashSet<>()
     private Map<String, Object> props = new HashMap<>()
 
-
     CXFApplication(Set<Object> resources, Set<Object> features, Map<String, String> props) {
         singletons.addAll(resources)
         singletons.addAll(features)
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFDefaultService.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFDefaultService.groovy
index 0ca1fa14420..cc209a5efda 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFDefaultService.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFDefaultService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.cxf
 
-import com.google.inject.Inject
+import javax.inject.Inject
 
 import javax.ws.rs.GET
 import javax.ws.rs.Path
@@ -19,6 +19,7 @@ import javax.ws.rs.Produces
 import javax.ws.rs.core.MediaType
 
 class CXFDefaultService {
+
     private CXFModuleConfig config
 
     @Inject
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFFeature.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFFeature.groovy
index b49c21f49fa..b65280a15ec 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFFeature.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFFeature.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.cxf
 
-import com.google.inject.BindingAnnotation
+import javax.inject.Qualifier
 
 import java.lang.annotation.ElementType
 import java.lang.annotation.Retention
@@ -20,7 +20,7 @@ import java.lang.annotation.Target
 
 @Target([ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD])
 @Retention(RetentionPolicy.RUNTIME)
-@BindingAnnotation
+@Qualifier
 @interface CXFFeature {
 
 }
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModule.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModule.groovy
index 67508fb4558..78e18e60dec 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModule.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModule.groovy
@@ -11,13 +11,13 @@
 
 package ish.oncourse.server.api.cxf
 
-import com.google.inject.Binder
-import com.google.inject.Key
-import com.google.inject.Provides
-import com.google.inject.Singleton
-import com.google.inject.multibindings.Multibinder
 import io.bootique.ConfigModule
 import io.bootique.config.ConfigurationFactory
+import io.bootique.di.Binder
+import io.bootique.di.Key
+import io.bootique.di.Provides
+import io.bootique.di.SetBuilder
+import javax.inject.Singleton
 import io.bootique.jetty.JettyModule
 import io.bootique.jetty.MappedServlet
 import org.apache.cxf.interceptor.LoggingInInterceptor
@@ -27,18 +27,18 @@ import javax.ws.rs.core.Application
 
 class CXFModule extends ConfigModule {
 
-    static Multibinder<Object> contributeResources(Binder binder) {
-        return Multibinder.newSetBinder(binder, Key.get(Object.class, CXFResource))
+    static SetBuilder<Object> contributeResources(Binder binder) {
+        return binder.bindSet(Object.class, CXFResource.class)
     }
 
-    static Multibinder<Object> contributeFeatures(Binder binder) {
-        return Multibinder.newSetBinder(binder, Key.get(Object.class, CXFFeature))
+    static SetBuilder<Object> contributeFeatures(Binder binder) {
+        return binder.bindSet(Object.class, CXFFeature.class)
     }
 
     @Override
     void configure(Binder binder) {
         JettyModule.extend(binder).addMappedServlet(Key.get(MappedServlet, CXFServlet))
-        contributeResources(binder).addBinding().to(CXFDefaultService)
+        contributeResources(binder).add(CXFDefaultService)
     }
 
     @CXFServlet
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModuleConfig.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModuleConfig.groovy
index 7a122ee4f45..310e02a5f83 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModuleConfig.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModuleConfig.groovy
@@ -16,10 +16,10 @@ import io.bootique.annotation.BQConfigProperty
 
 @BQConfig("Configures the servlet that is an entry point to CXF REST API engine.")
 class CXFModuleConfig {
+
     private String urlPattern
     private String welcomeText
 
-
     @BQConfigProperty
     void setUrlPattern(String urlPattern) {
         this.urlPattern = urlPattern
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModuleProvider.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModuleProvider.groovy
index 8fbed6fd14a..2a6d68026ff 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModuleProvider.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFModuleProvider.groovy
@@ -11,15 +11,13 @@
 
 package ish.oncourse.server.api.cxf
 
-import com.google.inject.Module
+import io.bootique.di.BQModule
 import io.bootique.BQModuleProvider
 
-/**
- * Created by akoira on 2/5/17.
- */
 class CXFModuleProvider implements BQModuleProvider {
+
     @Override
-    Module module() {
+    BQModule module() {
         return new CXFModule()
     }
 
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFResource.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFResource.groovy
index ec8203006bd..49027d56e16 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFResource.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFResource.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.cxf
 
-import com.google.inject.BindingAnnotation
+import javax.inject.Qualifier
 
 import java.lang.annotation.ElementType
 import java.lang.annotation.Retention
@@ -20,6 +20,6 @@ import java.lang.annotation.Target
 
 @Target([ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD])
 @Retention(RetentionPolicy.RUNTIME)
-@BindingAnnotation
+@Qualifier
 @interface CXFResource {
 }
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFServlet.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFServlet.groovy
index 154af5da2fe..be52b3b9008 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFServlet.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/CXFServlet.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.cxf
 
-import com.google.inject.BindingAnnotation
+import javax.inject.Qualifier
 
 import java.lang.annotation.ElementType
 import java.lang.annotation.Retention
@@ -20,6 +20,6 @@ import java.lang.annotation.Target
 
 @Target([ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD])
 @Retention(RetentionPolicy.RUNTIME)
-@BindingAnnotation
+@Qualifier
 @interface CXFServlet {
 }
diff --git a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/ObjectMapperContextResolver.groovy b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/ObjectMapperContextResolver.groovy
index 2294ed82ab5..95a0c07f533 100644
--- a/server-api/src/main/groovy/ish/oncourse/server/api/cxf/ObjectMapperContextResolver.groovy
+++ b/server-api/src/main/groovy/ish/oncourse/server/api/cxf/ObjectMapperContextResolver.groovy
@@ -8,20 +8,14 @@
 
 package ish.oncourse.server.api.cxf
 
-import com.fasterxml.jackson.annotation.JsonInclude
-import com.fasterxml.jackson.databind.MapperFeature
 import com.fasterxml.jackson.databind.ObjectMapper
-import com.fasterxml.jackson.databind.SerializationConfig
 import com.fasterxml.jackson.databind.SerializationFeature
-import com.fasterxml.jackson.databind.annotation.JsonSerialize
-import com.fasterxml.jackson.datatype.jdk8.Jdk8Module
-import com.fasterxml.jackson.datatype.jsr310.JSR310Module
 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 javax.ws.rs.Produces
+import javax.ws.rs.core.MediaType
+import javax.ws.rs.ext.ContextResolver
+import javax.ws.rs.ext.Provider
 
 /**
  * 
@@ -30,7 +24,6 @@ import javax.ws.rs.ext.Provider;
  * The reason of ObjectMapperContextResolver class - register JavaTimeModule only
  * For usage see ish.oncourse.server.api.v1.service.impl.PreferenceApiImpl.getLockedDate()
  */
-
 @Provider
 @Produces(MediaType.APPLICATION_JSON)
 class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
diff --git a/server-api/src/main/java/ish/oncourse/types/AuditAction.java b/server-api/src/main/java/ish/oncourse/types/AuditAction.java
index dcdbe9d8edf..6b5b778a45a 100644
--- a/server-api/src/main/java/ish/oncourse/types/AuditAction.java
+++ b/server-api/src/main/java/ish/oncourse/types/AuditAction.java
@@ -62,9 +62,8 @@ public enum AuditAction implements DisplayableExtendedEnumeration<String> {
     @API
     API_TOKEN("API_TOKEN", "Api token used");
     
-    
-    private String displayValue;
-    private String value;
+    private final String displayValue;
+    private final String value;
 
     AuditAction(String value, String displayValue) {
         this.value = value;
diff --git a/server-api/src/main/java/ish/oncourse/types/FundingStatus.java b/server-api/src/main/java/ish/oncourse/types/FundingStatus.java
index 44578717ccc..2c1ca838732 100644
--- a/server-api/src/main/java/ish/oncourse/types/FundingStatus.java
+++ b/server-api/src/main/java/ish/oncourse/types/FundingStatus.java
@@ -41,8 +41,8 @@ public enum FundingStatus implements DisplayableExtendedEnumeration<Integer> {
     @API
     FAILED(2, "failed");
 
-    private String displayValue;
-    private int value;
+    private final String displayValue;
+    private final int value;
 
     FundingStatus(int value, String displayValue) {
         this.value = value;
diff --git a/server-api/src/main/java/ish/oncourse/types/OutputType.java b/server-api/src/main/java/ish/oncourse/types/OutputType.java
index 983b1556c9b..dbb89cc44fc 100644
--- a/server-api/src/main/java/ish/oncourse/types/OutputType.java
+++ b/server-api/src/main/java/ish/oncourse/types/OutputType.java
@@ -67,11 +67,11 @@ public enum OutputType implements DisplayableExtendedEnumeration<Integer> {
      */
     @API
     PDF(5, "pdf", "application/pdf", "pdf");
-    private Integer value;
-    private String displayValue;
-    private String mimeType;
-    private String fileExtension;
 
+    private final Integer value;
+    private final String displayValue;
+    private final String mimeType;
+    private final String fileExtension;
 
     OutputType(Integer value, String displayValue, String mimeType, String fileExtension) {
         this.value = value;
@@ -80,7 +80,6 @@ public enum OutputType implements DisplayableExtendedEnumeration<Integer> {
         this.fileExtension = fileExtension;
     }
 
-
     public String getMimeType() {
         return mimeType;
     }
diff --git a/server-api/src/main/java/ish/oncourse/types/Severity.java b/server-api/src/main/java/ish/oncourse/types/Severity.java
index a62bc398120..ea6547cf05a 100644
--- a/server-api/src/main/java/ish/oncourse/types/Severity.java
+++ b/server-api/src/main/java/ish/oncourse/types/Severity.java
@@ -65,7 +65,7 @@ public enum Severity {
 	@API
 	SETUP(80);
 
-	private int level;
+	private final int level;
 
 	Severity(int level) {
 		this.level = level;
diff --git a/server-api/src/main/java/ish/oncourse/types/WorkingWithChildrenStatus.java b/server-api/src/main/java/ish/oncourse/types/WorkingWithChildrenStatus.java
index 5c55bd3f15b..321f59e7e08 100644
--- a/server-api/src/main/java/ish/oncourse/types/WorkingWithChildrenStatus.java
+++ b/server-api/src/main/java/ish/oncourse/types/WorkingWithChildrenStatus.java
@@ -51,8 +51,8 @@ public enum WorkingWithChildrenStatus implements DisplayableExtendedEnumeration<
 	@API
 	INTERIM_BARRED(4, "Interim barred");
 
-	private int value;
-	private String displayName;
+	private final int value;
+	private final String displayName;
 
 	WorkingWithChildrenStatus(int value, String displayName) {
 		this.value = value;
diff --git a/server-api/src/main/java/ish/util/LocalDateUtils.java b/server-api/src/main/java/ish/util/LocalDateUtils.java
index fc2ce555c69..2f39e432457 100644
--- a/server-api/src/main/java/ish/util/LocalDateUtils.java
+++ b/server-api/src/main/java/ish/util/LocalDateUtils.java
@@ -29,8 +29,6 @@ public class LocalDateUtils {
 	public static final String DATE_PATTERN ="yyyy-MM-dd";
 	public static final String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
 
-	 ;
-
 	public static final ZoneId UTC = ZoneId.of("UTC");
 
 	/**
@@ -66,7 +64,6 @@ public static LocalDate stringToValue(String stringValue, DateTimeFormatter cust
 		return LocalDate.parse(stringValue, customFormatter);
 	}
 
-
 	public static String valueToString(LocalDate localDate) {
 		return DATE_FORMAT.format(localDate);
 	}
diff --git a/server/build.gradle b/server/build.gradle
index 83991e6cc37..7e2934d7ffd 100644
--- a/server/build.gradle
+++ b/server/build.gradle
@@ -15,17 +15,27 @@ import com.github.psxpaul.task.JavaExecFork
 import java.security.MessageDigest
 
 plugins {
+	id 'java'
 	id 'apidoc'
 	id 'org.apache.cayenne'
 	id 'application'
 	id 'com.github.psxpaul.execfork'
 }
 
+def DEV_MODE_PROPERTY = "ish.devMode"
+
+java {
+	sourceCompatibility = JavaVersion.VERSION_11
+}
+
 configurations {
 	// exclude these here since they are pulled in in various ways
 	all*.exclude group: "org.slf4j", module: "slf4j-simple"
 	all*.exclude module: "hessian"
 }
+
+compileGroovy.groovyOptions.configurationScript = file("${rootDir}/gradle/groovyConfig.groovy")
+
 sourceSets {
 	main {
 		groovy {
@@ -44,17 +54,31 @@ sourceSets {
 	}
 }
 
+project.ext {
+	appName = "onCourseServer"
+}
+
+application {
+	mainClass.set('ish.oncourse.server.AngelServer')
+	applicationDefaultJvmArgs = ['-Xmx1024m', '-XX:+HeapDumpOnOutOfMemoryError']
+}
+
 dependencies {
 	api project(":types")
 	api project(':server-api')
 
-	implementation "io.bootique.jetty:bootique-jetty:$bootiqueVersion"
+	implementation ("io.bootique.jetty:bootique-jetty:$bootiqueVersion") {
+		exclude group: 'org.eclipse.jetty', module: 'jetty-servlet'
+		exclude group: 'org.eclipse.jetty', module: 'jetty-server'
+	}
+
 	implementation "io.bootique.cayenne:bootique-cayenne:$bootiqueVersion"
 	implementation "io.bootique.jdbc:bootique-jdbc-hikaricp:$bootiqueVersion"
 
 	api ("org.apache.cxf:cxf-rt-frontend-jaxws:$cfxVersion") {
 		exclude group: 'org.apache.geronimo.specs', module: 'geronimo-javamail_1.4_spec'
 	}
+
 	api 'javax.xml.bind:jaxb-api:2.3.0'
 	api 'javax.xml.ws:jaxws-api:2.3.0'
 
@@ -114,7 +138,6 @@ dependencies {
 	implementation 'commons-io:commons-io:2.6'
 	implementation 'org.apache.commons:commons-collections4:4.1'
 	implementation 'org.reflections:reflections:0.9.12'
-	api "com.google.inject:guice:$googleGuiceVersion"
 
 	implementation 'net.sf.supercsv:super-csv:2.4.0'
 	implementation 'net.sf.supercsv:super-csv-java8:2.4.0'
@@ -139,6 +162,12 @@ dependencies {
 
 	implementation 'com.chargebee:chargebee-java:3.19.0'
 
+	implementation('com.google.guava:guava:33.1.0-jre') {
+		attributes {
+			attribute(Attribute.of("org.gradle.jvm.environment", String), "standard-jvm")
+		}
+	}
+
 	testImplementation "org.apache.cayenne:cayenne-dbsync:$cayenneVersion"
 	testImplementation 'org.mockito:mockito-core:2.18.3'
 	testImplementation 'commons-dbcp:commons-dbcp:1.4'
@@ -147,21 +176,6 @@ dependencies {
 	testImplementation "io.bootique:bootique-test:$bootiqueVersion"
 }
 
-sourceCompatibility = JavaVersion.VERSION_11
-
-project.ext {
-	appName = "onCourseServer"
-}
-
-def DEV_MODE_PROPERTY = "ish.devMode"
-
-application {
-	mainClass.set('ish.oncourse.server.AngelServer')
-	applicationDefaultJvmArgs = ['-Xmx1024m', '-XX:+HeapDumpOnOutOfMemoryError']
-}
-
-compileGroovy.groovyOptions.configurationScript = file("${rootDir}/gradle/groovyConfig.groovy")
-
 jar {
 	manifest {
 		from sharedManifest
@@ -170,6 +184,7 @@ jar {
 	}
 
 	archiveFileName = 'onCourseServer.jar'
+	dependsOn "copyWebApp"
 }
 
 task expandTestConfig(type: Copy) {
@@ -230,7 +245,7 @@ task startDaemon(dependsOn: [classes], type: JavaExecFork) {
 	main = 'ish.oncourse.server.AngelServer'
 	args = ['DEBUG=true', 'REPLICATION_DISABLED=true']
 	jvmArgs = ['-Xmx2048m', '-XX:+HeapDumpOnOutOfMemoryError']
-	workingDir = "$buildDir"
+	workingDir = "${layout.buildDirectory.get()}"
 	waitForOutput = 'Server ready for client connections'
 	timeout = 60 * 3
 }
@@ -271,8 +286,6 @@ task addVersion {
 	}
 }
 
-distZip.dependsOn(copyWebApp,addVersion)
-
 task createChecksums(dependsOn: distZip) {
 	inputs.files(distZip.outputs.files)
 	outputs.files(inputs.files.collect({ it.path + ".sha256"}))
@@ -287,29 +300,19 @@ task createChecksums(dependsOn: distZip) {
 		}
 	}
 }
-distZip.finalizedBy(createChecksums)
-
-distributions {
-	main {
-		distributionBaseName = 'onCourseServer'
-		contents {
-			from "src/packaging/"
-			from addVersion.outputs.files
-		}
-	}
-}
 
 // DSL asciidoc documentation
 dslDocs {
 	source = sourceSets.main.groovy.plus(project(':types').sourceSets.main.groovy).plus(project(':server-api').sourceSets.main.groovy)
-	destinationDir = file("${buildDir}/distributions/dsldoc")
+	destinationDir = file("${project.layout.buildDirectory.get()}/distributions/dsldoc")
 }
+
 task packageDslDoc(type: Zip) {
-	from file("${buildDir}/distributions/dsldoc")
+	from file("${layout.buildDirectory.get()}/distributions/dsldoc")
 	archiveClassifier = 'documentation'
 	archiveBaseName = "dsl"
-	tasks.getByName('dslDocs').mustRunAfter(tasks.getByName('classes'))
-	dependsOn tasks.getByName('classes'),tasks.getByName('dslDocs')
+	tasks.named('dslDocs').get().mustRunAfter(tasks.named('classes').get())
+	dependsOn tasks.named('classes').get(), tasks.named('dslDocs').get()
 }
 
 task testJar(type: Jar) {
@@ -317,35 +320,8 @@ task testJar(type: Jar) {
 	from sourceSets.test.output
 }
 
-
-// "gradlew publishToMavenLocal" if you want to publish this to your local .m2 folder
-publishing {
-	publications {
-		dsldocs(MavenPublication) {
-			artifact (packageDslDoc) {
-				artifactId "dsldocs"
-			}
-		}
-		jar(MavenPublication) {
-			from components.java
-			artifactId 'server-jar'
-		}
-		test(MavenPublication) {
-			artifact (testJar) {
-				artifactId "test"
-			}
-		}
-		executables(MavenPublication) {
-			artifact(distZip) {
-				classifier "executable"
-				extension "zip"
-			}
-		}
-	}
-}
-
 task queryGrammar(type: Aql) {
-	outputDir = file("${buildDir}/generated-resources/antlr/java/ish/oncourse/aql/impl")
+	outputDir = file("${project.layout.buildDirectory.get()}/generated-resources/antlr/java/ish/oncourse/aql/impl")
 	packageDir = 'ish.oncourse.aql.impl'
 	target = 'Java'
 }
@@ -358,15 +334,22 @@ cgen {
 	superTemplate = "${projectDir}/src/main/resources/cayenne/dotemplates/superclass.vm"
 	mode = 'entity'
 	superPkg = 'ish.oncourse.server.cayenne.glue'
-	destDir = file("${buildDir}/generated-resources/cayenne/java")
+	destDir = file("${layout.buildDirectory.get()}/generated-resources/cayenne/java")
 	doLast {
 		// remove subclass files which are already committed inside the app
-		delete fileTree("${buildDir}/generated-resources/cayenne/java/ish/oncourse/server/cayenne") {
+		delete fileTree("${layout.buildDirectory.get()}/generated-resources/cayenne/java/ish/oncourse/server/cayenne") {
 			exclude '**/glue/*'
 		}
 	}
 }
 
+distZip.dependsOn(copyWebApp, addVersion)
+distZip.finalizedBy(createChecksums)
+
+compileGroovy.mustRunAfter(":api-test:copyConfig")
+compileGroovy.mustRunAfter(":selenium-test:copyConfig")
+compileTestGroovy.dependsOn(copyWebApp)
+
 compileJava {
 	dependsOn queryGrammar, cgen
 	if(project.hasProperty(DEV_MODE_PROPERTY) && project.property(DEV_MODE_PROPERTY) == "true"){
@@ -374,13 +357,48 @@ compileJava {
 	}
 }
 
+distributions {
+	main {
+		distributionBaseName = 'onCourseServer'
+		contents {
+			from "src/packaging/"
+			from addVersion.outputs.files
+		}
+	}
+}
+
+// "gradlew publishToMavenLocal" if you want to publish this to your local .m2 folder
+publishing {
+	publications {
+		create("dsldocs", MavenPublication) {
+			artifact(packageDslDoc) {
+				artifactId = "dsldocs"
+			}
+		}
+		create("jar", MavenPublication) {
+			from components.java
+			artifactId = 'server-jar'
+		}
+		create("test", MavenPublication) {
+			artifact(testJar) {
+				artifactId = "test"
+			}
+		}
+		create("executables", MavenPublication) {
+			artifact(distZip) {
+				classifier = "executable"
+				extension = "zip"
+			}
+		}
+	}
+}
+
 task runServer(dependsOn: [classes], type: JavaExec) {
 	if(project.hasProperty(DEV_MODE_PROPERTY)) {
 		systemProperty DEV_MODE_PROPERTY, project.property(DEV_MODE_PROPERTY)
 	}
 	classpath = sourceSets.main.runtimeClasspath
-	main = 'ish.oncourse.server.AngelServer'
+	mainClass = 'ish.oncourse.server.AngelServer'
 	args = ['DEBUG=true', 'REPLICATION_DISABLED=true', 'disableReplication=true']
 	jvmArgs = ['-Xmx1024m', '-XX:+HeapDumpOnOutOfMemoryError']
 }
-
diff --git a/server/src/main/groovy/ish/oncourse/server/AuditListener.groovy b/server/src/main/groovy/ish/oncourse/server/AuditListener.groovy
index 719fed2c0d2..6e3196890d7 100644
--- a/server/src/main/groovy/ish/oncourse/server/AuditListener.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/AuditListener.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.cayenne.glue.CayenneDataObject
 import ish.oncourse.server.services.AuditService
 import ish.oncourse.types.AuditAction
diff --git a/server/src/main/groovy/ish/oncourse/server/accounting/AccountTransactionService.groovy b/server/src/main/groovy/ish/oncourse/server/accounting/AccountTransactionService.groovy
index e0b1561da93..e960dd202e3 100644
--- a/server/src/main/groovy/ish/oncourse/server/accounting/AccountTransactionService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/accounting/AccountTransactionService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.accounting
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.AccountTransactionType
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.accounting.builder.JournalTransactionsBuilder
diff --git a/server/src/main/groovy/ish/oncourse/server/api/dao/AssessmentClassDao.groovy b/server/src/main/groovy/ish/oncourse/server/api/dao/AssessmentClassDao.groovy
index 2eb3d83cf95..eefe63d7a17 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/dao/AssessmentClassDao.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/dao/AssessmentClassDao.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.dao
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.cayenne.Assessment
 import ish.oncourse.server.cayenne.AssessmentClass
diff --git a/server/src/main/groovy/ish/oncourse/server/api/dao/ClassCostDao.groovy b/server/src/main/groovy/ish/oncourse/server/api/dao/ClassCostDao.groovy
index 8d4cf3c0aa0..fda424ea81e 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/dao/ClassCostDao.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/dao/ClassCostDao.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.dao
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.ClassCostFlowType
 import ish.common.types.ClassCostRepetitionType
 import ish.math.Money
diff --git a/server/src/main/groovy/ish/oncourse/server/api/dao/CourseClassDao.groovy b/server/src/main/groovy/ish/oncourse/server/api/dao/CourseClassDao.groovy
index ec74b6897c5..a6948471d93 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/dao/CourseClassDao.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/dao/CourseClassDao.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.dao
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.EnrolmentStatus
 import ish.math.Money
 import ish.oncourse.server.CayenneService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/dao/FundingSourceDao.groovy b/server/src/main/groovy/ish/oncourse/server/api/dao/FundingSourceDao.groovy
index 676aa1ce5f4..59fb3a51fe8 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/dao/FundingSourceDao.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/dao/FundingSourceDao.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.dao
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.FundingSource
 import org.apache.cayenne.ObjectContext
diff --git a/server/src/main/groovy/ish/oncourse/server/api/dao/PaymentInDao.groovy b/server/src/main/groovy/ish/oncourse/server/api/dao/PaymentInDao.groovy
index 575d0ccf1ea..498e189e9ca 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/dao/PaymentInDao.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/dao/PaymentInDao.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.dao
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.PaymentStatus
 import ish.common.types.PaymentType
 import ish.math.Money
@@ -20,7 +20,6 @@ import ish.oncourse.server.cayenne.Contact
 import ish.oncourse.server.cayenne.PaymentIn
 import ish.oncourse.server.cayenne.PaymentMethod
 import org.apache.cayenne.ObjectContext
-import org.apache.cayenne.exp.Expression
 import org.apache.cayenne.query.ObjectSelect
 import org.apache.cayenne.query.SelectById
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/dao/ReportDao.groovy b/server/src/main/groovy/ish/oncourse/server/api/dao/ReportDao.groovy
index f947c8050be..df61ab191bc 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/dao/ReportDao.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/dao/ReportDao.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.dao
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.AutomationStatus
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.api.v1.function.export.ExportFunctions
diff --git a/server/src/main/groovy/ish/oncourse/server/api/dao/ReportOverlayDao.groovy b/server/src/main/groovy/ish/oncourse/server/api/dao/ReportOverlayDao.groovy
index 7598004808b..7a85cd38068 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/dao/ReportOverlayDao.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/dao/ReportOverlayDao.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.dao
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.cayenne.ReportOverlay
 import org.apache.cayenne.ObjectContext
diff --git a/server/src/main/groovy/ish/oncourse/server/api/dao/SessionDao.groovy b/server/src/main/groovy/ish/oncourse/server/api/dao/SessionDao.groovy
index 105fd72aead..9f6b31a26e6 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/dao/SessionDao.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/dao/SessionDao.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.dao
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.NodeType
 import ish.oncourse.server.cayenne.CourseClass
 import ish.oncourse.server.cayenne.SessionModule
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/AccountApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/AccountApiService.groovy
index 35a7f63cd4c..35f6688ce57 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/AccountApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/AccountApiService.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.AccountType
 import ish.common.types.PaymentStatus
 import ish.math.Money
@@ -29,7 +29,7 @@ import java.util.stream.Collectors
 import static ish.oncourse.server.api.function.CayenneFunctions.getRecordById
 import static ish.oncourse.server.api.v1.function.TaxFunctions.toRestTaxMinimized
 import static org.apache.commons.lang3.StringUtils.isBlank
-import static org.apache.commons.lang3.StringUtils.trimToNull
+import static org.apache.commons.lang3.StringUtils.trimToNull 
 
 class AccountApiService extends EntityApiService<AccountDTO, Account, AccountDao>{
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/ApiTokenApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/ApiTokenApiService.groovy
index 3e7cd0e1af6..09fd7849806 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/ApiTokenApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/ApiTokenApiService.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.dao.ApiTokenDao
 import ish.oncourse.server.api.dao.UserDao
 import ish.oncourse.server.api.v1.model.ApiTokenDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/ApplicationApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/ApplicationApiService.groovy
index 363f6373287..2a929d7b53d 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/ApplicationApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/ApplicationApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.common.types.ApplicationStatus
 import ish.common.types.ConfirmationStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/ArticleProductApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/ArticleProductApiService.groovy
index 9553d81d6a5..3e41645ce36 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/ArticleProductApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/ArticleProductApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.AccountType
 import ish.math.Money
 import ish.oncourse.server.api.dao.AccountDao
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentApiService.groovy
index 0127439814d..db4ffa438b8 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.cayenne.TaggableClasses
 import ish.oncourse.server.api.dao.AssessmentDao
 import ish.oncourse.server.cayenne.GradingType
@@ -19,8 +19,6 @@ import ish.oncourse.server.document.DocumentService
 import static ish.oncourse.server.api.v1.function.DocumentFunctions.toRestDocument
 import static ish.oncourse.server.api.v1.function.DocumentFunctions.updateDocuments
 import ish.oncourse.server.api.v1.function.TagFunctions
-import static ish.oncourse.server.api.v1.function.TagFunctions.toRestTagMinimized
-import static ish.oncourse.server.api.v1.function.TagFunctions.updateTags
 import ish.oncourse.server.api.v1.model.AssessmentDTO
 import ish.oncourse.server.cayenne.Assessment
 import ish.oncourse.server.cayenne.AssessmentAttachmentRelation
@@ -33,6 +31,8 @@ import static org.apache.commons.lang3.StringUtils.isBlank
 import static org.apache.commons.lang3.StringUtils.trimToEmpty
 import static org.apache.commons.lang3.StringUtils.trimToNull
 
+import static ish.oncourse.server.api.v1.function.TagFunctions.updateTags
+
 class AssessmentApiService extends TaggableApiService<AssessmentDTO, Assessment, AssessmentDao> {
 
     @Inject
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentClassApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentClassApiService.groovy
index 6af25a5c33a..0edfc0be763 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentClassApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentClassApiService.groovy
@@ -11,7 +11,8 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Provider
+import javax.inject.Inject
 import ish.oncourse.server.api.dao.AssessmentClassDao
 import ish.oncourse.server.api.v1.model.AssessmentClassDTO
 import ish.oncourse.server.cayenne.Assessment
@@ -32,7 +33,7 @@ class AssessmentClassApiService extends EntityApiService<AssessmentClassDTO, Ass
     private AssessmentSubmissionApiService submissionApiService
 
     @Inject
-    private CourseClassApiService classService
+    private Provider<CourseClassApiService> classServiceProvider
 
     @Inject
     private ContactApiService contactService
@@ -65,7 +66,7 @@ class AssessmentClassApiService extends EntityApiService<AssessmentClassDTO, Ass
     AssessmentClass toCayenneModel(AssessmentClassDTO dto, AssessmentClass cayenneModel) {
         ObjectContext context = cayenneModel.context
         cayenneModel.assessment = assessmentService.getEntityAndValidateExistence(context, dto.assessmentId)
-        cayenneModel.courseClass = classService.getEntityAndValidateExistence(context, dto.courseClassId)
+        cayenneModel.courseClass = classServiceProvider.get().getEntityAndValidateExistence(context, dto.courseClassId)
 
         context.deleteObjects(cayenneModel.assessmentClassTutors.findAll {!(it.tutor.contact.id in dto.contactIds)})
 
@@ -100,7 +101,7 @@ class AssessmentClassApiService extends EntityApiService<AssessmentClassDTO, Ass
         }
 
         Assessment assessment = assessmentService.getEntityAndValidateExistence(context, dto.assessmentId)
-        CourseClass courseClass = classService.getEntityAndValidateExistence(context, dto.courseClassId)
+        CourseClass courseClass = classServiceProvider.get().getEntityAndValidateExistence(context, dto.courseClassId)
 
         if (entityDao.hasDuplicates(id, courseClass, assessment)) {
             validator.throwClientErrorException(id, 'assessmentCode', "$assessment.name already added to class, please remove existing assessment task first")
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentSubmissionApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentSubmissionApiService.groovy
index 42553a164cd..f5c69e4e2e6 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentSubmissionApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/AssessmentSubmissionApiService.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.dao.AssessmentSubmissionDao
 import ish.oncourse.server.api.v1.model.AssessmentSubmissionDTO
 import ish.oncourse.server.cayenne.AssessmentSubmission
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/BankingService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/BankingService.groovy
index 69fdcce0943..2fa889a516b 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/BankingService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/BankingService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.common.types.CreditCardType
 import ish.common.types.PaymentStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/BulkChangeApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/BulkChangeApiService.groovy
index c11f2e14b77..aac9e94fca0 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/BulkChangeApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/BulkChangeApiService.groovy
@@ -9,7 +9,7 @@
 package ish.oncourse.server.api.service
 
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileDynamic
 import ish.common.types.MessageStatus
 import ish.oncourse.aql.AqlService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/CertificateApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/CertificateApiService.groovy
index 832865cc1f5..9ce9b6c2d3e 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/CertificateApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/CertificateApiService.groovy
@@ -11,12 +11,11 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import groovy.transform.TypeCheckingMode
 import ish.common.types.OutcomeStatus
 import ish.common.types.UsiStatus
-import ish.oncourse.server.PreferenceController
 import ish.oncourse.server.api.dao.*
 import ish.oncourse.server.api.v1.model.CertificateCreateForEnrolmentsRequestDTO
 import ish.oncourse.server.api.v1.model.CertificateDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/ClassCostApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/ClassCostApiService.groovy
index 78bbd3455cb..5709fb3f41b 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/ClassCostApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/ClassCostApiService.groovy
@@ -11,36 +11,19 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
-import ish.oncourse.server.api.dao.DiscountDao
-import static ish.oncourse.server.api.servlet.ApiFilter.validateOnly
-import ish.common.types.AccountType
-import ish.common.types.ClassCostFlowType
-import ish.common.types.ClassCostRepetitionType
-import ish.common.types.KeyCode
-import ish.common.types.Mask
+import javax.inject.Inject
+import javax.inject.Provider
+import ish.common.types.*
 import ish.math.Money
-import ish.oncourse.server.api.dao.AccountDao
-import ish.oncourse.server.api.dao.ClassCostDao
-import ish.oncourse.server.api.dao.CourseClassDao
-import ish.oncourse.server.api.dao.TaxDao
-import ish.oncourse.server.api.v1.function.DiscountFunctions
-import ish.oncourse.server.api.v1.model.ClassCostDTO
-import ish.oncourse.server.api.v1.model.ClassCostFlowTypeDTO
-import ish.oncourse.server.api.v1.model.ClassCostRepetitionTypeDTO
-import ish.oncourse.server.api.v1.model.CourseClassDiscountDTO
-import ish.oncourse.server.api.v1.model.CourseClassPaymentPlanDTO
-import ish.oncourse.server.cayenne.Account
-import ish.oncourse.server.cayenne.ClassCost
-import ish.oncourse.server.cayenne.CourseClass
-import ish.oncourse.server.cayenne.CourseClassPaymentPlanLine
-import ish.oncourse.server.cayenne.CourseClassTutor
-import ish.oncourse.server.cayenne.DiscountCourseClass
-import ish.oncourse.server.cayenne.Tax
+import ish.oncourse.server.api.dao.*
+import ish.oncourse.server.api.v1.model.*
+import ish.oncourse.server.cayenne.*
 import ish.oncourse.server.security.api.IPermissionService
 import ish.util.MoneyUtil
 import org.apache.cayenne.ObjectContext
 
+import static ish.oncourse.server.api.servlet.ApiFilter.validateOnly
+
 class ClassCostApiService extends EntityApiService<ClassCostDTO, ClassCost, ClassCostDao>{
 
     @Inject
@@ -50,7 +33,7 @@ class ClassCostApiService extends EntityApiService<ClassCostDTO, ClassCost, Clas
     private CourseClassDao courseClassDao
 
     @Inject
-    private CourseClassApiService classApiService
+    private Provider<CourseClassApiService> classApiServiceProvider
 
     @Inject
     private TaxDao taxDao
@@ -235,7 +218,7 @@ class ClassCostApiService extends EntityApiService<ClassCostDTO, ClassCost, Clas
 
         CourseClass courseClass = null
         if (!(validateOnly.get() && id == null && dto.courseClassid == null)){
-            courseClass = classApiService.getEntityAndValidateExistence(context, dto.courseClassid)
+            courseClass = classApiServiceProvider.get().getEntityAndValidateExistence(context, dto.courseClassid)
         }
 
         if (dto.flowType == null) {
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/ContactApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/ContactApiService.groovy
index 956763e6b47..607531f4edc 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/ContactApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/ContactApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.common.types.AttachmentSpecialType
 import ish.common.types.USIFieldStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/CorporatePassApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/CorporatePassApiService.groovy
index 10c7c06e87b..392786b5c35 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/CorporatePassApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/CorporatePassApiService.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.dao.ContactDao
 import ish.oncourse.server.api.dao.CorporatePassDao
 import ish.oncourse.server.api.v1.model.CorporatePassDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/CourseApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/CourseApiService.groovy
index bd16ab2715f..0a151708154 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/CourseApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/CourseApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.KeyCode
 import ish.common.types.Mask
 import ish.duplicate.CourseDuplicationRequest
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/CourseClassApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/CourseClassApiService.groovy
index e2d04e729f4..a33e8e51460 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/CourseClassApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/CourseClassApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.cancel.CancelationResult
 import ish.common.types.EnrolmentStatus
 import ish.common.types.OutcomeStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/CourseClassTutorApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/CourseClassTutorApiService.groovy
index ee4edc7d980..d6cae26abbb 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/CourseClassTutorApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/CourseClassTutorApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.dao.ContactDao
 import ish.oncourse.server.api.dao.CourseClassDao
 import ish.oncourse.server.api.dao.CourseClassTutorDao
@@ -23,7 +23,6 @@ import ish.oncourse.server.cayenne.Contact
 import ish.oncourse.server.cayenne.CourseClass
 import ish.oncourse.server.cayenne.CourseClassTutor
 import ish.oncourse.server.cayenne.DefinedTutorRole
-import ish.oncourse.server.cayenne.Student
 import ish.util.LocalDateUtils
 import org.apache.cayenne.ObjectContext
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/DocumentApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/DocumentApiService.groovy
index dd54df823db..f6d68004834 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/DocumentApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/DocumentApiService.groovy
@@ -11,11 +11,10 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.api.dao.DocumentDao
 import ish.oncourse.server.api.v1.model.DocumentVisibilityDTO
-import ish.oncourse.server.cayenne.DocumentVersion
 import ish.oncourse.server.document.DocumentService
 import ish.s3.AmazonS3Service
 import ish.util.LocalDateUtils
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/EnrolmentApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/EnrolmentApiService.groovy
index 5448fbf2e26..d76146decdc 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/EnrolmentApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/EnrolmentApiService.groovy
@@ -11,10 +11,9 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.cancel.CancelationResult
 import ish.cancel.EnrolmentCancelationRequest
-import ish.common.types.EnrolmentReportingStatus
 import ish.common.types.EnrolmentStatus
 import ish.math.Money
 import ish.oncourse.server.api.dao.EnrolmentDao
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/EntityApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/EntityApiService.groovy
index 246f5528153..7b964a824a1 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/EntityApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/EntityApiService.groovy
@@ -11,19 +11,15 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.aql.AqlService
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.dao.CayenneLayer
 import ish.oncourse.server.api.traits._DTOTrait
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.validation.EntityValidator
 import org.apache.cayenne.ObjectContext
 import org.apache.cayenne.Persistent
-import org.apache.cayenne.query.ObjectSelect
-
-import static ish.oncourse.server.api.function.EntityFunctions.parseSearchQuery
 
 @CompileStatic
 abstract class EntityApiService<T extends _DTOTrait, K extends Persistent, M extends CayenneLayer<K>> {
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/FacultyApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/FacultyApiService.groovy
index 82e6de9e871..3b770c0a313 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/FacultyApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/FacultyApiService.groovy
@@ -8,7 +8,8 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
+import javax.inject.Provider
 import ish.oncourse.cayenne.TaggableClasses
 import ish.oncourse.server.api.dao.FacultyDao
 import ish.oncourse.server.api.v1.function.TagFunctions
@@ -32,7 +33,7 @@ class FacultyApiService extends TaggableApiService<FacultyDTO, Faculty, FacultyD
     private DocumentService documentService
 
     @Inject
-    private CourseApiService courseApiService
+    private Provider<CourseApiService> courseApiServiceProvider
 
     @Override
     Class<Faculty> getPersistentClass() {
@@ -129,7 +130,7 @@ class FacultyApiService extends TaggableApiService<FacultyDTO, Faculty, FacultyD
         List<Long> coursesToSave = courseDTOS*.id ?: [] as List<Long>
         List<Course> coursesToRemove = faculty.courses.findAll {!coursesToSave.contains(it.id)}
         List<Course> coursesToAdd = courseDTOS.findAll { !faculty.courses*.id.contains(it.id) }.collect { courseDTO ->
-            Course course = courseApiService.getEntityAndValidateExistence(faculty.context, courseDTO.id)
+            Course course = courseApiServiceProvider.get().getEntityAndValidateExistence(faculty.context, courseDTO.id)
             course
         }
         coursesToAdd.each {faculty.addToCourses(it)}
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/ImportApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/ImportApiService.groovy
index 490ce1b22c6..a212958a3fe 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/ImportApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/ImportApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.DataType
 import ish.imports.ImportResult
 import ish.oncourse.server.api.dao.ImportDao
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/InvoiceApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/InvoiceApiService.groovy
index 3594b25580a..817f84c8eaf 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/InvoiceApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/InvoiceApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.ConfirmationStatus
 import ish.common.types.InvoiceType
 import ish.common.types.PaymentStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/LeadApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/LeadApiService.groovy
index d3ee4890682..e8a96048ba2 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/LeadApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/LeadApiService.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.math.Money
 import ish.oncourse.server.api.dao.LeadDao
 import ish.oncourse.server.api.v1.function.SaleFunctions
@@ -17,7 +17,6 @@ import ish.oncourse.server.api.v1.model.LeadStatusDTO
 import ish.oncourse.server.api.v1.model.SaleDTO
 import ish.oncourse.server.api.v1.model.SaleTypeDTO
 import ish.oncourse.server.api.v1.model.SiteDTO
-import ish.oncourse.server.cayenne.Course
 import ish.oncourse.server.cayenne.Lead
 import ish.oncourse.server.cayenne.LeadAttachmentRelation
 import ish.oncourse.server.cayenne.LeadCustomField
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/MembershipProductApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/MembershipProductApiService.groovy
index f863bccd3b7..91a92f7529c 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/MembershipProductApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/MembershipProductApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.AccountType
 import ish.common.types.ExpiryType
 import ish.math.Money
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/MessageApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/MessageApiService.groovy
index 75a70fb4ab1..bb99ec7e4a7 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/MessageApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/MessageApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.text.Template
 import groovy.transform.CompileStatic
 import ish.common.types.EnrolmentStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/NoteApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/NoteApiService.groovy
index 5292a4f0df9..c34ba53950f 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/NoteApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/NoteApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.dao.NoteDao
 import ish.oncourse.server.api.v1.function.NoteFunctions
 import ish.oncourse.server.api.v1.model.NoteDTO
@@ -20,7 +20,7 @@ import ish.oncourse.server.users.SystemUserService
 import org.apache.cayenne.ObjectContext
 import org.apache.cayenne.query.SelectById
 
-public class NoteApiService extends EntityApiService<NoteDTO, Note, NoteDao> {
+class NoteApiService extends EntityApiService<NoteDTO, Note, NoteDao> {
 
     private Map<String, List<Class>> NOTABLE_MAP  =
             [
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/OutcomeApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/OutcomeApiService.groovy
index d9f42bc2ce2..d510fba6e73 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/OutcomeApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/OutcomeApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.EnrolmentStatus
 import ish.oncourse.types.FundingStatus
 import ish.oncourse.server.api.dao.EnrolmentDao
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/PaymentInApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/PaymentInApiService.groovy
index e38ea7ef72f..848a7d4dd49 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/PaymentInApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/PaymentInApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import groovy.transform.TypeCheckingMode
 import ish.common.types.ConfirmationStatus
@@ -21,10 +21,12 @@ import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.dao.PaymentInDao
 import ish.oncourse.server.api.v1.model.PaymentInDTO
 import ish.oncourse.server.api.v1.model.PaymentInvoiceDTO
-import ish.oncourse.server.cayenne.*
+import ish.oncourse.server.cayenne.PaymentIn
+import ish.oncourse.server.cayenne.PaymentInLine
+import ish.oncourse.server.cayenne.Site
+import ish.oncourse.server.cayenne.SystemUser
 import ish.oncourse.server.services.TransactionLockedService
 import ish.oncourse.server.users.SystemUserService
-import ish.util.AccountUtil
 import ish.util.PaymentMethodUtil
 import org.apache.cayenne.ObjectContext
 import org.apache.cayenne.access.DataContext
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/PaymentOutApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/PaymentOutApiService.groovy
index 51322c4d1bd..bb04a489d7d 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/PaymentOutApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/PaymentOutApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import groovy.transform.TypeCheckingMode
 import ish.common.types.ConfirmationStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/PortalWebsiteService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/PortalWebsiteService.groovy
index 8f668ab4e44..2620e1d8183 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/PortalWebsiteService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/PortalWebsiteService.groovy
@@ -8,10 +8,9 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.DataType
 import ish.oncourse.server.ICayenneService
-import ish.oncourse.server.cayenne.Contact
 import ish.oncourse.server.cayenne.ContactTrait
 import ish.oncourse.server.cayenne.CustomField
 import ish.oncourse.server.cayenne.PortalWebsite
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/PriorLearningApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/PriorLearningApiService.groovy
index 5d7277be2bb..e87555c1e34 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/PriorLearningApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/PriorLearningApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.dao.ModuleDao
 import ish.oncourse.server.api.dao.OutcomeDao
 import ish.oncourse.server.api.dao.PriorLearningDao
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/ProductItemApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/ProductItemApiService.groovy
index 4cf22ac64e2..cfb8150b391 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/ProductItemApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/ProductItemApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import groovy.transform.TypeCheckingMode
 import ish.common.types.ExpiryType
@@ -20,14 +20,12 @@ import ish.common.types.ProductType
 import ish.common.types.TypesUtil
 import ish.math.Money
 import ish.oncourse.cayenne.Taggable
-import ish.oncourse.cayenne.TaggableClasses
 import ish.oncourse.server.api.dao.AccountDao
 import ish.oncourse.server.api.dao.ContactDao
 import ish.oncourse.server.api.dao.ProductItemDAO
 import ish.oncourse.server.api.dao.TaxDao
 import ish.oncourse.server.api.v1.model.*
 import ish.oncourse.server.cayenne.*
-import ish.oncourse.server.cayenne.glue.TaggableCayenneDataObject
 import ish.oncourse.server.document.DocumentService
 import org.apache.cayenne.ObjectContext
 import org.apache.cayenne.query.ObjectSelect
@@ -43,7 +41,6 @@ import static ish.oncourse.server.api.v1.function.CustomFieldFunctions.updateCus
 import static ish.oncourse.server.api.v1.function.CustomFieldFunctions.validateCustomFields
 import static ish.oncourse.server.api.v1.function.DocumentFunctions.toRestDocument
 import static ish.oncourse.server.api.v1.function.DocumentFunctions.updateDocuments
-import static ish.oncourse.server.api.v1.function.TagFunctions.toRestTagMinimized
 import static ish.oncourse.server.api.v1.function.TagFunctions.updateTags
 import static ish.util.LocalDateUtils.dateToValue
 import static ish.util.LocalDateUtils.valueToDate
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/RefundService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/RefundService.groovy
index 5ff6098f1b8..17b69fa55fd 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/RefundService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/RefundService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.ConfirmationStatus
 import ish.common.types.PaymentSource
 import ish.common.types.PaymentStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/RoomApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/RoomApiService.groovy
index 65cbf61fb64..26e82536fb4 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/RoomApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/RoomApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.PreferenceController
 import ish.oncourse.server.api.dao.RoomDao
 import ish.oncourse.server.api.v1.function.RoomFunctions
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/ScriptApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/ScriptApiService.groovy
index 345b69246d4..16bda70ea44 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/ScriptApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/ScriptApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.EntityEvent
 import ish.common.types.SystemEventType
 import ish.common.types.TriggerType
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/SessionApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/SessionApiService.groovy
index 0311f1d530b..3bff14b761c 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/SessionApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/SessionApiService.groovy
@@ -11,20 +11,17 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.api.dao.CourseClassDao
-import ish.oncourse.server.api.dao.CourseClassTutorDao
 import ish.oncourse.server.api.dao.RoomDao
 import ish.oncourse.server.api.dao.SessionDao
-import ish.oncourse.server.api.dao.TutorAttendanceDao
 import static ish.oncourse.server.api.servlet.ApiFilter.validateOnly
 import ish.oncourse.server.api.v1.function.SessionValidator
 import ish.oncourse.server.api.v1.model.SessionDTO
 import ish.oncourse.server.api.v1.model.SessionWarningDTO
 import static ish.oncourse.server.api.v1.service.impl.SessionApiImpl.CLASS_TEMP_ID
 import ish.oncourse.server.cayenne.CourseClass
-import ish.oncourse.server.cayenne.CourseClassTutor
 import ish.oncourse.server.cayenne.Room
 import ish.oncourse.server.cayenne.Session
 import ish.oncourse.server.cayenne.TutorAttendance
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/SiteApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/SiteApiService.groovy
index 4b6360a8f55..82bd421ce5e 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/SiteApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/SiteApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.cayenne.TaggableClasses
 import ish.oncourse.server.PreferenceController
 import ish.oncourse.server.api.dao.SiteDao
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/SpecialTagsApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/SpecialTagsApiService.groovy
index 98220a9236d..2771e1f148b 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/SpecialTagsApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/SpecialTagsApiService.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.NodeSpecialType
 import ish.common.types.NodeType
 import ish.oncourse.server.ICayenneService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/TutorAttendanceApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/TutorAttendanceApiService.groovy
index 769ea38dd3a..63744acb997 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/TutorAttendanceApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/TutorAttendanceApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.api.dao.CourseClassTutorDao
 import ish.oncourse.server.api.dao.TutorAttendanceDao
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/TutorRoleApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/TutorRoleApiService.groovy
index 344eb136fd7..484d73fc254 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/TutorRoleApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/TutorRoleApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.dao.DefinedTutorRoleDao
 import ish.oncourse.server.api.dao.PayRateDao
 import ish.oncourse.server.api.v1.model.ClassCostRepetitionTypeDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/service/VoucherProductApiService.groovy b/server/src/main/groovy/ish/oncourse/server/api/service/VoucherProductApiService.groovy
index b641ef01ebb..79c6d013854 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/service/VoucherProductApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/service/VoucherProductApiService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.service
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.common.types.AccountType
 import ish.common.types.ExpiryType
@@ -26,13 +26,8 @@ import ish.oncourse.server.api.dao.ProductDao
 import ish.oncourse.server.api.dao.TaxDao
 import ish.oncourse.server.api.dao.VoucherProductCourseDao
 import ish.oncourse.server.api.dao.VoucherProductDao
-import ish.oncourse.server.api.v1.model.ProductTypeDTO
-import ish.oncourse.server.cayenne.Article
-import ish.oncourse.server.cayenne.ExpandableTrait
 import ish.oncourse.server.cayenne.FieldConfigurationScheme
-import ish.oncourse.server.cayenne.Membership
 import ish.oncourse.server.cayenne.Product
-import ish.oncourse.server.cayenne.Voucher
 import ish.oncourse.server.cayenne.VoucherProductTagRelation
 import ish.oncourse.server.cayenne.VoucherProductAttachmentRelation
 import ish.oncourse.server.document.DocumentService
@@ -44,7 +39,6 @@ import static ish.oncourse.server.api.v1.function.DocumentFunctions.updateDocume
 import static ish.oncourse.server.api.v1.function.EntityRelationFunctions.toRestFromEntityRelation
 import static ish.oncourse.server.api.v1.function.EntityRelationFunctions.toRestToEntityRelation
 import static ish.oncourse.server.api.v1.function.ProductFunctions.updateCorporatePassesByIds
-import static ish.oncourse.server.api.v1.function.TagFunctions.toRestTagMinimized
 import static ish.oncourse.server.api.v1.function.TagFunctions.updateTags
 import static ish.oncourse.server.api.v1.model.ProductStatusDTO.CAN_BE_PURCHASED_IN_OFFICE
 import static ish.oncourse.server.api.v1.model.ProductStatusDTO.CAN_BE_PURCHASED_IN_OFFICE_ONLINE
diff --git a/server/src/main/groovy/ish/oncourse/server/api/servlet/ActiveCollegeFilter.groovy b/server/src/main/groovy/ish/oncourse/server/api/servlet/ActiveCollegeFilter.groovy
index f87aa97c8fa..e5b19c1ea83 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/servlet/ActiveCollegeFilter.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/servlet/ActiveCollegeFilter.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.servlet
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.PreferenceController
 
 import javax.servlet.*
diff --git a/server/src/main/groovy/ish/oncourse/server/api/servlet/ApiFilter.groovy b/server/src/main/groovy/ish/oncourse/server/api/servlet/ApiFilter.groovy
index f4a6769df4c..127b692fb4b 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/servlet/ApiFilter.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/servlet/ApiFilter.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.servlet
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.ApiToken
 import ish.oncourse.server.security.api.IPermissionService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/servlet/SessionManager.groovy b/server/src/main/groovy/ish/oncourse/server/api/servlet/SessionManager.groovy
index a8f11a9aca7..54e91e89815 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/servlet/SessionManager.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/servlet/SessionManager.groovy
@@ -11,17 +11,12 @@
 
 package ish.oncourse.server.api.servlet
 
-import com.google.inject.Inject
-import com.google.inject.Provider
+import javax.inject.Inject
+import javax.inject.Provider
 import groovy.transform.CompileStatic
-import io.bootique.jetty.servlet.DefaultServletEnvironment
+import io.bootique.jetty.servlet.AngelServletEnvironment
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.ApiToken
-
-import static ish.oncourse.cayenne.SystemUserInterface.DEFAULT_ISH_USER
-
-import static ish.oncourse.server.api.servlet.AngelSessionDataStore.USER_ATTRIBUTE
-import static ish.oncourse.server.api.servlet.AngelSessionDataStore.IS_LOGIN
 import ish.oncourse.server.cayenne.SystemUser
 import org.apache.cayenne.query.ObjectSelect
 import org.apache.logging.log4j.LogManager
@@ -33,6 +28,10 @@ import org.eclipse.jetty.server.session.Session
 
 import javax.servlet.http.HttpServletRequest
 
+import static ish.oncourse.cayenne.SystemUserInterface.DEFAULT_ISH_USER
+import static ish.oncourse.server.api.servlet.AngelSessionDataStore.IS_LOGIN
+import static ish.oncourse.server.api.servlet.AngelSessionDataStore.USER_ATTRIBUTE
+
 @CompileStatic
 class SessionManager implements ISessionManager {
 
@@ -43,7 +42,7 @@ class SessionManager implements ISessionManager {
     private ICayenneService cayenneService
 
     @Inject
-    DefaultServletEnvironment defaultServletEnvironment
+    AngelServletEnvironment defaultServletEnvironment
 
     private static final Logger logger = LogManager.logger
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/function/SessionValidator.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/function/SessionValidator.groovy
index c041b3bed44..d32bdc3da1f 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/function/SessionValidator.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/function/SessionValidator.groovy
@@ -11,14 +11,13 @@
 
 package ish.oncourse.server.api.v1.function
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.api.dao.ContactDao
 import ish.oncourse.server.api.dao.CourseDao
 import ish.oncourse.server.api.dao.RoomDao
 import ish.oncourse.server.api.dao.UnavailableRuleDao
-import ish.oncourse.server.api.traits.SessionDTOTrait
 import ish.oncourse.server.api.v1.model.TutorAttendanceDTO
 import ish.oncourse.server.cayenne.CourseClassTutor
 import ish.oncourse.server.cayenne.TutorAttendance
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/function/export/CertificatePrintFilter.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/function/export/CertificatePrintFilter.groovy
index 575e3957aa2..d1830bf4d32 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/function/export/CertificatePrintFilter.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/function/export/CertificatePrintFilter.groovy
@@ -11,7 +11,6 @@
 
 package ish.oncourse.server.api.v1.function.export
 
-import com.google.inject.Inject
 import ish.common.types.KeyCode
 import ish.common.types.Mask
 import ish.common.types.OutcomeStatus
@@ -22,8 +21,6 @@ import ish.oncourse.server.cayenne.SystemUser
 import ish.oncourse.server.security.api.IPermissionService
 import org.apache.cayenne.CayenneDataObject
 
-import javax.ws.rs.BadRequestException
-
 /**
  * PrintFilter for Certificates.
  * Revoked or certificates with outcomes which has NOT_SET status won't be printed.
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AccessApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AccessApiImpl.groovy
index 23480d60d67..87a070fe6b4 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AccessApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AccessApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.KeyCode
 import ish.common.types.Mask
 import ish.oncourse.server.api.v1.model.KeyCodeDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AccountApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AccountApiImpl.groovy
index 8d6d4c5bf2c..7fc1a4547b9 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AccountApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AccountApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.AccountApiService
 import ish.oncourse.server.api.v1.model.AccountDTO
 import ish.oncourse.server.api.v1.service.AccountApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ApiTokenApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ApiTokenApiImpl.groovy
index ae76916bcfd..e6b62ffe113 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ApiTokenApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ApiTokenApiImpl.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.api.dao.ApiTokenDao
 import ish.oncourse.server.api.service.ApiTokenApiService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ApplicationApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ApplicationApiImpl.groovy
index f8d2de526a3..35ab81328db 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ApplicationApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ApplicationApiImpl.groovy
@@ -11,10 +11,9 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.ApplicationApiService
 import ish.oncourse.server.api.v1.model.ApplicationDTO
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.service.ApplicationApi
 
 class ApplicationApiImpl implements ApplicationApi {
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ArticleProductApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ArticleProductApiImpl.groovy
index 4ca93991826..3e30eebff2d 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ArticleProductApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ArticleProductApiImpl.groovy
@@ -11,12 +11,11 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.api.service.ArticleProductApiService
 import ish.oncourse.server.api.v1.function.EntityRelationFunctions
 import ish.oncourse.server.api.v1.model.ArticleProductDTO
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.service.ArticleProductApi
 import ish.oncourse.server.cayenne.ArticleProduct
 import ish.oncourse.server.cayenne.Product
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentApiImpl.groovy
index 98f57dd2ff1..a49179ea24f 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentApiImpl.groovy
@@ -11,10 +11,9 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.AssessmentApiService
 import ish.oncourse.server.api.v1.model.AssessmentDTO
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.service.AssessmentApi
 
 class AssessmentApiImpl implements AssessmentApi {
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentClassApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentClassApiImpl.groovy
index f04c933dc6c..3d6e7dfa490 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentClassApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentClassApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.AssessmentClassApiService
 import ish.oncourse.server.api.v1.model.AssessmentClassDTO
 import ish.oncourse.server.api.v1.service.AssessmentClassApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentSubmissionApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentSubmissionApiImpl.groovy
index 6ffb0684153..686934b5537 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentSubmissionApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AssessmentSubmissionApiImpl.groovy
@@ -8,10 +8,9 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.AssessmentSubmissionApiService
 import ish.oncourse.server.api.v1.model.AssessmentSubmissionDTO
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.service.AssessmentSubmissionApi
 
 class AssessmentSubmissionApiImpl implements AssessmentSubmissionApi {
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AttendanceApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AttendanceApiImpl.groovy
index 8def1a642d9..9e86169b608 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AttendanceApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AttendanceApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.AttendanceApiService
 import ish.oncourse.server.api.v1.model.StudentAttendanceDTO
 import ish.oncourse.server.api.v1.service.AttendanceApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AuditApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AuditApiImpl.groovy
index 69ef38847c1..775baaf587e 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AuditApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AuditApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import static ish.oncourse.server.api.function.EntityFunctions.checkForBadRequest
 import static ish.oncourse.server.api.function.EntityFunctions.validateIdParam
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AuthenticationApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AuthenticationApiImpl.groovy
index ea7b814d37c..fe1c5a350aa 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AuthenticationApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AuthenticationApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.PreferenceController
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AvetmissExportApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AvetmissExportApiImpl.groovy
index 7b35c8d4efe..71ed1ad3d71 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AvetmissExportApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/AvetmissExportApiImpl.groovy
@@ -12,7 +12,7 @@
 package ish.oncourse.server.api.v1.service.impl
 
 import com.fasterxml.jackson.databind.ObjectMapper
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.OutcomeStatus
 import ish.oncourse.common.ExportJurisdiction
 import ish.oncourse.entity.services.CertificateService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/BankingApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/BankingApiImpl.groovy
index 9c462957220..5544ba84363 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/BankingApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/BankingApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.common.types.PaymentStatus
 import ish.common.types.PaymentType
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CertificateApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CertificateApiImpl.groovy
index 1069bf82da2..89b3df89e93 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CertificateApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CertificateApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.aql.AqlService
 import ish.oncourse.server.CayenneService
@@ -24,7 +24,6 @@ import ish.oncourse.server.api.v1.service.CertificateApi
 import ish.oncourse.server.api.v1.model.CertificateCreateForEnrolmentsRequestDTO
 import ish.oncourse.server.cayenne.Certificate
 import ish.oncourse.server.print.CertificatePrintStatus
-import org.apache.cayenne.Cayenne
 import org.apache.cayenne.ObjectContext
 
 @CompileStatic
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CheckoutApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CheckoutApiImpl.groovy
index 83f0bc1c54f..a0f9d9a806d 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CheckoutApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CheckoutApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.common.types.EntityRelationCartAction
 import ish.math.Money
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ClassCostApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ClassCostApiImpl.groovy
index 9e34ca566e8..c3e3e9afe94 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ClassCostApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ClassCostApiImpl.groovy
@@ -11,15 +11,16 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
-import static ish.oncourse.server.api.servlet.ApiFilter.validateOnly
 import ish.oncourse.server.api.service.ClassCostApiService
 import ish.oncourse.server.api.v1.model.ClassCostDTO
 import ish.oncourse.server.api.v1.service.ClassCostApi
 import ish.oncourse.server.cayenne.ClassCost
-import org.apache.cayenne.CayenneRuntimeException
 import org.apache.cayenne.validation.ValidationException
 
+import javax.inject.Inject
+
+import static ish.oncourse.server.api.servlet.ApiFilter.validateOnly
+
 class ClassCostApiImpl implements ClassCostApi {
 
     @Inject
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ConcessionApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ConcessionApiImpl.groovy
index d779d1e99aa..4926fd20b77 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ConcessionApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ConcessionApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import static ish.oncourse.server.api.v1.function.ConcessionTypeFunctions.toRestConcessionType
 import static ish.oncourse.server.api.v1.function.ConcessionTypeFunctions.updateConcession
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactApiImpl.groovy
index 97cdcc3221d..9371815afb5 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.service.ContactApiService
 import static ish.oncourse.server.api.v1.function.ContactRelationFunctions.toRestContactRelationType
@@ -20,7 +20,6 @@ import static ish.oncourse.server.api.v1.function.ContactRelationFunctions.valid
 import static ish.oncourse.server.api.v1.function.ContactRelationFunctions.validateForUpdate
 import ish.oncourse.server.api.v1.model.ContactDTO
 import ish.oncourse.server.api.v1.model.ContactRelationTypeDTO
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.UsiRequestDTO
 import ish.oncourse.server.api.v1.model.UsiVerificationResultDTO
 import ish.oncourse.server.api.v1.model.ValidationErrorDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactInsightApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactInsightApiImpl.groovy
index c8a9575542e..24206e5d2cd 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactInsightApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactInsightApiImpl.groovy
@@ -8,10 +8,9 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.ApplicationStatus
 import ish.common.types.LeadStatus
-import ish.math.Money
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.dao.ContactDao
 import ish.oncourse.server.api.v1.model.ContactInsightDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactMergeApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactMergeApiImpl.groovy
index 2da027ea55d..e0dc3554856 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactMergeApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ContactMergeApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.api.dao.ContactDao
 import ish.oncourse.server.api.v1.model.MergeDataDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ControlApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ControlApiImpl.groovy
index 024a7a84832..346686d5656 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ControlApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ControlApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.imports.ImportResult
 import ish.oncourse.server.api.v1.model.ProcessResultDTO
 import ish.oncourse.server.api.v1.model.ProcessStatusDTO
@@ -20,6 +20,7 @@ import ish.oncourse.server.api.v1.service.ControlApi
 import ish.oncourse.server.concurrent.ExecutorManager
 import ish.print.PrintResult
 import ish.scripting.ScriptResult
+
 import static ish.scripting.ScriptResult.ResultType.FAILURE
 import static org.apache.commons.lang3.StringUtils.isNotBlank
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CorporatePassApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CorporatePassApiImpl.groovy
index f8ab448479a..d63d1cbfbaf 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CorporatePassApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CorporatePassApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.CorporatePassApiService
 import ish.oncourse.server.api.v1.model.CorporatePassDTO
 import ish.oncourse.server.api.v1.service.CorporatePassApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseApiImpl.groovy
index b25e011616d..5536268528c 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseApiImpl.groovy
@@ -11,12 +11,11 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.api.service.CourseApiService
 import ish.oncourse.server.api.v1.function.EntityRelationFunctions
 import ish.oncourse.server.api.v1.model.CourseDTO
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.SaleDTO
 import ish.oncourse.server.api.v1.service.CourseApi
 import ish.oncourse.server.cayenne.Course
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseClassApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseClassApiImpl.groovy
index 1cf7094de29..cfba7a71004 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseClassApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseClassApiImpl.groovy
@@ -11,12 +11,11 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.CourseClassApiService
 import ish.oncourse.server.api.v1.model.CancelCourseClassDTO
 import ish.oncourse.server.api.v1.model.CourseClassDTO
 import ish.oncourse.server.api.v1.model.CourseClassDuplicateDTO
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.TrainingPlanDTO
 import ish.oncourse.server.api.v1.service.CourseClassApi
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseClassTutorApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseClassTutorApiImpl.groovy
index 19e081a625a..621c32c3cd2 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseClassTutorApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CourseClassTutorApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.CourseClassTutorApiService
 import static ish.oncourse.server.api.servlet.ApiFilter.validateOnly
 import ish.oncourse.server.api.v1.model.CourseClassTutorDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CustomFieldApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CustomFieldApiImpl.groovy
index bc6d8b7ae7b..badff0db661 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CustomFieldApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/CustomFieldApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.TutorAttendance
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DashboardApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DashboardApiImpl.groovy
index 8044da85b06..7db17cbbf0c 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DashboardApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DashboardApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.common.types.EnrolmentStatus
 import ish.common.types.KeyCode
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DataCollectionApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DataCollectionApiImpl.groovy
index 447c378249e..0c99011c804 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DataCollectionApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DataCollectionApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.v1.function.DataCollectionFunctions
 import ish.oncourse.server.api.v1.model.FieldValidationTypeDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DiscountApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DiscountApiImpl.groovy
index 49ca3f16a46..875fe809f3e 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DiscountApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DiscountApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.DiscountApiService
 import ish.oncourse.server.api.v1.model.DiscountDTO
 import ish.oncourse.server.api.v1.service.DiscountApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DocumentApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DocumentApiImpl.groovy
index 1407426017c..9fc67197c69 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DocumentApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/DocumentApiImpl.groovy
@@ -11,12 +11,11 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.document.DocumentService
 import ish.s3.AmazonS3Service
 import ish.oncourse.server.api.service.DocumentApiService
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.DocumentDTO
 import ish.oncourse.server.api.v1.model.DocumentVersionDTO
 import ish.oncourse.server.api.v1.model.DocumentVisibilityDTO
@@ -26,8 +25,6 @@ import ish.oncourse.server.cayenne.DocumentVersion
 import ish.oncourse.server.users.SystemUserService
 import org.apache.cayenne.ObjectContext
 import org.apache.commons.collections.CollectionUtils
-import org.apache.logging.log4j.LogManager
-import org.apache.logging.log4j.Logger
 
 import static ish.oncourse.server.api.v1.function.DocumentFunctions.deleteDocumentVersion
 import static ish.oncourse.server.api.v1.function.DocumentFunctions.updateDocumentVersion
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EmailTemplateApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EmailTemplateApiImpl.groovy
index c8cbb152d04..3898959e9ec 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EmailTemplateApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EmailTemplateApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.AutomationStatus
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.service.EmailTemplateApiService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EnrolmentApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EnrolmentApiImpl.groovy
index e0c63aed5aa..2995e7052d2 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EnrolmentApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EnrolmentApiImpl.groovy
@@ -11,10 +11,9 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.EnrolmentApiService
 import ish.oncourse.server.api.v1.model.CancelEnrolmentDTO
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.EnrolmentDTO
 import ish.oncourse.server.api.v1.service.EnrolmentApi
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EntityApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EntityApiImpl.groovy
index a4cd7f7c5ad..fb214e31f45 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EntityApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EntityApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileDynamic
 import ish.oncourse.aql.AqlService
 import ish.oncourse.server.ICayenneService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EntityRelationTypeApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EntityRelationTypeApiImpl.groovy
index 4b170408d82..0ecfd5dd4fe 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EntityRelationTypeApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/EntityRelationTypeApiImpl.groovy
@@ -1,6 +1,6 @@
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.dao.EntityRelationTypeDao
 import ish.oncourse.server.api.service.EntityRelationTypeApiService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ExportApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ExportApiImpl.groovy
index 910e9b63462..09d8774b7ba 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ExportApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ExportApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.security.api.IPermissionService
 import ish.oncourse.types.OutputType
 import ish.oncourse.aql.AqlService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ExportTemplateApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ExportTemplateApiImpl.groovy
index 074b2ec1096..612e8372c40 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ExportTemplateApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ExportTemplateApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileDynamic
 import ish.oncourse.server.api.service.ExportTemplateApiService
 import ish.oncourse.server.api.v1.model.AutomationConfigsDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FacultyApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FacultyApiImpl.groovy
index 6671484a6f6..a9ada2e9e3e 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FacultyApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FacultyApiImpl.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.FacultyApiService
 import ish.oncourse.server.api.v1.model.FacultyDTO
 import ish.oncourse.server.api.v1.service.FacultyApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FilterApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FilterApiImpl.groovy
index ec33e762f94..566b021f0fb 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FilterApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FilterApiImpl.groovy
@@ -11,13 +11,9 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.aql.AqlService
 import ish.oncourse.server.ICayenneService
-import static ish.oncourse.server.api.v1.function.FilterFunctions.checkForBadRequest
-import static ish.oncourse.server.api.v1.function.FilterFunctions.isFilterNotNull
-import static ish.oncourse.server.api.v1.function.FilterFunctions.isFilterNull
-import static ish.oncourse.server.api.v1.function.FilterFunctions.validateFilter
 import ish.oncourse.server.api.v1.model.FilterDTO
 import ish.oncourse.server.api.v1.service.FilterApi
 import ish.oncourse.server.cayenne.SavedFind
@@ -26,6 +22,11 @@ import org.apache.cayenne.Cayenne
 import org.apache.cayenne.ObjectContext
 import org.apache.cayenne.query.ObjectSelect
 
+import static ish.oncourse.server.api.v1.function.FilterFunctions.checkForBadRequest
+import static ish.oncourse.server.api.v1.function.FilterFunctions.isFilterNotNull
+import static ish.oncourse.server.api.v1.function.FilterFunctions.isFilterNull
+import static ish.oncourse.server.api.v1.function.FilterFunctions.validateFilter
+
 class FilterApiImpl implements FilterApi {
 
     @Inject
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FinalisePeriodApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FinalisePeriodApiImpl.groovy
index 75d6527d11a..6eda88e648a 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FinalisePeriodApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FinalisePeriodApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.PaymentStatus
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.v1.model.FinalisePeriodInfoDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FundingContractApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FundingContractApiImpl.groovy
index 03e56c5cd50..5c2c9185129 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FundingContractApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FundingContractApiImpl.groovy
@@ -11,9 +11,14 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.dao.FundingSourceDao
+import ish.oncourse.server.api.v1.model.FundingSourceDTO
+import ish.oncourse.server.api.v1.service.FundingContractApi
+import ish.oncourse.server.cayenne.FundingSource
+import org.apache.cayenne.ObjectContext
+
 import static ish.oncourse.server.api.function.EntityFunctions.checkForBadRequest
 import static ish.oncourse.server.api.function.EntityFunctions.validateEntityExistence
 import static ish.oncourse.server.api.function.EntityFunctions.validateIdParam
@@ -22,10 +27,6 @@ import static ish.oncourse.server.api.v1.function.FundingContractFunctions.toRes
 import static ish.oncourse.server.api.v1.function.FundingContractFunctions.validateForDelete
 import static ish.oncourse.server.api.v1.function.FundingContractFunctions.validateForPatch
 import static ish.oncourse.server.api.v1.function.FundingContractFunctions.validateForSave
-import ish.oncourse.server.api.v1.model.FundingSourceDTO
-import ish.oncourse.server.api.v1.service.FundingContractApi
-import ish.oncourse.server.cayenne.FundingSource
-import org.apache.cayenne.ObjectContext
 
 class FundingContractApiImpl implements FundingContractApi {
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FundingUploadApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FundingUploadApiImpl.groovy
index 7da5e560a9e..d2f0269f336 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FundingUploadApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/FundingUploadApiImpl.groovy
@@ -11,24 +11,24 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.aql.AqlService
 import ish.oncourse.server.ICayenneService
-import static ish.oncourse.server.api.function.CayenneFunctions.getRecordById
-import static ish.oncourse.server.api.function.EntityFunctions.addAqlExp
-import static ish.oncourse.server.api.function.EntityFunctions.checkForBadRequest
-import static ish.oncourse.server.api.function.EntityFunctions.validateEntityExistence
-import static ish.oncourse.server.api.function.EntityFunctions.validateIdParam
 import ish.oncourse.server.api.v1.function.FundingUploadFunctions
-import static ish.oncourse.server.api.v1.function.FundingUploadFunctions.validateStatus
 import ish.oncourse.server.api.v1.model.FundingUploadDTO
 import ish.oncourse.server.api.v1.service.FundingUploadApi
 import ish.oncourse.server.cayenne.FundingUpload
-import ish.oncourse.server.cayenne.glue.CayenneDataObject
 import ish.oncourse.server.services.ISystemUserService
 import org.apache.cayenne.ObjectContext
 import org.apache.cayenne.query.ObjectSelect
 
+import static ish.oncourse.server.api.function.CayenneFunctions.getRecordById
+import static ish.oncourse.server.api.function.EntityFunctions.addAqlExp
+import static ish.oncourse.server.api.function.EntityFunctions.checkForBadRequest
+import static ish.oncourse.server.api.function.EntityFunctions.validateEntityExistence
+import static ish.oncourse.server.api.function.EntityFunctions.validateIdParam
+import static ish.oncourse.server.api.v1.function.FundingUploadFunctions.validateStatus
+
 class FundingUploadApiImpl implements FundingUploadApi {
 
     @Inject
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/GradingApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/GradingApiImpl.groovy
index b5d86bdbd3d..adb56f7e2c7 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/GradingApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/GradingApiImpl.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.GradingApiService
 import ish.oncourse.server.api.v1.model.GradingTypeDTO
 import ish.oncourse.server.api.v1.service.GradingApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/HolidayApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/HolidayApiImpl.groovy
index 199a35d253a..eb536a1e481 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/HolidayApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/HolidayApiImpl.groovy
@@ -11,14 +11,9 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.dao.UnavailableRuleDao
-import static ish.oncourse.server.api.v1.function.HolidayFunctions.getHolidayById
-import static ish.oncourse.server.api.v1.function.HolidayFunctions.toDbHoliday
-import static ish.oncourse.server.api.v1.function.HolidayFunctions.toRestHoliday
-import static ish.oncourse.server.api.v1.function.HolidayFunctions.validateFoUpdate
-import static ish.oncourse.server.api.v1.function.HolidayFunctions.validateForDelete
 import ish.oncourse.server.api.v1.model.HolidayDTO
 import ish.oncourse.server.api.v1.model.ValidationErrorDTO
 import ish.oncourse.server.api.v1.service.HolidayApi
@@ -28,6 +23,12 @@ import org.apache.cayenne.ObjectContext
 import javax.ws.rs.ClientErrorException
 import javax.ws.rs.core.Response
 
+import static ish.oncourse.server.api.v1.function.HolidayFunctions.getHolidayById
+import static ish.oncourse.server.api.v1.function.HolidayFunctions.toDbHoliday
+import static ish.oncourse.server.api.v1.function.HolidayFunctions.toRestHoliday
+import static ish.oncourse.server.api.v1.function.HolidayFunctions.validateFoUpdate
+import static ish.oncourse.server.api.v1.function.HolidayFunctions.validateForDelete
+
 class HolidayApiImpl implements HolidayApi {
 
     @Inject
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ImportApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ImportApiImpl.groovy
index 23fe6dba4ef..c90b4235a75 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ImportApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ImportApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.json.JsonSlurper
 import ish.oncourse.server.api.service.ImportApiService
 import ish.oncourse.server.api.v1.model.AutomationConfigsDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/IntegrationApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/IntegrationApiImpl.groovy
index e57c172d31d..733826b3f0d 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/IntegrationApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/IntegrationApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.v1.login.Sso
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/InvoiceApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/InvoiceApiImpl.groovy
index f5f0df512eb..b8265326c4b 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/InvoiceApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/InvoiceApiImpl.groovy
@@ -11,9 +11,8 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.InvoiceApiService
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.InvoiceDTO
 import ish.oncourse.server.api.v1.service.InvoiceApi
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/LeadApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/LeadApiImpl.groovy
index 239c4d8f82d..4a979174e89 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/LeadApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/LeadApiImpl.groovy
@@ -8,9 +8,8 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.LeadApiService
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.LeadDTO
 import ish.oncourse.server.api.v1.service.LeadApi
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/LogsApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/LogsApiImpl.groovy
index c4d7da81ea6..9032919fb94 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/LogsApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/LogsApiImpl.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.LogsApiService
 import ish.oncourse.server.api.v1.model.DatesIntervalDTO
 import ish.oncourse.server.api.v1.model.LogFileDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/MembershipProductApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/MembershipProductApiImpl.groovy
index c8149a7968b..fe2dc884087 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/MembershipProductApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/MembershipProductApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.api.service.MembershipProductApiService
 import ish.oncourse.server.api.v1.function.EntityRelationFunctions
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/MessageApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/MessageApiImpl.groovy
index f81c49da270..291e91fcb1b 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/MessageApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/MessageApiImpl.groovy
@@ -11,9 +11,8 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.MessageApiService
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.MessageDTO
 import ish.oncourse.server.api.v1.model.RecipientsDTO
 import ish.oncourse.server.api.v1.model.SearchQueryDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ModuleApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ModuleApiImpl.groovy
index aaccadf5673..45e85646813 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ModuleApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ModuleApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.api.service.ModuleApiService
 import ish.oncourse.server.api.v1.model.ModuleDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/NoteApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/NoteApiImpl.groovy
index 3ce20e5ba06..eb8433aefa3 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/NoteApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/NoteApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.NoteApiService
 import ish.oncourse.server.api.v1.model.NoteDTO
 import ish.oncourse.server.api.v1.service.NoteApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/OutcomeApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/OutcomeApiImpl.groovy
index faac6d1c861..062e11c6cbe 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/OutcomeApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/OutcomeApiImpl.groovy
@@ -11,9 +11,8 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.OutcomeApiService
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.OutcomeDTO
 import ish.oncourse.server.api.v1.service.OutcomeApi
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentApiImpl.groovy
index 7c04273e00a..e7bc220d995 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentApiImpl.groovy
@@ -11,17 +11,9 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
-import static ish.common.types.PaymentType.CHEQUE
-import static ish.common.types.PaymentType.CREDIT_CARD
-import static ish.common.types.PaymentType.OTHER
 import ish.oncourse.server.ICayenneService
-import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.SYSTEM_TYPES
-import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.updateType
-import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.validateData
-import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.validateForDelete
-import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.validateForUpdate
 import ish.oncourse.server.api.v1.model.PayTypeDTO
 import ish.oncourse.server.api.v1.model.PaymentMethodDTO
 import ish.oncourse.server.api.v1.model.ValidationErrorDTO
@@ -37,6 +29,15 @@ import javax.ws.rs.ClientErrorException
 import javax.ws.rs.core.Response
 import java.time.ZoneOffset
 
+import static ish.common.types.PaymentType.CHEQUE
+import static ish.common.types.PaymentType.CREDIT_CARD
+import static ish.common.types.PaymentType.OTHER
+import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.SYSTEM_TYPES
+import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.updateType
+import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.validateData
+import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.validateForDelete
+import static ish.oncourse.server.api.v1.function.PaymentTypeFunctions.validateForUpdate
+
 @CompileStatic
 class PaymentApiImpl implements PaymentApi {
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentInApiImpl.java b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentInApiImpl.java
index 13b5394e2e9..2b0d7db7a8c 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentInApiImpl.java
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentInApiImpl.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.api.service.PaymentInApiService;
 import ish.oncourse.server.api.v1.model.BankingParamDTO;
 import ish.oncourse.server.api.v1.model.PaymentInDTO;
@@ -27,7 +27,6 @@ public PaymentInDTO get(Long id) {
         return service.get(id);
     }
 
-
     @Override
     public void reverse(Long id) {
         service.reverseWithCommit(id);
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentOutApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentOutApiImpl.groovy
index 53bf1eb3792..8c188ad5b73 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentOutApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PaymentOutApiImpl.groovy
@@ -11,12 +11,10 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
-import ish.common.types.PaymentType
+import javax.inject.Inject
 import ish.oncourse.server.api.service.PaymentOutApiService
 import ish.oncourse.server.api.v1.model.PaymentOutDTO
 import ish.oncourse.server.api.v1.service.PaymentOutApi
-import ish.oncourse.server.cayenne.PaymentOut
 
 class PaymentOutApiImpl implements PaymentOutApi {
     @Inject
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PayrollApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PayrollApiImpl.groovy
index be6c7540375..e8715fe85e1 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PayrollApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PayrollApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import static ish.oncourse.server.api.function.EntityFunctions.checkForBadRequest
 import static ish.oncourse.server.api.v1.function.PayrollFunctions.toPayrollGenerationRequest
 import static ish.oncourse.server.api.v1.function.PayrollFunctions.toWagesToProcess
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PayslipApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PayslipApiImpl.groovy
index 9862c111098..e4abc266aff 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PayslipApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PayslipApiImpl.groovy
@@ -11,12 +11,11 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import static ish.oncourse.server.api.function.CayenneFunctions.getRecordById
 import ish.oncourse.server.api.service.PayslipApiService
 import static ish.oncourse.server.api.v1.function.PayslipFunctions.markAs
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.PayslipDTO
 import ish.oncourse.server.api.v1.model.PayslipRequestDTO
 import ish.oncourse.server.api.v1.service.PayslipApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PdfApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PdfApiImpl.groovy
index 19d6f05adbe..13291593ed9 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PdfApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PdfApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.aql.AqlService
 import ish.oncourse.server.ICayenneService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PdfTemplateApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PdfTemplateApiImpl.groovy
index 0130288600f..97f2329607b 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PdfTemplateApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PdfTemplateApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.ReportApiService
 import ish.oncourse.server.api.v1.model.AutomationConfigsDTO
 import ish.oncourse.server.api.v1.model.ReportDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PreferenceApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PreferenceApiImpl.groovy
index 4cbbb679506..6e6c9f0db36 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PreferenceApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PreferenceApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.ClassFundingSource
 import ish.common.types.DeliveryMode
 import ish.common.types.MessageStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PriorLearningApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PriorLearningApiImpl.groovy
index 53710323074..978df5fa78f 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PriorLearningApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/PriorLearningApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.PriorLearningApiService
 import ish.oncourse.server.api.v1.model.PriorLearningDTO
 import ish.oncourse.server.api.v1.service.PriorLearningApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ProductItemApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ProductItemApiImpl.groovy
index 52195ec19e2..b816027bf3e 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ProductItemApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ProductItemApiImpl.groovy
@@ -11,9 +11,8 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.ProductItemApiService
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.ProductItemCancelDTO
 import ish.oncourse.server.api.v1.model.ProductItemDTO
 import ish.oncourse.server.api.v1.service.ProductItemApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/QualificationApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/QualificationApiImpl.groovy
index 7b623abfa7b..ef81224cacd 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/QualificationApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/QualificationApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.QualificationApiService
 import ish.oncourse.server.api.v1.model.QualificationDTO
 import ish.oncourse.server.api.v1.service.QualificationApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ReportOverlayApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ReportOverlayApiImpl.groovy
index 06d63ee54c7..9d0f1e74f40 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ReportOverlayApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ReportOverlayApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.v1.model.ReportOverlayDTO
@@ -52,8 +52,6 @@ class  ReportOverlayApiImpl implements ReportOverlayApi {
         context.commitChanges()
     }
 
-
-
     @Override
     void remove(Long id) {
         ObjectContext context = cayenneService.newContext
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/RoomApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/RoomApiImpl.groovy
index b612fb2ad1c..552dba7f193 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/RoomApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/RoomApiImpl.groovy
@@ -11,13 +11,11 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.RoomApiService
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.RoomDTO
 import ish.oncourse.server.api.v1.service.RoomApi
 
-
 class RoomApiImpl implements RoomApi {
 
     @Inject
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/RoomValidationApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/RoomValidationApiImpl.groovy
index 785f3fd38a1..3f6f884c391 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/RoomValidationApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/RoomValidationApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.dao.RoomDao
 import ish.oncourse.server.api.service.RoomApiService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ScriptApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ScriptApiImpl.groovy
index c19d9fd58d4..57507c1403d 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ScriptApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/ScriptApiImpl.groovy
@@ -12,7 +12,7 @@
 package ish.oncourse.server.api.v1.service.impl
 
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.v1.model.AutomationConfigsDTO
 import ish.oncourse.types.OutputType
 import ish.oncourse.aql.AqlService
@@ -23,18 +23,13 @@ import ish.oncourse.server.api.v1.model.ScriptDTO
 import ish.oncourse.server.api.v1.service.ScriptApi
 import ish.oncourse.server.api.validation.EntityValidator
 import ish.scripting.ScriptResult
-import org.apache.logging.log4j.LogManager
-import org.apache.logging.log4j.Logger
 
 import javax.servlet.http.HttpServletResponse
 import javax.ws.rs.core.Context
 import java.time.LocalDateTime
 
-
 class ScriptApiImpl implements ScriptApi {
 
-    private static final Logger logger = LogManager.getLogger();
-
     @Inject
     private ICayenneService cayenneService
 
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SessionApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SessionApiImpl.groovy
index bc40051c329..4c2ece24e60 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SessionApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SessionApiImpl.groovy
@@ -13,7 +13,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.SessionApiService
 import ish.oncourse.server.api.v1.model.SessionDTO
 import ish.oncourse.server.api.v1.model.SessionWarningDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SiteApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SiteApiImpl.groovy
index dab9f9af335..cd1f7f29c5d 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SiteApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SiteApiImpl.groovy
@@ -11,13 +11,11 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.SiteApiService
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.SiteDTO
 import ish.oncourse.server.api.v1.service.SiteApi
 
-
 class SiteApiImpl implements SiteApi {
 
     @Inject
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SurveyApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SurveyApiImpl.groovy
index 266f0d703a1..83183106fa3 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SurveyApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/SurveyApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.SurveyApiService
 import ish.oncourse.server.api.v1.model.SurveyItemDTO
 import ish.oncourse.server.api.v1.service.SurveyApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TagApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TagApiImpl.groovy
index 7065493d729..f28aea97a6b 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TagApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TagApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.NodeType
 import ish.oncourse.aql.AqlService
 import ish.oncourse.cayenne.TaggableClasses
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TaxApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TaxApiImpl.groovy
index bcc483c1bee..48a58063685 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TaxApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TaxApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import static ish.oncourse.server.api.v1.function.TaxFunctions.GST_TAX_CODE
 import static ish.oncourse.server.api.v1.function.TaxFunctions.GST_exempt_TAX_CODE
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TimetableApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TimetableApiImpl.groovy
index ef5e84868e8..9e007606278 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TimetableApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TimetableApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.aql.AqlService
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.dao.SessionDao
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TransactionApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TransactionApiImpl.groovy
index 774ea880074..6ae9b335319 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TransactionApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TransactionApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.math.Money
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.accounting.AccountTransactionService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TutorRoleApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TutorRoleApiImpl.groovy
index 8e25291f34d..017015c6262 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TutorRoleApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/TutorRoleApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.TutorRoleApiService
 import ish.oncourse.server.api.v1.model.DefinedTutorRoleDTO
 import ish.oncourse.server.api.v1.service.TutorRoleApi
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserApiImpl.groovy
index 4f43018b93d..95fb00495a9 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserApiImpl.groovy
@@ -11,8 +11,8 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
-import com.google.inject.Provider
+import javax.inject.Inject
+import javax.inject.Provider
 import com.nulabinc.zxcvbn.Strength
 import com.nulabinc.zxcvbn.Zxcvbn
 import ish.oncourse.server.ICayenneService
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserPreferenceApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserPreferenceApiImpl.groovy
index d4660507cbf..2eb3f7158de 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserPreferenceApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserPreferenceApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.PreferenceController
 import ish.oncourse.server.api.v1.model.PreferenceEnumDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserRoleApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserRoleApiImpl.groovy
index cc2152e32e5..49ee7691358 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserRoleApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/UserRoleApiImpl.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.function.CayenneFunctions
 import static ish.oncourse.server.api.v1.function.UserRoleFunctions.toDbACLRole
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/VoucherProductApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/VoucherProductApiImpl.groovy
index f1576ea2a6a..1e9ab65ab87 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/VoucherProductApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/VoucherProductApiImpl.groovy
@@ -11,11 +11,10 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.api.service.VoucherProductApiService
 import ish.oncourse.server.api.v1.function.EntityRelationFunctions
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.VoucherProductDTO
 import ish.oncourse.server.api.v1.service.VoucherProductApi
 import ish.oncourse.server.cayenne.Product
@@ -29,7 +28,6 @@ class VoucherProductApiImpl implements VoucherProductApi {
     @Inject
     private VoucherProductApiService service
 
-
     @Override
     void create(VoucherProductDTO voucherProductDTO) {
         VoucherProduct dbModel = service.create(voucherProductDTO)
diff --git a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/WaitingListApiImpl.groovy b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/WaitingListApiImpl.groovy
index 567fce92337..1191a4bb688 100644
--- a/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/WaitingListApiImpl.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/api/v1/service/impl/WaitingListApiImpl.groovy
@@ -11,13 +11,11 @@
 
 package ish.oncourse.server.api.v1.service.impl
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.service.WaitingListApiService
-import ish.oncourse.server.api.v1.model.DiffDTO
 import ish.oncourse.server.api.v1.model.WaitingListDTO
 import ish.oncourse.server.api.v1.service.WaitingListApi
 
-
 class WaitingListApiImpl implements WaitingListApi {
 
     @Inject
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/CertificateTrait.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/CertificateTrait.groovy
index 2b91f80f516..5e92a0f8431 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/CertificateTrait.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/CertificateTrait.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.API
 import ish.oncourse.server.api.service.PortalWebsiteService
 import ish.util.UrlUtil
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/ContactTrait.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/ContactTrait.groovy
index a08f09eaec4..b476eeca6b7 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/ContactTrait.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/ContactTrait.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.ProductStatus
 import ish.oncourse.API
 import ish.oncourse.server.PreferenceController
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/CourseTrait.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/CourseTrait.groovy
index 4c5e288d7cb..c614307411a 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/CourseTrait.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/CourseTrait.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.API
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.v1.model.CourseStatusDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/Document.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/Document.groovy
index a50fcf9a317..e316d2cfb44 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/Document.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/Document.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.AttachmentInfoVisibility
 import ish.common.types.NodeType
 import ish.oncourse.API
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/GradingTypeTrait.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/GradingTypeTrait.groovy
index 0462150a0ca..7f1a4a7f8f0 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/GradingTypeTrait.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/GradingTypeTrait.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.GradingEntryType
 import ish.oncourse.server.ICayenneService
 import org.apache.cayenne.query.ObjectSelect
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/Invoice.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/Invoice.groovy
index 737929678b1..07b0a7ce03a 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/Invoice.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/Invoice.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.EnrolmentStatus
 import ish.common.types.InvoiceType
 import ish.math.Money
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/MembershipProductTrait.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/MembershipProductTrait.groovy
index ad7e917c470..0a856096c3e 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/MembershipProductTrait.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/MembershipProductTrait.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.ProductStatus
 import ish.oncourse.server.ICayenneService
 import org.apache.cayenne.query.ObjectSelect
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/Preference.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/Preference.groovy
index e3be2f42c88..00186fcc3ce 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/Preference.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/Preference.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.API
 import ish.oncourse.cayenne.QueueableEntity
 import ish.oncourse.entity.services.TagService
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/Quote.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/Quote.groovy
index 665d2fbbed5..48fc6e0671f 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/Quote.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/Quote.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.InvoiceType
 import ish.math.Money
 import ish.oncourse.API
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/RoomTrait.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/RoomTrait.groovy
index b0fd340419a..b9c5b5d8174 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/RoomTrait.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/RoomTrait.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.CourseClassType
 import ish.oncourse.server.ICayenneService
 import org.apache.cayenne.query.ObjectSelect
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/Student.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/Student.groovy
index 7eb32317e76..5c8dcd0a8db 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/Student.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/Student.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import com.sun.istack.NotNull
 import ish.common.types.AttendanceType
 import ish.common.types.AvetmissStudentDisabilityType
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/StudentTrait.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/StudentTrait.groovy
index f21cc772b5e..1189ec64201 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/StudentTrait.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/StudentTrait.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import org.apache.cayenne.ObjectContext
 import org.apache.cayenne.query.ObjectSelect
diff --git a/server/src/main/groovy/ish/oncourse/server/cayenne/TagRelation.groovy b/server/src/main/groovy/ish/oncourse/server/cayenne/TagRelation.groovy
index 715959c5a67..0404f015cc4 100644
--- a/server/src/main/groovy/ish/oncourse/server/cayenne/TagRelation.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/cayenne/TagRelation.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.NodeType
 import ish.common.types.SystemEventType
 import ish.common.types.TypesUtil
@@ -20,7 +20,6 @@ import ish.oncourse.cayenne.QueueableEntity
 import ish.oncourse.cayenne.Taggable
 import ish.oncourse.cayenne.TaggableClasses
 import ish.oncourse.common.SystemEvent
-import ish.oncourse.server.cayenne.glue.TaggableCayenneDataObject
 import ish.oncourse.server.cayenne.glue._TagRelation
 import ish.oncourse.server.integration.EventService
 import ish.validation.ValidationFailure
@@ -28,7 +27,6 @@ import org.apache.cayenne.validation.ValidationResult
 
 import javax.annotation.Nonnull
 import javax.annotation.Nullable
-import java.util.Date
 
 /**
  * Object representing relation between tag and entity record tagged with it.
diff --git a/server/src/main/groovy/ish/oncourse/server/checkout/CheckoutApiService.groovy b/server/src/main/groovy/ish/oncourse/server/checkout/CheckoutApiService.groovy
index 9e93bd8c49f..fe35419cbb6 100644
--- a/server/src/main/groovy/ish/oncourse/server/checkout/CheckoutApiService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/checkout/CheckoutApiService.groovy
@@ -8,8 +8,8 @@
 
 package ish.oncourse.server.checkout
 
-import com.google.inject.Inject
-import com.google.inject.Injector
+import javax.inject.Inject
+import io.bootique.di.Injector
 import ish.common.checkout.gateway.PaymentGatewayError
 import ish.common.types.PaymentGatewayType
 import ish.common.types.SystemEventType
diff --git a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/EWayPaymentAPI.groovy b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/EWayPaymentAPI.groovy
index 269a19daff3..05e2f9563d7 100644
--- a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/EWayPaymentAPI.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/EWayPaymentAPI.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.checkout.gateway.eway
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.json.JsonOutput
 import groovy.transform.CompileStatic
 import groovy.transform.TypeCheckingMode
diff --git a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/EWayPaymentService.groovy b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/EWayPaymentService.groovy
index cd00f523682..653cb1e272a 100644
--- a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/EWayPaymentService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/EWayPaymentService.groovy
@@ -8,8 +8,8 @@
 
 package ish.oncourse.server.checkout.gateway.eway
 
-import com.google.inject.Inject
-import com.google.inject.Injector
+import javax.inject.Inject
+import io.bootique.di.Injector
 import ish.math.Money
 import ish.oncourse.server.api.checkout.Checkout
 import ish.oncourse.server.api.v1.model.CheckoutResponseDTO
diff --git a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/test/EWayTestPaymentService.groovy b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/test/EWayTestPaymentService.groovy
index 9faff0aa104..f6f2c0e2696 100644
--- a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/test/EWayTestPaymentService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/eway/test/EWayTestPaymentService.groovy
@@ -8,8 +8,8 @@
 
 package ish.oncourse.server.checkout.gateway.eway.test
 
-import com.google.inject.Inject
-import com.google.inject.Injector
+import javax.inject.Inject
+import io.bootique.di.Injector
 import ish.oncourse.server.checkout.gateway.eway.EWayPaymentService
 
 class EWayTestPaymentService extends EWayPaymentService {
diff --git a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/windcave/WindcavePaymentAPI.groovy b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/windcave/WindcavePaymentAPI.groovy
index eeb96b3d403..2c9af6fd852 100644
--- a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/windcave/WindcavePaymentAPI.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/windcave/WindcavePaymentAPI.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.checkout.gateway.windcave
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.json.JsonOutput
 import groovy.transform.CompileStatic
 import groovy.transform.TypeCheckingMode
diff --git a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/windcave/WindcavePaymentService.groovy b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/windcave/WindcavePaymentService.groovy
index d1647e4f65e..d2c412c825e 100644
--- a/server/src/main/groovy/ish/oncourse/server/checkout/gateway/windcave/WindcavePaymentService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/checkout/gateway/windcave/WindcavePaymentService.groovy
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.checkout.gateway.windcave
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.checkout.gateway.SessionAttributes
 import ish.math.Money
 import ish.oncourse.server.PreferenceController
diff --git a/server/src/main/groovy/ish/oncourse/server/dashboard/DashboardSearchManager.groovy b/server/src/main/groovy/ish/oncourse/server/dashboard/DashboardSearchManager.groovy
index 1fcd6895d41..310de4552e7 100644
--- a/server/src/main/groovy/ish/oncourse/server/dashboard/DashboardSearchManager.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/dashboard/DashboardSearchManager.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.dashboard
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.api.v1.model.SearchGroupDTO
 
 class DashboardSearchManager {
diff --git a/server/src/main/groovy/ish/oncourse/server/dashboard/EntitySearchService.groovy b/server/src/main/groovy/ish/oncourse/server/dashboard/EntitySearchService.groovy
index f824a0aa2ed..c447d342ec0 100644
--- a/server/src/main/groovy/ish/oncourse/server/dashboard/EntitySearchService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/dashboard/EntitySearchService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.dashboard
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.types.KeyCode
 import ish.common.types.Mask
 import ish.oncourse.aql.AqlService
diff --git a/server/src/main/groovy/ish/oncourse/server/deduplication/ContactMergeService.groovy b/server/src/main/groovy/ish/oncourse/server/deduplication/ContactMergeService.groovy
index 2363399efe4..bd5a05acc09 100644
--- a/server/src/main/groovy/ish/oncourse/server/deduplication/ContactMergeService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/deduplication/ContactMergeService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.deduplication
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.CayenneService
 import ish.oncourse.server.api.dao.ContactDao
diff --git a/server/src/main/groovy/ish/oncourse/server/document/DocumentModule.groovy b/server/src/main/groovy/ish/oncourse/server/document/DocumentModule.groovy
index 73ae304f9b4..d5e1677438b 100644
--- a/server/src/main/groovy/ish/oncourse/server/document/DocumentModule.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/document/DocumentModule.groovy
@@ -8,8 +8,8 @@
 
 package ish.oncourse.server.document
 
-import com.google.inject.Provides
-import com.google.inject.Singleton
+import io.bootique.di.Provides
+import javax.inject.Singleton
 import io.bootique.ConfigModule
 import io.bootique.config.ConfigurationFactory
 import ish.oncourse.server.ICayenneService
diff --git a/server/src/main/groovy/ish/oncourse/server/entity/mixins/MixinHelper.groovy b/server/src/main/groovy/ish/oncourse/server/entity/mixins/MixinHelper.groovy
index fac0bd4252d..7a2332c333e 100644
--- a/server/src/main/groovy/ish/oncourse/server/entity/mixins/MixinHelper.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/entity/mixins/MixinHelper.groovy
@@ -11,8 +11,8 @@
 
 package ish.oncourse.server.entity.mixins
 
-import com.google.inject.Inject
-import com.google.inject.Injector
+import javax.inject.Inject
+import io.bootique.di.Injector
 import groovy.transform.CompileDynamic
 import ish.oncourse.cayenne.PersistentObjectI
 import ish.oncourse.server.cayenne.Account
diff --git a/server/src/main/groovy/ish/oncourse/server/export/ExportService.groovy b/server/src/main/groovy/ish/oncourse/server/export/ExportService.groovy
index f4ca2896685..9ec21a3e5cc 100644
--- a/server/src/main/groovy/ish/oncourse/server/export/ExportService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/export/ExportService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.export
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.json.JsonGenerator
 import groovy.json.StreamingJsonBuilder
 import groovy.transform.CompileDynamic
diff --git a/server/src/main/groovy/ish/oncourse/server/imports/ImportService.groovy b/server/src/main/groovy/ish/oncourse/server/imports/ImportService.groovy
index 5a59e349411..aa142ca4eae 100644
--- a/server/src/main/groovy/ish/oncourse/server/imports/ImportService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/imports/ImportService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.imports
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileDynamic
 import groovy.transform.CompileStatic
 import ish.imports.ImportParameter
diff --git a/server/src/main/groovy/ish/oncourse/server/integration/OnConfigure.groovy b/server/src/main/groovy/ish/oncourse/server/integration/OnConfigure.groovy
index 4c7fbe781c4..dff0021d778 100644
--- a/server/src/main/groovy/ish/oncourse/server/integration/OnConfigure.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/integration/OnConfigure.groovy
@@ -6,7 +6,7 @@ import java.lang.annotation.RetentionPolicy
 import java.lang.annotation.Target
 
 /**
- * Use this for static void method that accept single com.google.inject.Binder argument
+ * Use this for static void method that accept single io.bootique.di.Binder argument
  * Is called on DI configuration phase  
  */
 
diff --git a/server/src/main/groovy/ish/oncourse/server/integration/PluginService.groovy b/server/src/main/groovy/ish/oncourse/server/integration/PluginService.groovy
index a055be1003c..49737f089b6 100644
--- a/server/src/main/groovy/ish/oncourse/server/integration/PluginService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/integration/PluginService.groovy
@@ -11,9 +11,9 @@
 
 package ish.oncourse.server.integration
 
-import com.google.inject.Binder
-import com.google.inject.Inject
-import com.google.inject.Injector
+import io.bootique.di.Binder
+import javax.inject.Inject
+import io.bootique.di.Injector
 import groovy.transform.CompileStatic
 import io.bootique.cayenne.CayenneModule
 import org.reflections.Reflections
diff --git a/server/src/main/groovy/ish/oncourse/server/integration/PluginTrait.groovy b/server/src/main/groovy/ish/oncourse/server/integration/PluginTrait.groovy
index 8e57812d8d2..b7bee0d2f85 100644
--- a/server/src/main/groovy/ish/oncourse/server/integration/PluginTrait.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/integration/PluginTrait.groovy
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.integration
 
-import com.google.inject.Injector
+import io.bootique.di.Injector
 import ish.oncourse.aql.AqlService
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.PreferenceController
diff --git a/server/src/main/groovy/ish/oncourse/server/messaging/MailDeliveryService.groovy b/server/src/main/groovy/ish/oncourse/server/messaging/MailDeliveryService.groovy
index 4d897e46349..20ab0046f42 100644
--- a/server/src/main/groovy/ish/oncourse/server/messaging/MailDeliveryService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/messaging/MailDeliveryService.groovy
@@ -11,12 +11,11 @@
 
 package ish.oncourse.server.messaging
 
-import com.google.inject.Inject
-import com.google.inject.name.Named
+import javax.inject.Inject
+import javax.inject.Named
 import com.sun.mail.smtp.SMTPMessage
 import groovy.transform.CompileDynamic
 import ish.oncourse.server.AngelModule
-import ish.oncourse.server.PreferenceController
 import static javax.mail.Message.RecipientType
 import org.apache.commons.lang3.StringUtils
 
diff --git a/server/src/main/groovy/ish/oncourse/server/messaging/MailSession.groovy b/server/src/main/groovy/ish/oncourse/server/messaging/MailSession.groovy
index b437b885dc9..e199b4b0880 100644
--- a/server/src/main/groovy/ish/oncourse/server/messaging/MailSession.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/messaging/MailSession.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.messaging
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileDynamic
 import org.apache.commons.lang3.StringUtils
 import org.apache.logging.log4j.LogManager
diff --git a/server/src/main/groovy/ish/oncourse/server/messaging/MessageService.groovy b/server/src/main/groovy/ish/oncourse/server/messaging/MessageService.groovy
index 9a0ef683232..7ffcf7b334f 100644
--- a/server/src/main/groovy/ish/oncourse/server/messaging/MessageService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/messaging/MessageService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.messaging
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileDynamic
 import ish.common.types.MessageStatus
 import ish.common.types.MessageType
diff --git a/server/src/main/groovy/ish/oncourse/server/messaging/SMTPModule.groovy b/server/src/main/groovy/ish/oncourse/server/messaging/SMTPModule.groovy
index 337e9b6d9d6..f25334ac082 100644
--- a/server/src/main/groovy/ish/oncourse/server/messaging/SMTPModule.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/messaging/SMTPModule.groovy
@@ -8,8 +8,8 @@
 
 package ish.oncourse.server.messaging
 
-import com.google.inject.Provides
-import com.google.inject.Singleton
+import io.bootique.di.Provides
+import javax.inject.Singleton
 import io.bootique.ConfigModule
 import io.bootique.config.ConfigurationFactory
 
diff --git a/server/src/main/groovy/ish/oncourse/server/modules/ApiCayenneLayerModule.groovy b/server/src/main/groovy/ish/oncourse/server/modules/ApiCayenneLayerModule.groovy
index 8994fc9b8c9..4d29267fd91 100644
--- a/server/src/main/groovy/ish/oncourse/server/modules/ApiCayenneLayerModule.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/modules/ApiCayenneLayerModule.groovy
@@ -11,9 +11,8 @@
 
 package ish.oncourse.server.modules
 
-import com.google.inject.Binder
-import com.google.inject.Module
-import com.google.inject.Scopes
+import io.bootique.di.Binder
+import io.bootique.di.BQModule
 import ish.oncourse.server.api.dao.AccountDao
 import ish.oncourse.server.api.dao.ApiTokenDao
 import ish.oncourse.server.api.dao.ApplicationDao
@@ -71,81 +70,80 @@ import ish.oncourse.server.api.dao.VoucherProductCourseDao
 import ish.oncourse.server.api.dao.VoucherProductDao
 import ish.oncourse.server.api.dao.WaitingListDao
 
-class ApiCayenneLayerModule implements Module {
+class ApiCayenneLayerModule implements BQModule {
 
     @Override
     void configure(Binder binder) {
-        binder.bind(AccountDao).in(Scopes.SINGLETON)
-        binder.bind(ApplicationDao).in(Scopes.SINGLETON)
-        binder.bind(ArticleProductDao).in(Scopes.SINGLETON)
-        binder.bind(AssessmentDao).in(Scopes.SINGLETON)
-        binder.bind(AssessmentSubmissionDao).in(Scopes.SINGLETON)
-
-
-        binder.bind(CertificateDao).in(Scopes.SINGLETON)
-        binder.bind(CertificateOutcomeDao).in(Scopes.SINGLETON)
-        binder.bind(ContactDao).in(Scopes.SINGLETON)
-        binder.bind(ContactRelationTypeDao).in(Scopes.SINGLETON)
-        binder.bind(CorporatePassDao).in(Scopes.SINGLETON)
-        binder.bind(CorporatePassProductDao).in(Scopes.SINGLETON)
-        binder.bind(CourseDao).in(Scopes.SINGLETON)
-        binder.bind(CourseModuleDao).in(Scopes.SINGLETON)
-        binder.bind(CourseClassDao).in(Scopes.SINGLETON)
-
-        binder.bind(DefinedTutorRoleDao).in(Scopes.SINGLETON)
-        binder.bind(DiscountDao).in(Scopes.SINGLETON)
-        binder.bind(DiscountMembershipDao).in(Scopes.SINGLETON)
-        binder.bind(DiscountMembershipRelationTypeDao).in(Scopes.SINGLETON)
-        binder.bind(DocumentDao).in(Scopes.SINGLETON)
-
-        binder.bind(EmailTemplateDao).in(Scopes.SINGLETON)
-        binder.bind(EnrolmentDao).in(Scopes.SINGLETON)
-        binder.bind(EntityRelationDao).in(Scopes.SINGLETON)
-        binder.bind(EntityRelationTypeDao).in(Scopes.SINGLETON)
-        binder.bind(ExportTemplateDao).in(Scopes.SINGLETON)
-
-        binder.bind(FacultyDao).in(Scopes.SINGLETON)
-        binder.bind(FieldConfigurationSchemeDao).in(Scopes.SINGLETON)
-        binder.bind(GradingTypeDao).in(Scopes.SINGLETON)
-
-        binder.bind(ImportDao).in(Scopes.SINGLETON)
-        binder.bind(InvoiceDao).in(Scopes.SINGLETON)
-        binder.bind(InvoiceDueDateDao).in(Scopes.SINGLETON)
-        binder.bind(InvoiceLineDao).in(Scopes.SINGLETON)
-
-        binder.bind(LeadDao).in(Scopes.SINGLETON)
-        binder.bind(MembershipProductDao).in(Scopes.SINGLETON)
-        binder.bind(MessageDao).in(Scopes.SINGLETON)
-        binder.bind(ModuleDao).in(Scopes.SINGLETON)
-
-        binder.bind(OutcomeDao).in(Scopes.SINGLETON)
-
-        binder.bind(PaymentInDao).in(Scopes.SINGLETON)
-        binder.bind(PayRateDao).in(Scopes.SINGLETON)
-        binder.bind(PriorLearningDao).in(Scopes.SINGLETON)
-        binder.bind(ProductDao).in(Scopes.SINGLETON)
-        binder.bind(PayslipDao).in(Scopes.SINGLETON)
-
-        binder.bind(QualificationDao).in(Scopes.SINGLETON)
-
-        binder.bind(SurveyDao).in(Scopes.SINGLETON)
-        binder.bind(ScriptDao).in(Scopes.SINGLETON)
-
-        binder.bind(TaxDao).in(Scopes.SINGLETON)
-
-        binder.bind(VoucherProductCourseDao).in(Scopes.SINGLETON)
-        binder.bind(VoucherProductDao).in(Scopes.SINGLETON)
-        binder.bind(ReportDao).in(Scopes.SINGLETON)
-        binder.bind(ReportOverlayDao).in(Scopes.SINGLETON)
-        binder.bind(NoteDao).in(Scopes.SINGLETON)
-        binder.bind(CourseClassDao).in(Scopes.SINGLETON)
-        binder.bind(CourseClassTutorDao).in(Scopes.SINGLETON)
-        binder.bind(ClassCostDao).in(Scopes.SINGLETON)
-
-        binder.bind(UnavailableRuleDao).in(Scopes.SINGLETON)
-        binder.bind(UserDao).in(Scopes.SINGLETON)
-        binder.bind(WaitingListDao).in(Scopes.SINGLETON)
-        binder.bind(ApiTokenDao).in(Scopes.SINGLETON)
-
+        binder.bind(AccountDao).inSingletonScope()
+        binder.bind(ApplicationDao).inSingletonScope()
+        binder.bind(ArticleProductDao).inSingletonScope()
+        binder.bind(AssessmentDao).inSingletonScope()
+        binder.bind(AssessmentSubmissionDao).inSingletonScope()
+
+
+        binder.bind(CertificateDao).inSingletonScope()
+        binder.bind(CertificateOutcomeDao).inSingletonScope()
+        binder.bind(ContactDao).inSingletonScope()
+        binder.bind(ContactRelationTypeDao).inSingletonScope()
+        binder.bind(CorporatePassDao).inSingletonScope()
+        binder.bind(CorporatePassProductDao).inSingletonScope()
+        binder.bind(CourseDao).inSingletonScope()
+        binder.bind(CourseModuleDao).inSingletonScope()
+        binder.bind(CourseClassDao).inSingletonScope()
+
+        binder.bind(DefinedTutorRoleDao).inSingletonScope()
+        binder.bind(DiscountDao).inSingletonScope()
+        binder.bind(DiscountMembershipDao).inSingletonScope()
+        binder.bind(DiscountMembershipRelationTypeDao).inSingletonScope()
+        binder.bind(DocumentDao).inSingletonScope()
+
+        binder.bind(EmailTemplateDao).inSingletonScope()
+        binder.bind(EnrolmentDao).inSingletonScope()
+        binder.bind(EntityRelationDao).inSingletonScope()
+        binder.bind(EntityRelationTypeDao).inSingletonScope()
+        binder.bind(ExportTemplateDao).inSingletonScope()
+
+        binder.bind(FacultyDao).inSingletonScope()
+        binder.bind(FieldConfigurationSchemeDao).inSingletonScope()
+        binder.bind(GradingTypeDao).inSingletonScope()
+
+        binder.bind(ImportDao).inSingletonScope()
+        binder.bind(InvoiceDao).inSingletonScope()
+        binder.bind(InvoiceDueDateDao).inSingletonScope()
+        binder.bind(InvoiceLineDao).inSingletonScope()
+
+        binder.bind(LeadDao).inSingletonScope()
+        binder.bind(MembershipProductDao).inSingletonScope()
+        binder.bind(MessageDao).inSingletonScope()
+        binder.bind(ModuleDao).inSingletonScope()
+
+        binder.bind(OutcomeDao).inSingletonScope()
+
+        binder.bind(PaymentInDao).inSingletonScope()
+        binder.bind(PayRateDao).inSingletonScope()
+        binder.bind(PriorLearningDao).inSingletonScope()
+        binder.bind(ProductDao).inSingletonScope()
+        binder.bind(PayslipDao).inSingletonScope()
+
+        binder.bind(QualificationDao).inSingletonScope()
+
+        binder.bind(SurveyDao).inSingletonScope()
+        binder.bind(ScriptDao).inSingletonScope()
+
+        binder.bind(TaxDao).inSingletonScope()
+
+        binder.bind(VoucherProductCourseDao).inSingletonScope()
+        binder.bind(VoucherProductDao).inSingletonScope()
+        binder.bind(ReportDao).inSingletonScope()
+        binder.bind(ReportOverlayDao).inSingletonScope()
+        binder.bind(NoteDao).inSingletonScope()
+        binder.bind(CourseClassDao).inSingletonScope()
+        binder.bind(CourseClassTutorDao).inSingletonScope()
+        binder.bind(ClassCostDao).inSingletonScope()
+
+        binder.bind(UnavailableRuleDao).inSingletonScope()
+        binder.bind(UserDao).inSingletonScope()
+        binder.bind(WaitingListDao).inSingletonScope()
+        binder.bind(ApiTokenDao).inSingletonScope()
     }
 }
diff --git a/server/src/main/groovy/ish/oncourse/server/modules/ApiImplementationModule.groovy b/server/src/main/groovy/ish/oncourse/server/modules/ApiImplementationModule.groovy
index fe39bda1694..5ed3e51c520 100644
--- a/server/src/main/groovy/ish/oncourse/server/modules/ApiImplementationModule.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/modules/ApiImplementationModule.groovy
@@ -11,8 +11,8 @@
 
 package ish.oncourse.server.modules
 
-import com.google.inject.Binder
-import com.google.inject.Module
+import io.bootique.di.Binder
+import io.bootique.di.BQModule
 import ish.oncourse.server.api.v1.service.AccessApi
 import ish.oncourse.server.api.v1.service.AccountApi
 import ish.oncourse.server.api.v1.service.ApplicationApi
@@ -176,7 +176,7 @@ import ish.oncourse.server.api.v1.service.impl.UserRoleApiImpl
 import ish.oncourse.server.api.v1.service.impl.VoucherProductApiImpl
 import ish.oncourse.server.api.v1.service.impl.WaitingListApiImpl
 
-class ApiImplementationModule implements Module {
+class ApiImplementationModule implements BQModule {
 
     @Override
     void configure(Binder binder) {
diff --git a/server/src/main/groovy/ish/oncourse/server/modules/ApiServiceModule.groovy b/server/src/main/groovy/ish/oncourse/server/modules/ApiServiceModule.groovy
index 140ecfe6cf5..14c7199f0f4 100644
--- a/server/src/main/groovy/ish/oncourse/server/modules/ApiServiceModule.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/modules/ApiServiceModule.groovy
@@ -11,145 +11,96 @@
 
 package ish.oncourse.server.modules
 
-import com.google.inject.Binder
-import com.google.inject.Module
-import com.google.inject.Scopes
-import com.google.inject.multibindings.Multibinder
-import ish.oncourse.server.api.service.AccountApiService
-import ish.oncourse.server.api.service.ApiTokenApiService
-import ish.oncourse.server.api.service.ApplicationApiService
-import ish.oncourse.server.api.service.ArticleProductApiService
-import ish.oncourse.server.api.service.AssessmentApiService
-import ish.oncourse.server.api.service.AssessmentSubmissionApiService
-import ish.oncourse.server.api.service.BulkChangeApiService
-import ish.oncourse.server.api.service.CertificateApiService
-import ish.oncourse.server.api.service.ClassCostApiService
-import ish.oncourse.server.api.service.ContactApiService
-import ish.oncourse.server.api.service.CourseApiService
-import ish.oncourse.server.api.service.CourseClassApiService
-import ish.oncourse.server.api.service.CourseClassTutorApiService
-import ish.oncourse.server.api.service.DocumentApiService
-import ish.oncourse.server.api.service.EmailTemplateApiService
-import ish.oncourse.server.api.service.EnrolmentApiService
-import ish.oncourse.server.api.service.EntityApiService
-import ish.oncourse.server.api.service.EntityRelationTypeApiService
-import ish.oncourse.server.api.service.ExportTemplateApiService
-import ish.oncourse.server.api.service.FacultyApiService
-import ish.oncourse.server.api.service.GradingApiService
-import ish.oncourse.server.api.service.ImportApiService
-import ish.oncourse.server.api.service.InvoiceApiService
-import ish.oncourse.server.api.service.LeadApiService
-import ish.oncourse.server.api.service.LogsApiService
-import ish.oncourse.server.api.service.MembershipProductApiService
-import ish.oncourse.server.api.service.MessageApiService
-import ish.oncourse.server.api.service.ModuleApiService
-import ish.oncourse.server.api.service.NoteApiService
-import ish.oncourse.server.api.service.OutcomeApiService
-import ish.oncourse.server.api.service.PayslipApiService
-import ish.oncourse.server.api.service.PortalWebsiteService
-import ish.oncourse.server.api.service.PriorLearningApiService
-import ish.oncourse.server.api.service.QualificationApiService
-import ish.oncourse.server.api.service.ReportApiService
-import ish.oncourse.server.api.service.RoomApiService
-import ish.oncourse.server.api.service.ScriptApiService
-import ish.oncourse.server.api.service.SiteApiService
-import ish.oncourse.server.api.service.SurveyApiService
-import ish.oncourse.server.api.service.TutorRoleApiService
-import ish.oncourse.server.api.service.VoucherProductApiService
-import ish.oncourse.server.api.service.WaitingListApiService
+import io.bootique.di.BQModule
+import io.bootique.di.Binder
+import ish.oncourse.server.api.service.*
 import ish.oncourse.server.api.validation.EntityValidator
 import ish.oncourse.server.checkout.CheckoutApiService
+import ish.oncourse.server.checkout.gateway.eway.EWayPaymentAPI
+import ish.oncourse.server.checkout.gateway.eway.EWayPaymentService
 import ish.oncourse.server.checkout.gateway.eway.test.EWayTestPaymentAPI
 import ish.oncourse.server.checkout.gateway.eway.test.EWayTestPaymentService
 import ish.oncourse.server.checkout.gateway.offline.OfflinePaymentService
-import ish.oncourse.server.concurrent.ExecutorManager
-import ish.oncourse.server.dashboard.ClassSearchService
-import ish.oncourse.server.dashboard.ContactSearchService
-import ish.oncourse.server.dashboard.CourseSearchService
-import ish.oncourse.server.dashboard.DashboardSearchManager
-import ish.oncourse.server.dashboard.EnrolmentSearchService
-import ish.oncourse.server.dashboard.InvoiceSearchService
-import ish.oncourse.server.checkout.gateway.eway.EWayPaymentAPI
-import ish.oncourse.server.checkout.gateway.eway.EWayPaymentService
 import ish.oncourse.server.checkout.gateway.windcave.WindcavePaymentAPI
 import ish.oncourse.server.checkout.gateway.windcave.WindcavePaymentService
+import ish.oncourse.server.concurrent.ExecutorManager
+import ish.oncourse.server.dashboard.*
 
-
-class ApiServiceModule implements Module {
+class ApiServiceModule implements BQModule {
 
     @Override
     void configure(Binder binder) {
-        binder.bind(ExecutorManager).in(Scopes.SINGLETON)
+        binder.bind(ExecutorManager).inSingletonScope()
 
-        binder.bind(ClassSearchService).in(Scopes.SINGLETON)
-        binder.bind(ContactSearchService).in(Scopes.SINGLETON)
-        binder.bind(CourseSearchService).in(Scopes.SINGLETON)
-        binder.bind(EnrolmentSearchService).in(Scopes.SINGLETON)
-        binder.bind(InvoiceSearchService).in(Scopes.SINGLETON)
-        binder.bind(DashboardSearchManager).in(Scopes.SINGLETON)
+        binder.bind(ClassSearchService).inSingletonScope()
+        binder.bind(ContactSearchService).inSingletonScope()
+        binder.bind(CourseSearchService).inSingletonScope()
+        binder.bind(EnrolmentSearchService).inSingletonScope()
+        binder.bind(InvoiceSearchService).inSingletonScope()
+        binder.bind(DashboardSearchManager).inSingletonScope()
 
-        binder.bind(EntityValidator).in(Scopes.SINGLETON)
+        binder.bind(EntityValidator).inSingletonScope()
 
-        def entityServicesBinder = Multibinder.newSetBinder(binder, EntityApiService.class)
-        entityServicesBinder.addBinding().to(ApplicationApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(ArticleProductApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(AssessmentApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(AssessmentSubmissionApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(ContactApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(CourseApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(CourseClassApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(DocumentApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(EnrolmentApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(ExportTemplateApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(GradingApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(ImportApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(InvoiceApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(LeadApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(MembershipProductApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(MessageApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(ModuleApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(NoteApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(OutcomeApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(PayslipApiService).in(Scopes.NO_SCOPE)
-        entityServicesBinder.addBinding().to(RoomApiService).in(Scopes.NO_SCOPE)
-        entityServicesBinder.addBinding().to(SiteApiService).in(Scopes.NO_SCOPE)
-        entityServicesBinder.addBinding().to(VoucherProductApiService).in(Scopes.SINGLETON)
-        entityServicesBinder.addBinding().to(WaitingListApiService).in(Scopes.NO_SCOPE)
-        entityServicesBinder.addBinding().to(FacultyApiService).in(Scopes.SINGLETON)
+        def entityServicesBinder = binder.bindSet(EntityApiService.class)
+        entityServicesBinder.add(ApplicationApiService).inSingletonScope()
+        entityServicesBinder.add(ArticleProductApiService).inSingletonScope()
+        entityServicesBinder.add(AssessmentApiService).inSingletonScope()
+        entityServicesBinder.add(AssessmentSubmissionApiService).inSingletonScope()
+        entityServicesBinder.add(ContactApiService).inSingletonScope()
+        entityServicesBinder.add(CourseApiService).inSingletonScope()
+        entityServicesBinder.add(CourseClassApiService).inSingletonScope()
+        entityServicesBinder.add(DocumentApiService).inSingletonScope()
+        entityServicesBinder.add(EnrolmentApiService).inSingletonScope()
+        entityServicesBinder.add(ExportTemplateApiService).inSingletonScope()
+        entityServicesBinder.add(GradingApiService).inSingletonScope()
+        entityServicesBinder.add(ImportApiService).inSingletonScope()
+        entityServicesBinder.add(InvoiceApiService).inSingletonScope()
+        entityServicesBinder.add(LeadApiService).inSingletonScope()
+        entityServicesBinder.add(MembershipProductApiService).inSingletonScope()
+        entityServicesBinder.add(MessageApiService).inSingletonScope()
+        entityServicesBinder.add(ModuleApiService).inSingletonScope()
+        entityServicesBinder.add(NoteApiService).inSingletonScope()
+        entityServicesBinder.add(OutcomeApiService).inSingletonScope()
+        entityServicesBinder.add(PayslipApiService)
+        entityServicesBinder.add(RoomApiService)
+        entityServicesBinder.add(SiteApiService)
+        entityServicesBinder.add(VoucherProductApiService).inSingletonScope()
+        entityServicesBinder.add(WaitingListApiService)
+        entityServicesBinder.add(FacultyApiService).inSingletonScope()
 
-        binder.bind(AccountApiService).in(Scopes.SINGLETON)
-        binder.bind(ApiTokenApiService).in(Scopes.NO_SCOPE)
-        binder.bind(CertificateApiService).in(Scopes.SINGLETON)
-        binder.bind(ClassCostApiService).in(Scopes.SINGLETON)
-        binder.bind(CourseClassTutorApiService).in(Scopes.SINGLETON)
-        binder.bind(EmailTemplateApiService).in(Scopes.SINGLETON)
-        binder.bind(EntityRelationTypeApiService).in(Scopes.NO_SCOPE)
-        binder.bind(ExportTemplateApiService).in(Scopes.SINGLETON)
-        binder.bind(FacultyApiService).in(Scopes.SINGLETON)
-        binder.bind(GradingApiService).in(Scopes.SINGLETON)
-        binder.bind(ImportApiService).in(Scopes.SINGLETON)
-        binder.bind(InvoiceApiService).in(Scopes.SINGLETON)
-        binder.bind(LeadApiService).in(Scopes.SINGLETON)
-        binder.bind(LogsApiService).in(Scopes.SINGLETON)
-        binder.bind(CheckoutApiService).in(Scopes.SINGLETON)
-        binder.bind(EWayPaymentAPI).in(Scopes.SINGLETON)
-        binder.bind(EWayPaymentService).in(Scopes.SINGLETON)
-        binder.bind(EWayTestPaymentAPI).in(Scopes.SINGLETON)
-        binder.bind(EWayTestPaymentService).in(Scopes.SINGLETON)
-        binder.bind(OfflinePaymentService).in(Scopes.SINGLETON)
-        binder.bind(WindcavePaymentAPI).in(Scopes.SINGLETON)
-        binder.bind(WindcavePaymentService).in(Scopes.SINGLETON)
-        binder.bind(PriorLearningApiService).in(Scopes.SINGLETON)
-        binder.bind(QualificationApiService).in(Scopes.SINGLETON)
-        binder.bind(ReportApiService).in(Scopes.SINGLETON)
-        binder.bind(RoomApiService).in(Scopes.NO_SCOPE)
-        binder.bind(ScriptApiService).in(Scopes.SINGLETON)
-        binder.bind(SurveyApiService).in(Scopes.SINGLETON)
-        binder.bind(TutorRoleApiService).in(Scopes.SINGLETON)
-        binder.bind(BulkChangeApiService).in(Scopes.SINGLETON)
-        binder.bind(VoucherProductApiService).in(Scopes.SINGLETON)
-        binder.bind(WaitingListApiService).in(Scopes.NO_SCOPE)
-        binder.bind(PortalWebsiteService).in(Scopes.SINGLETON)
+        binder.bind(AccountApiService).inSingletonScope()
+        binder.bind(ApiTokenApiService)
+        binder.bind(CertificateApiService).inSingletonScope()
+        binder.bind(ClassCostApiService).inSingletonScope()
+        binder.bind(CourseClassTutorApiService).inSingletonScope()
+        binder.bind(EmailTemplateApiService).inSingletonScope()
+        binder.bind(EntityRelationTypeApiService)
+        binder.bind(ExportTemplateApiService).inSingletonScope()
+        binder.bind(FacultyApiService).inSingletonScope()
+        binder.bind(GradingApiService).inSingletonScope()
+        binder.bind(ImportApiService).inSingletonScope()
+        binder.bind(InvoiceApiService).inSingletonScope()
+        binder.bind(LeadApiService).inSingletonScope()
+        binder.bind(LogsApiService).inSingletonScope()
+        binder.bind(CheckoutApiService).inSingletonScope()
+        binder.bind(EWayPaymentAPI).inSingletonScope()
+        binder.bind(EWayPaymentService).inSingletonScope()
+        binder.bind(EWayTestPaymentAPI).inSingletonScope()
+        binder.bind(EWayTestPaymentService).inSingletonScope()
+        binder.bind(OfflinePaymentService).inSingletonScope()
+        binder.bind(WindcavePaymentAPI).inSingletonScope()
+        binder.bind(WindcavePaymentService).inSingletonScope()
+        binder.bind(PriorLearningApiService).inSingletonScope()
+        binder.bind(QualificationApiService).inSingletonScope()
+        binder.bind(ReportApiService).inSingletonScope()
+        binder.bind(RoomApiService)
+        binder.bind(ScriptApiService).inSingletonScope()
+        binder.bind(SurveyApiService).inSingletonScope()
+        binder.bind(TutorRoleApiService).inSingletonScope()
+        binder.bind(BulkChangeApiService).inSingletonScope()
+        binder.bind(VoucherProductApiService).inSingletonScope()
+        binder.bind(WaitingListApiService)
+        binder.bind(PortalWebsiteService).inSingletonScope()
 
     }
 }
diff --git a/server/src/main/groovy/ish/oncourse/server/modules/CustomServicesModule.groovy b/server/src/main/groovy/ish/oncourse/server/modules/CustomServicesModule.groovy
index 5e94286659a..beceb70896c 100644
--- a/server/src/main/groovy/ish/oncourse/server/modules/CustomServicesModule.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/modules/CustomServicesModule.groovy
@@ -11,17 +11,16 @@
 
 package ish.oncourse.server.modules
 
-import com.google.inject.Binder
-import com.google.inject.Module
-import com.google.inject.Scopes
+import io.bootique.di.BQModule
+import io.bootique.di.Binder
 import ish.oncourse.server.api.service.RefundService
 import ish.oncourse.server.duplicate.DuplicateInvoiceService
 
-class CustomServicesModule implements Module {
+class CustomServicesModule implements BQModule {
 
     @Override
     void configure(Binder binder) {
-        binder.bind(DuplicateInvoiceService).in(Scopes.SINGLETON)
-        binder.bind(RefundService).in(Scopes.SINGLETON)
+        binder.bind(DuplicateInvoiceService).inSingletonScope()
+        binder.bind(RefundService).inSingletonScope()
     }
 }
diff --git a/server/src/main/groovy/ish/oncourse/server/modules/JasperReportsModule.groovy b/server/src/main/groovy/ish/oncourse/server/modules/JasperReportsModule.groovy
index 395f065c409..b8ca1d2eb61 100644
--- a/server/src/main/groovy/ish/oncourse/server/modules/JasperReportsModule.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/modules/JasperReportsModule.groovy
@@ -8,11 +8,11 @@
 
 package ish.oncourse.server.modules
 
-import com.google.inject.Binder
-import com.google.inject.Module
+import io.bootique.di.Binder
+import io.bootique.di.BQModule
 import ish.oncourse.server.jasper.JasperReportsConfig
 
-class JasperReportsModule implements Module {
+class JasperReportsModule implements BQModule {
 
     @Override
     void configure(Binder binder) {
diff --git a/server/src/main/groovy/ish/oncourse/server/modules/MonitoringModule.groovy b/server/src/main/groovy/ish/oncourse/server/modules/MonitoringModule.groovy
index 8cc6cc53c92..d4516dae627 100644
--- a/server/src/main/groovy/ish/oncourse/server/modules/MonitoringModule.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/modules/MonitoringModule.groovy
@@ -8,15 +8,14 @@
 
 package ish.oncourse.server.modules
 
-import com.google.inject.Binder
-import com.google.inject.Provides
-import com.google.inject.Scopes
-import com.google.inject.Singleton
-import com.google.inject.TypeLiteral
+import io.bootique.di.Binder
+import io.bootique.di.Provides
+import javax.inject.Singleton
+import io.bootique.di.TypeLiteral
 import io.bootique.ConfigModule
 import io.bootique.config.ConfigurationFactory
 import io.bootique.jetty.MappedServlet
-import ish.oncourse.server.jetty.AngelJettyModule
+import io.bootique.jetty.AngelJettyModule
 import ish.oncourse.server.monitoring.MonitoringService
 import ish.oncourse.server.monitoring.MonitoringServiceFactory
 import ish.oncourse.server.monitoring.MonitoringServletContextHandlerExtender
@@ -52,9 +51,9 @@ class MonitoringModule extends ConfigModule {
     @Override
     void configure(Binder binder) {
         AngelJettyModule.extend(binder)
-        .addMappedServlet(MONITORING_SERVLET)
-        .addContextHandlerExtender(MonitoringServletContextHandlerExtender)
+                .addMappedServlet(MONITORING_SERVLET)
+                .addContextHandlerExtender(MonitoringServletContextHandlerExtender)
 
-        binder.bind(MonitoringStatisticService.class).in(Scopes.SINGLETON)
+        binder.bind(MonitoringStatisticService.class).inSingletonScope()
     }
 }
diff --git a/server/src/main/groovy/ish/oncourse/server/monitoring/MonitoringStatisticService.groovy b/server/src/main/groovy/ish/oncourse/server/monitoring/MonitoringStatisticService.groovy
index eacd3a76243..a88034af7de 100644
--- a/server/src/main/groovy/ish/oncourse/server/monitoring/MonitoringStatisticService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/monitoring/MonitoringStatisticService.groovy
@@ -8,8 +8,7 @@
 
 package ish.oncourse.server.monitoring
 
-import com.google.inject.Inject
-import com.sun.management.OperatingSystemMXBean
+import javax.inject.Inject
 import com.zaxxer.hikari.HikariConfigMXBean
 import com.zaxxer.hikari.HikariPoolMXBean
 import ish.oncourse.common.ResourcesUtil
diff --git a/server/src/main/groovy/ish/oncourse/server/preference/UserPreferenceService.groovy b/server/src/main/groovy/ish/oncourse/server/preference/UserPreferenceService.groovy
index b4306cea895..88c0f170683 100644
--- a/server/src/main/groovy/ish/oncourse/server/preference/UserPreferenceService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/preference/UserPreferenceService.groovy
@@ -12,8 +12,8 @@
 package ish.oncourse.server.preference
 
 import com.fasterxml.jackson.databind.ObjectMapper
-import com.google.inject.Inject
-import com.google.inject.Singleton
+import javax.inject.Inject
+import javax.inject.Singleton
 import groovy.transform.CompileStatic
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.PreferenceController
diff --git a/server/src/main/groovy/ish/oncourse/server/quality/QualityCheckJob.groovy b/server/src/main/groovy/ish/oncourse/server/quality/QualityCheckJob.groovy
index 10199309406..2e6cf7c6c73 100644
--- a/server/src/main/groovy/ish/oncourse/server/quality/QualityCheckJob.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/quality/QualityCheckJob.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.quality
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.QualityRule
 import org.apache.cayenne.query.ObjectSelect
diff --git a/server/src/main/groovy/ish/oncourse/server/quality/QualityService.groovy b/server/src/main/groovy/ish/oncourse/server/quality/QualityService.groovy
index 7fe82115a06..77c560a95bd 100644
--- a/server/src/main/groovy/ish/oncourse/server/quality/QualityService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/quality/QualityService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.quality
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.PreferenceController
diff --git a/server/src/main/groovy/ish/oncourse/server/querying/QueryService.groovy b/server/src/main/groovy/ish/oncourse/server/querying/QueryService.groovy
index a32adb80638..6a568f6c1cb 100644
--- a/server/src/main/groovy/ish/oncourse/server/querying/QueryService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/querying/QueryService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.querying
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.aql.AqlService
 import ish.oncourse.aql.CompilationResult
 import ish.oncourse.server.CayenneService
diff --git a/server/src/main/groovy/ish/oncourse/server/scripting/GroovyScriptService.groovy b/server/src/main/groovy/ish/oncourse/server/scripting/GroovyScriptService.groovy
index be21e878c99..33f8d3fa816 100644
--- a/server/src/main/groovy/ish/oncourse/server/scripting/GroovyScriptService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/scripting/GroovyScriptService.groovy
@@ -10,8 +10,8 @@
  */
 package ish.oncourse.server.scripting
 
-import com.google.inject.Inject
-import com.google.inject.Injector
+import javax.inject.Inject
+import io.bootique.di.Injector
 import groovy.transform.CompileStatic
 import io.bootique.BQRuntime
 import ish.common.types.AutomationStatus
diff --git a/server/src/main/groovy/ish/oncourse/server/scripting/ScriptClosureFactory.groovy b/server/src/main/groovy/ish/oncourse/server/scripting/ScriptClosureFactory.groovy
index 458456020cf..bcf9ef64719 100644
--- a/server/src/main/groovy/ish/oncourse/server/scripting/ScriptClosureFactory.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/scripting/ScriptClosureFactory.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.scripting
 
-import com.google.inject.Injector
+import io.bootique.di.Injector
 import groovy.transform.CompileDynamic
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.IntegrationConfiguration
@@ -29,7 +29,6 @@ class ScriptClosureFactory {
     public ICayenneService cayenneService
     public Injector injector
 
-
     void setSpecClass(Class<? extends ScriptClosureTrait> specClass) {
         this.specClass = specClass
         this.integrationClass = specClass.getAnnotation(ScriptClosure).integration()
@@ -93,6 +92,4 @@ class ScriptClosureFactory {
                     .select(cayenneService.newContext)
         }
     }
-
-
 }
diff --git a/server/src/main/groovy/ish/oncourse/server/security/api/permission/ChainPermission.groovy b/server/src/main/groovy/ish/oncourse/server/security/api/permission/ChainPermission.groovy
index ccd9fc1e02f..0a45a11a3e5 100644
--- a/server/src/main/groovy/ish/oncourse/server/security/api/permission/ChainPermission.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/security/api/permission/ChainPermission.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.security.api.permission
 
-import com.google.inject.Injector
+import io.bootique.di.Injector
 import groovy.transform.CompileStatic
 
 /**
diff --git a/server/src/main/groovy/ish/oncourse/server/security/api/permission/custom/EmailMassCheckPermission.groovy b/server/src/main/groovy/ish/oncourse/server/security/api/permission/custom/EmailMassCheckPermission.groovy
index a331642bcf0..06372c3fb7b 100644
--- a/server/src/main/groovy/ish/oncourse/server/security/api/permission/custom/EmailMassCheckPermission.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/security/api/permission/custom/EmailMassCheckPermission.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.security.api.permission.custom
 
-import io.bootique.jetty.servlet.DefaultServletEnvironment
+import io.bootique.jetty.servlet.AngelServletEnvironment
 import ish.common.types.KeyCode
 import ish.common.types.Mask
 import ish.oncourse.server.security.api.IPermissionService
@@ -39,7 +39,7 @@ class EmailMassCheckPermission extends ResourcePermission {
     PermissionCheckingResult check() {
         IPermissionService permissionService = injector.getInstance(IPermissionService)
         if (!permissionService.currentUserCan(KeyCode.SPECIAL_EMAIL_MASS, Mask.VIEW)) {
-            String queryString = injector.getInstance(DefaultServletEnvironment)?.request()?.get()?.queryString
+            String queryString = injector.getInstance(AngelServletEnvironment)?.request()?.get()?.queryString
             if (trimToEmpty(queryString).contains(PARAM_NAME)) {
                 String values = queryString.split('&').find{ it.contains(PARAM_NAME) }.split('=')[1]
                 if (values.split(',').size() > 50) {
diff --git a/server/src/main/groovy/ish/oncourse/server/security/api/permission/custom/MessageMassCheckPermission.groovy b/server/src/main/groovy/ish/oncourse/server/security/api/permission/custom/MessageMassCheckPermission.groovy
index 3afea0a7786..29c1a4a6e6b 100644
--- a/server/src/main/groovy/ish/oncourse/server/security/api/permission/custom/MessageMassCheckPermission.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/security/api/permission/custom/MessageMassCheckPermission.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.security.api.permission.custom
 
-import io.bootique.jetty.servlet.DefaultServletEnvironment
+import io.bootique.jetty.servlet.AngelServletEnvironment
 import ish.common.types.KeyCode
 import ish.common.types.Mask
 import ish.oncourse.server.api.v1.model.MessageTypeDTO
@@ -43,7 +43,7 @@ class MessageMassCheckPermission extends ResourcePermission {
     @Override
     PermissionCheckingResult check() {
         permissionService = injector.getInstance(IPermissionService)
-        queryString = injector.getInstance(DefaultServletEnvironment)?.request()?.get()?.queryString
+        queryString = injector.getInstance(AngelServletEnvironment)?.request()?.get()?.queryString
         String messageType = getMessageType()
         if (!StringUtils.isEmpty(messageType)) {
             if (messageType.equalsIgnoreCase(MessageTypeDTO.EMAIL.toString())) {
diff --git a/server/src/main/groovy/ish/oncourse/server/services/AuditService.groovy b/server/src/main/groovy/ish/oncourse/server/services/AuditService.groovy
index 928cce94137..f16dca3cb22 100644
--- a/server/src/main/groovy/ish/oncourse/server/services/AuditService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/services/AuditService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.services
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.glue.CayenneDataObject
diff --git a/server/src/main/groovy/ish/oncourse/server/services/AuthHelper.groovy b/server/src/main/groovy/ish/oncourse/server/services/AuthHelper.groovy
index 50e71813b7e..3c49f8e4765 100644
--- a/server/src/main/groovy/ish/oncourse/server/services/AuthHelper.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/services/AuthHelper.groovy
@@ -11,7 +11,6 @@
 
 package ish.oncourse.server.services
 
-import com.google.inject.Inject
 import com.nimbusds.jose.JWSAlgorithm
 import com.nimbusds.jose.JWSHeader
 import com.nimbusds.jose.JWSSigner
diff --git a/server/src/main/groovy/ish/oncourse/server/services/FundingContractUpdateJob.groovy b/server/src/main/groovy/ish/oncourse/server/services/FundingContractUpdateJob.groovy
index a1b3c6d3f1d..f20a34be2bb 100644
--- a/server/src/main/groovy/ish/oncourse/server/services/FundingContractUpdateJob.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/services/FundingContractUpdateJob.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.services
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.types.FundingStatus
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.FundingUpload
diff --git a/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeModule.java b/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeModule.java
index 778af96327d..73010986ac0 100644
--- a/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeModule.java
+++ b/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeModule.java
@@ -8,8 +8,8 @@
 
 package ish.oncourse.server.services.chargebee;
 
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
+import io.bootique.di.Provides;
+import javax.inject.Singleton;
 import io.bootique.ConfigModule;
 import io.bootique.config.ConfigurationFactory;
 import ish.oncourse.server.ICayenneService;
diff --git a/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeService.groovy b/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeService.groovy
index ac15edb9a0f..2a312cac1cf 100644
--- a/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeService.groovy
@@ -8,7 +8,6 @@
 
 package ish.oncourse.server.services.chargebee
 
-import com.google.inject.Inject
 import io.bootique.annotation.BQConfigProperty
 import ish.common.chargebee.ChargebeePropertyType
 import ish.oncourse.server.ICayenneService
diff --git a/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeUploadJob.groovy b/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeUploadJob.groovy
index 559f23dbe79..ac8a2305900 100644
--- a/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeUploadJob.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/services/chargebee/ChargebeeUploadJob.groovy
@@ -11,14 +11,12 @@ package ish.oncourse.server.services.chargebee
 import com.chargebee.Environment
 import com.chargebee.models.Subscription
 import com.chargebee.models.Usage
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.common.chargebee.ChargebeePropertyType
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.PreferenceController
 import ish.oncourse.server.cayenne.Script
 import ish.oncourse.server.messaging.MessageService
-import ish.oncourse.server.scripting.api.EmailService
-import ish.oncourse.server.scripting.api.EmailSpec
 import ish.oncourse.server.scripting.api.MessageSpec
 import ish.oncourse.server.services.AuditService
 import ish.oncourse.server.services.chargebee.property.ChargebeePropertyProcessor
diff --git a/server/src/main/groovy/ish/oncourse/server/users/SystemUserService.groovy b/server/src/main/groovy/ish/oncourse/server/users/SystemUserService.groovy
index a3dc37ecd1e..8b3fcce3031 100644
--- a/server/src/main/groovy/ish/oncourse/server/users/SystemUserService.groovy
+++ b/server/src/main/groovy/ish/oncourse/server/users/SystemUserService.groovy
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.users
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.oncourse.API
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.api.servlet.ApiFilter
@@ -51,7 +51,7 @@ class SystemUserService implements ISystemUserService {
     }
 
     SystemUser getCurrentUser() {
-        if(ApiFilter.CLIENT_MODE)
+        if (ApiFilter.CLIENT_MODE)
             return SelectById.query(SystemUser, 1l).selectOne(cayenneService.newContext)
 
         return sessionManager.currentUser
diff --git a/server/src/main/java/io/bootique/di/spi/GenericTypesUtils.java b/server/src/main/java/io/bootique/di/spi/GenericTypesUtils.java
new file mode 100644
index 00000000000..ef7ce43b4b4
--- /dev/null
+++ b/server/src/main/java/io/bootique/di/spi/GenericTypesUtils.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright ish group pty ltd 2025.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ *  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.
+ */
+
+package io.bootique.di.spi;
+
+import io.bootique.di.TypeLiteral;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+
+// Clone class of io.bootique.di.spi.GenericTypesUtils,
+// in which the method 'resolveVariableType' is fixed to supprt Generic Types in Generics like 'EntityApiService'
+public class GenericTypesUtils {
+
+    public GenericTypesUtils() {}
+
+    static Type getGenericParameterType(Type type) {
+        if (type instanceof ParameterizedType) {
+            ParameterizedType parameterizedType = (ParameterizedType)type;
+            Type[] parameters = parameterizedType.getActualTypeArguments();
+            if (parameters.length == 1) {
+                return parameters[0];
+            }
+        }
+
+        return null;
+    }
+
+    static Class<?> parameterClass(Type type) {
+        Type parameterType = getGenericParameterType(type);
+        return parameterType == null ? null : typeToClass(parameterType);
+    }
+
+    private static Class<?> typeToClass(Type type) {
+        if (type instanceof Class) {
+            return (Class)type;
+        } else {
+            return type instanceof ParameterizedType ? (Class)((ParameterizedType)type).getRawType() : Object.class;
+        }
+    }
+
+    static TypeLiteral<?> resolveVariableType(Class<?> objectClass, Field field, Type variableType) {
+        Class<?> declaringClass = field.getDeclaringClass();
+        Type genericSuperclass = getSuperclassDeclaringField(objectClass, declaringClass);
+        if (genericSuperclass == null) {
+            return null;
+        } else {
+            int idx = getTypeVariableIdx(variableType.getTypeName(), declaringClass);
+            if (idx == -1) {
+                return null;
+            } else {
+                Class<?> superClass = objectClass;
+                Type actualType;
+                do {
+                    actualType = ((ParameterizedType) superClass.getGenericSuperclass()).getActualTypeArguments()[idx];
+                    if (!(actualType instanceof TypeLiteral)) {
+                        return TypeLiteral.of(actualType);
+                    }
+                    superClass = superClass.getSuperclass();
+                } while (superClass != genericSuperclass.getClass());
+
+                return TypeLiteral.of(actualType);
+            }
+        }
+    }
+
+    private static Type getSuperclassDeclaringField(Class<?> objectClass, Class<?> declaringClass) {
+        while(objectClass.getSuperclass() != null && !objectClass.getSuperclass().equals(declaringClass)) {
+            objectClass = objectClass.getSuperclass();
+        }
+
+        Type genericSuperclass = objectClass.getGenericSuperclass();
+        if (!(genericSuperclass instanceof ParameterizedType)) {
+            return null;
+        } else {
+            return genericSuperclass;
+        }
+    }
+
+    private static int getTypeVariableIdx(String typeVariableName, Class<?> declaringClass) {
+        TypeVariable<? extends Class<?>>[] typeParameters = declaringClass.getTypeParameters();
+
+        int idx;
+        for(idx = 0; idx < typeParameters.length && !typeParameters[idx].getName().equals(typeVariableName); ++idx) {
+        }
+
+        return idx == typeParameters.length ? -1 : idx;
+    }
+}
diff --git a/server/src/main/java/io/bootique/jetty/AngelJettyModule.java b/server/src/main/java/io/bootique/jetty/AngelJettyModule.java
new file mode 100644
index 00000000000..cc7833215ea
--- /dev/null
+++ b/server/src/main/java/io/bootique/jetty/AngelJettyModule.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright ish group pty ltd 2025.
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
+ *
+ *  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.
+ */
+
+package io.bootique.jetty;
+
+import io.bootique.config.ConfigurationFactory;
+import io.bootique.di.Provides;
+import io.bootique.jetty.request.RequestMDCItem;
+import io.bootique.jetty.request.RequestMDCManager;
+import io.bootique.jetty.server.ServerFactory;
+import io.bootique.jetty.server.ServerHolder;
+import io.bootique.jetty.server.ServletContextHandlerExtender;
+import io.bootique.jetty.servlet.AngelServletEnvironment;
+import io.bootique.log.BootLogger;
+import io.bootique.shutdown.ShutdownManager;
+import org.eclipse.jetty.server.Server;
+
+import javax.inject.Singleton;
+import javax.servlet.Filter;
+import javax.servlet.Servlet;
+import java.util.EventListener;
+import java.util.Map;
+import java.util.Set;
+
+public class AngelJettyModule extends JettyModule {
+
+    public AngelJettyModule(String configPrefix) {
+        super(configPrefix);
+    }
+
+    public AngelJettyModule() {
+        super("jetty");
+    }
+
+    @Singleton
+    @Provides
+    ServerFactory providerServerFactory(ConfigurationFactory configFactory) {
+        return configFactory.config(AngelServerFactory.class, getConfigPrefix());
+    }
+
+    @Singleton
+    @Provides
+    Server providerServer(ServerHolder holder) {
+        return super.providerServer(holder);
+    }
+
+    @Singleton
+    @Provides
+    ServerHolder provideServerHolder(ServerFactory factory, Set<Servlet> servlets, Set<MappedServlet> mappedServlets, Set<Filter> filters, Set<MappedFilter> mappedFilters, Set<EventListener> listeners, Set<MappedListener> mappedListeners, Set<ServletContextHandlerExtender> contextHandlerExtenders, RequestMDCManager mcdManager, BootLogger bootLogger, ShutdownManager shutdownManager) {
+        return super.provideServerHolder(factory, servlets, mappedServlets, filters, mappedFilters, listeners, mappedListeners, contextHandlerExtenders, mcdManager, bootLogger, shutdownManager);
+    }
+
+    @Provides
+    @Singleton
+    RequestMDCManager provideRequestMDCManager(Map<String, RequestMDCItem> items) {
+        return super.provideRequestMDCManager(items);
+    }
+
+    @Singleton
+    @Provides
+    AngelServletEnvironment createStateTrackerImpl() {
+        return new AngelServletEnvironment();
+    }
+}
diff --git a/server/src/main/java/ish/oncourse/server/jetty/server/AngelServerFactory.java b/server/src/main/java/io/bootique/jetty/AngelServerFactory.java
similarity index 54%
rename from server/src/main/java/ish/oncourse/server/jetty/server/AngelServerFactory.java
rename to server/src/main/java/io/bootique/jetty/AngelServerFactory.java
index 9c371cc1fe0..d77e41c0faa 100644
--- a/server/src/main/java/ish/oncourse/server/jetty/server/AngelServerFactory.java
+++ b/server/src/main/java/io/bootique/jetty/AngelServerFactory.java
@@ -1,21 +1,17 @@
 /*
- * Copyright ish group pty ltd 2021.
+ * Copyright ish group pty ltd 2025.
  *
  * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
  *
  *  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.
  */
 
-package ish.oncourse.server.jetty.server;
+package io.bootique.jetty;
 
-import io.bootique.jetty.MappedFilter;
-import io.bootique.jetty.MappedListener;
-import io.bootique.jetty.MappedServlet;
 import io.bootique.jetty.connector.ConnectorFactory;
-import io.bootique.jetty.server.ConnectorDescriptor;
-import io.bootique.jetty.server.ServerFactory;
-import io.bootique.jetty.server.ServerLifecycleLogger;
-import io.bootique.jetty.server.ServletContextHandlerExtender;
+import io.bootique.jetty.request.RequestMDCManager;
+import io.bootique.jetty.server.*;
+import ish.oncourse.server.modules.AngelHttpsConnectorFactory;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.eclipse.jetty.server.NetworkConnector;
@@ -26,6 +22,7 @@
 
 import java.util.*;
 
+// Implementation use Jetty 11.0 instead of 9.0
 public class AngelServerFactory extends ServerFactory {
 
     private static final Logger LOGGER = LogManager.getLogger();
@@ -33,64 +30,55 @@ public class AngelServerFactory extends ServerFactory {
     private int maxFormContentSize;
     private int maxFormKeys;
 
-    public Server createServer(
-            Set<MappedServlet> servlets,
-            Set<MappedFilter> filters,
-            Set<MappedListener> listeners,
-            Set<ServletContextHandlerExtender> contextHandlerExtenders) {
-
-        ThreadPool threadPool = createThreadPool();
-        ServletContextHandler contextHandler = createHandler(servlets, filters, listeners);
-
+    @Override
+    public ServerHolder createServerHolder(Set<MappedServlet> servlets, Set<MappedFilter> filters, Set<MappedListener> listeners, Set<ServletContextHandlerExtender> contextHandlerExtenders, RequestMDCManager mdcManager) {
+        String context = this.resolveContext();
+        ThreadPool threadPool = this.createThreadPool();
+        ServletContextHandler contextHandler = this.createHandler(context, servlets, filters, listeners);
         Server server = new Server(threadPool);
         server.setStopAtShutdown(true);
         server.setStopTimeout(1000L);
         server.setHandler(contextHandler);
-
-        // postconfig *after* the handler is associated with the Server. Some extensions like WebSocket require access
-        // to the handler's Server
-        postConfigHandler(contextHandler, contextHandlerExtenders);
-
-        if (maxFormContentSize > 0) {
-            server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", maxFormContentSize);
-            contextHandler.setMaxFormContentSize(maxFormContentSize);
+        this.postConfigHandler(contextHandler, contextHandlerExtenders);
+        if (this.maxFormContentSize > 0) {
+            server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", this.maxFormContentSize);
+            contextHandler.setMaxFormContentSize(this.maxFormContentSize);
         }
 
-        if (maxFormKeys > 0) {
-            server.setAttribute("org.eclipse.jetty.server.Request.maxFormKeys", maxFormKeys);
-            contextHandler.setMaxFormKeys(maxFormKeys);
+        if (this.maxFormKeys > 0) {
+            server.setAttribute("org.eclipse.jetty.server.Request.maxFormKeys", this.maxFormKeys);
+            contextHandler.setMaxFormKeys(this.maxFormKeys);
         }
 
-        createRequestLog(server);
-
-        Collection<ConnectorFactory> connectorFactories = connectorFactories(server);
-
-        Collection<ConnectorDescriptor> connectorDescriptors = new ArrayList<>(2);
-
+        this.createRequestLog(server);
+        Collection<ConnectorFactory> connectorFactories = this.connectorFactories(server);
+        Collection<ConnectorHolder> connectorHolders = new ArrayList(2);
         if (connectorFactories.isEmpty()) {
             LOGGER.warn("Jetty starts with no connectors configured. Is that expected?");
         } else {
-            connectorFactories.forEach(cf -> {
+            connectorFactories.forEach((cf) -> {
                 NetworkConnector connector = cf.createConnector(server);
+                connector.addBean(mdcManager);
                 server.addConnector(connector);
-                connectorDescriptors.add(new ConnectorDescriptor(connector));
+                connectorHolders.add(new ConnectorHolder(connector));
             });
         }
 
-        contextHandler.addEventListener(new ServerLifecycleLogger(connectorDescriptors, context));
-        return server;
+        ServerHolder serverHolder = new ServerHolder(server, context, connectorHolders);
+        contextHandler.addEventListener(new ServerLifecycleLogger(serverHolder));
+        return serverHolder;
     }
 
+    @Override
     protected GzipHandler createGzipHandler() {
         return  new GzipHandler();
     }
 
+    @Override
     protected void installListeners(ServletContextHandler handler, Set<MappedListener> listeners) {
-
         if (listeners.isEmpty()) {
             return;
         }
-
         sortedListeners(listeners).forEach(listener -> {
             LOGGER.info("Adding listener {}", listener.getListener().getClass().getName());
             handler.addEventListener(listener.getListener());
@@ -103,4 +91,18 @@ private List<MappedListener> sortedListeners(Set<MappedListener> unsorted) {
         sorted.sort(Comparator.comparing(MappedListener::getOrder));
         return sorted;
     }
+
+    @Override
+    protected Collection<ConnectorFactory> connectorFactories(Server server) {
+        Collection<ConnectorFactory> connectorFactories = new ArrayList<>();
+        if (this.connectors != null) {
+            connectorFactories.addAll(this.connectors);
+        }
+
+        if (connectorFactories.isEmpty()) {
+            connectorFactories.add(new AngelHttpsConnectorFactory());
+        }
+
+        return connectorFactories;
+    }
 }
diff --git a/server/src/main/java/io/bootique/jetty/servlet/AngelServletEnvironment.java b/server/src/main/java/io/bootique/jetty/servlet/AngelServletEnvironment.java
new file mode 100644
index 00000000000..200860ebec3
--- /dev/null
+++ b/server/src/main/java/io/bootique/jetty/servlet/AngelServletEnvironment.java
@@ -0,0 +1,28 @@
+package io.bootique.jetty.servlet;
+
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Optional;
+
+public class AngelServletEnvironment extends DefaultServletEnvironment {
+
+    // super class requiest variable works incorrect in Bootique version 2.0
+    private static final ThreadLocal<HttpServletRequest> request = new ThreadLocal<>();
+
+    public AngelServletEnvironment() {}
+
+    @Override
+    public Optional<HttpServletRequest> request() {
+        return Optional.ofNullable(request.get());
+    }
+
+    @Override
+    public void requestInitialized(ServletRequestEvent sre) {
+        request.set((HttpServletRequest)sre.getServletRequest());
+    }
+
+    @Override
+    public void requestDestroyed(ServletRequestEvent sre) {
+        request.remove();
+    }
+}
diff --git a/server/src/main/java/ish/oncourse/GoogleGuiceInjector.java b/server/src/main/java/ish/oncourse/BootiqueInjector.java
similarity index 76%
rename from server/src/main/java/ish/oncourse/GoogleGuiceInjector.java
rename to server/src/main/java/ish/oncourse/BootiqueInjector.java
index c2d0bf46ae7..bdd9d43e3ac 100644
--- a/server/src/main/java/ish/oncourse/GoogleGuiceInjector.java
+++ b/server/src/main/java/ish/oncourse/BootiqueInjector.java
@@ -10,16 +10,16 @@
  */
 package ish.oncourse;
 
-import com.google.inject.Inject;
-import com.google.inject.Injector;
+import io.bootique.di.Injector;
+import javax.inject.Inject;
 
-public class GoogleGuiceInjector {
+public class BootiqueInjector {
 
 	private static Injector injector;
 
 	@Inject
-	public GoogleGuiceInjector(Injector injector) {
-		GoogleGuiceInjector.injector = injector;
+	public BootiqueInjector(Injector injector) {
+		BootiqueInjector.injector = injector;
 	}
 
 	public static Injector getInstance() {
diff --git a/server/src/main/java/ish/oncourse/aql/impl/AntlrAqlService.java b/server/src/main/java/ish/oncourse/aql/impl/AntlrAqlService.java
index d45a74b9e69..c4d2926f6b8 100644
--- a/server/src/main/java/ish/oncourse/aql/impl/AntlrAqlService.java
+++ b/server/src/main/java/ish/oncourse/aql/impl/AntlrAqlService.java
@@ -11,10 +11,9 @@
 
 package ish.oncourse.aql.impl;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.aql.AqlService;
 import ish.oncourse.aql.CompilationResult;
-import ish.oncourse.server.cayenne.SystemUser;
 import ish.oncourse.server.users.SystemUserService;
 import org.antlr.v4.runtime.CharStream;
 import org.antlr.v4.runtime.CharStreams;
diff --git a/server/src/main/java/ish/oncourse/aql/impl/CompilationContext.java b/server/src/main/java/ish/oncourse/aql/impl/CompilationContext.java
index 7d0ef9e360c..49a80b05dd0 100644
--- a/server/src/main/java/ish/oncourse/aql/impl/CompilationContext.java
+++ b/server/src/main/java/ish/oncourse/aql/impl/CompilationContext.java
@@ -11,7 +11,6 @@
 
 package ish.oncourse.aql.impl;
 
-import com.google.inject.Inject;
 import ish.oncourse.aql.CompilationError;
 import ish.oncourse.aql.CompilationResult;
 import ish.oncourse.aql.model.Entity;
diff --git a/server/src/main/java/ish/oncourse/entity/services/CourseClassService.java b/server/src/main/java/ish/oncourse/entity/services/CourseClassService.java
index 161a89ad2b8..4ff5394217d 100644
--- a/server/src/main/java/ish/oncourse/entity/services/CourseClassService.java
+++ b/server/src/main/java/ish/oncourse/entity/services/CourseClassService.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.entity.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.budget.ClassBudgetUtil;
 import ish.common.types.EnrolmentStatus;
 import ish.math.Money;
diff --git a/server/src/main/java/ish/oncourse/server/AngelCommand.java b/server/src/main/java/ish/oncourse/server/AngelCommand.java
index 3108c1bd9c3..22899696626 100644
--- a/server/src/main/java/ish/oncourse/server/AngelCommand.java
+++ b/server/src/main/java/ish/oncourse/server/AngelCommand.java
@@ -11,8 +11,8 @@
 
 package ish.oncourse.server;
 
-import com.google.inject.Inject;
-import com.google.inject.Provider;
+import javax.inject.Inject;
+import javax.inject.Provider;
 import io.bootique.cli.Cli;
 import io.bootique.command.CommandOutcome;
 import io.bootique.command.CommandWithMetadata;
diff --git a/server/src/main/java/ish/oncourse/server/AngelModule.java b/server/src/main/java/ish/oncourse/server/AngelModule.java
index 604d532a496..918d5a10726 100644
--- a/server/src/main/java/ish/oncourse/server/AngelModule.java
+++ b/server/src/main/java/ish/oncourse/server/AngelModule.java
@@ -11,13 +11,16 @@
 
 package ish.oncourse.server;
 
-import com.google.inject.*;
-import com.google.inject.name.Names;
 import io.bootique.BQCoreModule;
 import io.bootique.ConfigModule;
 import io.bootique.cayenne.CayenneModule;
 import io.bootique.command.CommandDecorator;
 import io.bootique.config.ConfigurationFactory;
+import io.bootique.di.Binder;
+import io.bootique.di.Injector;
+import io.bootique.di.Provides;
+import io.bootique.di.TypeLiteral;
+import io.bootique.jetty.AngelJettyModule;
 import io.bootique.jetty.MappedFilter;
 import io.bootique.jetty.MappedServlet;
 import io.bootique.jetty.command.ServerCommand;
@@ -27,7 +30,6 @@
 import ish.oncourse.server.integration.EventService;
 import ish.oncourse.server.integration.PluginService;
 import ish.oncourse.server.integration.PluginsPrefsService;
-import ish.oncourse.server.jetty.AngelJettyModule;
 import ish.oncourse.server.lifecycle.*;
 import ish.oncourse.server.modules.AngelJobFactory;
 import ish.oncourse.server.preference.UserPreferenceService;
@@ -52,6 +54,8 @@
 import org.quartz.utils.ConnectionProvider;
 import org.quartz.utils.DBConnectionManager;
 
+import javax.inject.Provider;
+import javax.inject.Singleton;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.*;
@@ -157,15 +161,15 @@ public void configure(Binder binder) {
                 .addMappedServlet(HEALTHCHECK_SERVLET)
                 .addServlet(new ResourceServlet(),"resources", ROOT_URL_PATTERN);
 
-        binder.bind(ISessionManager.class).to(SessionManager.class).in(Scopes.SINGLETON);
-        binder.bind(CertificateUpdateWatcher.class).in(Scopes.SINGLETON);
-        binder.bind(ICayenneService.class).to(CayenneService.class).in(Scopes.SINGLETON);
+        binder.bind(ISessionManager.class).to(SessionManager.class).inSingletonScope();
+        binder.bind(CertificateUpdateWatcher.class).inSingletonScope();
+        binder.bind(ICayenneService.class).to(CayenneService.class).inSingletonScope();
         binder.bind(PreferenceController.class);
         binder.bind(PluginsPrefsService.class);
         binder.bind(UserPreferenceService.class);
-        binder.bind(String.class).annotatedWith(Names.named(ANGEL_VERSION)).toInstance(getVersion());
-        binder.bind(EmailService.class).in(Scopes.SINGLETON);
-        binder.bind(PluginService.class).in(Scopes.SINGLETON);
+        binder.bind(String.class, ANGEL_VERSION).toInstance(getVersion());
+        binder.bind(EmailService.class).inSingletonScope();
+        binder.bind(PluginService.class).inSingletonScope();
         PluginService.configurePlugin(binder);
     }
 
diff --git a/server/src/main/java/ish/oncourse/server/AngelServer.java b/server/src/main/java/ish/oncourse/server/AngelServer.java
index f7836906ee3..1fce58e9359 100755
--- a/server/src/main/java/ish/oncourse/server/AngelServer.java
+++ b/server/src/main/java/ish/oncourse/server/AngelServer.java
@@ -15,7 +15,7 @@
 import io.bootique.cayenne.CayenneModule;
 import io.bootique.jdbc.JdbcModule;
 import io.bootique.jdbc.hikaricp.JdbcHikariCPModule;
-import ish.oncourse.server.jetty.AngelJettyModule;
+import io.bootique.jetty.AngelJettyModule;
 import ish.oncourse.server.api.ServerApiModule;
 import ish.oncourse.server.api.cxf.CXFModule;
 import ish.oncourse.server.bugsnag.BugsnagModule;
diff --git a/server/src/main/java/ish/oncourse/server/AngelServerFactory.java b/server/src/main/java/ish/oncourse/server/AngelServerFactory.java
index f4a06982417..9bc1174e0fc 100644
--- a/server/src/main/java/ish/oncourse/server/AngelServerFactory.java
+++ b/server/src/main/java/ish/oncourse/server/AngelServerFactory.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import io.bootique.annotation.BQConfig;
 import ish.math.Country;
 import ish.math.CurrencyFormat;
@@ -24,7 +24,6 @@
 import ish.oncourse.server.license.LicenseService;
 import ish.oncourse.server.messaging.EmailDequeueJob;
 import ish.oncourse.server.messaging.MailDeliveryService;
-import ish.oncourse.server.services.ISchedulerService;
 import ish.oncourse.server.services.*;
 import ish.oncourse.server.security.CertificateUpdateWatcher;
 import ish.oncourse.server.services.chargebee.ChargebeeUploadJob;
@@ -61,7 +60,6 @@ public class AngelServerFactory {
     public final static String YAML_SYSTEM_USERS_FILE = "createAdminUsers.yaml";
     public static boolean QUIT_SIGNAL_CAUGHT = false;
 
-
     @Inject
     public AngelServerFactory() {
         ResourcesUtil.initialiseLogging(true);
diff --git a/server/src/main/java/ish/oncourse/server/CayenneListenersService.java b/server/src/main/java/ish/oncourse/server/CayenneListenersService.java
index 34d959763c0..ed9b2a7c4e6 100644
--- a/server/src/main/java/ish/oncourse/server/CayenneListenersService.java
+++ b/server/src/main/java/ish/oncourse/server/CayenneListenersService.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.accounting.AccountTransactionService;
 import ish.oncourse.server.integration.EventService;
 import ish.oncourse.server.license.LicenseService;
@@ -20,8 +20,6 @@
 import ish.oncourse.server.services.TransactionLockedService;
 import org.apache.cayenne.access.ValidationFilter;
 
-/**
- */
 public class CayenneListenersService {
 
     @Inject
diff --git a/server/src/main/java/ish/oncourse/server/CayenneService.java b/server/src/main/java/ish/oncourse/server/CayenneService.java
index 3c1d2387c6c..d659fb23e40 100644
--- a/server/src/main/java/ish/oncourse/server/CayenneService.java
+++ b/server/src/main/java/ish/oncourse/server/CayenneService.java
@@ -10,8 +10,8 @@
  */
 package ish.oncourse.server;
 
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import ish.math.MoneyType;
 import ish.oncourse.server.cayenne.glue.CayenneDataObject;
 import ish.util.Maps;
diff --git a/server/src/main/java/ish/oncourse/server/DataPopulationCommand.java b/server/src/main/java/ish/oncourse/server/DataPopulationCommand.java
index e57786a8aa7..24f87d58d23 100644
--- a/server/src/main/java/ish/oncourse/server/DataPopulationCommand.java
+++ b/server/src/main/java/ish/oncourse/server/DataPopulationCommand.java
@@ -11,9 +11,9 @@
 
 package ish.oncourse.server;
 
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.name.Named;
+import javax.inject.Inject;
+import javax.inject.Provider;
+import javax.inject.Named;
 import io.bootique.cli.Cli;
 import io.bootique.command.CommandOutcome;
 import io.bootique.command.CommandWithMetadata;
@@ -30,6 +30,7 @@ public class DataPopulationCommand  extends CommandWithMetadata {
     private String angelVersion;
     private Provider<CayenneService> cayenneServiceProvider;
     private Provider<GroovyScriptService> groovyScriptServiceProvider;
+
     @Inject
     public DataPopulationCommand(@Named(AngelModule.ANGEL_VERSION) String angelVersion,
                                  Provider<CayenneService> cayenneServiceProvider,
@@ -55,6 +56,5 @@ public CommandOutcome run(Cli cli) {
 
         }
         return CommandOutcome.succeeded();
-
     }
 }
diff --git a/server/src/main/java/ish/oncourse/server/PreferenceController.java b/server/src/main/java/ish/oncourse/server/PreferenceController.java
index 5d9bdb1f017..ecb3f1d958b 100644
--- a/server/src/main/java/ish/oncourse/server/PreferenceController.java
+++ b/server/src/main/java/ish/oncourse/server/PreferenceController.java
@@ -10,8 +10,8 @@
  */
 package ish.oncourse.server;
 
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import ish.math.Country;
 import ish.math.CurrencyFormat;
 import ish.oncourse.entity.services.TagService;
diff --git a/server/src/main/java/ish/oncourse/server/SanityCheckCommand.java b/server/src/main/java/ish/oncourse/server/SanityCheckCommand.java
index 5c57052c0e3..ac4937326bb 100644
--- a/server/src/main/java/ish/oncourse/server/SanityCheckCommand.java
+++ b/server/src/main/java/ish/oncourse/server/SanityCheckCommand.java
@@ -11,8 +11,8 @@
 
 package ish.oncourse.server;
 
-import com.google.inject.Inject;
-import com.google.inject.Provider;
+import javax.inject.Inject;
+import javax.inject.Provider;
 import io.bootique.cli.Cli;
 import io.bootique.command.CommandOutcome;
 import io.bootique.command.CommandWithMetadata;
diff --git a/server/src/main/java/ish/oncourse/server/api/service/ReportApiService.java b/server/src/main/java/ish/oncourse/server/api/service/ReportApiService.java
index e6667f009bf..d054bd4c7ce 100644
--- a/server/src/main/java/ish/oncourse/server/api/service/ReportApiService.java
+++ b/server/src/main/java/ish/oncourse/server/api/service/ReportApiService.java
@@ -11,7 +11,6 @@
 
 package ish.oncourse.server.api.service;
 
-import com.google.inject.Inject;
 import ish.oncourse.server.api.dao.ReportDao;
 import ish.oncourse.server.api.dao.ReportOverlayDao;
 import ish.oncourse.server.api.v1.model.BindingDTO;
@@ -26,6 +25,7 @@
 import ish.util.LocalDateUtils;
 import org.apache.cayenne.query.ObjectSelect;
 
+import javax.inject.Inject;
 import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
diff --git a/server/src/main/java/ish/oncourse/server/bugsnag/BugsnagModule.java b/server/src/main/java/ish/oncourse/server/bugsnag/BugsnagModule.java
index d1a312cf621..517c8e71cd2 100644
--- a/server/src/main/java/ish/oncourse/server/bugsnag/BugsnagModule.java
+++ b/server/src/main/java/ish/oncourse/server/bugsnag/BugsnagModule.java
@@ -11,8 +11,8 @@
 
 package ish.oncourse.server.bugsnag;
 
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
+import io.bootique.di.Provides;
+import javax.inject.Singleton;
 import io.bootique.ConfigModule;
 import io.bootique.config.ConfigurationFactory;
 import ish.oncourse.server.license.LicenseService;
diff --git a/server/src/main/java/ish/oncourse/server/cancel/CancelEnrolmentService.java b/server/src/main/java/ish/oncourse/server/cancel/CancelEnrolmentService.java
index fc6973c75cf..4e37fd4528f 100644
--- a/server/src/main/java/ish/oncourse/server/cancel/CancelEnrolmentService.java
+++ b/server/src/main/java/ish/oncourse/server/cancel/CancelEnrolmentService.java
@@ -11,7 +11,6 @@
 
 package ish.oncourse.server.cancel;
 
-import com.google.inject.Inject;
 import ish.cancel.CancelationResult;
 import ish.cancel.EnrolmentCancelationRequest;
 import ish.common.types.EnrolmentStatus;
@@ -20,7 +19,6 @@
 import ish.oncourse.common.SystemEvent;
 import ish.oncourse.server.cayenne.Account;
 import ish.oncourse.server.cayenne.Enrolment;
-import ish.oncourse.server.cayenne.Invoice;
 import ish.oncourse.server.cayenne.InvoiceLine;
 import ish.oncourse.server.cayenne.Tax;
 import ish.oncourse.server.integration.EventService;
@@ -32,10 +30,10 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import javax.inject.Inject;
 import java.util.ArrayList;
 import java.util.List;
 
-
 public class CancelEnrolmentService {
 
     private static final Logger logger = LogManager.getLogger();
diff --git a/server/src/main/java/ish/oncourse/server/cayenne/glue/CayenneDataObject.java b/server/src/main/java/ish/oncourse/server/cayenne/glue/CayenneDataObject.java
index b4d503cd9fa..f6d66872cc6 100644
--- a/server/src/main/java/ish/oncourse/server/cayenne/glue/CayenneDataObject.java
+++ b/server/src/main/java/ish/oncourse/server/cayenne/glue/CayenneDataObject.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.cayenne.glue;
 
-import ish.oncourse.GoogleGuiceInjector;
+import ish.oncourse.BootiqueInjector;
 import ish.oncourse.cayenne.PersistentObjectI;
 import ish.util.MapsUtil;
 import ish.validation.ValidationFailure;
@@ -31,7 +31,6 @@
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.UnsupportedFlavorException;
 import java.io.IOException;
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -544,8 +543,8 @@ public static Object getKeyForValue(Object value, Map<?, ?> map) {
 	@Override
 	public void setObjectContext(ObjectContext objectContext) {
 		super.setObjectContext(objectContext);
-		if (GoogleGuiceInjector.getInstance()  != null) {
-			GoogleGuiceInjector.getInstance().injectMembers(this);
+		if (BootiqueInjector.getInstance()  != null) {
+			BootiqueInjector.getInstance().injectMembers(this);
 		}
 	}
 
diff --git a/server/src/main/java/ish/oncourse/server/cayenne/glue/TaggableCayenneDataObject.java b/server/src/main/java/ish/oncourse/server/cayenne/glue/TaggableCayenneDataObject.java
index da294a30f81..5e1a2f78aaa 100644
--- a/server/src/main/java/ish/oncourse/server/cayenne/glue/TaggableCayenneDataObject.java
+++ b/server/src/main/java/ish/oncourse/server/cayenne/glue/TaggableCayenneDataObject.java
@@ -11,7 +11,7 @@
 package ish.oncourse.server.cayenne.glue;
 
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.NodeSpecialType;
 import ish.common.types.NodeType;
 import ish.oncourse.API;
diff --git a/server/src/main/java/ish/oncourse/server/db/DbModule.java b/server/src/main/java/ish/oncourse/server/db/DbModule.java
index d7224e88e40..e8f2667c8dc 100644
--- a/server/src/main/java/ish/oncourse/server/db/DbModule.java
+++ b/server/src/main/java/ish/oncourse/server/db/DbModule.java
@@ -11,20 +11,16 @@
 
 package ish.oncourse.server.db;
 
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
+import io.bootique.di.Provides;
+import javax.inject.Singleton;
 import io.bootique.ConfigModule;
 import io.bootique.config.ConfigurationFactory;
 
-
-import java.util.Map;
-
 public class DbModule extends ConfigModule {
 
     @Singleton
     @Provides
     DbUriProvider createDbFactory(ConfigurationFactory configFactory) {
-        return configFactory
-                .config(DbUriProvider.class, defaultConfigPrefix());
+        return configFactory.config(DbUriProvider.class, defaultConfigPrefix());
     }
 }
diff --git a/server/src/main/java/ish/oncourse/server/db/SanityCheckService.java b/server/src/main/java/ish/oncourse/server/db/SanityCheckService.java
index 4a0800c7668..e559229a91d 100644
--- a/server/src/main/java/ish/oncourse/server/db/SanityCheckService.java
+++ b/server/src/main/java/ish/oncourse/server/db/SanityCheckService.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.db;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.AccountType;
 import ish.oncourse.DefaultAccount;
 import ish.oncourse.server.ICayenneService;
diff --git a/server/src/main/java/ish/oncourse/server/db/SchemaUpdateService.java b/server/src/main/java/ish/oncourse/server/db/SchemaUpdateService.java
index 07175d288de..6d943ec9ff4 100644
--- a/server/src/main/java/ish/oncourse/server/db/SchemaUpdateService.java
+++ b/server/src/main/java/ish/oncourse/server/db/SchemaUpdateService.java
@@ -11,7 +11,7 @@
 package ish.oncourse.server.db;
 
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.integration.PluginService;
 import ish.oncourse.server.license.LicenseService;
diff --git a/server/src/main/java/ish/oncourse/server/db/TransactionCheckService.java b/server/src/main/java/ish/oncourse/server/db/TransactionCheckService.java
index 5371e146b88..6c7a6bb32aa 100644
--- a/server/src/main/java/ish/oncourse/server/db/TransactionCheckService.java
+++ b/server/src/main/java/ish/oncourse/server/db/TransactionCheckService.java
@@ -11,14 +11,13 @@
 
 package ish.oncourse.server.db;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.AccountTransactionType;
 import ish.math.Money;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.cayenne.Account;
 import ish.oncourse.server.cayenne.AccountTransaction;
 import ish.oncourse.server.cayenne.InvoiceLine;
-import ish.oncourse.server.services.TransactionLockedService;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.SQLSelect;
diff --git a/server/src/main/java/ish/oncourse/server/db/URIDataSourceFactory.java b/server/src/main/java/ish/oncourse/server/db/URIDataSourceFactory.java
index e668d911de6..5ca8ac29166 100644
--- a/server/src/main/java/ish/oncourse/server/db/URIDataSourceFactory.java
+++ b/server/src/main/java/ish/oncourse/server/db/URIDataSourceFactory.java
@@ -12,7 +12,7 @@
 package ish.oncourse.server.db;
 
 import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.inject.Injector;
+import io.bootique.di.Injector;
 import io.bootique.annotation.BQConfig;
 import io.bootique.jdbc.managed.ManagedDataSourceStarter;
 import io.bootique.jdbc.hikaricp.HikariCPManagedDataSourceFactory;
@@ -22,6 +22,7 @@
 @BQConfig("Pooling Hikari JDBC DataSource configuration.")
 @JsonTypeName("uri")
 public class URIDataSourceFactory extends HikariCPManagedDataSourceFactory {
+
     private static final Logger logger = LogManager.getLogger();
 
     public ManagedDataSourceStarter create(String dataSourceName, Injector injector) {
diff --git a/server/src/main/java/ish/oncourse/server/duplicate/DuplicateClassService.java b/server/src/main/java/ish/oncourse/server/duplicate/DuplicateClassService.java
index 792da278eb9..b334a9f490b 100644
--- a/server/src/main/java/ish/oncourse/server/duplicate/DuplicateClassService.java
+++ b/server/src/main/java/ish/oncourse/server/duplicate/DuplicateClassService.java
@@ -8,14 +8,13 @@
  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  * See the GNU Affero General Public License for more details.
  */
+
 package ish.oncourse.server.duplicate;
 
-import com.google.inject.Inject;
 import ish.duplicate.ClassDuplicationRequest;
 import ish.duplicate.DuplicationResult;
 import ish.oncourse.entity.services.CourseClassService;
 import ish.oncourse.server.ICayenneService;
-import ish.oncourse.server.PreferenceController;
 import ish.oncourse.server.api.dao.CourseClassDao;
 import ish.oncourse.server.api.v1.model.ClassCostDTO;
 import ish.oncourse.server.cayenne.CourseClass;
@@ -25,6 +24,7 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import javax.inject.Inject;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -36,9 +36,6 @@ public class DuplicateClassService {
 	@Inject
 	private CourseClassService courseClassService;
 
-	@Inject
-	private PreferenceController preferenceController;
-
 	@Inject
 	private CourseClassDao courseClassDao;
 
diff --git a/server/src/main/java/ish/oncourse/server/duplicate/DuplicateCourseService.java b/server/src/main/java/ish/oncourse/server/duplicate/DuplicateCourseService.java
index 284e1423d44..ae8ce04b166 100644
--- a/server/src/main/java/ish/oncourse/server/duplicate/DuplicateCourseService.java
+++ b/server/src/main/java/ish/oncourse/server/duplicate/DuplicateCourseService.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.duplicate;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.duplicate.CourseDuplicationRequest;
 import ish.duplicate.DuplicationResult;
 import ish.oncourse.server.ICayenneService;
diff --git a/server/src/main/java/ish/oncourse/server/http/HttpFactory.java b/server/src/main/java/ish/oncourse/server/http/HttpFactory.java
index 9dcae9bf2c2..e79bbc0b6d8 100644
--- a/server/src/main/java/ish/oncourse/server/http/HttpFactory.java
+++ b/server/src/main/java/ish/oncourse/server/http/HttpFactory.java
@@ -11,12 +11,13 @@
 
 package ish.oncourse.server.http;
 
-import com.google.inject.Provider;
 import io.bootique.annotation.BQConfigProperty;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 
+import javax.inject.Provider;
+
 public class HttpFactory {
 
     private Integer port;
diff --git a/server/src/main/java/ish/oncourse/server/http/HttpModule.java b/server/src/main/java/ish/oncourse/server/http/HttpModule.java
index c5b7c4314a7..9a5ce5eeac4 100644
--- a/server/src/main/java/ish/oncourse/server/http/HttpModule.java
+++ b/server/src/main/java/ish/oncourse/server/http/HttpModule.java
@@ -11,13 +11,15 @@
 
 package ish.oncourse.server.http;
 
-import com.google.inject.Provider;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
+import javax.inject.Provider;
+import io.bootique.di.Provides;
+import javax.inject.Singleton;
 import io.bootique.ConfigModule;
 import io.bootique.config.ConfigurationFactory;
 import org.eclipse.jetty.server.Server;
 
+
+// Configure http settings section from oncCourse.yml
 public class HttpModule extends ConfigModule {
 
     @Singleton
diff --git a/server/src/main/java/ish/oncourse/server/integration/GroovyScriptEventListener.java b/server/src/main/java/ish/oncourse/server/integration/GroovyScriptEventListener.java
index 03435a88acc..a4957e5a6ac 100644
--- a/server/src/main/java/ish/oncourse/server/integration/GroovyScriptEventListener.java
+++ b/server/src/main/java/ish/oncourse/server/integration/GroovyScriptEventListener.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.integration;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.AutomationStatus;
 import ish.common.types.SystemEventType;
 import ish.common.types.TriggerType;
diff --git a/server/src/main/java/ish/oncourse/server/jetty/AngelJettyModule.java b/server/src/main/java/ish/oncourse/server/jetty/AngelJettyModule.java
deleted file mode 100644
index f91eab03c55..00000000000
--- a/server/src/main/java/ish/oncourse/server/jetty/AngelJettyModule.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright ish group pty ltd 2021.
- *
- * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
- *
- *  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.
- */
-
-package ish.oncourse.server.jetty;
-
-import io.bootique.config.ConfigurationFactory;
-import io.bootique.jetty.JettyModule;
-import ish.oncourse.server.jetty.server.AngelServerFactory;
-
-public class AngelJettyModule extends JettyModule {
-
-    public AngelJettyModule(String configPrefix) {
-        super(configPrefix);
-    }
-
-    public AngelJettyModule() {
-        super("jetty");
-    }
-
-    @Override
-    protected <T> T config(Class<T> type, ConfigurationFactory configurationFactory) {
-        return (T) configurationFactory.config(AngelServerFactory.class, getConfigPrefix());
-    }
-
-}
diff --git a/server/src/main/java/ish/oncourse/server/license/LicenseModule.java b/server/src/main/java/ish/oncourse/server/license/LicenseModule.java
index 058eec85f49..0a4a4e6d690 100644
--- a/server/src/main/java/ish/oncourse/server/license/LicenseModule.java
+++ b/server/src/main/java/ish/oncourse/server/license/LicenseModule.java
@@ -11,8 +11,8 @@
 
 package ish.oncourse.server.license;
 
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
+import io.bootique.di.Provides;
+import javax.inject.Singleton;
 import io.bootique.ConfigModule;
 import io.bootique.config.ConfigurationFactory;
 
diff --git a/server/src/main/java/ish/oncourse/server/lifecycle/PaymentInLifecycleListener.java b/server/src/main/java/ish/oncourse/server/lifecycle/PaymentInLifecycleListener.java
index a3fa84e3b9a..8ab1778011f 100644
--- a/server/src/main/java/ish/oncourse/server/lifecycle/PaymentInLifecycleListener.java
+++ b/server/src/main/java/ish/oncourse/server/lifecycle/PaymentInLifecycleListener.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.lifecycle;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.PaymentSource;
 import ish.common.types.PaymentStatus;
 import ish.common.types.PaymentType;
diff --git a/server/src/main/java/ish/oncourse/server/lifecycle/PaymentInLineLifecycleListener.java b/server/src/main/java/ish/oncourse/server/lifecycle/PaymentInLineLifecycleListener.java
index 6b4fff616e4..5a9aad65988 100644
--- a/server/src/main/java/ish/oncourse/server/lifecycle/PaymentInLineLifecycleListener.java
+++ b/server/src/main/java/ish/oncourse/server/lifecycle/PaymentInLineLifecycleListener.java
@@ -10,12 +10,10 @@
  */
 package ish.oncourse.server.lifecycle;
 
-import com.google.inject.Inject;
-import ish.oncourse.server.PreferenceController;
+import javax.inject.Inject;
 import ish.oncourse.server.cayenne.Account;
 import ish.oncourse.server.cayenne.PaymentInLine;
 import ish.util.AccountUtil;
-import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.annotation.PostAdd;
 
 /**
diff --git a/server/src/main/java/ish/oncourse/server/messaging/EmailDequeueJob.java b/server/src/main/java/ish/oncourse/server/messaging/EmailDequeueJob.java
index 6c97122b732..9d6e46d43a5 100644
--- a/server/src/main/java/ish/oncourse/server/messaging/EmailDequeueJob.java
+++ b/server/src/main/java/ish/oncourse/server/messaging/EmailDequeueJob.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.messaging;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import com.sun.mail.smtp.SMTPAddressFailedException;
 import ish.common.types.MessageStatus;
 import ish.common.types.MessageType;
@@ -43,7 +43,6 @@
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 @DisallowConcurrentExecution
 public class EmailDequeueJob implements Job {
diff --git a/server/src/main/java/ish/oncourse/server/modules/AngelJobFactory.java b/server/src/main/java/ish/oncourse/server/modules/AngelJobFactory.java
index f76489a6d1a..cdac0395cb9 100644
--- a/server/src/main/java/ish/oncourse/server/modules/AngelJobFactory.java
+++ b/server/src/main/java/ish/oncourse/server/modules/AngelJobFactory.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.modules;
 
-import com.google.inject.Injector;
+import io.bootique.di.Injector;
 import org.quartz.Job;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
diff --git a/server/src/main/java/ish/oncourse/server/modules/ServiceModule.java b/server/src/main/java/ish/oncourse/server/modules/ServiceModule.java
index 833fc2def55..7e58b530799 100644
--- a/server/src/main/java/ish/oncourse/server/modules/ServiceModule.java
+++ b/server/src/main/java/ish/oncourse/server/modules/ServiceModule.java
@@ -10,10 +10,9 @@
  */
 package ish.oncourse.server.modules;
 
-import com.google.inject.Binder;
-import com.google.inject.Module;
-import com.google.inject.Scopes;
-import ish.oncourse.GoogleGuiceInjector;
+import io.bootique.di.BQModule;
+import io.bootique.di.Binder;
+import ish.oncourse.BootiqueInjector;
 import ish.oncourse.aql.AqlService;
 import ish.oncourse.aql.impl.AntlrAqlService;
 import ish.oncourse.entity.services.*;
@@ -36,57 +35,57 @@
 
 /**
  */
-public class ServiceModule implements Module {
+public class ServiceModule implements BQModule {
 
 	public ServiceModule() {
 	}
 
 	/**
-	 * @see com.google.inject.Module#configure(Binder)
+	 * @see io.bootique.di.BQModule#configure(Binder)
 	 */
 	@Override
 	public void configure(Binder binder) {
-		binder.bind(SanityCheckService.class).in(Scopes.SINGLETON);
-		binder.bind(TransactionCheckService.class).in(Scopes.SINGLETON);
-		binder.bind(PrintService.class).in(Scopes.SINGLETON);
-
+		binder.bind(SanityCheckService.class).inSingletonScope();
+		binder.bind(TransactionCheckService.class).inSingletonScope();
+		binder.bind(PrintService.class).inSingletonScope();
 
 		// jobs
 		binder.bind(EmailDequeueJob.class);
 		binder.bind(ChargebeeUploadJob.class);
-		binder.bind(StatsService.class).in(Scopes.SINGLETON);
+		binder.bind(StatsService.class).inSingletonScope();
 
-		binder.bind(AccountTransactionService.class).in(Scopes.SINGLETON);
-		binder.bind(AuditService.class).in(Scopes.SINGLETON);
-		binder.bind(AuditListener.class).in(Scopes.SINGLETON);
-		binder.bind(CayenneListenersService.class).asEagerSingleton();
+		binder.bind(AccountTransactionService.class).inSingletonScope();
+		binder.bind(AuditService.class).inSingletonScope();
+		binder.bind(AuditListener.class).inSingletonScope();
+		binder.bind(CayenneListenersService.class).initOnStartup();
 
-		binder.bind(MixinHelper.class).asEagerSingleton();
+		binder.bind(MixinHelper.class).initOnStartup();
 
 		binder.bind(InvoiceLineInitHelper.class);
 
 		binder.bind(ISchedulerService.class).to(SchedulerService.class);
-		binder.bind(GroovyScriptService.class).in(Scopes.SINGLETON);
-		binder.bind(QualityService.class).in(Scopes.SINGLETON);
+//		binder.bind(GroovyScriptService.class).toProvider(GroovyScriptServiceProvider.class).inSingletonScope();
+		binder.bind(GroovyScriptService.class).inSingletonScope();
+		binder.bind(QualityService.class).inSingletonScope();
 
-		binder.bind(GoogleGuiceInjector.class).asEagerSingleton();
+		binder.bind(BootiqueInjector.class).initOnStartup();
 
 		// entity service classes
-		binder.bind(CourseClassService.class).in(Scopes.SINGLETON);
-		binder.bind(StudentConcessionService.class).in(Scopes.SINGLETON);
-		binder.bind(TagService.class).in(Scopes.SINGLETON);
-		binder.bind(SessionService.class).in(Scopes.SINGLETON);
-		binder.bind(CourseService.class).in(Scopes.SINGLETON);
-		binder.bind(CertificateService.class).in(Scopes.SINGLETON);
-		binder.bind(StudentService.class).in(Scopes.SINGLETON);
-		binder.bind(InvoiceLineService.class).in(Scopes.SINGLETON);
-		binder.bind(EnrolmentService.class).in(Scopes.SINGLETON);
-		binder.bind(IAutoIncrementService.class).to(ClusteredAutoincrementService.class).in(Scopes.SINGLETON);
-		binder.bind(TransactionLockedService.class).in(Scopes.SINGLETON);
-		binder.bind(CustomFieldTypeService.class).in(Scopes.SINGLETON);
-		binder.bind(ISystemUserService.class).to(SystemUserService.class).in(Scopes.SINGLETON);
-		binder.bind(AqlService.class).to(AntlrAqlService.class).in(Scopes.SINGLETON);
-		binder.bind(PayrollService.class).in(Scopes.SINGLETON);
-		binder.bind(ContactMergeService.class).in(Scopes.SINGLETON);
+		binder.bind(CourseClassService.class).inSingletonScope();
+		binder.bind(StudentConcessionService.class).inSingletonScope();
+		binder.bind(TagService.class).inSingletonScope();
+		binder.bind(SessionService.class).inSingletonScope();
+		binder.bind(CourseService.class).inSingletonScope();
+		binder.bind(CertificateService.class).inSingletonScope();
+		binder.bind(StudentService.class).inSingletonScope();
+		binder.bind(InvoiceLineService.class).inSingletonScope();
+		binder.bind(EnrolmentService.class).inSingletonScope();
+		binder.bind(IAutoIncrementService.class).to(ClusteredAutoincrementService.class).inSingletonScope();
+		binder.bind(TransactionLockedService.class).inSingletonScope();
+		binder.bind(CustomFieldTypeService.class).inSingletonScope();
+		binder.bind(ISystemUserService.class).to(SystemUserService.class).inSingletonScope();
+		binder.bind(AqlService.class).to(AntlrAqlService.class).inSingletonScope();
+		binder.bind(PayrollService.class).inSingletonScope();
+		binder.bind(ContactMergeService.class).inSingletonScope();
 	}
 }
diff --git a/server/src/main/java/ish/oncourse/server/payroll/PayrollService.java b/server/src/main/java/ish/oncourse/server/payroll/PayrollService.java
index 2b080c2ffa3..472ebd84f3d 100644
--- a/server/src/main/java/ish/oncourse/server/payroll/PayrollService.java
+++ b/server/src/main/java/ish/oncourse/server/payroll/PayrollService.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.payroll;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.AttendanceType;
 import ish.common.types.ClassCostFlowType;
 import ish.common.types.CourseClassType;
diff --git a/server/src/main/java/ish/oncourse/server/print/PrintService.java b/server/src/main/java/ish/oncourse/server/print/PrintService.java
index 0a8338fcc01..ec94451df79 100644
--- a/server/src/main/java/ish/oncourse/server/print/PrintService.java
+++ b/server/src/main/java/ish/oncourse/server/print/PrintService.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.print;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import groovy.lang.Closure;
 import groovy.lang.DelegatesTo;
 import ish.oncourse.server.ICayenneService;
diff --git a/server/src/main/java/ish/oncourse/server/scripting/ScriptExecutingJob.java b/server/src/main/java/ish/oncourse/server/scripting/ScriptExecutingJob.java
index a0a308a9104..18e9c5ba846 100644
--- a/server/src/main/java/ish/oncourse/server/scripting/ScriptExecutingJob.java
+++ b/server/src/main/java/ish/oncourse/server/scripting/ScriptExecutingJob.java
@@ -10,9 +10,7 @@
  */
 package ish.oncourse.server.scripting;
 
-import com.google.inject.Inject;
 import ish.oncourse.server.ICayenneService;
-import ish.oncourse.server.cayenne.Enrolment;
 import ish.oncourse.server.cayenne.Script;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.query.SelectQuery;
@@ -23,6 +21,8 @@
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 
+import javax.inject.Inject;
+
 @DisallowConcurrentExecution
 public class ScriptExecutingJob implements Job {
 
diff --git a/server/src/main/java/ish/oncourse/server/scripting/api/CollegePreferenceService.java b/server/src/main/java/ish/oncourse/server/scripting/api/CollegePreferenceService.java
index 4ad39b691fe..b95b14c7a43 100644
--- a/server/src/main/java/ish/oncourse/server/scripting/api/CollegePreferenceService.java
+++ b/server/src/main/java/ish/oncourse/server/scripting/api/CollegePreferenceService.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.scripting.api;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.DeliverySchedule;
 import ish.oncourse.API;
 import ish.oncourse.server.PreferenceController;
diff --git a/server/src/main/java/ish/oncourse/server/scripting/api/EmailService.java b/server/src/main/java/ish/oncourse/server/scripting/api/EmailService.java
index 268572681b7..8026a10fe74 100644
--- a/server/src/main/java/ish/oncourse/server/scripting/api/EmailService.java
+++ b/server/src/main/java/ish/oncourse/server/scripting/api/EmailService.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.scripting.api;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import groovy.lang.Closure;
 import groovy.lang.DelegatesTo;
 import ish.oncourse.server.ICayenneService;
diff --git a/server/src/main/java/ish/oncourse/server/scripting/api/TemplateService.java b/server/src/main/java/ish/oncourse/server/scripting/api/TemplateService.java
index 46b0632eaed..3eec3f70cb9 100644
--- a/server/src/main/java/ish/oncourse/server/scripting/api/TemplateService.java
+++ b/server/src/main/java/ish/oncourse/server/scripting/api/TemplateService.java
@@ -10,21 +10,18 @@
  */
 package ish.oncourse.server.scripting.api;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import groovy.text.SimpleTemplateEngine;
 import groovy.text.Template;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.cayenne.*;
 import ish.oncourse.server.document.DocumentService;
-import ish.oncourse.server.entity.mixins.ContactMixin;
 import ish.oncourse.server.scripting.converter.RenderType;
 import ish.util.DateFormatter;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.query.ObjectSelect;
 
 import java.io.IOException;
-import java.time.LocalDate;
-import java.util.List;
 import java.util.Map;
 import java.util.TimeZone;
 
diff --git a/server/src/main/java/ish/oncourse/server/security/LdapAuthConnectionService.java b/server/src/main/java/ish/oncourse/server/security/LdapAuthConnectionService.java
index 4353a914c5b..cd37d5bf8ae 100644
--- a/server/src/main/java/ish/oncourse/server/security/LdapAuthConnectionService.java
+++ b/server/src/main/java/ish/oncourse/server/security/LdapAuthConnectionService.java
@@ -11,10 +11,9 @@
 
 package ish.oncourse.server.security;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.cayenne.ACLRole;
-import ish.security.LdapAuthConnection;
 import ish.security.LdapAuthConnectionRequest;
 import ish.security.LdapProperties;
 import ish.security.TestLdapAuthConnection;
diff --git a/server/src/main/java/ish/oncourse/server/security/api/PermissionModule.java b/server/src/main/java/ish/oncourse/server/security/api/PermissionModule.java
index 12f22a2c46c..a93c304d63b 100644
--- a/server/src/main/java/ish/oncourse/server/security/api/PermissionModule.java
+++ b/server/src/main/java/ish/oncourse/server/security/api/PermissionModule.java
@@ -11,9 +11,9 @@
 
 package ish.oncourse.server.security.api;
 
-import com.google.inject.Injector;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
+import io.bootique.di.Injector;
+import io.bootique.di.Provides;
+import javax.inject.Singleton;
 import io.bootique.ConfigModule;
 import io.bootique.config.ConfigurationFactory;
 
diff --git a/server/src/main/java/ish/oncourse/server/security/api/PermissionServiceFactory.java b/server/src/main/java/ish/oncourse/server/security/api/PermissionServiceFactory.java
index e913af7a809..03b7f2b213e 100644
--- a/server/src/main/java/ish/oncourse/server/security/api/PermissionServiceFactory.java
+++ b/server/src/main/java/ish/oncourse/server/security/api/PermissionServiceFactory.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.security.api;
 
-import com.google.inject.Injector;
+import io.bootique.di.Injector;
 import ish.oncourse.server.api.security.Permission;
 import ish.oncourse.server.security.api.permission.OpenApiPermission;
 import ish.oncourse.server.security.api.permission.ResourcePermission;
diff --git a/server/src/main/java/ish/oncourse/server/security/api/permission/LazyApiPermission.java b/server/src/main/java/ish/oncourse/server/security/api/permission/LazyApiPermission.java
index f8cfe2527d9..93dc1edb099 100644
--- a/server/src/main/java/ish/oncourse/server/security/api/permission/LazyApiPermission.java
+++ b/server/src/main/java/ish/oncourse/server/security/api/permission/LazyApiPermission.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.security.api.permission;
 
-import io.bootique.jetty.servlet.DefaultServletEnvironment;
+import io.bootique.jetty.servlet.AngelServletEnvironment;
 import ish.common.types.KeyCode;
 import ish.oncourse.server.cayenne.Module;
 import ish.oncourse.server.cayenne.*;
@@ -171,7 +171,7 @@ private String getQueryString() {
             return reserveQueryString;
         }
 
-        var environment = injector.getInstance(DefaultServletEnvironment.class);
+        var environment = injector.getInstance(AngelServletEnvironment.class);
         if (!environment.request().isPresent()) {
             return null;
         }
diff --git a/server/src/main/java/ish/oncourse/server/security/api/permission/QueryParamBasedPermission.java b/server/src/main/java/ish/oncourse/server/security/api/permission/QueryParamBasedPermission.java
index 192fcd689c4..7989f6a7c58 100644
--- a/server/src/main/java/ish/oncourse/server/security/api/permission/QueryParamBasedPermission.java
+++ b/server/src/main/java/ish/oncourse/server/security/api/permission/QueryParamBasedPermission.java
@@ -11,13 +11,11 @@
 
 package ish.oncourse.server.security.api.permission;
 
-import io.bootique.jetty.servlet.DefaultServletEnvironment;
+import io.bootique.jetty.servlet.AngelServletEnvironment;
 import ish.common.types.KeyCode;
 import ish.common.types.Mask;
 import ish.oncourse.server.security.api.IPermissionService;
 
-import javax.servlet.http.HttpServletRequest;
-
 /**
  * Permission which checks permission based on query parameter value.
  */
@@ -71,7 +69,7 @@ public PermissionCheckingResult check() {
     }
 
     private String getQueryString() {
-        var environment = injector.getInstance(DefaultServletEnvironment.class);
+        var environment = injector.getInstance(AngelServletEnvironment.class);
         if (!environment.request().isPresent()) {
             return null;
         }
diff --git a/server/src/main/java/ish/oncourse/server/security/api/permission/ResourcePermission.java b/server/src/main/java/ish/oncourse/server/security/api/permission/ResourcePermission.java
index aee9162ea13..2d6f541e6d6 100644
--- a/server/src/main/java/ish/oncourse/server/security/api/permission/ResourcePermission.java
+++ b/server/src/main/java/ish/oncourse/server/security/api/permission/ResourcePermission.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.security.api.permission;
 
-import com.google.inject.Injector;
+import io.bootique.di.Injector;
 import ish.validation.AngelUriTemplatePathSpec;
 
 
diff --git a/server/src/main/java/ish/oncourse/server/services/AuditPurgeJob.java b/server/src/main/java/ish/oncourse/server/services/AuditPurgeJob.java
index 0044a378e51..3fbcae1b6df 100644
--- a/server/src/main/java/ish/oncourse/server/services/AuditPurgeJob.java
+++ b/server/src/main/java/ish/oncourse/server/services/AuditPurgeJob.java
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.license.LicenseService;
 import org.apache.cayenne.ObjectContext;
diff --git a/server/src/main/java/ish/oncourse/server/services/ClusteredAutoincrementService.java b/server/src/main/java/ish/oncourse/server/services/ClusteredAutoincrementService.java
index 45e61b1d2ac..784f2646633 100644
--- a/server/src/main/java/ish/oncourse/server/services/ClusteredAutoincrementService.java
+++ b/server/src/main/java/ish/oncourse/server/services/ClusteredAutoincrementService.java
@@ -14,7 +14,7 @@
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.ICayenneService;
 import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.query.SQLExec;
diff --git a/server/src/main/java/ish/oncourse/server/services/CustomFieldTypeService.java b/server/src/main/java/ish/oncourse/server/services/CustomFieldTypeService.java
index ece1a1962aa..a063b1e9823 100644
--- a/server/src/main/java/ish/oncourse/server/services/CustomFieldTypeService.java
+++ b/server/src/main/java/ish/oncourse/server/services/CustomFieldTypeService.java
@@ -11,11 +11,10 @@
 
 package ish.oncourse.server.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.cayenne.CustomFieldType;
 import ish.oncourse.server.function.DeleteCustomFieldTypeWithRelatedFields;
-import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.query.SelectById;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
diff --git a/server/src/main/java/ish/oncourse/server/services/DelayedEnrolmentIncomePostingJob.java b/server/src/main/java/ish/oncourse/server/services/DelayedEnrolmentIncomePostingJob.java
index f4397fb1395..1191e952643 100644
--- a/server/src/main/java/ish/oncourse/server/services/DelayedEnrolmentIncomePostingJob.java
+++ b/server/src/main/java/ish/oncourse/server/services/DelayedEnrolmentIncomePostingJob.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.AccountTransactionType;
 import ish.common.types.EnrolmentStatus;
 import ish.common.types.InvoiceType;
diff --git a/server/src/main/java/ish/oncourse/server/services/InvoiceOverdueUpdateJob.java b/server/src/main/java/ish/oncourse/server/services/InvoiceOverdueUpdateJob.java
index d1898685058..8b507fe3397 100644
--- a/server/src/main/java/ish/oncourse/server/services/InvoiceOverdueUpdateJob.java
+++ b/server/src/main/java/ish/oncourse/server/services/InvoiceOverdueUpdateJob.java
@@ -11,11 +11,10 @@
 package ish.oncourse.server.services;
 
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.math.Money;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.cayenne.Invoice;
-import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -26,7 +25,6 @@
 
 import java.time.LocalDate;
 import java.util.Date;
-import java.util.List;
 
 /**
  * this job runs nightly and processes invoice lines, posting the delayed income between liability and income accounts.
diff --git a/server/src/main/java/ish/oncourse/server/services/PermanentlyDeleteDocumentsJob.java b/server/src/main/java/ish/oncourse/server/services/PermanentlyDeleteDocumentsJob.java
index 179e879fe88..a90ffbf29fd 100644
--- a/server/src/main/java/ish/oncourse/server/services/PermanentlyDeleteDocumentsJob.java
+++ b/server/src/main/java/ish/oncourse/server/services/PermanentlyDeleteDocumentsJob.java
@@ -8,7 +8,7 @@
 
 package ish.oncourse.server.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.cayenne.Document;
 import ish.oncourse.server.document.DocumentService;
diff --git a/server/src/main/java/ish/oncourse/server/services/SchedulerService.java b/server/src/main/java/ish/oncourse/server/services/SchedulerService.java
index 1b469bb8d47..c68dc1e44e5 100644
--- a/server/src/main/java/ish/oncourse/server/services/SchedulerService.java
+++ b/server/src/main/java/ish/oncourse/server/services/SchedulerService.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.ICayenneService;
 import ish.util.TimeZoneUtil;
 import org.apache.cayenne.access.DataContext;
diff --git a/server/src/main/java/ish/oncourse/server/services/StatsService.java b/server/src/main/java/ish/oncourse/server/services/StatsService.java
index 2d08c311d83..8df55b17cb6 100644
--- a/server/src/main/java/ish/oncourse/server/services/StatsService.java
+++ b/server/src/main/java/ish/oncourse/server/services/StatsService.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.EnrolmentStatus;
 import ish.common.types.PaymentSource;
 import ish.math.Money;
diff --git a/server/src/main/java/ish/oncourse/server/services/TestAutoIncrementService.java b/server/src/main/java/ish/oncourse/server/services/TestAutoIncrementService.java
index 2a93391af95..a3a00170333 100644
--- a/server/src/main/java/ish/oncourse/server/services/TestAutoIncrementService.java
+++ b/server/src/main/java/ish/oncourse/server/services/TestAutoIncrementService.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.cayenne.Invoice;
 import ish.oncourse.server.cayenne.Student;
diff --git a/server/src/main/java/ish/oncourse/server/services/TransactionLockedService.java b/server/src/main/java/ish/oncourse/server/services/TransactionLockedService.java
index 3e6c131873b..d237de396a4 100644
--- a/server/src/main/java/ish/oncourse/server/services/TransactionLockedService.java
+++ b/server/src/main/java/ish/oncourse/server/services/TransactionLockedService.java
@@ -11,7 +11,7 @@
 
 package ish.oncourse.server.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.cayenne.Preference;
 import ish.persistence.Preferences;
diff --git a/server/src/main/java/ish/oncourse/server/services/VoucherExpiryJob.java b/server/src/main/java/ish/oncourse/server/services/VoucherExpiryJob.java
index 06a0b8e1469..0bfca9f450c 100644
--- a/server/src/main/java/ish/oncourse/server/services/VoucherExpiryJob.java
+++ b/server/src/main/java/ish/oncourse/server/services/VoucherExpiryJob.java
@@ -10,7 +10,7 @@
  */
 package ish.oncourse.server.services;
 
-import com.google.inject.Inject;
+import javax.inject.Inject;
 import ish.common.types.ProductStatus;
 import ish.oncourse.server.ICayenneService;
 import ish.oncourse.server.accounting.AccountTransactionService;
diff --git a/server/src/main/java/ish/oncourse/server/upgrades/DataPopulation.java b/server/src/main/java/ish/oncourse/server/upgrades/DataPopulation.java
index 7286c94ef7f..6bb422e3334 100644
--- a/server/src/main/java/ish/oncourse/server/upgrades/DataPopulation.java
+++ b/server/src/main/java/ish/oncourse/server/upgrades/DataPopulation.java
@@ -10,8 +10,8 @@
  */
 package ish.oncourse.server.upgrades;
 
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
+import javax.inject.Inject;
+import javax.inject.Named;
 import ish.oncourse.common.ResourceProperty;
 import ish.oncourse.common.ResourceType;
 import ish.oncourse.common.ResourcesUtil;
diff --git a/server/src/main/java/ish/oncourse/server/upgrades/liquibase/change/UpdateFavouriteLinks.groovy b/server/src/main/java/ish/oncourse/server/upgrades/liquibase/change/UpdateFavouriteLinks.groovy
index a7de8ace856..c48b90601ce 100644
--- a/server/src/main/java/ish/oncourse/server/upgrades/liquibase/change/UpdateFavouriteLinks.groovy
+++ b/server/src/main/java/ish/oncourse/server/upgrades/liquibase/change/UpdateFavouriteLinks.groovy
@@ -9,7 +9,7 @@
 package ish.oncourse.server.upgrades.liquibase.change
 
 import com.google.common.base.CaseFormat
-import com.google.inject.Inject
+import javax.inject.Inject
 import ish.liquibase.IshTaskChange
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.Preference
@@ -23,6 +23,7 @@ import org.apache.cayenne.query.ObjectSelect
 import static ish.oncourse.server.preference.UserPreferenceService.JOIN_DELIMETER
 
 class UpdateFavouriteLinks extends IshTaskChange {
+
     private static final String DASHBOARD_FAVORITE_CATEGORY = "html.dashboard.favorite"
 
     @Inject
diff --git a/server/src/test/groovy/ish/TestWithBootique.groovy b/server/src/test/groovy/ish/TestWithBootique.groovy
index 85fb489b8bc..df96289f0d4 100644
--- a/server/src/test/groovy/ish/TestWithBootique.groovy
+++ b/server/src/test/groovy/ish/TestWithBootique.groovy
@@ -1,9 +1,9 @@
 package ish
 
-import com.google.inject.Binder
-import com.google.inject.Module
-import com.google.inject.Provides
-import com.google.inject.Singleton
+import io.bootique.di.Binder
+import io.bootique.di.BQModule
+import io.bootique.di.Provides
+import javax.inject.Singleton
 import groovy.transform.CompileStatic
 import io.bootique.BQRuntime
 import io.bootique.cayenne.CayenneConfigMerger
@@ -46,7 +46,6 @@ abstract class TestWithBootique {
     protected static final String ANGEL_NODE = "AngelNode"
     protected static final String MARIADB = "mariadb"
 
-
     private static boolean loggingInitialised = false
 
     public BQRuntime injector
@@ -89,7 +88,7 @@ abstract class TestWithBootique {
                 .app("--config=classpath:application-test.yml")
                 .module(AngelModule.class)
                 .module(TestModule.class)
-                .module(new Module() {
+                .module(new BQModule() {
 
                     @Provides
                     @Singleton
@@ -130,7 +129,6 @@ abstract class TestWithBootique {
                         return runtime
                     }
 
-
                     @Override
                     void configure(Binder binder) {
 
diff --git a/server/src/test/groovy/ish/TestWithDatabase.groovy b/server/src/test/groovy/ish/TestWithDatabase.groovy
index a291c1bbab1..bda5f34270b 100644
--- a/server/src/test/groovy/ish/TestWithDatabase.groovy
+++ b/server/src/test/groovy/ish/TestWithDatabase.groovy
@@ -1,8 +1,8 @@
 package ish
 
-import com.google.inject.Binder
-import com.google.inject.Inject
-import com.google.inject.Module
+import io.bootique.di.Binder
+import javax.inject.Inject
+import io.bootique.di.BQModule
 import groovy.transform.CompileStatic
 import io.bootique.cayenne.CayenneModule
 import io.bootique.jdbc.DataSourceListener
@@ -76,7 +76,7 @@ abstract class TestWithDatabase extends TestWithBootique {
 
     @BeforeEach
     @Order(2)
-    private void setup() throws Exception {
+    void setup() throws Exception {
         validateAccountAndTaxDefaults()
         checkPaymentMethods()
     }
@@ -87,7 +87,7 @@ abstract class TestWithDatabase extends TestWithBootique {
                 .module(AngelModule.class)
                 .module(JdbcModule.class)
                 .module(LicenseModule.class)
-                .module(new Module() {
+                .module(new BQModule() {
                     @Override
                     void configure(Binder binder) {
                         JdbcModule.extend(binder).addDataSourceListener(new DataSourceListener() {
@@ -107,7 +107,7 @@ abstract class TestWithDatabase extends TestWithBootique {
                 })
                 .module(JdbcHikariCPModule.class)
                 .module(CayenneModule.class)
-                .module(new Module() {
+                .module(new BQModule() {
                     @Override
                     void configure(Binder binder) {
                         CayenneModule.extend(binder).addModule(new org.apache.cayenne.di.Module() {
@@ -122,7 +122,7 @@ abstract class TestWithDatabase extends TestWithBootique {
                 .module(ish.oncourse.server.modules.TestModule.class)
                 .module(ApiCayenneLayerModule.class)
 
-        def testModules = new Reflections(PluginService.PLUGIN_PACKAGE).getTypesAnnotatedWith(ish.TestModule) as Set<Class>
+        def testModules = new Reflections(PluginService.PLUGIN_PACKAGE).getTypesAnnotatedWith(TestModule) as Set<Class>
         testModules.each {
             builder.module(it)
         }
diff --git a/server/src/test/groovy/ish/oncourse/server/modules/TestModule.groovy b/server/src/test/groovy/ish/oncourse/server/modules/TestModule.groovy
index 37fb1266c0e..6ddc4530154 100644
--- a/server/src/test/groovy/ish/oncourse/server/modules/TestModule.groovy
+++ b/server/src/test/groovy/ish/oncourse/server/modules/TestModule.groovy
@@ -1,14 +1,9 @@
-/**
- * Copyright ish group pty ltd. All rights reserved. http://www.ish.com.au
- * No copying or use of this code is allowed without permission in writing from ish.
- */
 package ish.oncourse.server.modules
 
-import com.google.inject.Binder
-import com.google.inject.Module
-import com.google.inject.Scopes
 import groovy.transform.CompileStatic
-import ish.oncourse.GoogleGuiceInjector
+import io.bootique.di.BQModule
+import io.bootique.di.Binder
+import ish.oncourse.BootiqueInjector
 import ish.oncourse.aql.AqlService
 import ish.oncourse.aql.impl.AntlrAqlService
 import ish.oncourse.entity.services.*
@@ -30,62 +25,57 @@ import ish.oncourse.server.querying.QueryService
 import ish.oncourse.server.scripting.GroovyScriptService
 import ish.oncourse.server.services.*
 import ish.oncourse.server.upgrades.DataPopulation
-import org.apache.logging.log4j.LogManager
-import org.apache.logging.log4j.Logger
 import org.mockito.Mockito
 
 @CompileStatic
-class TestModule implements Module {
-
-    private static final Logger logger = LogManager.getLogger()
-
+class TestModule implements BQModule {
 
     @Override
     void configure(Binder binder) {
 
-        binder.bind(AccountTransactionService.class).in(Scopes.SINGLETON)
-        binder.bind(AuditService.class).in(Scopes.SINGLETON)
+        binder.bind(AccountTransactionService.class).inSingletonScope()
+        binder.bind(AuditService.class).inSingletonScope()
         binder.bind(AuditListener.class).toInstance(Mockito.mock(AuditListener.class))
 
-        binder.bind(MixinHelper.class).asEagerSingleton()
+        binder.bind(MixinHelper.class).initOnStartup()
 
         binder.bind(InvoiceLineInitHelper.class)
         binder.bind(AqlService.class).to(AntlrAqlService.class)
-        binder.bind(QueryService.class).in(Scopes.SINGLETON)
-        binder.bind(GroovyScriptService.class).in(Scopes.SINGLETON)
-        binder.bind(MessageService.class).in(Scopes.SINGLETON)
+        binder.bind(QueryService.class).inSingletonScope()
+        binder.bind(GroovyScriptService.class).inSingletonScope()
+        binder.bind(MessageService.class).inSingletonScope()
 
         // dummy scheduler service for tests
         binder.bind(ISchedulerService.class).toInstance(new TestSchedulerService())
 
-        binder.bind(GoogleGuiceInjector.class).asEagerSingleton()
+        binder.bind(BootiqueInjector.class).initOnStartup()
 
         // entity service classes
-        binder.bind(CourseClassService.class).in(Scopes.SINGLETON)
-        binder.bind(StudentConcessionService.class).in(Scopes.SINGLETON)
-        binder.bind(TagService.class).in(Scopes.SINGLETON)
-        binder.bind(SessionService.class).in(Scopes.SINGLETON)
-        binder.bind(CourseService.class).in(Scopes.SINGLETON)
-        binder.bind(CertificateService.class).in(Scopes.SINGLETON)
-        binder.bind(StudentService.class).in(Scopes.SINGLETON)
-        binder.bind(InvoiceLineService.class).in(Scopes.SINGLETON)
-        binder.bind(IAutoIncrementService.class).to(TestAutoIncrementService.class).in(Scopes.SINGLETON)
-        binder.bind(CertificateServiceTest.class).in(Scopes.SINGLETON)
-        binder.bind(ISystemUserService.class).to(TestSystemUserService.class).in(Scopes.SINGLETON)
+        binder.bind(CourseClassService.class).inSingletonScope()
+        binder.bind(StudentConcessionService.class).inSingletonScope()
+        binder.bind(TagService.class).inSingletonScope()
+        binder.bind(SessionService.class).inSingletonScope()
+        binder.bind(CourseService.class).inSingletonScope()
+        binder.bind(CertificateService.class).inSingletonScope()
+        binder.bind(StudentService.class).inSingletonScope()
+        binder.bind(InvoiceLineService.class).inSingletonScope()
+        binder.bind(IAutoIncrementService.class).to(TestAutoIncrementService.class).inSingletonScope()
+        binder.bind(CertificateServiceTest.class).inSingletonScope()
+        binder.bind(ISystemUserService.class).to(TestSystemUserService.class).inSingletonScope()
 
-        binder.bind(CustomFieldTypeService.class).in(Scopes.SINGLETON)
-        binder.bind(SanityCheckService.class).in(Scopes.SINGLETON)
-        binder.bind(QualityService.class).in(Scopes.SINGLETON)
-        binder.bind(ExportService.class).in(Scopes.SINGLETON)
-        binder.bind(DuplicateCourseService.class).in(Scopes.SINGLETON)
-        binder.bind(DuplicateClassService.class).in(Scopes.SINGLETON)
+        binder.bind(CustomFieldTypeService.class).inSingletonScope()
+        binder.bind(SanityCheckService.class).inSingletonScope()
+        binder.bind(QualityService.class).inSingletonScope()
+        binder.bind(ExportService.class).inSingletonScope()
+        binder.bind(DuplicateCourseService.class).inSingletonScope()
+        binder.bind(DuplicateClassService.class).inSingletonScope()
 
-        binder.bind(DataPopulation.class).in(Scopes.SINGLETON)
-        binder.bind(ImportService.class).in(Scopes.SINGLETON)
-        binder.bind(ContactMergeService.class).in(Scopes.SINGLETON)
-        binder.bind(SessionValidator.class).in(Scopes.SINGLETON)
+        binder.bind(DataPopulation.class).inSingletonScope()
+        binder.bind(ImportService.class).inSingletonScope()
+        binder.bind(ContactMergeService.class).inSingletonScope()
+        binder.bind(SessionValidator.class).inSingletonScope()
 
-        binder.bind(CayenneListenersService.class).asEagerSingleton();
+        binder.bind(CayenneListenersService.class).initOnStartup()
 
     }
 }
diff --git a/server/src/test/groovy/ish/oncourse/server/security/api/MockModule.groovy b/server/src/test/groovy/ish/oncourse/server/security/api/MockModule.groovy
index 4f7cfc34adc..b6cdbd8dbc7 100644
--- a/server/src/test/groovy/ish/oncourse/server/security/api/MockModule.groovy
+++ b/server/src/test/groovy/ish/oncourse/server/security/api/MockModule.groovy
@@ -1,16 +1,15 @@
 package ish.oncourse.server.security.api
 
-import com.google.inject.Binder
-import com.google.inject.Module
+import io.bootique.di.Binder
+import io.bootique.di.BQModule
 import groovy.transform.CompileStatic
 import ish.oncourse.server.services.ISystemUserService
 
 @CompileStatic
-class MockModule implements Module {
-
+class MockModule implements BQModule {
     
     @Override
     void configure(Binder binder) {
-        binder.bind(ISystemUserService.class).to(MockSystemUserService.class).asEagerSingleton()
+        binder.bind(ISystemUserService.class).to(MockSystemUserService.class).initOnStartup()
     }
 }
diff --git a/server/src/test/groovy/ish/oncourse/server/services/TestSystemUserService.groovy b/server/src/test/groovy/ish/oncourse/server/services/TestSystemUserService.groovy
index fc4f106536b..50b30802892 100644
--- a/server/src/test/groovy/ish/oncourse/server/services/TestSystemUserService.groovy
+++ b/server/src/test/groovy/ish/oncourse/server/services/TestSystemUserService.groovy
@@ -1,20 +1,16 @@
 package ish.oncourse.server.services
 
-import com.google.inject.Inject
+import javax.inject.Inject
 import groovy.transform.CompileStatic
 import ish.oncourse.API
 import ish.oncourse.server.ICayenneService
 import ish.oncourse.server.cayenne.ACLRole
 import ish.oncourse.server.cayenne.SystemUser
 import org.apache.cayenne.query.ObjectSelect
-import org.apache.logging.log4j.LogManager
-import org.apache.logging.log4j.Logger
 
 @CompileStatic
 class TestSystemUserService implements ISystemUserService {
 
-    static final Logger logger = LogManager.getLogger()
-
     private ICayenneService cayenneService
 
     @Inject
diff --git a/server/src/test/groovy/org/eclipse/jetty/testing/AngelServletTester.java b/server/src/test/groovy/org/eclipse/jetty/testing/AngelServletTester.java
index 662b8cd1fee..916a69fb850 100644
--- a/server/src/test/groovy/org/eclipse/jetty/testing/AngelServletTester.java
+++ b/server/src/test/groovy/org/eclipse/jetty/testing/AngelServletTester.java
@@ -4,7 +4,7 @@
  */
 package org.eclipse.jetty.testing;
 
-import com.google.inject.Provider;
+import javax.inject.Provider;
 import groovy.transform.CompileStatic;
 import ish.oncourse.server.AngelServerFactory;
 import ish.oncourse.server.PreferenceController;
diff --git a/types/build.gradle b/types/build.gradle
index 7ed7b1d6f54..be196e5a63a 100644
--- a/types/build.gradle
+++ b/types/build.gradle
@@ -10,10 +10,16 @@
  */
 
 plugins {
+    id 'java'
     id 'java-library'
     id 'maven-publish'
 }
 
+java {
+    sourceCompatibility = JavaVersion.VERSION_11
+    group = 'ish.oncourse'
+}
+
 sourceSets.main.java.srcDirs = []
 sourceSets.main.groovy.srcDir 'src/main/java'
 
@@ -40,14 +46,10 @@ dependencies {
 }
 
 task sourceJar(type: Jar, dependsOn: classes) {
-    classifier = 'sources'
+    archiveClassifier = 'sources'
     from sourceSets.main.allSource
 }
 
-group = 'ish.oncourse'
-sourceCompatibility = 8
-
-
 publishing {
     publications {
         jar(MavenPublication) {