diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..2e41b51
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,15 @@
+name: Build
+
+on: [pull_request]
+
+jobs:
+  compile:
+    runs-on: ubuntu-latest
+    name: Build
+    steps:
+      - uses: actions/checkout@master
+      - name: Setup java
+        uses: actions/setup-java@v1
+        with:
+          java-version: 1.8
+      - run: mvn clean install -Dcheckstyle.skip -q
diff --git a/.github/workflows/checkstyle.yml b/.github/workflows/checkstyle.yml
new file mode 100644
index 0000000..ef0ceaf
--- /dev/null
+++ b/.github/workflows/checkstyle.yml
@@ -0,0 +1,15 @@
+name: Checkstyle
+
+on: [pull_request]
+
+jobs:
+  compile:
+    runs-on: ubuntu-latest
+    name: Checkstyle
+    steps:
+      - uses: actions/checkout@master
+      - name: Setup java
+        uses: actions/setup-java@v1
+        with:
+          java-version: 1.8
+      - run: mvn checkstyle:check -q
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0084a3b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,208 @@
+
+# Created by https://www.gitignore.io/api/java,maven,eclipse,netbeans,intellij+all
+# Edit at https://www.gitignore.io/?templates=java,maven,eclipse,netbeans,intellij+all
+
+### Eclipse ###
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.recommenders
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# PyDev specific (Python IDE for Eclipse)
+*.pydevproject
+
+# CDT-specific (C/C++ Development Tooling)
+.cproject
+
+# CDT- autotools
+.autotools
+
+# Java annotation processor (APT)
+.factorypath
+
+# PDT-specific (PHP Development Tools)
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# Tern plugin
+.tern-project
+
+# TeXlipse plugin
+.texlipse
+
+# STS (Spring Tool Suite)
+.springBeans
+
+# Code Recommenders
+.recommenders/
+
+# Annotation Processing
+.apt_generated/
+
+# Scala IDE specific (Scala & Java development for Eclipse)
+.cache-main
+.scala_dependencies
+.worksheet
+
+### Eclipse Patch ###
+# Eclipse Core
+.project
+
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+
+# Annotation Processing
+.apt_generated
+
+.sts4-cache/
+
+### Intellij+all ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij+all Patch ###
+# Ignores the whole .idea folder and all .iml files
+# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
+
+.idea/
+
+# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
+
+*.iml
+modules.xml
+.idea/misc.xml
+*.ipr
+
+# Sonarlint plugin
+.idea/sonarlint
+
+### Java ###
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+### Maven ###
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+.mvn/wrapper/maven-wrapper.jar
+.flattened-pom.xml
+
+### NetBeans ###
+**/nbproject/private/
+**/nbproject/Makefile-*.mk
+**/nbproject/Package-*.bash
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+# End of https://www.gitignore.io/api/java,maven,eclipse,netbeans,intellij+all
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ca8265a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,46 @@
+![GitHub](https://img.shields.io/github/license/E-edu/java-common)
+![GitHub top language](https://img.shields.io/github/languages/top/E-edu/java-common)
+
+![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/E-edu/java-common)
+
+![GitHub last commit (branch)](https://img.shields.io/github/last-commit/E-Edu/java-common/master?label=last%20commit%20%28master%29)
+![GitHub last commit (branch)](https://img.shields.io/github/last-commit/E-Edu/java-common/experimental?label=last%20commit%20%28experimental%29)
+
+# Gewia Common
+
+This project contains the commonly shared code for all our
+java based micro services (e.g. task and gateway).
+
+This repository also is our reference implementation for some things.
+
+## Scope
+![Maven Central](https://img.shields.io/maven-central/v/com.gewia.common/scope)
+
+[Based on this meeting changelog](https://github.com/E-Edu/concept/blob/master/changelog/meeting/20200420-conceptmeeting.md#8-roles--permissions)
+
+We have a custom implementation of the widely known "scopes" used in OAuth2 for example.
+
+This implementation standardized scopes for
+every Gewia related project - so this is the reference implementation.
+
+Some special features:
+- Implementations with and without restrictions
+    - BasicScope (no restrictions)
+    - MicroServiceScope
+        - microService.topic.mode.scope.extra
+- Merging (and de-merging)
+    - user.email.read+write+delete.all+beta
+- Pre-defined scopes
+    - none (default)
+    - own
+    - self (only applicable to topics regarding a user itself)
+    - all
+    - beta
+- Pre-defined modes
+    - read
+    - write
+    - delete
+
+## License
+
+This project is licensed under the MIT license.
diff --git a/checkstyle.xml b/checkstyle.xml
new file mode 100644
index 0000000..f927fb4
--- /dev/null
+++ b/checkstyle.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC
+		"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
+		"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
+
+<module name="Checker">
+
+	<!-- Check for new Line at EOF -->
+	<module name="NewlineAtEndOfFile">
+		<property name="lineSeparator" value="lf"/>
+	</module>
+
+	<!-- Allow ignoring things with @SuppressWarnings or comment -->
+	<module name="SuppressWarningsFilter"/>
+
+	<!--Check for trailing spaces -->
+	<module name="RegexpSingleline">
+		<property name="format" value="(^\t{0,} + (?![\*@]))|([ \t]+$)"/>
+		<property name="minimum" value="0"/>
+		<property name="maximum" value="0"/>
+		<property name="message" value="Line should use tab indentation and have no trailing spaces."/>
+	</module>
+
+	<module name="TreeWalker">
+
+		<module name="SuppressionCommentFilter" />
+
+		<!-- Ignore if SuppressWarnings or comment -->
+		<module name="SuppressWarningsHolder"/>
+
+		<!-- Check if Methods, Classes, Interfaces and Enums have a Javadoc Comments -->
+		<module name="JavadocMethod"/>
+		<module name="JavadocType">
+			<property name="scope" value="PRIVATE"/>
+			<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF"/>
+		</module>
+
+		<!-- Check formatting of Javadoc comments -->
+		<module name="JavadocStyle">
+			<property name="checkEmptyJavadoc" value="true"/>
+		</module>
+		<module name="JavadocParagraph"/>
+		<module name="AtclauseOrder">
+			<property name="tagOrder"
+					  value="@version, @param, @return, @throws, @exception, @see, @since, @serial, @serialField, @serialData, @deprecated"/>
+			<property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
+		</module>
+		<module name="NonEmptyAtclauseDescription"/>
+
+		<!-- Check imports -->
+		<module name="UnusedImports"/>
+		<module name="AvoidStarImport"/>
+		<module name="RedundantImport"/>
+		<module name="IllegalImport">
+			<property name="illegalPkgs" value="java.awt, java.sql, javafx, sun"/>
+		</module>
+
+		<!-- Check declaration order of variables -->
+		<module name="DeclarationOrder"/>
+
+		<!-- Check if Constants are written in Capital Letters -->
+		<module name="ConstantName"/>
+
+		<!-- Check if Package Name is correct -->
+		<module name="PackageName"/>
+
+		<!-- Check if non static fields begin lower case -->
+		<module name="MemberName"/>
+
+		<!-- Check if method identifiers begin lower case -->
+		<module name="MethodName"/>
+
+		<!-- Check empty line separators -->
+		<module name="EmptyLineSeparator">
+			<property name="tokens"
+					  value="IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF, STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF"/>
+		</module>
+
+		<!-- Check default is at end of switch if there is one -->
+		<module name="DefaultComesLast"/>
+
+		<!-- Check if package declaration is correct -->
+		<module name="PackageDeclaration"/>
+
+		<!-- Check different whitespaces -->
+		<module name="EmptyForIteratorPad"/>
+		<module name="GenericWhitespace"/>
+		<module name="MethodParamPad"/>
+		<module name="ParenPad"/>
+		<module name="WhitespaceAfter"/>
+		<module name="WhitespaceAround"/>
+		<module name="SingleSpaceSeparator"/>
+
+		<!-- Check Blocks -->
+		<module name="EmptyBlock"/>
+		<module name="LeftCurly"/>
+		<module name="RightCurly"/>
+
+		<!-- Check Code -->
+		<module name="EmptyStatement"/>
+		<module name="EqualsHashCode"/>
+		<module name="MissingSwitchDefault"/>
+		<module name="IllegalThrows"/>
+		<module name="IllegalCatch"/>
+		<module name="SimplifyBooleanExpression"/>
+		<module name="SimplifyBooleanReturn"/>
+		<module name="OneStatementPerLine"/>
+		<module name="ModifiedControlVariable"/>
+		<module name="RequireThis"/>
+		<module name="StringLiteralEquality"/>
+
+		<!-- Check Misc -->
+		<module name="ArrayTypeStyle"/>
+	</module>
+</module>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..7070b88
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.gewia.common</groupId>
+	<artifactId>gewia-common</artifactId>
+	<packaging>pom</packaging>
+	<version>1.0</version>
+
+	<modules>
+		<module>scope</module>
+	</modules>
+
+	<properties>
+		<java.version>8</java.version>
+		<maven.compiler.source>${java.version}</maven.compiler.source>
+		<maven.compiler.target>${java.version}</maven.compiler.target>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>1.18.12</version>
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.13</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.8.1</version>
+				<configuration>
+					<target>${maven.compiler.target}</target>
+					<source>${maven.compiler.source}</source>
+					<encoding>${project.build.sourceEncoding}</encoding>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>3.0.0-M4</version>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-checkstyle-plugin</artifactId>
+				<version>3.1.1</version>
+				<configuration>
+					<configLocation>checkstyle.xml</configLocation>
+					<encoding>${project.build.sourceEncoding}</encoding>
+					<consoleOutput>true</consoleOutput>
+					<failsOnError>true</failsOnError>
+					<linkXRef>false</linkXRef>
+				</configuration>
+				<executions>
+					<execution>
+						<id>validate</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>check</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/renovate.json b/renovate.json
new file mode 100644
index 0000000..92b410d
--- /dev/null
+++ b/renovate.json
@@ -0,0 +1,14 @@
+{
+  "schedule": [
+	"after 7pm every weekday",
+	"before 8am every weekday"
+  ],
+  "baseBranches": [
+	"experimental"
+  ],
+  "labels": [
+	"renovate"
+  ],
+  "rangeStrategy": "pin",
+  "automerge": false
+}
diff --git a/scope/pom.xml b/scope/pom.xml
new file mode 100644
index 0000000..67140a8
--- /dev/null
+++ b/scope/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<parent>
+		<artifactId>gewia-common</artifactId>
+		<groupId>com.gewia.common</groupId>
+		<version>1.0</version>
+	</parent>
+	<modelVersion>4.0.0</modelVersion>
+
+	<artifactId>scope</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/scope/src/main/java/com/gewia/common/scope/Scope.java b/scope/src/main/java/com/gewia/common/scope/Scope.java
new file mode 100644
index 0000000..630a8e7
--- /dev/null
+++ b/scope/src/main/java/com/gewia/common/scope/Scope.java
@@ -0,0 +1,123 @@
+package com.gewia.common.scope;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A scope is a mechanism to limit permissions of a person or application.
+ *
+ * <p>
+ * 		This implementation is the reference implementation of scopes for the 'Gewia' project.
+ *
+ * 		Examples:
+ * 			user.email.read.self - let's the user read his own email address
+ * 			user.email.write.self - let's the user change his own email address
+ * 			user.email.write.all - let's the user change every email address of every user
+ * 			user.email.write.steve - let's the user change the email address of "steve"; this is a custom behaviour
+ * 									and not part of the official specification
+ * </p>
+ * @since 1.0
+ */
+public abstract class Scope {
+
+	protected final List<ScopePart> scopeParts = new ArrayList<>();
+
+	/**
+	 * Gets the currently available scope parts.
+	 *
+	 * <p>
+	 * 		Whether the returned list is readonly or even a copy will be specified by
+	 * 		the implementation.
+	 * </p>
+	 *
+	 * @return all scope parts
+	 *
+	 * @since 1.0
+	 */
+	public abstract List<ScopePart> getScopeParts();
+
+	/**
+	 * Adds the given <i>scopeParts</i> at the end of the scope.
+	 *
+	 * @param scopeParts the scope parts to add
+	 *
+	 * @return this
+	 *
+	 * @since 1.0
+	 */
+	public Scope addScopeParts(String... scopeParts) {
+		for (String scopePart : scopeParts) this.addScopePart(new ScopePart(scopePart));
+		return this;
+	}
+
+	/**
+	 * Adds the given <i>scopePart</i> at the end of the scope.
+	 *
+	 * @param scopePart the scope part to add
+	 *
+	 * @return this
+	 *
+	 * @since 1.0
+	 */
+	public Scope addScopePart(String scopePart) {
+		return this.addScopePart(new ScopePart(scopePart));
+	}
+
+	/**
+	 * Adds the given <i>scopePart</i> at the end of the scope.
+	 *
+	 * @param scopePart the scope part to add
+	 *
+	 * @return this
+	 *
+	 * @since 1.0
+	 */
+	public abstract Scope addScopePart(ScopePart scopePart);
+
+	/**
+	 * Removes the scope part at the given <i>index</i>.
+	 *
+	 * @param index the index used to remove the scope part
+	 *
+	 * @return this
+	 * @throws IndexOutOfBoundsException when the index is greater than the amount scope parts
+	 *
+	 * @since 1.0
+	 */
+	public abstract Scope removeScopePart(int index);
+
+	/**
+	 * Gets the scope part at the given <i>index</i>.
+	 *
+	 * @param index the index used to get the scope part
+	 *
+	 * @return this
+	 * @throws IndexOutOfBoundsException when the index is greater than the amount scope parts
+	 *
+	 * @since 1.0
+	 */
+	public abstract ScopePart getScopePart(int index);
+
+	/**
+	 * Gets the amount of scope parts of this scope.
+	 *
+	 * @return the amount of scope parts
+	 *
+	 * @since 1.0
+	 */
+	public abstract int getScopePartsSize();
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+
+		this.getScopeParts().forEach(scopePart -> {
+			if (sb.length() != 0) sb.append(".");
+
+			sb.append(scopePart);
+		});
+
+		return sb.toString();
+	}
+
+}
diff --git a/scope/src/main/java/com/gewia/common/scope/ScopePart.java b/scope/src/main/java/com/gewia/common/scope/ScopePart.java
new file mode 100644
index 0000000..7679921
--- /dev/null
+++ b/scope/src/main/java/com/gewia/common/scope/ScopePart.java
@@ -0,0 +1,20 @@
+package com.gewia.common.scope;
+
+import lombok.Data;
+
+/**
+ * Scopes are made out of {@link ScopePart}s which are concatenated using dots.
+ *
+ * @since 1.0
+ */
+@Data
+public class ScopePart {
+
+	private final String content;
+
+	@Override
+	public String toString() {
+		return this.content;
+	}
+
+}
diff --git a/scope/src/main/java/com/gewia/common/scope/impl/BasicScope.java b/scope/src/main/java/com/gewia/common/scope/impl/BasicScope.java
new file mode 100644
index 0000000..5ce02f5
--- /dev/null
+++ b/scope/src/main/java/com/gewia/common/scope/impl/BasicScope.java
@@ -0,0 +1,56 @@
+package com.gewia.common.scope.impl;
+
+import com.gewia.common.scope.Scope;
+import com.gewia.common.scope.ScopePart;
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
+import java.util.List;
+
+/**
+ * Represents a generic scope without further restrictions.
+ *
+ * @since 1.0
+ */
+@RequiredArgsConstructor(access = AccessLevel.MODULE)
+public class BasicScope extends Scope {
+
+	/**
+	 * Gets the currently available scope parts.
+	 *
+	 * <p>
+	 *     	The returned list is the real modifiable list used for internal
+	 * 		purposes.
+	 * 		Modifications to this list will directly affect this scope.
+	 * </p>
+	 *
+	 * @return all scope parts
+	 */
+	@Override
+	public List<ScopePart> getScopeParts() {
+		return this.scopeParts;
+	}
+
+	@Override
+	public Scope addScopePart(ScopePart scopePart) {
+		this.scopeParts.add(scopePart);
+		return this;
+	}
+
+	@Override
+	public Scope removeScopePart(int index) {
+		this.scopeParts.remove(index);
+		return this;
+	}
+
+	@Override
+	public ScopePart getScopePart(int index) {
+		return this.scopeParts.get(index);
+	}
+
+	@Override
+	public int getScopePartsSize() {
+		return this.scopeParts.size();
+	}
+
+
+}
diff --git a/scope/src/main/java/com/gewia/common/scope/impl/ScopeFactory.java b/scope/src/main/java/com/gewia/common/scope/impl/ScopeFactory.java
new file mode 100644
index 0000000..5c097ac
--- /dev/null
+++ b/scope/src/main/java/com/gewia/common/scope/impl/ScopeFactory.java
@@ -0,0 +1,18 @@
+package com.gewia.common.scope.impl;
+
+import com.gewia.common.scope.Scope;
+
+public class ScopeFactory {
+
+	/**
+	 * Creates a {@link BasicScope} with not further restrictions.
+	 *
+	 * @return a {@link BasicScope}
+	 *
+	 * @since 1.0
+	 */
+	public static Scope createBasicScope() {
+		return new BasicScope();
+	}
+
+}
diff --git a/scope/src/test/java/com/gewia/common/scope/test/BasicScopeTest.java b/scope/src/test/java/com/gewia/common/scope/test/BasicScopeTest.java
new file mode 100644
index 0000000..aa937fb
--- /dev/null
+++ b/scope/src/test/java/com/gewia/common/scope/test/BasicScopeTest.java
@@ -0,0 +1,37 @@
+package com.gewia.common.scope.test;
+
+import com.gewia.common.scope.Scope;
+import com.gewia.common.scope.impl.ScopeFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class BasicScopeTest {
+
+	@Test
+	public void basicCreateAndReadAndDeleteTest() {
+		Scope scope = ScopeFactory.createBasicScope();
+
+		Assert.assertTrue("Scope parts not empty", scope.getScopeParts().isEmpty());
+		Assert.assertEquals("Scope parts size not zero", 0, scope.getScopePartsSize());
+		Assert.assertEquals("Output not empty", 0, scope.toString().length());
+
+		Assert.assertEquals(
+			"Returned scope not the same",
+			scope,
+			scope.addScopeParts("user", "email", "read")
+		);
+
+		Assert.assertEquals("Scope output doesn't match", "user.email.read", scope.toString());
+		Assert.assertEquals("Scope parts do not match size (list access)", 3, scope.getScopeParts().size());
+		Assert.assertEquals("Scope parts do not match size", 3, scope.getScopePartsSize());
+
+		Assert.assertThrows("Scope didn't catch out of bound remove", IndexOutOfBoundsException.class,() -> scope.removeScopePart(4));
+
+		scope.removeScopePart(1);
+
+		Assert.assertEquals("Scope output doesn't match", "user.read", scope.toString());
+		Assert.assertEquals("Scope parts do not match size (list access)", 2, scope.getScopeParts().size());
+		Assert.assertEquals("Scope parts do not match size", 2, scope.getScopePartsSize());
+	}
+
+}
