Initial commit
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a2a3040
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..a117754
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,4 @@
+FROM openjdk:8-jre-alpine
+COPY /target/contact-base-data.jar /usr/src/cbd/
+WORKDIR usr/src/cbd
+CMD ["java", "-jar", "-Dspring.config.name=application_localdev", "contact-base-data.jar"] 
\ No newline at end of file
diff --git a/Dockerfile_DevServer b/Dockerfile_DevServer
new file mode 100644
index 0000000..2e97d85
--- /dev/null
+++ b/Dockerfile_DevServer
@@ -0,0 +1,4 @@
+FROM openjdk:8-jre-alpine
+COPY /target/contact-base-data.jar /usr/src/cbd/
+WORKDIR usr/src/cbd
+CMD ["java", "-jar", "-Dspring.profiles.active=devserver", "contact-base-data.jar"]
\ No newline at end of file
diff --git a/mvnw b/mvnw
new file mode 100644
index 0000000..21d3ee8
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# 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
+#
+#    https://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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+        
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 0000000..84d60ab
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..d03b684
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    *******************************************************************************
+    * Copyright (c) 2019 Contributors to the Eclipse Foundation
+    *
+    * See the NOTICE file(s) distributed with this work for additional
+    * information regarding copyright ownership.
+    *
+    * This program and the accompanying materials are made available under the
+    * terms of the Eclipse Public License v. 2.0 which is available at
+    * http://www.eclipse.org/legal/epl-2.0.
+    *
+    * SPDX-License-Identifier: EPL-2.0
+    *******************************************************************************
+-->
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.2.1.RELEASE</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+	<groupId>org.eclipse.openk</groupId>
+	<artifactId>contact-base-data</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>contact-base-data</name>
+	<description>Demo project for Spring Boot</description>
+
+	<properties>
+		<skip.asciidoc>false</skip.asciidoc>
+		<maven.test.skip>false</maven.test.skip>
+
+		<flyway.sqlMigrationSeparator>__</flyway.sqlMigrationSeparator>
+		<flyway.url>jdbc:postgresql://entopticadirx:5432/ContactBaseDataDevServer</flyway.url>
+		<flyway.user>cbd_service</flyway.user>
+		<flyway.password>cbd_service</flyway.password>
+		<flyway.schemas>public</flyway.schemas>
+		<flyway.locations>filesystem:src/main/resources/db/migration/</flyway.locations>
+
+		<java.version>1.8</java.version>
+		<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
+		<springfox.version>2.9.2</springfox.version>
+		<powerMockReflect.version>2.0.0</powerMockReflect.version>
+		<sonar-maven-plugin.version>3.2</sonar-maven-plugin.version>
+		<asciidoctor-maven-plugin-version>1.5.3</asciidoctor-maven-plugin-version>
+		<asciidoctorj-pdf-version>1.5.0-alpha.11</asciidoctorj-pdf-version>
+		<asciidoctorj-version>1.5.4</asciidoctorj-version>
+		<asciidoctorj-diagram-versions>1.5.4.1</asciidoctorj-diagram-versions>
+		<jacoco-maven-plugin.version>0.7.9</jacoco-maven-plugin.version>
+		<jruby-complete-version>9.0.0.0</jruby-complete-version>
+		<mapstruct.version>1.2.0.Final</mapstruct.version>
+		<flyway-core.version>6.0.8</flyway-core.version>
+		<postgresql.version>42.2.8</postgresql.version>
+		<lombock.version>1.18.10</lombock.version>
+		<h2.version>1.4.200</h2.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-jpa</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-oauth2-client</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-security</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.flywaydb</groupId>
+			<artifactId>flyway-core</artifactId>
+			<version>${flyway-core.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-openfeign</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.postgresql</groupId>
+			<artifactId>postgresql</artifactId>
+			<version>${postgresql.version}</version>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>${lombok.version}</version>
+			<optional>true</optional>
+		</dependency>
+		<dependency>
+			<groupId>org.mapstruct</groupId>
+			<artifactId>mapstruct-processor</artifactId>
+			<version>${mapstruct.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger2</artifactId>
+			<version>${springfox.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger-ui</artifactId>
+			<version>${springfox.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.junit.vintage</groupId>
+					<artifactId>junit-vintage-engine</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.security</groupId>
+			<artifactId>spring-security-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.powermock</groupId>
+			<artifactId>powermock-reflect</artifactId>
+			<version>${powerMockReflect.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.h2database</groupId>
+			<artifactId>h2</artifactId>
+			<version>${h2.version}</version>
+		</dependency>
+	</dependencies>
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.springframework.cloud</groupId>
+				<artifactId>spring-cloud-dependencies</artifactId>
+				<version>${spring-cloud.version}</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<build>
+		<finalName>${project.artifactId}</finalName>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.jacoco</groupId>
+				<artifactId>jacoco-maven-plugin</artifactId>
+				<version>${jacoco-maven-plugin.version}</version>
+				<configuration>
+					<skip>${maven.test.skip}</skip>
+					<output>file</output>
+					<append>true</append>
+					<excludes>
+						<exclude>**/Globals.*</exclude>
+					</excludes>
+				</configuration>
+				<executions>
+					<execution>
+						<id>jacoco-initialize</id>
+						<goals>
+							<goal>prepare-agent</goal>
+						</goals>
+					</execution>
+					<execution>
+						<id>jacoco-site</id>
+						<phase>verify</phase>
+						<goals>
+							<goal>report</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.sonarsource.scanner.maven</groupId>
+				<artifactId>sonar-maven-plugin</artifactId>
+				<version>${sonar-maven-plugin.version}</version>
+			</plugin>
+			<plugin>
+				<groupId>org.asciidoctor</groupId>
+				<artifactId>asciidoctor-maven-plugin</artifactId>
+				<version>${asciidoctor-maven-plugin-version}</version>
+				<dependencies>
+					<dependency>
+						<groupId>org.jruby</groupId>
+						<artifactId>jruby-complete</artifactId>
+						<version>${jruby-complete-version}</version>
+					</dependency>
+					<dependency>
+						<groupId>org.asciidoctor</groupId>
+						<artifactId>asciidoctorj-pdf</artifactId>
+						<version>${asciidoctorj-pdf-version}</version>
+					</dependency>
+					<dependency>
+						<groupId>org.asciidoctor</groupId>
+						<artifactId>asciidoctorj</artifactId>
+						<version>${asciidoctorj-version}</version>
+					</dependency>
+					<dependency>
+						<groupId>org.asciidoctor</groupId>
+						<artifactId>asciidoctorj-diagram</artifactId>
+						<version>${asciidoctorj-diagram-versions}</version>
+					</dependency>
+				</dependencies>
+				<configuration>
+					<sourceDirectory>src/main/asciidoc</sourceDirectory>
+					<requires>
+						<require>asciidoctor-diagram</require>
+					</requires>
+					<attributes>
+						<imagesoutdir>${project.build.directory}/generated-docs/img</imagesoutdir>
+						<imagesDir>${project.build.directory}/generated-docs/img</imagesDir>
+					</attributes>
+				</configuration>
+				<executions>
+					<execution>
+						<id>output-html</id>
+						<phase>generate-resources</phase>
+						<goals>
+							<goal>process-asciidoc</goal>
+						</goals>
+						<configuration>
+							<skip>${skip.asciidoc}</skip>
+							<imagesDir>./img</imagesDir>
+							<requires>
+								<require>asciidoctor-diagram</require>
+							</requires>
+							<sourceHighlighter>coderay</sourceHighlighter>
+							<backend>html</backend>
+							<doctype>book</doctype>
+						</configuration>
+					</execution>
+					<execution>
+						<id>output-pdf</id>
+						<phase>generate-resources</phase>
+						<goals>
+							<goal>process-asciidoc</goal>
+						</goals>
+						<configuration>
+							<skip>${skip.asciidoc}</skip>
+							<imagesDir>${project.build.directory}/generated-docs/img</imagesDir>
+							<requires>
+								<require>asciidoctor-diagram</require>
+							</requires>
+							<sourceHighlighter>coderay</sourceHighlighter>
+							<backend>pdf</backend>
+							<doctype>book</doctype>
+							<attributes>
+								<icons>font</icons>
+								<pagenums />
+								<toc />
+								<idprefix />
+								<idseparator>-</idseparator>
+							</attributes>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+		</plugins>
+	</build>
+
+</project>
diff --git a/sonar-project.properties b/sonar-project.properties
new file mode 100644
index 0000000..a35cbd3
--- /dev/null
+++ b/sonar-project.properties
@@ -0,0 +1,19 @@
+# must be unique in a given SonarQube instance
+sonar.projectKey=openk.pta.de:contact-base-data.backend
+# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
+sonar.projectName=contact-base-data.BE
+sonar.projectVersion=0.0.1_Snapshot
+sonar.java.binaries=target/classes
+ 
+# Language
+sonar.language=
+ 
+sonar.sourceEncoding=UTF-8
+sonar.sources=src/main
+sonar.exclusions=**/model/*.java,**/viewmodel/*.java
+sonar.tests=src/test
+#sonar.test.inclusions=**/*.spec.ts
+sonar.test.exclusions=**/model/**,**/viewmodel/**
+#sonar.ts.tslintconfigpath=tslint.json
+
+sonar.typescript.lcov.reportPaths=coverage/lcov.info
\ No newline at end of file
diff --git a/src/main/asciidoc/architectureDocumentation/architectureDocumentation.adoc b/src/main/asciidoc/architectureDocumentation/architectureDocumentation.adoc
new file mode 100644
index 0000000..8d01f75
--- /dev/null
+++ b/src/main/asciidoc/architectureDocumentation/architectureDocumentation.adoc
@@ -0,0 +1,502 @@
+////
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+////
+
+openKonsequenz - Architecture of the module 'Contact Base Data'
+===============================================================
+:Author: Frank Dietrich
+:Email: frank.dietrich@pta.de
+:Date: 2018-03-19
+:Revision: 1
+:icons:
+:source-highlighter: highlightjs
+:highlightjs-theme: solarized_dark
+
+This documentation is based on the ARC42-Template (v7.0):
+
+== Introduction and Goals
+
+=== Requirements Overview
+
+The module 'Contact Base Data' supports the different openKonsesequence domain- and user-modules ...
+
+
+=== Quality Goals
+The module 'Contact Base Data' represents a user module that is based on the architecture platform of openKONSEQUENZ. The main quality
+goals of the platform are:
+
+* *Flexibility* The reference platform shall grant that different systems and modules from different vendors/developers can interact and interoperate, and may be exchanged or recombined.
+* *Availability* All platform modules that are running on the platform can only be as available as the platform same for user modules that are based on platform modules.
+* *Maintainability* (and testability as part of maintainability)  The platform and its platform modules shall be used longer than 15 years.
+* *Integration performance* New implemented functionality of oK own modules and external modules shall be included fast / automatically.
+* *Security* The platform and its modules need to underly security-by-design
+
+The main quality goals of the user module Contact Base Data are:
+
+* *Functionality* The user module must fulfil the functional requirements mentioned in the section before
+* *Ergonomics* The web interface must be realized according to oK-GUI-Styleguide.
+* *Good documentation* (i.e. code and architecture documentation) makes code changes easier and automatic
+tests facilitate rigorous verification.
+* *Modifiability* (and testability as part of modifiability)
+* *Integration performance* The user module must be easy integratable in different production environments.
+
+The following documents contain the quality goals in detail:
+
+* Architecture Committee Handbook v1.3.1 from 05-09-2017
+* Quality Committee Handbook v1.1.1 from 11-09-2017
+
+The architecture is based on the AC-Handbook. The quality demands are described in the QC-Handbook.
+Both specifications were fully complied with in the project, so that a high quality is given.
+
+The code quality regarding static code analysis and unit test code coverage on the backend and fronend sides
+are ensured by the use of sonarqube. The rule set and the qualtity gate are defined by the default, the
+so called "sonar way".
+
+The module 'Contact Base Data' is part of the Eclipse project 'Eclipse openK User Modules'.
+This project bases on the Eclipse Public Licence 2.0.
+
+=== Stakeholders
+
+.Stakeholders
+[options="header,footer"]
+|=========================================================
+|Role/Name|Contact|Expectations
+|Product Owner (represents the Distribution System Operators)|Rainer Fuhrmann, Gordon Pickfort|The software must fulfil their functional and nonfunctional requirements.
+|Module Developer|Michel Alessandrini, Jonas Tewolde, Frank Dietrich|All relevant business and technical information must be available for implementing the software.
+|External Reviewer (represents the AC/QC)|n.n.|The software and the documentation is realized according to the Quality and Architecture Handbook of openKONSEQUENZ.
+|External Reviewer (represents the Eclipse-Requirements)|n.n.|The software is  licensed under the EPL 2.0. It must be validated that all requirements are fulfilled.
+|System Integrator|n.n.|A documentation for the integration of the module in the DSO specific environments must be available.
+|=========================================================
+
+== Architecture Constraints
+
+The main architecture constraints are:
+
+* *Public License* The module must be available under the “Eclipse Public License 2.0”.
+* *Availability* The source code of the module must be accessible to any interested person/company.
+
+Therefore the project is published under the following repositories:
+•https://git.eclipse.org/r/openk-usermodules/org.eclipse.openk-usermodules.mics.centralService
+
+* *Standardization* The module must use standardized data structures (CIM) [if available] and the reference platform.
+
+=== Technical Constraints
+
+TODO: Bibliotheken und Versionen aktualisieren
+
+The following technical constraints are given:
+
+.Technical Contraints
+[options="header,footer"]
+|========================================================
+|Component|Constraints
+|Base components of the reference platform
+a|* Application Server Tomcat
+* JPA EclipseLink
+* Database PostgreSQL
+
+|Enterprise service bus
+a|* ESB Talend
+* Communication via RESTful Webservices
+
+|Programming language frontend
+a|* Angular
+* Bootstrap
+* jQuery
+* REST/JSON Interfaces
+
+|GUI design
+a|* According to oK-GUI-Styleguide
+
+|Java QA environment
+a| * Sonarqube 5.6.6
+
+|Programming language
+a|* Backend: Java 1.8
+* Frontend: Angular 4.0.0 (Javascript, Typescript, HTML5, CSS3)
+
+|IDE
+a|* Not restricted (Eclipse, IntelliJ, Microsoft Developer Studio, Microsoft Visual Code ...)
+
+|Build system
+a|* Backend: Maven
+* Frontend: NodeJS + Angular/cli
+
+|Libraries, frameworks, components
+a|* Used Libraries/Frameworks have to be compatible to the Eclipse Public License
+
+|Architecture Documentation
+a|* According ARC42-Template
+|========================================================
+
+
+=== Technical Dependencies
+
+==== Modules
+The following modules are required to use the 'Contact Base Data':
+
+.Modules
+[options="header,footer"]
+|=========================================================
+|Name of the module|Purpose|Status of the module
+|'Auth&Auth'|Authentification and Authorization|available
+|=========================================================
+
+
+==== Libraries
+
+The following libraries are used:
+
+.Libraries
+[options="header,footer"]
+|=========================================================
+|Name of the library|Version|Artefact-id|Usage|License|Tier
+
+
+|org.springframework.boot.spring-boot-starter-parent|2.2.1.RELEASE
+a|
+[source,xml]
+----
+
+----
+||Apache License 2.0|Backend
+|=========================================================
+
+== System Scope and Context
+
+=== Business Context
+
+The user module 'Contact Base Data' communicates via Restful Webservices with the follwowing modules
+(see also figure 1):
+
+* *Core Module 'Auth & Auth'* The 'Contact Base Data' can only be used by authorized users.
+   Therefore, it is essential to invoke the module 'Auth & Auth' for authorization and authentication
+   purposes.
+
+
+
+
+
+
+
+
+=== Technical Context
+
+The following aspects have to be taken into account for external communication of the module 'Contact Base Data':
+
+* RESTful web services are used as interface-technology.
+* Each external interface (interfaces between modules or external systems) has to be documented.
+* Dependencies of modules to services realized by other modules have to be specified and documented explicitly.
+* When CIM is not appropriate (like access management), other standards in their respective domain shall be taken into account first to avoid proprietary and inaccurate interfaces. The interface has to be documented in the overall openKONSEQUENZ interface profile and it should use REST & XML.
+
+The interfaces of the module 'Contact Base Data' are described in the interface documentation.
+
+=== Solution Strategy
+
+The module 'Contact Base Data' bases on a three-tier architecture:
+
+. *Frontend* - The GUI is implemented as a web-frontend with rich-client functionalities.
+. *Backend* - The business functionalities are implemented in the backend tier. It provides the business functions via RESTful Webservices.
+. *Database* - The database stores all module specific data.
+
+
+== Building Block View
+
+=== Whitebox Overall System
+
+The module 'Contact Base Data' contains two components (see figure 2):
+
+. *UI* - Represents the graphical user interface and consumes the services from the business logic component via RESTful webservices.
+. *Business Logic* - Realizes the business functionality and the data storage of the module. The
+module itself is split up in several components due to the requirement to use
+microservices.
+
+.Module components
+[options="header,footer"]
+[plantuml]
+----
+node Module {
+    rectangle UI
+    rectangle BusinessLogic
+
+    interface REST
+
+    UI -> REST
+    REST -- BusinessLogic
+}
+----
+
+
+
+The communication between WebBrowser and Apache Tomcat is established via HTTP/HTTPS.
+ApacheTomcat is connected to the data source (PostgresDBMS) via TCP/IP.
+
+==== contactBaseDataFE
+
+This component implements the presentation logic for the *contact-base-data*-module using the *Angular*-TypeScript
+framework. The Frontend is a so called *Single Page Application* (SPA) because
+it behaves like a single HTML-page. 
+
+
+==== contact-base-data.jar (backend tier)
+
+This component implements the business functionality of the contact base data. And it provides services, that the
+contactBaseDataFE can use the functions in the frontend.
+
+The "spring boot/sprint cloud" framework is used to implement this application.
+
+==== ContactBaseDataDev-DB (Database tier)
+
+This component stores the data of the contact base data. It provides an interface to the contact-base-data.jar to create or
+change data in the database.
+
+The ContactBaseDataDev-DB runs on a Postgres DBMS.
+(The decision to use the Postgres DBMS was made by the openKONSEQUENZ architecture committee)
+
+=== Level 2
+
+==== ContactBaseDataFE (frontend tier)
+
+The frontend component implements the concept of a single-page application (SPA). The framework used is Angular5.
+
+It divides the contactBaseDataFE into three layers:
+
+. *Components* - The components (pages, lists, dialogs, common comp.) represent the presentation layer and the control layer. A component contains the control logic (.ts-file), an HTML-fragment as presentation description (.html-file) and a style definition (.css-file).
+. *Services* - The service component communicates with the interfaces of the backend via HTTP requests by using the model component.
+. *Model* - The model corresponds to the view-model of the backend tier.
+
+.Frontend tier
+[options="header,footer"]
+[plantuml]
+----
+
+node contactBaseData_Frontend  {
+    component Model
+
+
+    node Components {
+        component "Pages"
+        component Lists
+        component "Common Components"
+    }
+
+    component Services
+
+    Components --> Services
+    Components --> Model
+    Services --> Model
+}
+
+node "Contact Base Data Backend (simplified)" {
+    component RestService
+    component ViewModel_API
+}
+
+Services .. RestService
+Model .. ViewModel_API
+RestService --> ViewModel_API
+----
+
+
+==== contact-base-data.jar (backend tier)
+
+The backend tier contains five components which can be summarized in three layers:
+
+. *Presentation layer* - Represented by
+ .. REST-Srv
+ .. View model
+. *Controller layer* - Represented by
+ ..	Controller
+.	*Model layer* - Represented by
+ ..	DAO
+ ..	Model
+
+
+
+.Backend tier
+[options="header,footer"]
+[plantuml]
+----
+
+node "Contact Base Data Backend"  {
+    component Model
+
+
+    component RestService
+
+    component ViewModel_API
+
+    component Controller
+
+    component DAO
+
+    RestService --> ViewModel_API
+    RestService --> Controller
+    DAO --> Model
+    Controller --> DAO
+ }
+
+node DBMS {
+    component ContactBaseDataDB
+}
+
+DAO --> ContactBaseDataDB
+----
+
+==== ContactBaseData-DB (database tier)
+
+The ContactBaseData-DB is realized as a relational database system.
+
+.Database tier
+[options="header,footer"]
+[plantuml]
+----
+
+node DBMS {
+    component ContactBaseDataDB
+}
+----
+
+
+==== Program Configuration
+
+== Runtime view
+
+=== Login / authentication
+
+
+There is no login page, since the openK-Portal-Application is responsible for authentication and
+the whole SSO (single sign on) process.
+Therefore the application has to be started by providing a valid authentication token.
+This token is a JWT (JSON Web Token).
+
+.contactBaseData application is called by the *portal* application. The User is already logged in
+[plantuml]
+....
+actor User
+participant PortalFrontend
+participant PortalBackend
+participant ContactBaseDataFrontend
+entity ContactBaseDataStorage
+participant ContactBaseDataBackend
+
+
+User->PortalFrontend: Start ContactBaseData(JWT)
+PortalFrontend->ContactBaseDataFrontend: nav. to frontend-URL with JWT
+ContactBaseDataFrontend->ContactBaseDataStorage: Extract JWT and store token in session
+... some delay ...
+ContactBaseDataFrontend->ContactBaseDataBackend: Call any secured service with JWT
+group Call secured service
+
+    ContactBaseDataBackend->PortalBackend: "/checkAut(JWT)"
+    group Authorization succeeded
+        ContactBaseDataBackend->ContactBaseDataBackend: run service
+        ContactBaseDataBackend->ContactBaseDataFrontend: return service result
+    end
+    group Authorization failed
+        ContactBaseDataBackend->ContactBaseDataFrontend: return HTTP Code 401
+    end
+end
+....
+
+=== Deployment of the application components
+
+==== Deployment of the frontend
+
+TODO:
+
+==== Deployment of the backend
+TODO:
+
+==== Deployment of the database
+The component "Flyway" is used to make to distribute structural
+or content related changes to the database.
+
+The database is built out of the scripts in the directory "db/migrations". Every sql
+script contains the complete db script for the contact base data database (in different versions).
+The highest version number indicates the currently valid script.
+
+==== Configuration of the system
+
+===== DB based configuration
+
+TODO:
+
+
+===== Configuration of the contact base data backend
+
+When starting the microservice of the contact base data backend you have to provide a configuration "YML"
+file.
+
+TODO: Describe configuration possibilities.
+
+
+
+=== CI- and CD-Components
+
+==== GIT-Repository
+
+TODO: Links to Repos
+
+=== Continuous deployment
+
+The continuous deployment is realized on two platforms:
+
+ * the development platform (Dev-Environment)
+ * the quality platform (Q-Environment)
+
+The automatic deployment on both of the environments is
+directly linked to the branches on the GIT-repositories:
+
+. "SNAPSHOT" or "DEVELOP"
+. "MASTER" or "TRUNC"
+
+The running development is exclusively made on the Snapshot-Branch. Every time
+a developer checks in (pushes) code to the repository, an automatic build
+starts on the hudson ci-server. If the Snapshot-build is successful, then the result
+of that build is directly deployed on the Dev-environment.
+
+At the end of a scrum sprint or when a big user story is realized, all
+the code changes are merged from the *Snapshot*-Branch to the *Trunc*.
+This automatically triggers the build and the deployment on the
+Q-environment.
+
+
+== Design decisions
+
+All architecture decisions are based on the Architecture Committee Handbook. There are no deviations.
+
+== Risks and Technical Debts
+
+(Currently there aren't any known issues)
+
+<<<
+
+== Glossary
+
+.Abbreviations and glossary terms
+[options="header,footer"]
+|========================================================
+|Short|Long|German|Description
+|AC|Architecture Committee|Architektur-Komittee|Gives framework and constraints according to architecture for oK projects.
+|CNCU|Central Network Control Unit||
+|DAO|Data Access Objects||
+|DSO|Distribution System Operator|Verteilnetz-betreiber (VNB)|Manages the distribution network for energy, gas or water.
+|EPL|Eclipse Public License||Underlying license model for Eclipse projects like contact-base-data@openK
+|ESB|Enterprise Service Bus||Central instance to exchange data to overcome point-to-point connections.
+|GNM|Geplante Netzmaßnahme||German name of the module 'Contact Base Data'
+|oK|openKONSEQUENZ|openKONSEQUENZ|Name of the consortium of DSOs
+|QC|Quality Committee|Qualitätskomitee|Gives framework and constraints according to quality for oK projects.
+|SCADA|Supervisory Control and Data Acquisition|Netzleitsystem|System, that allows DSOs view/control actual parameters of their power grid.
+|========================================================
diff --git a/src/main/asciidoc/img/BackendTier.png b/src/main/asciidoc/img/BackendTier.png
new file mode 100644
index 0000000..3b626ec
--- /dev/null
+++ b/src/main/asciidoc/img/BackendTier.png
Binary files differ
diff --git a/src/main/asciidoc/img/DatabaseTier.png b/src/main/asciidoc/img/DatabaseTier.png
new file mode 100644
index 0000000..6225be2
--- /dev/null
+++ b/src/main/asciidoc/img/DatabaseTier.png
Binary files differ
diff --git a/src/main/asciidoc/img/DistributionOfComponents1.png b/src/main/asciidoc/img/DistributionOfComponents1.png
new file mode 100644
index 0000000..44bd6c8
--- /dev/null
+++ b/src/main/asciidoc/img/DistributionOfComponents1.png
Binary files differ
diff --git a/src/main/asciidoc/img/FrontendTier.png b/src/main/asciidoc/img/FrontendTier.png
new file mode 100644
index 0000000..d820cc5
--- /dev/null
+++ b/src/main/asciidoc/img/FrontendTier.png
Binary files differ
diff --git a/src/main/asciidoc/img/SolutionArchitecture.png b/src/main/asciidoc/img/SolutionArchitecture.png
new file mode 100644
index 0000000..bc731ac
--- /dev/null
+++ b/src/main/asciidoc/img/SolutionArchitecture.png
Binary files differ
diff --git a/src/main/asciidoc/img/SystemContext.png b/src/main/asciidoc/img/SystemContext.png
new file mode 100644
index 0000000..cd194ce
--- /dev/null
+++ b/src/main/asciidoc/img/SystemContext.png
Binary files differ
diff --git a/src/main/asciidoc/img/abbrechen.png b/src/main/asciidoc/img/abbrechen.png
new file mode 100644
index 0000000..cf98a3a
--- /dev/null
+++ b/src/main/asciidoc/img/abbrechen.png
Binary files differ
diff --git a/src/main/asciidoc/img/abmelden.png b/src/main/asciidoc/img/abmelden.png
new file mode 100644
index 0000000..1a8799f
--- /dev/null
+++ b/src/main/asciidoc/img/abmelden.png
Binary files differ
diff --git a/src/main/asciidoc/img/auge-symbol.png b/src/main/asciidoc/img/auge-symbol.png
new file mode 100644
index 0000000..6bb5e6f
--- /dev/null
+++ b/src/main/asciidoc/img/auge-symbol.png
Binary files differ
diff --git a/src/main/asciidoc/img/beantragen.png b/src/main/asciidoc/img/beantragen.png
new file mode 100644
index 0000000..88044aa
--- /dev/null
+++ b/src/main/asciidoc/img/beantragen.png
Binary files differ
diff --git a/src/main/asciidoc/img/button_tabelle_kalender.jpg b/src/main/asciidoc/img/button_tabelle_kalender.jpg
new file mode 100644
index 0000000..92a33ce
--- /dev/null
+++ b/src/main/asciidoc/img/button_tabelle_kalender.jpg
Binary files differ
diff --git a/src/main/asciidoc/img/dateien_hochladen.png b/src/main/asciidoc/img/dateien_hochladen.png
new file mode 100644
index 0000000..c07d4be
--- /dev/null
+++ b/src/main/asciidoc/img/dateien_hochladen.png
Binary files differ
diff --git a/src/main/asciidoc/img/einzelmassnahme-loeschen.png b/src/main/asciidoc/img/einzelmassnahme-loeschen.png
new file mode 100644
index 0000000..f74a18c
--- /dev/null
+++ b/src/main/asciidoc/img/einzelmassnahme-loeschen.png
Binary files differ
diff --git a/src/main/asciidoc/img/email-verteiler.png b/src/main/asciidoc/img/email-verteiler.png
new file mode 100644
index 0000000..52966ce
--- /dev/null
+++ b/src/main/asciidoc/img/email-verteiler.png
Binary files differ
diff --git a/src/main/asciidoc/img/erinnerung_datum_grau.png b/src/main/asciidoc/img/erinnerung_datum_grau.png
new file mode 100644
index 0000000..069c12f
--- /dev/null
+++ b/src/main/asciidoc/img/erinnerung_datum_grau.png
Binary files differ
diff --git a/src/main/asciidoc/img/erinnerung_datum_orange.png b/src/main/asciidoc/img/erinnerung_datum_orange.png
new file mode 100644
index 0000000..f59a47b
--- /dev/null
+++ b/src/main/asciidoc/img/erinnerung_datum_orange.png
Binary files differ
diff --git a/src/main/asciidoc/img/erinnerung_datum_rot.jpg b/src/main/asciidoc/img/erinnerung_datum_rot.jpg
new file mode 100644
index 0000000..d5b4a64
--- /dev/null
+++ b/src/main/asciidoc/img/erinnerung_datum_rot.jpg
Binary files differ
diff --git a/src/main/asciidoc/img/erinnerung_glocke_grau.png b/src/main/asciidoc/img/erinnerung_glocke_grau.png
new file mode 100644
index 0000000..d4ea274
--- /dev/null
+++ b/src/main/asciidoc/img/erinnerung_glocke_grau.png
Binary files differ
diff --git a/src/main/asciidoc/img/erinnerung_glocke_orange.png b/src/main/asciidoc/img/erinnerung_glocke_orange.png
new file mode 100644
index 0000000..918723f
--- /dev/null
+++ b/src/main/asciidoc/img/erinnerung_glocke_orange.png
Binary files differ
diff --git a/src/main/asciidoc/img/erinnerung_glocke_rot.jpg b/src/main/asciidoc/img/erinnerung_glocke_rot.jpg
new file mode 100644
index 0000000..1ce63ec
--- /dev/null
+++ b/src/main/asciidoc/img/erinnerung_glocke_rot.jpg
Binary files differ
diff --git a/src/main/asciidoc/img/filter_speichern.png b/src/main/asciidoc/img/filter_speichern.png
new file mode 100644
index 0000000..5a7d08a
--- /dev/null
+++ b/src/main/asciidoc/img/filter_speichern.png
Binary files differ
diff --git a/src/main/asciidoc/img/gnm-erstellen.png b/src/main/asciidoc/img/gnm-erstellen.png
new file mode 100644
index 0000000..88a9eb9
--- /dev/null
+++ b/src/main/asciidoc/img/gnm-erstellen.png
Binary files differ
diff --git a/src/main/asciidoc/img/gnm_detail.png b/src/main/asciidoc/img/gnm_detail.png
new file mode 100644
index 0000000..b154645
--- /dev/null
+++ b/src/main/asciidoc/img/gnm_detail.png
Binary files differ
diff --git a/src/main/asciidoc/img/gnm_einzelmassnahme.png b/src/main/asciidoc/img/gnm_einzelmassnahme.png
new file mode 100644
index 0000000..9a59e79
--- /dev/null
+++ b/src/main/asciidoc/img/gnm_einzelmassnahme.png
Binary files differ
diff --git a/src/main/asciidoc/img/gnm_gesamt.png b/src/main/asciidoc/img/gnm_gesamt.png
new file mode 100644
index 0000000..9e618c5
--- /dev/null
+++ b/src/main/asciidoc/img/gnm_gesamt.png
Binary files differ
diff --git a/src/main/asciidoc/img/gnm_header.png b/src/main/asciidoc/img/gnm_header.png
new file mode 100644
index 0000000..51a256a
--- /dev/null
+++ b/src/main/asciidoc/img/gnm_header.png
Binary files differ
diff --git a/src/main/asciidoc/img/gnm_kalenderuebersicht.png b/src/main/asciidoc/img/gnm_kalenderuebersicht.png
new file mode 100644
index 0000000..0ade69d
--- /dev/null
+++ b/src/main/asciidoc/img/gnm_kalenderuebersicht.png
Binary files differ
diff --git a/src/main/asciidoc/img/gnm_schrittsequenz.png b/src/main/asciidoc/img/gnm_schrittsequenz.png
new file mode 100644
index 0000000..1fdf2ed
--- /dev/null
+++ b/src/main/asciidoc/img/gnm_schrittsequenz.png
Binary files differ
diff --git a/src/main/asciidoc/img/gnm_schrittsequenz_tabelle.png b/src/main/asciidoc/img/gnm_schrittsequenz_tabelle.png
new file mode 100644
index 0000000..8ea36e3
--- /dev/null
+++ b/src/main/asciidoc/img/gnm_schrittsequenz_tabelle.png
Binary files differ
diff --git a/src/main/asciidoc/img/gnm_uebersichtstabelle.png b/src/main/asciidoc/img/gnm_uebersichtstabelle.png
new file mode 100644
index 0000000..abd0f3a
--- /dev/null
+++ b/src/main/asciidoc/img/gnm_uebersichtstabelle.png
Binary files differ
diff --git a/src/main/asciidoc/img/icons/caution.png b/src/main/asciidoc/img/icons/caution.png
new file mode 100644
index 0000000..9a8c515
--- /dev/null
+++ b/src/main/asciidoc/img/icons/caution.png
Binary files differ
diff --git a/src/main/asciidoc/img/icons/important.png b/src/main/asciidoc/img/icons/important.png
new file mode 100644
index 0000000..be685cc
--- /dev/null
+++ b/src/main/asciidoc/img/icons/important.png
Binary files differ
diff --git a/src/main/asciidoc/img/icons/note.png b/src/main/asciidoc/img/icons/note.png
new file mode 100644
index 0000000..7c1f3e2
--- /dev/null
+++ b/src/main/asciidoc/img/icons/note.png
Binary files differ
diff --git a/src/main/asciidoc/img/icons/tip.png b/src/main/asciidoc/img/icons/tip.png
new file mode 100644
index 0000000..f087c73
--- /dev/null
+++ b/src/main/asciidoc/img/icons/tip.png
Binary files differ
diff --git a/src/main/asciidoc/img/icons/warning.png b/src/main/asciidoc/img/icons/warning.png
new file mode 100644
index 0000000..d41edb9
--- /dev/null
+++ b/src/main/asciidoc/img/icons/warning.png
Binary files differ
diff --git a/src/main/asciidoc/img/kalender_tag.png b/src/main/asciidoc/img/kalender_tag.png
new file mode 100644
index 0000000..59ea073
--- /dev/null
+++ b/src/main/asciidoc/img/kalender_tag.png
Binary files differ
diff --git a/src/main/asciidoc/img/kalender_woche.png b/src/main/asciidoc/img/kalender_woche.png
new file mode 100644
index 0000000..bec72f4
--- /dev/null
+++ b/src/main/asciidoc/img/kalender_woche.png
Binary files differ
diff --git a/src/main/asciidoc/img/meldung_erfolgreich.png b/src/main/asciidoc/img/meldung_erfolgreich.png
new file mode 100644
index 0000000..06fac8f
--- /dev/null
+++ b/src/main/asciidoc/img/meldung_erfolgreich.png
Binary files differ
diff --git a/src/main/asciidoc/img/meldung_fehler.png b/src/main/asciidoc/img/meldung_fehler.png
new file mode 100644
index 0000000..6413db7
--- /dev/null
+++ b/src/main/asciidoc/img/meldung_fehler.png
Binary files differ
diff --git a/src/main/asciidoc/img/meldung_hinweis.png b/src/main/asciidoc/img/meldung_hinweis.png
new file mode 100644
index 0000000..e64fc27
--- /dev/null
+++ b/src/main/asciidoc/img/meldung_hinweis.png
Binary files differ
diff --git a/src/main/asciidoc/img/netzmassnahme_duplizieren.png b/src/main/asciidoc/img/netzmassnahme_duplizieren.png
new file mode 100644
index 0000000..dbef084
--- /dev/null
+++ b/src/main/asciidoc/img/netzmassnahme_duplizieren.png
Binary files differ
diff --git a/src/main/asciidoc/img/oeffnen-modul.png b/src/main/asciidoc/img/oeffnen-modul.png
new file mode 100644
index 0000000..c6ef04c
--- /dev/null
+++ b/src/main/asciidoc/img/oeffnen-modul.png
Binary files differ
diff --git a/src/main/asciidoc/img/rueckschaltung-planen.png b/src/main/asciidoc/img/rueckschaltung-planen.png
new file mode 100644
index 0000000..11a2080
--- /dev/null
+++ b/src/main/asciidoc/img/rueckschaltung-planen.png
Binary files differ
diff --git a/src/main/asciidoc/img/speichern.png b/src/main/asciidoc/img/speichern.png
new file mode 100644
index 0000000..d24aeb4
--- /dev/null
+++ b/src/main/asciidoc/img/speichern.png
Binary files differ
diff --git a/src/main/asciidoc/img/sperrung_aufheben.png b/src/main/asciidoc/img/sperrung_aufheben.png
new file mode 100644
index 0000000..a6b960f
--- /dev/null
+++ b/src/main/asciidoc/img/sperrung_aufheben.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_a_beendet.png b/src/main/asciidoc/img/status_farbe_a_beendet.png
new file mode 100644
index 0000000..b86a3c9
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_a_beendet.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_angefordert.png b/src/main/asciidoc/img/status_farbe_angefordert.png
new file mode 100644
index 0000000..ca89557
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_angefordert.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_beantragt.png b/src/main/asciidoc/img/status_farbe_beantragt.png
new file mode 100644
index 0000000..10e1129
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_beantragt.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_freigegeben.png b/src/main/asciidoc/img/status_farbe_freigegeben.png
new file mode 100644
index 0000000..dd7ae29
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_freigegeben.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_genehmigt.png b/src/main/asciidoc/img/status_farbe_genehmigt.png
new file mode 100644
index 0000000..3d0a1ba
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_genehmigt.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_in_arbeit.png b/src/main/asciidoc/img/status_farbe_in_arbeit.png
new file mode 100644
index 0000000..7ca59bd
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_in_arbeit.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_m_beendet.png b/src/main/asciidoc/img/status_farbe_m_beendet.png
new file mode 100644
index 0000000..afcb205
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_m_beendet.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_neu.png b/src/main/asciidoc/img/status_farbe_neu.png
new file mode 100644
index 0000000..972fc33
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_neu.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_schalten-aktiv.png b/src/main/asciidoc/img/status_farbe_schalten-aktiv.png
new file mode 100644
index 0000000..9f65e09
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_schalten-aktiv.png
Binary files differ
diff --git a/src/main/asciidoc/img/status_farbe_zur_genehmigung.png b/src/main/asciidoc/img/status_farbe_zur_genehmigung.png
new file mode 100644
index 0000000..fc10974
--- /dev/null
+++ b/src/main/asciidoc/img/status_farbe_zur_genehmigung.png
Binary files differ
diff --git a/src/main/asciidoc/img/statuswechsel-uebersicht.png b/src/main/asciidoc/img/statuswechsel-uebersicht.png
new file mode 100644
index 0000000..daf23e2
--- /dev/null
+++ b/src/main/asciidoc/img/statuswechsel-uebersicht.png
Binary files differ
diff --git a/src/main/asciidoc/img/stift-symbol.png b/src/main/asciidoc/img/stift-symbol.png
new file mode 100644
index 0000000..c892d04
--- /dev/null
+++ b/src/main/asciidoc/img/stift-symbol.png
Binary files differ
diff --git a/src/main/asciidoc/img/stornieren-deaktiviert.png b/src/main/asciidoc/img/stornieren-deaktiviert.png
new file mode 100644
index 0000000..353e592
--- /dev/null
+++ b/src/main/asciidoc/img/stornieren-deaktiviert.png
Binary files differ
diff --git a/src/main/asciidoc/img/stornieren.png b/src/main/asciidoc/img/stornieren.png
new file mode 100644
index 0000000..66caec6
--- /dev/null
+++ b/src/main/asciidoc/img/stornieren.png
Binary files differ
diff --git a/src/main/asciidoc/img/stornieren_kommentar.png b/src/main/asciidoc/img/stornieren_kommentar.png
new file mode 100644
index 0000000..58c7e17
--- /dev/null
+++ b/src/main/asciidoc/img/stornieren_kommentar.png
Binary files differ
diff --git a/src/main/asciidoc/img/tabellen-filter.png b/src/main/asciidoc/img/tabellen-filter.png
new file mode 100644
index 0000000..d1aa03e
--- /dev/null
+++ b/src/main/asciidoc/img/tabellen-filter.png
Binary files differ
diff --git a/src/main/asciidoc/img/vordefinierte_filter.png b/src/main/asciidoc/img/vordefinierte_filter.png
new file mode 100644
index 0000000..1f2ac0b
--- /dev/null
+++ b/src/main/asciidoc/img/vordefinierte_filter.png
Binary files differ
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/ContactBaseDataApplication.java b/src/main/java/org/eclipse/openk/contactbasedata/ContactBaseDataApplication.java
new file mode 100644
index 0000000..45920d5
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/ContactBaseDataApplication.java
@@ -0,0 +1,32 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+*/
+package org.eclipse.openk.contactbasedata;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@SpringBootApplication
+@EnableSwagger2
+public class ContactBaseDataApplication {
+
+	public static void main(String[] args) {
+		// passing through args is a security issue at sonar. As long as we don't know what for, we won't passthrough
+		// any arg
+		SpringApplication.run(ContactBaseDataApplication.class, new String[0] );
+	}
+
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/config/SecurityConfig.java b/src/main/java/org/eclipse/openk/contactbasedata/config/SecurityConfig.java
new file mode 100644
index 0000000..17efe79
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/config/SecurityConfig.java
@@ -0,0 +1,30 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+*/
+package org.eclipse.openk.contactbasedata.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+    @Override
+    protected void configure(HttpSecurity security ) throws Exception {
+        security.httpBasic().disable();
+        security.csrf().disable();
+    }
+
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/constants/Constants.java b/src/main/java/org/eclipse/openk/contactbasedata/constants/Constants.java
new file mode 100644
index 0000000..8b120eb
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/constants/Constants.java
@@ -0,0 +1,26 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+*/
+package org.eclipse.openk.contactbasedata.constants;
+
+public final class Constants {
+    private Constants() {
+        // empty Constructor for the sake of SONAR
+    }
+    public static final String DB_VERSION_NOT_PRESENT = "DB-Version-not_present";
+    public static final String CONTACT_TYPE_INTERNAL_PERSON = "I_P";
+    public static final String CONTACT_TYPE_EXTERNAL_PERSON = "E_P";
+    public static final String CONTACT_TYPE_CONTACT_PERSON = "C_P";
+    public static final String CONTACT_TYPE_COMPANY = "COM";
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
new file mode 100644
index 0000000..af4fc26
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
@@ -0,0 +1,43 @@
+package org.eclipse.openk.contactbasedata.controller;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
+import org.eclipse.openk.contactbasedata.service.ContactService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Optional;
+import java.util.UUID;
+
+import static org.springframework.data.domain.Sort.Direction.ASC;
+
+@Log4j2
+@RestController
+@RequestMapping("/contacts")
+public class ContactController {
+    @Autowired
+    private ContactService contactService;
+
+    @ApiOperation(value = "Anzeigen aller gespeicherter Kontakte")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    @ResponseStatus(HttpStatus.OK)
+    @GetMapping
+    public Page<VwDetailedContact> findContacts(
+            @RequestParam( "contactType") Optional<String> contactType,
+            @RequestParam( "personTypeId" ) Optional<UUID> personTypeUuid,
+            @RequestParam( "searchText" ) Optional<String> searchText,
+            @PageableDefault( sort = {"name"}, size = 20, direction = ASC) Pageable pageable ) {
+        return contactService.findDetailedContacts(
+                contactType.orElse(null),
+                personTypeUuid.orElse(null),
+                searchText.orElse( null), pageable);
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonController.java
new file mode 100644
index 0000000..367b648
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonController.java
@@ -0,0 +1,85 @@
+package org.eclipse.openk.contactbasedata.controller;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
+import org.eclipse.openk.contactbasedata.service.ExternalPersonService;
+import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import java.net.URI;
+import java.util.UUID;
+
+@Log4j2
+@RestController
+@RequestMapping("/external-persons")
+public class ExternalPersonController {
+    @Autowired
+    private ExternalPersonService externalPersonService;
+
+
+    @GetMapping("/{contactUuid}")
+    @ApiOperation(value = "Anzeigen einer externen Person")
+    @ApiResponses(value = { @ApiResponse(code = 200, message = "Erfolgreich durchgeführt"),
+                            @ApiResponse(code = 404, message = "Person wurde nicht gefunden")})
+    @ResponseStatus(HttpStatus.OK)
+    public ExternalPersonDto getExternalPerson(@PathVariable UUID contactUuid) {
+        return externalPersonService.findExternalPerson(contactUuid);
+    }
+
+    @GetMapping
+    @ApiOperation(value = "Anzeigen aller externen Personen", notes = "Sortieren ist möglich. Lieferanten werden seitenweise geliefert.")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    public Page<ExternalPersonDto> readExternalPersons(
+            @PageableDefault(sort = {"lastName"}, direction = Sort.Direction.ASC) Pageable pageable){
+            return externalPersonService.findExternalPersons(pageable);
+    }
+
+    @PostMapping
+    @ApiOperation(value = "Anlegen einer externen Person")
+    @ApiResponses(value = {
+            @ApiResponse(code = 201, message = "externe Person erfolgreich angelegt"),
+            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
+    })
+    public ResponseEntity<ExternalPersonDto> insertExternalPerson(
+            @Validated @RequestBody ExternalPersonDto externalPersonDto) {
+        ExternalPersonDto savedExternalPersonDto = externalPersonService.insertExternalPerson(externalPersonDto);
+        URI location = ServletUriComponentsBuilder
+                .fromCurrentRequestUri()
+                .path("/{uuid}")
+                .buildAndExpand(savedExternalPersonDto.getContactId())
+                .toUri();
+        return ResponseEntity.created(location).body(savedExternalPersonDto);
+    }
+
+    @PutMapping("/{contactUuid}")
+    @ApiOperation(value = "Ändern einer externen Person")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Externe Person wurde aktualisiert"),
+            @ApiResponse(code = 400, message = "Ungültige Eingabe"),
+            @ApiResponse(code = 404, message = "Nicht gefunden")})
+    public ResponseEntity updateExternalPerson(@PathVariable UUID contactUuid, @Validated @RequestBody ExternalPersonDto externalPersonDto) {
+
+        if (!externalPersonDto.getContactId().equals(contactUuid)) {
+            // TODO: Msg extrahieren
+            throw new BadRequestException("Die Id des Pfades stimmt nicht mit der des Objekts überein");
+        }
+
+        externalPersonService.updateExternalPerson(externalPersonDto);
+        return ResponseEntity.ok().build();
+    }
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/SalutationController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/SalutationController.java
new file mode 100644
index 0000000..0bf4bb8
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/SalutationController.java
@@ -0,0 +1,109 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
+import org.eclipse.openk.contactbasedata.service.SalutationService;
+import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import java.net.URI;
+import java.util.List;
+import java.util.UUID;
+
+@Log4j2
+@RestController
+@RequestMapping("/salutations")
+public class SalutationController {
+    @Autowired
+    private SalutationService salutationService;
+
+    @ApiOperation(value = "Anzeigen aller Anreden")
+    @ApiResponses(value = { @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    @ResponseStatus(HttpStatus.OK)
+    @GetMapping
+    public List<SalutationDto> getSalutations() {
+        return salutationService.findAllSalutations();
+    }
+
+
+
+    @GetMapping("/{salutationUuid}")
+    @ApiOperation(value = "Suchen einer Anrede per UUID")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiResponses(value = {
+            @ApiResponse(code = 400, message = "Ungültige Anfrage."),
+            @ApiResponse(code = 200, message = "Anrede gefunden")})
+    public SalutationDto getSalutation(@PathVariable UUID salutationUuid) {
+
+        return salutationService.getSalutationByUuid(salutationUuid);
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "Anlegen einer neuen Anrede")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Anrede erfolgreich angelegt"),
+            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
+    })
+    public ResponseEntity<SalutationDto> insertSalutation(@Validated @RequestBody SalutationDto salutationDto) {
+        SalutationDto savedSalutationDto = salutationService.insertSalutation(salutationDto);
+        URI location = ServletUriComponentsBuilder
+                .fromCurrentRequestUri()
+                .path("/{uuid}")
+                .buildAndExpand(savedSalutationDto.getUuid())
+                .toUri();
+        return ResponseEntity.created(location).body(savedSalutationDto);
+    }
+
+
+    @PutMapping("/{salutationUuid}")
+    @ApiOperation(value = "Ändern einer Anrede")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Anrede wurde erfolgreich aktualisiert"),
+            @ApiResponse(code = 400, message = "Ungültige Eingabe"),
+            @ApiResponse(code = 404, message = "Nicht gefunden")})
+    public ResponseEntity updateSupplier(@PathVariable UUID salutationUuid, @Validated @RequestBody SalutationDto salutationDto) {
+
+        if (!salutationDto.getUuid().equals(salutationUuid)) {
+            throw new BadRequestException("invalid.uuid.path.object");
+        }
+
+        salutationService.updateSalutation(salutationDto);
+        return ResponseEntity.ok().build();
+    }
+
+
+    @DeleteMapping("/{uuid}")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiOperation(value = "Anrede löschen")
+    @ApiResponses(value = {
+            @ApiResponse(code = 204, message = "Erfolgreich durchgeführt"),
+            @ApiResponse(code = 400, message = "Ungültige Anfrage"),
+            @ApiResponse(code = 404, message = "Nicht gefunden")})
+    public void removeSalutation(@PathVariable UUID uuid) {
+        salutationService.removeSalutation(uuid);
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/VersionController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/VersionController.java
new file mode 100644
index 0000000..1ff798d
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/VersionController.java
@@ -0,0 +1,46 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.service.VersionService;
+import org.eclipse.openk.contactbasedata.viewmodel.VersionDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Log4j2
+@RestController
+@RequestMapping("/version")
+public class VersionController {
+
+    @Autowired
+    private VersionService versionService;
+
+    @ApiOperation(value = "Anzeigen der Backend und der DB-Version")
+    @ApiResponses(value = {@ApiResponse(code = 204, message = "Erfolgreich durchgeführt")})
+    @GetMapping
+    public VersionDto getVersion() {
+        return versionService.getVersion();
+    }
+
+
+
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/exceptions/BadRequestException.java b/src/main/java/org/eclipse/openk/contactbasedata/exceptions/BadRequestException.java
new file mode 100644
index 0000000..e18545c
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/exceptions/BadRequestException.java
@@ -0,0 +1,16 @@
+package org.eclipse.openk.contactbasedata.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(code = HttpStatus.BAD_REQUEST)
+public class BadRequestException extends RuntimeException{
+
+    public BadRequestException() {
+
+    }
+
+    public BadRequestException(String message) {
+        super(message);
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/exceptions/NotFoundException.java b/src/main/java/org/eclipse/openk/contactbasedata/exceptions/NotFoundException.java
new file mode 100644
index 0000000..f1374fb
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/exceptions/NotFoundException.java
@@ -0,0 +1,17 @@
+package org.eclipse.openk.contactbasedata.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(code = HttpStatus.NOT_FOUND)
+public class NotFoundException extends RuntimeException{
+
+    public NotFoundException() {
+
+    }
+
+    public NotFoundException(String message) {
+        super(message);
+    }
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressMapper.java
new file mode 100644
index 0000000..e5a68cc
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressMapper.java
@@ -0,0 +1,26 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.TblAddress;
+import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface AddressMapper {
+
+    AddressDto toAddressDto(TblAddress tblAdress);
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressTypeMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressTypeMapper.java
new file mode 100644
index 0000000..e77f78d
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressTypeMapper.java
@@ -0,0 +1,26 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.RefAddressType;
+import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface AddressTypeMapper {
+
+    AddressDto toAddressTypeDto(RefAddressType refAddressType);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationMapper.java
new file mode 100644
index 0000000..59f459f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationMapper.java
@@ -0,0 +1,26 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.TblCommunication;
+import org.eclipse.openk.contactbasedata.viewmodel.CommunicationDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface CommunicationMapper {
+
+    CommunicationDto toCommunicationDto(TblCommunication tblCommunication);
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationTypeMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationTypeMapper.java
new file mode 100644
index 0000000..a6ab66b
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationTypeMapper.java
@@ -0,0 +1,26 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.RefCommunicationType;
+import org.eclipse.openk.contactbasedata.viewmodel.CommunicationDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface CommunicationTypeMapper {
+
+    CommunicationDto toCommunicationTypeDto(RefCommunicationType refCommunicationType);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java
new file mode 100644
index 0000000..82696dd
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java
@@ -0,0 +1,30 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.TblCompany;
+import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface CompanyMapper {
+    @Mappings({
+            @Mapping( source="contact.uuid", target="id")
+    })
+    CompanyDto toCompanyDto(TblCompany tblCompany);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java
new file mode 100644
index 0000000..c8e97a1
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java
@@ -0,0 +1,31 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.eclipse.openk.contactbasedata.viewmodel.ContactDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface ContactMapper {
+
+    @Mappings({
+            @Mapping( source="uuid", target="id")
+    })
+    ContactDto toContactDto(TblContact tblContact);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactPersonMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactPersonMapper.java
new file mode 100644
index 0000000..c4d0472
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactPersonMapper.java
@@ -0,0 +1,30 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.TblContactPerson;
+import org.eclipse.openk.contactbasedata.viewmodel.ContactPersonDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface ContactPersonMapper {
+    @Mappings({
+            @Mapping( source="contact.uuid", target="id")
+    })
+    ContactPersonDto toContactPersonDto(TblContactPerson tblContactPerson);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java
new file mode 100644
index 0000000..4227183
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java
@@ -0,0 +1,50 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.TblExternalPerson;
+import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface ExternalPersonMapper {
+
+    @Mappings({
+            @Mapping( source="contact.uuid", target="contactId"),
+            //@Mapping( source="contact.uuid", target="contactId"),
+            @Mapping( source="contact.contactType", target="contactType"),
+            @Mapping( source="contact.note", target="contactNote"),
+            @Mapping( source="refPersonType.uuid", target="personTypeId"),
+            @Mapping( source="refPersonType.type", target="personType"),
+            @Mapping( source="salutation.uuid", target="salutationId"),
+            @Mapping( source="salutation.type", target="salutationType")
+    })
+    ExternalPersonDto toExternalPersonDto(TblExternalPerson tblExternalPerson);
+
+    @Mappings({
+            //@Mapping( source="id", target="uuid"),
+            @Mapping( source="contactId", target="contact.uuid"),
+            @Mapping( source="contactType", target="contact.contactType"),
+            @Mapping( source="contactNote", target="contact.note"),
+            @Mapping( source="personTypeId", target="refPersonType.uuid"),
+            @Mapping( source="personType", target="refPersonType.type"),
+            @Mapping( source="salutationId", target="salutation.uuid"),
+            @Mapping( source="salutationType", target="salutation.type")
+    })
+    TblExternalPerson toTblExternalPerson(ExternalPersonDto externalPersonDto);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/InternalPersonMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/InternalPersonMapper.java
new file mode 100644
index 0000000..d0855a9
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/InternalPersonMapper.java
@@ -0,0 +1,32 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.TblInternalPerson;
+import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.eclipse.openk.contactbasedata.viewmodel.InternalPersonDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface InternalPersonMapper {
+
+    @Mappings({
+            @Mapping( source="contact.uuid", target="id")
+    })
+    InternalPersonDto toInternalPersonDto(TblInternalPerson tblInternalPerson);
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/PersonTypeMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/PersonTypeMapper.java
new file mode 100644
index 0000000..e68f8e3
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/PersonTypeMapper.java
@@ -0,0 +1,26 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.RefPersonType;
+import org.eclipse.openk.contactbasedata.viewmodel.PersonTypeDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface PersonTypeMapper {
+
+    PersonTypeDto toPersonTypeDto(RefPersonType refPersonType);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/SalutationMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/SalutationMapper.java
new file mode 100644
index 0000000..d7cccc3
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/SalutationMapper.java
@@ -0,0 +1,29 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.RefSalutation;
+import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface SalutationMapper {
+
+    SalutationDto toSalutationDto(RefSalutation refSalutation);
+
+    RefSalutation toRefSalutation(SalutationDto salutationDto);
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/VersionMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/VersionMapper.java
new file mode 100644
index 0000000..3961745
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/VersionMapper.java
@@ -0,0 +1,31 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.mapper;
+
+import org.eclipse.openk.contactbasedata.model.Version;
+import org.eclipse.openk.contactbasedata.viewmodel.VersionDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface VersionMapper {
+
+    @Mappings({
+            @Mapping(source = "version", target = "dbVersion")
+    })
+    VersionDto toVersionDto(Version version);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/RefAddressType.java b/src/main/java/org/eclipse/openk/contactbasedata/model/RefAddressType.java
new file mode 100644
index 0000000..65fb165
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/RefAddressType.java
@@ -0,0 +1,35 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.UUID;
+
+@Data
+@Entity
+public class RefAddressType {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "ref_address_type_id_seq")
+    @SequenceGenerator(name = "ref_address_type_id_seq", sequenceName = "ref_address_type_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private UUID uuid;
+    private String  type;
+    private String description;
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/RefCommunicationType.java b/src/main/java/org/eclipse/openk/contactbasedata/model/RefCommunicationType.java
new file mode 100644
index 0000000..80c5cca
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/RefCommunicationType.java
@@ -0,0 +1,36 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.UUID;
+
+@Data
+@Entity
+public class RefCommunicationType {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "ref_communication_type_id_seq")
+    @SequenceGenerator(name = "ref_communication_type_id_seq", sequenceName = "ref_communication_type_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private UUID uuid;
+    private String  type;
+    private String description;
+
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/RefPersonType.java b/src/main/java/org/eclipse/openk/contactbasedata/model/RefPersonType.java
new file mode 100644
index 0000000..0804571
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/RefPersonType.java
@@ -0,0 +1,36 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.UUID;
+
+@Data
+@Entity
+public class RefPersonType {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "ref_person_type_id_seq")
+    @SequenceGenerator(name = "ref_person_type_id_seq", sequenceName = "ref_person_type_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private UUID uuid;
+    private String type;
+    private String description;
+
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/RefSalutation.java b/src/main/java/org/eclipse/openk/contactbasedata/model/RefSalutation.java
new file mode 100644
index 0000000..d30a0b7
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/RefSalutation.java
@@ -0,0 +1,35 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.UUID;
+
+@Data
+@Entity
+public class RefSalutation {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "ref_salutation_id_seq")
+    @SequenceGenerator(name = "ref_salutation_id_seq", sequenceName = "ref_salutation_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private UUID uuid;
+    private String  type;
+    private String description;
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java
new file mode 100644
index 0000000..276ac63
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java
@@ -0,0 +1,53 @@
+/*
+    *******************************************************************************
+    * Copyright (c) 2019 Contributors to the Eclipse Foundation
+    *
+    * See the NOTICE file(s) distributed with this work for additional
+    * information regarding copyright ownership.
+    *
+    * This program and the accompanying materials are made available under the
+    * terms of the Eclipse Public License v. 2.0 which is available at
+    * http://www.eclipse.org/legal/epl-2.0.
+    *
+    * SPDX-License-Identifier: EPL-2.0
+    *******************************************************************************
+*/
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.UUID;
+
+@Data
+@Entity
+public class TblAddress {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "tbl_address_id_seq")
+    @SequenceGenerator(name = "tbl_address_id_seq", sequenceName = "tbl_address_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+
+    private UUID uuid;
+    private Boolean isMainAddress;
+    private String postcode;
+    private String community;
+    private String communitySuffix;
+    private String street;
+    private String housenumber;
+    private String wgs_84_zone;
+    private String latitude;
+    private String longitude;
+    private String urlMap;
+    private String note;
+
+    @ManyToOne
+    @JoinColumn( name = "fk_contact_id")
+    private TblContact tblContact;
+
+    @OneToOne
+    @JoinColumn( name = "fk_address_type")
+    private RefAddressType refAddressType;
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblCommunication.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblCommunication.java
new file mode 100644
index 0000000..fd90f8f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblCommunication.java
@@ -0,0 +1,42 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.UUID;
+
+@Data
+@Entity
+public class TblCommunication {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "tbl_communication_id_seq")
+    @SequenceGenerator(name = "tbl_communication_id_seq", sequenceName = "tbl_communication_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private UUID uuid;
+    private String communicationData;
+
+    @ManyToOne
+    @JoinColumn( name = "fk_contact_id")
+    private TblContact tblContact;
+
+    @OneToOne
+    @JoinColumn( name = "fk_communication_type")
+    private RefCommunicationType refCommunicationType;
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
new file mode 100644
index 0000000..8895d39
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
@@ -0,0 +1,42 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Data
+@Entity
+public class TblCompany {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "tbl_company_id_seq")
+    @SequenceGenerator(name = "tbl_company_id_seq", sequenceName = "tbl_company_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private String companyName;
+    private String companyType;
+    private String hrNumber;
+
+    @OneToOne
+    private TblContact contact;
+
+    @OneToMany
+    private List<TblContactPerson> contactPerson;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblContact.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblContact.java
new file mode 100644
index 0000000..f3ef0ec
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblContact.java
@@ -0,0 +1,46 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+@Data
+@Entity
+public class TblContact {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "tbl_contact_id_seq")
+    @SequenceGenerator(name = "tbl_contact_id_seq", sequenceName = "tbl_contact_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private UUID uuid;
+    private String contactType;
+    private String note;
+
+    @OneToMany(cascade=CascadeType.ALL, mappedBy="tblContact", orphanRemoval = true)
+    private List<TblAddress> addresses = new ArrayList<>();
+
+    @OneToMany(cascade=CascadeType.ALL, mappedBy="tblContact", orphanRemoval = true)
+    private List<TblCommunication> communications = new ArrayList<>();
+
+}
+
+
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblContactPerson.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblContactPerson.java
new file mode 100644
index 0000000..cdc266d
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblContactPerson.java
@@ -0,0 +1,46 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+public class TblContactPerson {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "tbl_contact_person_id_seq")
+    @SequenceGenerator(name = "tbl_contact_person_id_seq", sequenceName = "tbl_contact_person_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private String firstName;
+    private String lastName;
+    private String title;
+
+    @OneToOne
+    private TblContact contact;
+
+    @ManyToOne
+    private TblCompany tblCompany;
+
+    @ManyToOne
+    private RefPersonType refPersonType;
+
+    @ManyToOne
+    private RefSalutation refSalutation;
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblExternalPerson.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblExternalPerson.java
new file mode 100644
index 0000000..dc31699
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblExternalPerson.java
@@ -0,0 +1,49 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.UUID;
+
+@Data
+@Entity
+public class TblExternalPerson {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "tbl_external_person_id_seq")
+    @SequenceGenerator(name = "tbl_external_person_id_seq", sequenceName = "tbl_external_person_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private String firstName;
+    private String lastName;
+    private String title;
+
+    @OneToOne
+    @JoinColumn( name = "fk_contact_id")
+    private TblContact contact;
+
+    @ManyToOne
+    @JoinColumn( name = "fk_salutation_id")
+    private RefSalutation salutation;
+
+    @ManyToOne
+    @JoinColumn( name = "fk_ref_person_type_id")
+    private RefPersonType refPersonType;
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblInternalPerson.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblInternalPerson.java
new file mode 100644
index 0000000..99a67ea
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblInternalPerson.java
@@ -0,0 +1,46 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+public class TblInternalPerson {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator = "tbl_internal_person_id_seq")
+    @SequenceGenerator(name = "tbl_internal_person_id_seq", sequenceName = "tbl_internal_person_id_seq", allocationSize = 1)
+    @Column(name = "id", updatable = false)
+    private Long id;
+    private String firstName;
+    private String lastName;
+    private String title;
+    private String sid;
+    private String userRef;
+
+
+    @OneToOne
+    private TblContact contact;
+
+    @OneToOne
+    private RefSalutation refSalutation;
+
+    @OneToOne
+    private RefPersonType refPersonType;
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/Version.java b/src/main/java/org/eclipse/openk/contactbasedata/model/Version.java
new file mode 100644
index 0000000..dce3dec
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/Version.java
@@ -0,0 +1,29 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+*/
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+public class Version {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+    private String version;
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/VwDetailedContact.java b/src/main/java/org/eclipse/openk/contactbasedata/model/VwDetailedContact.java
new file mode 100644
index 0000000..64092ed
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/VwDetailedContact.java
@@ -0,0 +1,35 @@
+package org.eclipse.openk.contactbasedata.model;
+
+import lombok.Data;
+import org.springframework.data.annotation.Immutable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.util.UUID;
+
+@Data
+@Immutable
+@Entity
+public class VwDetailedContact {
+    @Id
+    private Long fkContactId;
+
+    private Long id;
+    private UUID uuid;
+    private String name;
+    private String contactType;
+    private String companyName;
+    private String companyType;
+    private UUID salutationUuid;
+    private UUID personTypeUuid;
+    private String firstName;
+    private String lastName;
+    private String department;
+    private String note;
+    private String salutationType;
+    private String personType;
+    private String street;
+    private String housenumber;
+    private String community;
+    private String searchfield;
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java
new file mode 100644
index 0000000..c32af23
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java
@@ -0,0 +1,12 @@
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+import java.util.UUID;
+
+public interface ContactRepository extends JpaRepository<TblContact, Long > {
+    public Optional<TblContact> findByUuid( UUID uuid );
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
new file mode 100644
index 0000000..3de1c11
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
@@ -0,0 +1,20 @@
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import java.util.UUID;
+
+public interface DetailedContactRepository extends PagingAndSortingRepository<VwDetailedContact, Long> {
+    Page<VwDetailedContact> findAll(Pageable pageable);
+
+
+   @Query( "select dc from VwDetailedContact dc where"
+           + "(COALESCE(:contactType) is null or COALESCE(:contactType) is not null AND dc.contactType=:contactType)"
+           + " and (COALESCE(:personType) is null or COALESCE(:personType) is not null AND dc.personTypeUuid=:personType)"
+           + " and (COALESCE(:searchText) is null or COALESCE(:searchText) is not null AND dc.searchfield like %:searchText%)")
+    Page<VwDetailedContact> findByFilter(String contactType, UUID personType, String searchText, Pageable pageable);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/ExternalPersonRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/ExternalPersonRepository.java
new file mode 100644
index 0000000..4f9dd2e
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/ExternalPersonRepository.java
@@ -0,0 +1,14 @@
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.TblExternalPerson;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.Optional;
+import java.util.UUID;
+
+public interface ExternalPersonRepository extends JpaRepository<TblExternalPerson, Long > {
+    @Query("select ep from TblExternalPerson ep where ep.contact.uuid = ?1")
+    Optional< TblExternalPerson > findByTblContactUuid(final UUID contactUuid );
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/PersonTypeRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/PersonTypeRepository.java
new file mode 100644
index 0000000..35276b2
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/PersonTypeRepository.java
@@ -0,0 +1,28 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.RefPersonType;
+import org.eclipse.openk.contactbasedata.model.RefSalutation;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+public interface PersonTypeRepository extends JpaRepository<RefPersonType, Long> {
+    List< RefPersonType > findAll();
+    Optional<RefPersonType> findByUuid(UUID uuid);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/SalutationRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/SalutationRepository.java
new file mode 100644
index 0000000..511685f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/SalutationRepository.java
@@ -0,0 +1,27 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.RefSalutation;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+public interface SalutationRepository extends JpaRepository<RefSalutation, Long> {
+    List< RefSalutation > findAll();
+    Optional<RefSalutation> findByUuid(UUID uuid);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/VersionRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/VersionRepository.java
new file mode 100644
index 0000000..2f6ae1f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/VersionRepository.java
@@ -0,0 +1,24 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.Version;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface VersionRepository extends JpaRepository<Version, Long > {
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/BaseContactService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/BaseContactService.java
new file mode 100644
index 0000000..6c7c357
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/BaseContactService.java
@@ -0,0 +1,39 @@
+package org.eclipse.openk.contactbasedata.service;
+
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
+import org.eclipse.openk.contactbasedata.repository.PersonTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.UUID;
+
+@Log4j2
+@Service
+public class BaseContactService {
+    
+    @Autowired
+    private ContactRepository contactRepository;
+
+    @Autowired
+    private SalutationRepository salutationRepository;
+
+    @Autowired
+    private PersonTypeRepository personTypeRepository;
+
+
+    public TblContact getContact(UUID contactUuid){
+
+        //TODO: Fehlermeldung mit message!
+        return contactRepository
+                .findByUuid(contactUuid)
+                .orElseThrow(() -> new NotFoundException("Der Kontakt konnte nicht gefunden werden"));
+    }
+
+
+
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
new file mode 100644
index 0000000..3655146
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
@@ -0,0 +1,34 @@
+package org.eclipse.openk.contactbasedata.service;
+
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
+import org.eclipse.openk.contactbasedata.repository.DetailedContactRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import java.util.UUID;
+
+@Log4j2
+@Service
+public class ContactService {
+    @Autowired
+    private DetailedContactRepository detailedContactRepository;
+
+    public Page<VwDetailedContact> findDetailedContacts(String contactType,
+                                                        UUID personTypeUuid,
+                                                        String searchText, Pageable pageable) {
+
+        if( contactType == null && personTypeUuid == null && searchText == null) {
+            return detailedContactRepository.findAll(pageable);
+        }
+        else {
+            return detailedContactRepository.findByFilter( contactType,
+                    personTypeUuid,
+                    searchText != null ? searchText.toUpperCase() : null,
+                    pageable);
+        }
+
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/ExternalPersonService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/ExternalPersonService.java
new file mode 100644
index 0000000..df897cd
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/ExternalPersonService.java
@@ -0,0 +1,111 @@
+package org.eclipse.openk.contactbasedata.service;
+
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.constants.Constants;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.mapper.ContactMapper;
+import org.eclipse.openk.contactbasedata.mapper.ExternalPersonMapper;
+import org.eclipse.openk.contactbasedata.model.RefPersonType;
+import org.eclipse.openk.contactbasedata.model.RefSalutation;
+import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.eclipse.openk.contactbasedata.model.TblExternalPerson;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
+import org.eclipse.openk.contactbasedata.repository.ExternalPersonRepository;
+import org.eclipse.openk.contactbasedata.repository.PersonTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
+import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.UUID;
+
+@Log4j2
+@Service
+public class ExternalPersonService {
+    @Autowired
+    private ExternalPersonRepository externalPersonRepository;
+
+    @Autowired
+    private ContactRepository contactRepository;
+
+    @Autowired
+    private SalutationRepository salutationRepository;
+
+    @Autowired
+    private PersonTypeRepository personTypeRepository;
+
+    @Autowired
+    private ExternalPersonMapper externalPersonMapper;
+
+    @Autowired
+    private ContactMapper contactMapper;
+
+    @Autowired
+    private BaseContactService baseContactService;
+
+    public ExternalPersonDto findExternalPerson(UUID contactUuid) {
+        return externalPersonMapper.toExternalPersonDto(
+                externalPersonRepository.findByTblContactUuid(contactUuid).orElseThrow(NotFoundException::new)
+        );
+    }
+
+    public Page<ExternalPersonDto> findExternalPersons(Pageable pageable) {
+        return externalPersonRepository.findAll(pageable).map(externalPersonMapper::toExternalPersonDto);
+    }
+
+
+    @Transactional
+    public ExternalPersonDto insertExternalPerson(ExternalPersonDto externalPersonDto) {
+        TblContact contactToSave = new TblContact();
+        contactToSave.setUuid(UUID.randomUUID());
+        contactToSave.setContactType(Constants.CONTACT_TYPE_EXTERNAL_PERSON);
+
+        TblExternalPerson externalPersonToSave = externalPersonMapper.toTblExternalPerson(externalPersonDto);
+        externalPersonToSave.setContact(contactToSave);
+        contactRepository.save(externalPersonToSave.getContact());
+
+        setFromExternalPersonDto( externalPersonToSave, externalPersonDto );
+        // Save Contact first
+
+        // Then save dependent Model-Object
+        return externalPersonMapper.toExternalPersonDto(externalPersonRepository.save(externalPersonToSave));
+    }
+
+    @Transactional
+    public ExternalPersonDto updateExternalPerson(ExternalPersonDto externalPersonDto){
+        TblExternalPerson externalPersonUpdated;
+
+        //Externe Person holen
+        //TODO: Fehlermeldung mit message!
+        TblExternalPerson existingExternalPerson = externalPersonRepository
+                .findByTblContactUuid(externalPersonDto.getContactId())
+                .orElseThrow(() -> new NotFoundException("Der angegebene Kontakt existiert nicht"));
+
+        existingExternalPerson.setLastName(externalPersonDto.getLastName());
+        existingExternalPerson.setFirstName(externalPersonDto.getFirstName());
+        existingExternalPerson.setTitle(externalPersonDto.getTitle());
+
+        setFromExternalPersonDto( existingExternalPerson, externalPersonDto );
+        externalPersonUpdated = externalPersonRepository.save(existingExternalPerson);
+
+        return externalPersonMapper.toExternalPersonDto(externalPersonUpdated);
+    }
+
+    private void setFromExternalPersonDto( TblExternalPerson destTblExternalPerson, ExternalPersonDto sourceDto ) {
+        RefSalutation salutationUpdated = salutationRepository
+                .findByUuid(sourceDto.getSalutationId())
+                .orElseThrow(() -> new NotFoundException("Anrede wurde nicht gefunden"));
+        // TODO: Nachricht auslagern
+        RefPersonType personTypeUpdated = personTypeRepository
+                .findByUuid(sourceDto.getPersonTypeId())
+                .orElseThrow(() -> new NotFoundException("Persontyp wurde nicht gefunden"));
+
+        destTblExternalPerson.setSalutation(salutationUpdated);
+        destTblExternalPerson.setRefPersonType(personTypeUpdated);
+
+        destTblExternalPerson.getContact().setNote(sourceDto.getContactNote());
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/SalutationService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/SalutationService.java
new file mode 100644
index 0000000..87e04e8
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/SalutationService.java
@@ -0,0 +1,85 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.mapper.SalutationMapper;
+import org.eclipse.openk.contactbasedata.model.RefSalutation;
+import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
+import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+@Log4j2
+@Service
+public class SalutationService{
+    @Autowired
+    private SalutationRepository salutationRepository;
+
+    @Autowired
+    SalutationMapper salutationMapper;
+
+    public List<SalutationDto> findAllSalutations() {
+        return salutationRepository.findAll().stream()
+                    .map( salutationMapper::toSalutationDto )
+                    .collect(Collectors.toList());
+    }
+
+
+    public SalutationDto getSalutationByUuid(UUID salutationUuid) {
+        RefSalutation refSalutation = salutationRepository
+                .findByUuid(salutationUuid)
+                .orElseThrow(() -> new NotFoundException("salutation.not.found"));
+        return salutationMapper.toSalutationDto(refSalutation);
+    }
+
+    @Transactional
+    public SalutationDto insertSalutation(SalutationDto salutationDto) {
+        RefSalutation salutationToSave = salutationMapper.toRefSalutation(salutationDto);
+        salutationToSave.setUuid(UUID.randomUUID());
+
+        RefSalutation savedSalutation = salutationRepository.save(salutationToSave);
+        return salutationMapper.toSalutationDto(savedSalutation);
+    }
+
+    @Transactional
+    public SalutationDto updateSalutation(SalutationDto salutationDto){
+        RefSalutation salutationUpdated;
+        RefSalutation salutationToSave = salutationMapper.toRefSalutation(salutationDto);
+        RefSalutation existingSalutation = salutationRepository
+                .findByUuid(salutationDto.getUuid())
+                .orElseThrow(() -> new NotFoundException("salutation.not.found"));
+        salutationToSave.setId(existingSalutation.getId());
+        salutationUpdated = salutationRepository.save(salutationToSave);
+
+        return salutationMapper.toSalutationDto(salutationUpdated);
+    }
+
+    @Transactional
+    public void removeSalutation(UUID uuid) {
+        RefSalutation existingSalutation = salutationRepository.findByUuid(uuid)
+                .orElseThrow( () -> new BadRequestException("salutation.uuid.not.existing"));
+
+        salutationRepository.delete(existingSalutation);
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/VersionService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/VersionService.java
new file mode 100644
index 0000000..8def19f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/VersionService.java
@@ -0,0 +1,48 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+*/
+package org.eclipse.openk.contactbasedata.service;
+
+import org.eclipse.openk.contactbasedata.constants.Constants;
+import org.eclipse.openk.contactbasedata.mapper.VersionMapper;
+import org.eclipse.openk.contactbasedata.model.Version;
+import org.eclipse.openk.contactbasedata.repository.VersionRepository;
+import org.eclipse.openk.contactbasedata.viewmodel.VersionDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+@Service
+public class VersionService {
+    @Autowired
+    VersionRepository versionRepository;
+
+    @Autowired
+    VersionMapper versionMapper;
+
+    public VersionDto getVersion() {
+        VersionDto retVersion;
+        Optional<Version> dbVersion = versionRepository.findById(1L);
+        if( dbVersion.isPresent() ) {
+            retVersion = versionMapper.toVersionDto(dbVersion.get());
+        }
+        else {
+            retVersion = new VersionDto();
+            retVersion.setDbVersion(Constants.DB_VERSION_NOT_PRESENT);
+        }
+        retVersion.setBackendVersion("00");
+        return retVersion;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
new file mode 100644
index 0000000..85ef29f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
@@ -0,0 +1,28 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class AddressDto implements Serializable {
+    private UUID uuid;
+
+    private Boolean isMainAddress;
+    private String postcode;
+    private String community;
+    private String communitySuffix;
+    private String street;
+    private String housenumber;
+    private String wgs84Zone;
+    private String latitude;
+    private String longitude;
+    private String urlMap;
+    private String note;
+
+    //fromAddressType
+    private UUID adressId;
+    private String type;
+    private String description;
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressTypeDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressTypeDto.java
new file mode 100644
index 0000000..8a4a6b7
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressTypeDto.java
@@ -0,0 +1,13 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class AddressTypeDto implements Serializable {
+    private UUID uuid;
+    private String  type;
+    private String description;
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationDto.java
new file mode 100644
index 0000000..76ac357
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationDto.java
@@ -0,0 +1,19 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class CommunicationDto implements Serializable {
+
+    private Long id;
+    private String communicationData;
+
+    //fromCommunicationType
+    private UUID communicationsTypeId;
+    private String type;
+    private String description;
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationTypeDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationTypeDto.java
new file mode 100644
index 0000000..ff1bda2
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationTypeDto.java
@@ -0,0 +1,13 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class CommunicationTypeDto implements Serializable {
+    private UUID uuid;
+    private String  type;
+    private String description;
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java
new file mode 100644
index 0000000..5b40347
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java
@@ -0,0 +1,19 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class CompanyDto implements Serializable {
+    private UUID id;
+    private String companyName;
+    private String companyType;
+    private String hrNumber;
+
+    //from Contact
+    private UUID contactId;
+    private String contactType;
+    private String note;
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactDto.java
new file mode 100644
index 0000000..8640323
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactDto.java
@@ -0,0 +1,14 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class ContactDto implements Serializable {
+    private UUID id;
+    private String contactType;
+    private String note;
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
new file mode 100644
index 0000000..c8a7db0
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
@@ -0,0 +1,33 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class ContactPersonDto implements Serializable {
+
+    private UUID id;
+    private String firstName;
+    private String lastName;
+    private String title;
+
+    //from Contact
+    private String contactType;
+    private String note;
+
+    //from Company
+    private String companyId;
+    private String companyName;
+    private String companyType;
+    private String hrNumber;
+
+    // from RefPersonType
+    private String refPersonTypeType;
+    private String refPersonTypeDescription;
+
+    //from RefSalutation
+    private String refSalutationType;
+    private String refSalutationDescription;
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
new file mode 100644
index 0000000..d90d76e
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
@@ -0,0 +1,28 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class ExternalPersonDto implements Serializable {
+
+    //private UUID id;
+    private String firstName;
+    private String lastName;
+    private String title;
+
+    //from Contact
+    private UUID contactId;
+    private String contactType;
+    private String contactNote;
+
+    // from RefPersonType
+    private UUID personTypeId;
+    private String personType;
+
+    //from RefSalutation
+    private UUID salutationId;
+    private String salutationType;
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
new file mode 100644
index 0000000..d6cc25f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
@@ -0,0 +1,31 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class InternalPersonDto implements Serializable {
+
+    private UUID id;
+    private String firstName;
+    private String lastName;
+    private String title;
+    private String sid;
+    private String userRef;
+
+    //from Contact
+    private String contactType;
+    private String note;
+
+    // from RefPersonType
+    private UUID personTypeId;
+    private String personTypeType;
+    private String personTypeDescription;
+
+    //from RefSalutation
+    private UUID salutationId;
+    private String salutationType;
+    private String salutationDescription;
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/PersonTypeDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/PersonTypeDto.java
new file mode 100644
index 0000000..5292b9c
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/PersonTypeDto.java
@@ -0,0 +1,13 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class PersonTypeDto implements Serializable {
+    private UUID uuid;
+    private String  type;
+    private String description;
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/SalutationDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/SalutationDto.java
new file mode 100644
index 0000000..67e2995
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/SalutationDto.java
@@ -0,0 +1,13 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+@Data
+public class SalutationDto implements Serializable {
+    private UUID uuid;
+    private String  type;
+    private String description;
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/VersionDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/VersionDto.java
new file mode 100644
index 0000000..16334e2
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/VersionDto.java
@@ -0,0 +1,26 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class VersionDto implements Serializable {
+    private String backendVersion;
+    private String dbVersion;
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..707ce94
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,30 @@
+#  *******************************************************************************
+#  Copyright (c) 2019 Contributors to the Eclipse Foundation
+#
+#  See the NOTICE file(s) distributed with this work for additional
+#  information regarding copyright ownership.
+#
+#  This program and the accompanying materials are made available under the
+#  terms of the Eclipse Public License v. 2.0 which is available at
+#  http://www.eclipse.org/legal/epl-2.0.
+#
+#  SPDX-License-Identifier: EPL-2.0
+#  *******************************************************************************
+spring:
+  datasource:
+    url: jdbc:postgresql://entopticadirx:5432/ContactBaseDataDevServer
+    username: cbd_service
+    password: cbd_service
+  flyway:
+    enabled: false
+
+server:
+  max-http-header-size: 262144
+
+---
+
+spring:
+  profiles: devserver
+
+server:
+  port: 9155
\ No newline at end of file
diff --git a/src/main/resources/application_localdev.yml b/src/main/resources/application_localdev.yml
new file mode 100644
index 0000000..59dff56
--- /dev/null
+++ b/src/main/resources/application_localdev.yml
@@ -0,0 +1,26 @@
+#  *******************************************************************************
+#  Copyright (c) 2019 Contributors to the Eclipse Foundation
+#
+#  See the NOTICE file(s) distributed with this work for additional
+#  information regarding copyright ownership.
+#
+#  This program and the accompanying materials are made available under the
+#  terms of the Eclipse Public License v. 2.0 which is available at
+#  http://www.eclipse.org/legal/epl-2.0.
+#
+#  SPDX-License-Identifier: EPL-2.0
+#  *******************************************************************************
+spring:
+  datasource:
+    url: jdbc:postgresql://entopticadirx:5432/ContactBaseDataDev
+    username: cbd_service
+    password: cbd_service
+  flyway:
+    enabled: false
+
+server:
+  port: 9155
+  max-http-header-size: 262144
+  servlet:
+    session:
+      tracking-modes: cookie
diff --git a/src/main/resources/db/migration/V0_1__CREATE_CBD_DB.sql b/src/main/resources/db/migration/V0_1__CREATE_CBD_DB.sql
new file mode 100644
index 0000000..7f1bf5f
--- /dev/null
+++ b/src/main/resources/db/migration/V0_1__CREATE_CBD_DB.sql
@@ -0,0 +1,34 @@
+-----------------------------------------------------------------------------------
+-- *******************************************************************************
+-- * Copyright (c) 2019 Contributors to the Eclipse Foundation
+-- *
+-- * See the NOTICE file(s) distributed with this work for additional
+-- * information regarding copyright ownership.
+-- *
+-- * This program and the accompanying materials are made available under the
+-- * terms of the Eclipse Public License v. 2.0 which is available at
+-- * http://www.eclipse.org/legal/epl-2.0.
+-- *
+-- * SPDX-License-Identifier: EPL-2.0
+-- *******************************************************************************
+-----------------------------------------------------------------------------------
+-- CREATE ROLE CBD_SERVICE LOGIN
+-- NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
+-- ALTER ROLE CBD_SERVICE with password 'cbd_service';
+
+CREATE TABLE public.VERSION
+(
+  ID integer NOT NULL,
+  VERSION character varying(50) NOT NULL,
+  CONSTRAINT REF_VERSION_PKEY PRIMARY KEY (id)
+);
+
+ALTER TABLE public.VERSION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.VERSION TO CBD_SERVICE;
+
+INSERT INTO public.VERSION (ID, VERSION) VALUES ( 1, '00-DEV' );
+
+
+
+
diff --git a/src/main/resources/db/migration/V0_2__CREATE_CBD_DB.sql b/src/main/resources/db/migration/V0_2__CREATE_CBD_DB.sql
new file mode 100644
index 0000000..2b879e7
--- /dev/null
+++ b/src/main/resources/db/migration/V0_2__CREATE_CBD_DB.sql
@@ -0,0 +1,607 @@
+-----------------------------------------------------------------------------------
+-- *******************************************************************************
+-- * Copyright (c) 2019 Contributors to the Eclipse Foundation
+-- *
+-- * See the NOTICE file(s) distributed with this work for additional
+-- * information regarding copyright ownership.
+-- *
+-- * This program and the accompanying materials are made available under the
+-- * terms of the Eclipse Public License v. 2.0 which is available at
+-- * http://www.eclipse.org/legal/epl-2.0.
+-- *
+-- * SPDX-License-Identifier: EPL-2.0
+-- *******************************************************************************
+-----------------------------------------------------------------------------------
+
+-- CREATE ROLE CBD_SERVICE LOGIN
+-- NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
+-- ALTER ROLE CBD_SERVICE with password 'cbd_service';
+
+-- ---------------------------------------------
+-- DROPS
+-- ---------------------------------------------
+DROP TABLE IF EXISTS public.VERSION CASCADE;
+
+DROP TABLE IF EXISTS public.TBL_ADDRESS CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_ADDRESS_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_COMMUNICATION CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_COMMUNICATION_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_CONTACT_PERSON CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_CONTACT_PERSON_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_COMPANY CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_COMPANY_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_EXTERNAL_PERSON CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_EXTERNAL_PERSON_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_INTERNAL_PERSON CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_INTERNAL_PERSON_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_CONTACT CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_CONTACT_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_ADDRESS_TYPE CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_ADDRESS_TYPE_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_PERSON_TYPE CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_PERSON_TYPE_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_COMMUNICATION_TYPE CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_COMMUNICATION_TYPE_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_SALUTATION CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_SALUTATION_ID_SEQ;
+
+-- ---------------------------------------------
+-- TABLE VERSION
+-- ---------------------------------------------
+CREATE TABLE public.VERSION
+(
+  ID integer NOT NULL,
+  VERSION character varying(50) NOT NULL,
+  CONSTRAINT REF_VERSION_PKEY PRIMARY KEY (id)
+);
+
+ALTER TABLE public.VERSION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.VERSION TO CBD_SERVICE;
+
+INSERT INTO public.VERSION (ID, VERSION) VALUES ( 1, '00-DEV' );
+
+
+-- ---------------------------------------------
+-- TABLE TBL_CONTACT
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_contact_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_contact_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_CONTACT
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_contact_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  CONTACT_TYPE character varying(3),
+  NOTE character varying(255),
+  CONSTRAINT TBL_CONTACT_PKEY PRIMARY KEY (ID)
+);
+
+
+
+ALTER TABLE public.TBL_CONTACT
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_CONTACT TO CBD_SERVICE;
+
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'ae3f2ec1-ccc5-4269-a48f-dd40e37fa14e', 'COM', 'company 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'fc7f598b-0d51-46bb-9563-99851fe6a3ad', 'COM', 'company 2 ' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '556b91be-6d57-432f-93ed-65604dd6e5cd', 'C_P', 'contact person 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '116380e3-25c5-4179-b40a-8abebe10fe07', 'C_P', 'contact person 2' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '7782179b-fb79-4370-8f71-f4c71470d006', 'I_P', 'internal person 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '8963aa38-d021-4dc9-bd70-d3734ccd20c4', 'I_P', 'internal person 2' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'c862d604-5766-43d6-a7e8-a4bac2bd01e1', 'E_P', 'external person 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'fa3d981b-a7d6-4965-a623-cdbc69404153', 'E_P', 'exernal person 2' );
+
+CREATE UNIQUE INDEX idx_tbl_contact_contact_type ON public.TBL_CONTACT  ( ID ASC );
+CREATE UNIQUE INDEX idx_cntct_uuid ON public.TBL_CONTACT (UUID);
+
+
+-- ---------------------------------------------
+-- TABLE REF_ADDRESS_TYPE
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_address_type_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_address_type_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_ADDRESS_TYPE
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_address_type_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_ADDRESS_TYPE_PKEY PRIMARY KEY (ID)
+);
+
+ALTER TABLE public.REF_ADDRESS_TYPE
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_ADDRESS_TYPE TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_address_type_uuid ON public.REF_ADDRESS_TYPE ( UUID ASC );
+
+INSERT INTO public.REF_ADDRESS_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '3802e681-9396-434e-b19c-5fedcec40ba7', 'Geschäftsadresse', 'Adresse des Hauptfirmensitzes' );
+INSERT INTO public.REF_ADDRESS_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'f43ed6ac-9e7a-40f6-acc9-ec6b73eebf79', 'Privatadresse', 'private Anschrift' );
+INSERT INTO public.REF_ADDRESS_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '70fd0811-f674-4f3a-96a7-7ae29fc95188', 'Lieferadresse', 'Adresse für Lieferungen' );
+
+
+-- ---------------------------------------------
+-- TABLE REF_PERSON_TYPE
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_person_type_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_person_type_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_PERSON_TYPE
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_person_type_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_PERSON_TYPE_PKEY PRIMARY KEY (ID)
+);
+ALTER TABLE public.REF_PERSON_TYPE
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_PERSON_TYPE TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_person_type_uuid ON public.REF_PERSON_TYPE ( UUID ASC );
+
+INSERT INTO public.REF_PERSON_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '47ce68b7-6d44-453e-b421-19020fd791b5', 'Rechtsanwalt', '' );
+INSERT INTO public.REF_PERSON_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'a7522c72-14d0-4e9d-afe3-bfcb3ffbec10', 'Geschäftsführer', '' );
+INSERT INTO public.REF_PERSON_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '2eb4885e-7363-4918-90ed-b7d5d84cfd3f', 'Rechnungsempfänger', 'Person, der Rechnungen zukommen' );
+
+
+-- ---------------------------------------------
+-- TABLE REF_COMMUNICATION_TYPE
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_communication_type_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_communication_type_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_COMMUNICATION_TYPE
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_communication_type_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_COMMUNICATION_TYPE_PKEY PRIMARY KEY (ID)
+);
+ALTER TABLE public.REF_COMMUNICATION_TYPE
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_COMMUNICATION_TYPE TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_communication_type_uuid ON public.REF_COMMUNICATION_TYPE ( UUID ASC );
+
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '4757ca3a-72c2-4f13-a2f6-ce092e3eadf4', 'Mail', 'Mailadresse' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '77028572-ff57-4c1d-999a-78fa3fcbc1cd', 'Mobil', '' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'f7d5b343-00c2-4d7f-8e03-009aad3d90f7', 'Festnetz', '' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '2bfe40f9-c4eb-4d2e-855f-6b0883912846', 'Fax', '' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'd00d1a61-c8e7-43b2-959f-66e986731441', 'WhatsApp', '' );
+
+-- ---------------------------------------------
+-- TABLE REF_SALUTATION
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_salutation_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_salutation_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_SALUTATION
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_salutation_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_SALUTATION_PKEY PRIMARY KEY (ID)
+);
+ALTER TABLE public.REF_SALUTATION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_SALUTATION TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_salutation_uuid ON public.REF_SALUTATION ( UUID ASC );
+
+INSERT INTO public.REF_SALUTATION (UUID, TYPE, DESCRIPTION) VALUES ( '90119f18-5562-425d-9a36-3dd58ea125e5', 'Herr', 'Anrede männlich' );
+INSERT INTO public.REF_SALUTATION (UUID, TYPE, DESCRIPTION) VALUES ( '4e873baa-e4f5-4585-8b16-2db8fac66538', 'Frau', 'Anrede weiblich' );
+
+
+-- ---------------------------------------------
+-- TABLE TBL_ADDRESS
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_address_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_address_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_ADDRESS
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_address_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  FK_CONTACT_ID bigint NOT NULL,
+  FK_ADDRESS_TYPE bigint,
+  IS_MAIN_ADDRESS boolean,
+  POSTCODE character varying(30),
+  COMMUNITY character varying(255),
+  COMMUNITY_SUFFIX character varying(255),
+  STREET character varying(255),
+  HOUSENUMBER character varying(30),
+  WGS_84_ZONE character varying(255),
+  LATITUDE character varying(255),
+  LONGITUDE character varying(255),
+  URL_MAP character varying(255),
+  NOTE character varying(255),
+
+  CONSTRAINT TBL_ADDRESS_PKEY PRIMARY KEY (ID),
+  CONSTRAINT TBL_ADDRESS__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT(ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_ADDRESS__ADDRESS_TYPE_ID_FKEY FOREIGN KEY (FK_ADDRESS_TYPE)
+       REFERENCES public.REF_ADDRESS_TYPE (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_ADDRESS
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_ADDRESS TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_address_uuid ON public.TBL_ADDRESS ( UUID ASC );
+
+INSERT INTO public.TBL_ADDRESS (UUID, FK_CONTACT_ID, FK_ADDRESS_TYPE, IS_MAIN_ADDRESS, POSTCODE, COMMUNITY, COMMUNITY_SUFFIX, STREET, HOUSENUMBER, WGS_84_ZONE, LATITUDE, LONGITUDE, URL_MAP, NOTE) VALUES ( '37e800fe-64f0-4834-8b83-8453cbb936a5', 2, 1, true, '12345', 'Heringsdorf','', 'Flunderweg', '5', '', '53 NL', '3 WB','www.xyz', 'nur über Seeweg erreichbar');
+INSERT INTO public.TBL_ADDRESS (UUID, FK_CONTACT_ID, FK_ADDRESS_TYPE, IS_MAIN_ADDRESS, POSTCODE, COMMUNITY, COMMUNITY_SUFFIX, STREET, HOUSENUMBER, WGS_84_ZONE, LATITUDE, LONGITUDE, URL_MAP, NOTE) VALUES ( '8a1202ae-2532-474e-8367-a1f0e13e9fbd', 1, 2, false, '67890', 'Stralsund','', 'Schollendamm', '18', '', '53 N', '2 WB','www.xyz', 'Hochwassergefahr');
+
+
+-- ---------------------------------------------
+-- TABLE TBL_COMMUNICATION
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_communication_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_communication_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_COMMUNICATION
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_communication_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  FK_CONTACT_ID bigint NOT NULL,
+  FK_COMMUNICATION_TYPE bigint,
+  COMMUNICATION_DATA character varying(1024),
+
+  CONSTRAINT TBL_COMMUNICATION_PKEY PRIMARY KEY (ID),
+  CONSTRAINT TBL_COMMUNICATION__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT(ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_COMMUNICATION__COMMUNICATION_TYPE_ID_FKEY FOREIGN KEY (FK_COMMUNICATION_TYPE)
+       REFERENCES public.REF_COMMUNICATION_TYPE (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_COMMUNICATION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_COMMUNICATION TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_communication_uuid ON public.TBL_COMMUNICATION ( UUID ASC );
+
+INSERT INTO public.TBL_COMMUNICATION (UUID, FK_CONTACT_ID, FK_COMMUNICATION_TYPE, COMMUNICATION_DATA) VALUES ( '25f6d7cc-b168-4dd5-a36d-6f14b2f956e9', 2, 2, 'bitte melden Sie sich bei uns');
+INSERT INTO public.TBL_COMMUNICATION (UUID, FK_CONTACT_ID, FK_COMMUNICATION_TYPE, COMMUNICATION_DATA) VALUES ( 'a5fa380e-8f33-4ea7-9416-e03d11b91cae', 1, 3, 'bitte melden zwecks Terminabstimmung');
+
+
+-- ---------------------------------------------
+-- TABLE TBL_COMPANY
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_company_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_company_id_seq
+  OWNER TO CBD_SERVICE;
+
+
+CREATE TABLE public.TBL_COMPANY
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_company_id_seq'::regclass),
+  COMPANY_NAME character varying(255),
+  COMPANY_TYPE character varying(30),
+  HR_NUMBER character varying(255),
+  FK_CONTACT_ID bigint NOT NULL,
+  CONSTRAINT TBL_COMPANY_PKEY PRIMARY KEY (id),
+  CONSTRAINT TBL_COMPANY__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT(ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_COMPANY
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_COMPANY TO CBD_SERVICE;
+
+INSERT INTO public.TBL_COMPANY (COMPANY_NAME, COMPANY_TYPE, HR_NUMBER, FK_CONTACT_ID) VALUES ( 'BigBang Logistic', 'Logistik', '123', 1 );
+INSERT INTO public.TBL_COMPANY (COMPANY_NAME, COMPANY_TYPE, HR_NUMBER, FK_CONTACT_ID) VALUES ( 'Pharma Peek', 'Pharma', '345', 2 );
+
+
+-- ---------------------------------------------
+-- TABLE TBL_CONTACT_PERSON
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_contact_person_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_contact_person_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_CONTACT_PERSON
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_contact_person_id_seq'::regclass),
+  FIRST_NAME character varying(255),
+  LAST_NAME character varying(255),
+  TITLE character varying(255),
+  FK_SALUTATION_ID bigint,
+  FK_REF_PERSON_TYPE_ID bigint NOT NULL,
+  FK_CONTACT_ID bigint NOT NULL,
+  FK_COMPANY_ID bigint NOT NULL,
+  CONSTRAINT TBL_CONTACT_PERSON_PKEY PRIMARY KEY (ID),
+  CONSTRAINT TBL_CONTACT_PERSON__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT (ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_CONTACT_PERSON__PERSON_TYPE_ID_FKEY FOREIGN KEY (FK_REF_PERSON_TYPE_ID)
+      REFERENCES public.REF_PERSON_TYPE (ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_CONTACT_PERSON__SALUTATION_ID_FKEY FOREIGN KEY (FK_SALUTATION_ID)
+           REFERENCES public.REF_SALUTATION (ID) MATCH SIMPLE
+           ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_CONTACT_PERSON__COMPANY_ID_FKEY FOREIGN KEY (FK_COMPANY_ID)
+       REFERENCES public.TBL_COMPANY (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_CONTACT_PERSON
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_CONTACT_PERSON TO CBD_SERVICE;
+
+INSERT INTO public.TBL_CONTACT_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID, FK_COMPANY_ID) VALUES ( 'Tabea', 'Reinebold', 'Dr.', 2, 1, 3, 2);
+INSERT INTO public.TBL_CONTACT_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID, FK_COMPANY_ID) VALUES ( 'Jan', 'Wacker', '', 1, 1, 4, 2);
+
+
+-- ---------------------------------------------
+-- TABLE TBL_EXTERNAL_PERSON
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_external_person_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_external_person_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_EXTERNAL_PERSON
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_external_person_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  FIRST_NAME character varying(255),
+  LAST_NAME character varying(255),
+  TITLE character varying(255),
+  FK_SALUTATION_ID bigint,
+  FK_REF_PERSON_TYPE_ID bigint,
+  FK_CONTACT_ID bigint NOT NULL,
+  CONSTRAINT TBL_EXTERNAL_PERSON_PKEY PRIMARY KEY (id),
+  CONSTRAINT TBL_EXTERNAL_PERSON__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+       REFERENCES public.TBL_CONTACT (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_EXTERNAL_PERSON__SALUTATION_ID_FKEY FOREIGN KEY (FK_SALUTATION_ID)
+         REFERENCES public.REF_SALUTATION (ID) MATCH SIMPLE
+         ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_EXTERNAL_PERSON__PERSON_TYPE_ID_FKEY FOREIGN KEY (FK_REF_PERSON_TYPE_ID)
+           REFERENCES public.REF_PERSON_TYPE (ID) MATCH SIMPLE
+           ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_EXTERNAL_PERSON
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_EXTERNAL_PERSON TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_external_person_uuid ON public.TBL_EXTERNAL_PERSON ( UUID ASC );
+
+INSERT INTO public.TBL_EXTERNAL_PERSON (UUID, FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID) VALUES ( '77c16800-b387-41a3-8865-e45f2918f51b', 'Monica', 'Grübel', 'Dipl.-Sportlehrerin', 2, 1, 7);
+INSERT INTO public.TBL_EXTERNAL_PERSON (UUID, FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID) VALUES ( 'c94c0031-38a6-4f40-ae5f-8e24fa11e7b7', 'Maurice', 'Fürstenberg', 'B.A.', 2, 2, 8);
+
+
+-- ---------------------------------------------
+-- TABLE TBL_INTERNAL_PERSON
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_internal_person_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_internal_person_id_seq
+  OWNER TO CBD_SERVICE;
+CREATE TABLE public.TBL_INTERNAL_PERSON
+(
+   ID bigint NOT NULL DEFAULT nextval('tbl_internal_person_id_seq'::regclass),
+   FIRST_NAME character varying(255),
+   LAST_NAME character varying(255),
+   TITLE character varying(255),
+   FK_SALUTATION_ID bigint,
+   FK_REF_PERSON_TYPE_ID bigint,
+   DEPARTMENT character varying(255),
+   SID character varying(255),
+   USER_REF character varying(255),
+   FK_CONTACT_ID bigint NOT NULL,
+   CONSTRAINT TBL_INTERNAL_PERSON_PKEY PRIMARY KEY (ID),
+   CONSTRAINT TBL_INTERNAL_PERSON__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT (ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+   CONSTRAINT TBL_INTERNAL_PERSON__SALUTATION_ID_FKEY FOREIGN KEY (FK_SALUTATION_ID)
+         REFERENCES public.REF_SALUTATION (ID) MATCH SIMPLE
+         ON UPDATE NO ACTION ON DELETE NO ACTION,
+   CONSTRAINT TBL_INTERNAL_PERSON__PERSON_TYPE_ID_FKEY FOREIGN KEY (FK_REF_PERSON_TYPE_ID)
+         REFERENCES public.REF_PERSON_TYPE (ID) MATCH SIMPLE
+         ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_INTERNAL_PERSON
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_INTERNAL_PERSON TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_internal_person_sid ON public.TBL_INTERNAL_PERSON ( SID ASC );
+CREATE UNIQUE INDEX idx_tbl_internal_person_user_ref ON public.TBL_INTERNAL_PERSON ( USER_REF ASC );
+
+INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, SID, USER_REF, FK_CONTACT_ID) VALUES ( 'Pauline', 'Freudenberg', 'B.Sc.', 1, 1,'Abteilung Rechnungsstellung', '66cd78c3-6716-4ab3-b834-a199fc796b88', 'PFREUD',  5);
+INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, SID, USER_REF, FK_CONTACT_ID) VALUES ( 'Bernhardt', 'Iffland', '', 2, 2,'Kreativ', '4124e4e7-3488-4492-bf39-75e6a23a1c1a', 'BIFFL', 6);
+
+-- -------------------------------------
+-- VIEWS -------------------------------
+-- -------------------------------------
+DROP VIEW IF EXISTS V_GENERAL_CONTACT;
+
+CREATE VIEW V_GENERAL_CONTACT
+AS
+SELECT g.id,
+	c.uuid,
+	g.name,
+	c.contact_type,
+	g.fk_contact_id,
+	g.company_name,
+	g.company_type,
+	g.fk_salutation_id,
+	g.title,
+	g.first_name,
+	g.last_name,
+	c.note
+FROM tbl_contact c
+INNER JOIN (
+
+SELECT id,
+	company_name as name,
+	fk_contact_id,
+	company_name,
+	company_type,
+	null as fk_salutation_id,
+	null as title,
+	null as first_name,
+	null as last_name
+FROM tbl_company company
+
+UNION
+
+SELECT p.id,
+	p.last_name || ' ' || p.first_name || ' [' || c.company_name || ']' as name,
+	p.fk_contact_id,
+	c.company_name,
+	c.company_type,
+	p.fk_salutation_id,
+	p.title,
+	p.first_name,
+	p.last_name
+FROM tbl_contact_person p
+INNER JOIN tbl_company c ON c.id = p.fk_company_id
+
+UNION
+
+SELECT id,
+	last_name || ' ' || first_name as name,
+	fk_contact_id,
+	null as company_name,
+	null as company_type,
+	fk_salutation_id,
+	title,
+	first_name,
+	last_name
+FROM tbl_internal_person
+
+UNION
+
+SELECT id,
+	last_name || ' ' || first_name as name,
+	fk_contact_id,
+	null as company_name,
+	null as company_type,
+	fk_salutation_id,
+	title,
+	first_name,
+	last_name
+FROM tbl_external_person
+	) g
+ON g.fk_contact_id = c.ID;
+
+
+
+
+
+DROP VIEW IF EXISTS V_DETAILED_CONTACT;
+
+CREATE VIEW V_DETAILED_CONTACT
+AS
+SELECT c.id,
+    c.uuid,
+	c.name,
+	c.contact_type,
+	c.fk_contact_id,
+	c.company_name,
+	c.company_type,
+	s.uuid as salutation_uuid,
+	c.title,
+	c.first_name,
+	c.last_name,
+	c.note,
+	s.type as salutation_type,
+	a.street,
+	a.housenumber,
+	a.community
+
+FROM V_GENERAL_CONTACT c
+LEFT OUTER JOIN ref_salutation s ON c.fk_salutation_id = s.id
+LEFT OUTER JOIN tbl_address a ON a.fk_contact_id = c.fk_contact_id and is_main_address = true;
+
+ALTER VIEW public.V_DETAILED_CONTACT
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.V_GENERAL_CONTACT TO CBD_SERVICE;
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/db/migration/V0_3__CREATE_CBD_DB.sql b/src/main/resources/db/migration/V0_3__CREATE_CBD_DB.sql
new file mode 100644
index 0000000..bdb4a30
--- /dev/null
+++ b/src/main/resources/db/migration/V0_3__CREATE_CBD_DB.sql
@@ -0,0 +1,604 @@
+-----------------------------------------------------------------------------------
+-- *******************************************************************************
+-- * Copyright (c) 2019 Contributors to the Eclipse Foundation
+-- *
+-- * See the NOTICE file(s) distributed with this work for additional
+-- * information regarding copyright ownership.
+-- *
+-- * This program and the accompanying materials are made available under the
+-- * terms of the Eclipse Public License v. 2.0 which is available at
+-- * http://www.eclipse.org/legal/epl-2.0.
+-- *
+-- * SPDX-License-Identifier: EPL-2.0
+-- *******************************************************************************
+-----------------------------------------------------------------------------------
+
+-- CREATE ROLE CBD_SERVICE LOGIN
+-- NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
+-- ALTER ROLE CBD_SERVICE with password 'cbd_service';
+
+-- ---------------------------------------------
+-- DROPS
+-- ---------------------------------------------
+DROP TABLE IF EXISTS public.VERSION CASCADE;
+
+DROP TABLE IF EXISTS public.TBL_ADDRESS CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_ADDRESS_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_COMMUNICATION CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_COMMUNICATION_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_CONTACT_PERSON CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_CONTACT_PERSON_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_COMPANY CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_COMPANY_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_EXTERNAL_PERSON CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_EXTERNAL_PERSON_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_INTERNAL_PERSON CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_INTERNAL_PERSON_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_CONTACT CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_CONTACT_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_ADDRESS_TYPE CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_ADDRESS_TYPE_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_PERSON_TYPE CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_PERSON_TYPE_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_COMMUNICATION_TYPE CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_COMMUNICATION_TYPE_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_SALUTATION CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_SALUTATION_ID_SEQ;
+
+-- ---------------------------------------------
+-- TABLE VERSION
+-- ---------------------------------------------
+CREATE TABLE public.VERSION
+(
+  ID integer NOT NULL,
+  VERSION character varying(50) NOT NULL,
+  CONSTRAINT REF_VERSION_PKEY PRIMARY KEY (id)
+);
+
+ALTER TABLE public.VERSION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.VERSION TO CBD_SERVICE;
+
+INSERT INTO public.VERSION (ID, VERSION) VALUES ( 1, '00-DEV' );
+
+
+-- ---------------------------------------------
+-- TABLE TBL_CONTACT
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_contact_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_contact_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_CONTACT
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_contact_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  CONTACT_TYPE character varying(3),
+  NOTE character varying(255),
+  CONSTRAINT TBL_CONTACT_PKEY PRIMARY KEY (ID)
+);
+
+
+
+ALTER TABLE public.TBL_CONTACT
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_CONTACT TO CBD_SERVICE;
+
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'ae3f2ec1-ccc5-4269-a48f-dd40e37fa14e', 'COM', 'company 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'fc7f598b-0d51-46bb-9563-99851fe6a3ad', 'COM', 'company 2 ' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '556b91be-6d57-432f-93ed-65604dd6e5cd', 'C_P', 'contact person 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '116380e3-25c5-4179-b40a-8abebe10fe07', 'C_P', 'contact person 2' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '7782179b-fb79-4370-8f71-f4c71470d006', 'I_P', 'internal person 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '8963aa38-d021-4dc9-bd70-d3734ccd20c4', 'I_P', 'internal person 2' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'c862d604-5766-43d6-a7e8-a4bac2bd01e1', 'E_P', 'external person 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'fa3d981b-a7d6-4965-a623-cdbc69404153', 'E_P', 'exernal person 2' );
+
+CREATE UNIQUE INDEX idx_tbl_contact_contact_type ON public.TBL_CONTACT  ( ID ASC );
+CREATE UNIQUE INDEX idx_cntct_uuid ON public.TBL_CONTACT (UUID);
+
+
+-- ---------------------------------------------
+-- TABLE REF_ADDRESS_TYPE
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_address_type_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_address_type_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_ADDRESS_TYPE
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_address_type_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_ADDRESS_TYPE_PKEY PRIMARY KEY (ID)
+);
+
+ALTER TABLE public.REF_ADDRESS_TYPE
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_ADDRESS_TYPE TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_address_type_uuid ON public.REF_ADDRESS_TYPE ( UUID ASC );
+
+INSERT INTO public.REF_ADDRESS_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '3802e681-9396-434e-b19c-5fedcec40ba7', 'Geschäftsadresse', 'Adresse des Hauptfirmensitzes' );
+INSERT INTO public.REF_ADDRESS_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'f43ed6ac-9e7a-40f6-acc9-ec6b73eebf79', 'Privatadresse', 'private Anschrift' );
+INSERT INTO public.REF_ADDRESS_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '70fd0811-f674-4f3a-96a7-7ae29fc95188', 'Lieferadresse', 'Adresse für Lieferungen' );
+
+
+-- ---------------------------------------------
+-- TABLE REF_PERSON_TYPE
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_person_type_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_person_type_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_PERSON_TYPE
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_person_type_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_PERSON_TYPE_PKEY PRIMARY KEY (ID)
+);
+ALTER TABLE public.REF_PERSON_TYPE
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_PERSON_TYPE TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_person_type_uuid ON public.REF_PERSON_TYPE ( UUID ASC );
+
+INSERT INTO public.REF_PERSON_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '47ce68b7-6d44-453e-b421-19020fd791b5', 'Rechtsanwalt', '' );
+INSERT INTO public.REF_PERSON_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'a7522c72-14d0-4e9d-afe3-bfcb3ffbec10', 'Geschäftsführer', '' );
+INSERT INTO public.REF_PERSON_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '2eb4885e-7363-4918-90ed-b7d5d84cfd3f', 'Rechnungsempfänger', 'Person, der Rechnungen zukommen' );
+
+
+-- ---------------------------------------------
+-- TABLE REF_COMMUNICATION_TYPE
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_communication_type_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_communication_type_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_COMMUNICATION_TYPE
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_communication_type_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_COMMUNICATION_TYPE_PKEY PRIMARY KEY (ID)
+);
+ALTER TABLE public.REF_COMMUNICATION_TYPE
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_COMMUNICATION_TYPE TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_communication_type_uuid ON public.REF_COMMUNICATION_TYPE ( UUID ASC );
+
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '4757ca3a-72c2-4f13-a2f6-ce092e3eadf4', 'Mail', 'Mailadresse' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '77028572-ff57-4c1d-999a-78fa3fcbc1cd', 'Mobil', '' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'f7d5b343-00c2-4d7f-8e03-009aad3d90f7', 'Festnetz', '' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '2bfe40f9-c4eb-4d2e-855f-6b0883912846', 'Fax', '' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'd00d1a61-c8e7-43b2-959f-66e986731441', 'WhatsApp', '' );
+
+-- ---------------------------------------------
+-- TABLE REF_SALUTATION
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_salutation_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_salutation_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_SALUTATION
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_salutation_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_SALUTATION_PKEY PRIMARY KEY (ID)
+);
+ALTER TABLE public.REF_SALUTATION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_SALUTATION TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_salutation_uuid ON public.REF_SALUTATION ( UUID ASC );
+
+INSERT INTO public.REF_SALUTATION (UUID, TYPE, DESCRIPTION) VALUES ( '90119f18-5562-425d-9a36-3dd58ea125e5', 'Herr', 'Anrede männlich' );
+INSERT INTO public.REF_SALUTATION (UUID, TYPE, DESCRIPTION) VALUES ( '4e873baa-e4f5-4585-8b16-2db8fac66538', 'Frau', 'Anrede weiblich' );
+
+
+-- ---------------------------------------------
+-- TABLE TBL_ADDRESS
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_address_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_address_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_ADDRESS
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_address_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  FK_CONTACT_ID bigint NOT NULL,
+  FK_ADDRESS_TYPE bigint,
+  IS_MAIN_ADDRESS boolean,
+  POSTCODE character varying(30),
+  COMMUNITY character varying(255),
+  COMMUNITY_SUFFIX character varying(255),
+  STREET character varying(255),
+  HOUSENUMBER character varying(30),
+  WGS_84_ZONE character varying(255),
+  LATITUDE character varying(255),
+  LONGITUDE character varying(255),
+  URL_MAP character varying(255),
+  NOTE character varying(255),
+
+  CONSTRAINT TBL_ADDRESS_PKEY PRIMARY KEY (ID),
+  CONSTRAINT TBL_ADDRESS__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT(ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_ADDRESS__ADDRESS_TYPE_ID_FKEY FOREIGN KEY (FK_ADDRESS_TYPE)
+       REFERENCES public.REF_ADDRESS_TYPE (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_ADDRESS
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_ADDRESS TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_address_uuid ON public.TBL_ADDRESS ( UUID ASC );
+
+INSERT INTO public.TBL_ADDRESS (UUID, FK_CONTACT_ID, FK_ADDRESS_TYPE, IS_MAIN_ADDRESS, POSTCODE, COMMUNITY, COMMUNITY_SUFFIX, STREET, HOUSENUMBER, WGS_84_ZONE, LATITUDE, LONGITUDE, URL_MAP, NOTE) VALUES ( '37e800fe-64f0-4834-8b83-8453cbb936a5', 2, 1, true, '12345', 'Heringsdorf','', 'Flunderweg', '5', '', '53 NL', '3 WB','www.xyz', 'nur über Seeweg erreichbar');
+INSERT INTO public.TBL_ADDRESS (UUID, FK_CONTACT_ID, FK_ADDRESS_TYPE, IS_MAIN_ADDRESS, POSTCODE, COMMUNITY, COMMUNITY_SUFFIX, STREET, HOUSENUMBER, WGS_84_ZONE, LATITUDE, LONGITUDE, URL_MAP, NOTE) VALUES ( '8a1202ae-2532-474e-8367-a1f0e13e9fbd', 1, 2, false, '67890', 'Stralsund','', 'Schollendamm', '18', '', '53 N', '2 WB','www.xyz', 'Hochwassergefahr');
+
+
+-- ---------------------------------------------
+-- TABLE TBL_COMMUNICATION
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_communication_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_communication_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_COMMUNICATION
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_communication_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  FK_CONTACT_ID bigint NOT NULL,
+  FK_COMMUNICATION_TYPE bigint,
+  COMMUNICATION_DATA character varying(1024),
+
+  CONSTRAINT TBL_COMMUNICATION_PKEY PRIMARY KEY (ID),
+  CONSTRAINT TBL_COMMUNICATION__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT(ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_COMMUNICATION__COMMUNICATION_TYPE_ID_FKEY FOREIGN KEY (FK_COMMUNICATION_TYPE)
+       REFERENCES public.REF_COMMUNICATION_TYPE (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_COMMUNICATION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_COMMUNICATION TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_communication_uuid ON public.TBL_COMMUNICATION ( UUID ASC );
+
+INSERT INTO public.TBL_COMMUNICATION (UUID, FK_CONTACT_ID, FK_COMMUNICATION_TYPE, COMMUNICATION_DATA) VALUES ( '25f6d7cc-b168-4dd5-a36d-6f14b2f956e9', 2, 2, 'bitte melden Sie sich bei uns');
+INSERT INTO public.TBL_COMMUNICATION (UUID, FK_CONTACT_ID, FK_COMMUNICATION_TYPE, COMMUNICATION_DATA) VALUES ( 'a5fa380e-8f33-4ea7-9416-e03d11b91cae', 1, 3, 'bitte melden zwecks Terminabstimmung');
+
+
+-- ---------------------------------------------
+-- TABLE TBL_COMPANY
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_company_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_company_id_seq
+  OWNER TO CBD_SERVICE;
+
+
+CREATE TABLE public.TBL_COMPANY
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_company_id_seq'::regclass),
+  COMPANY_NAME character varying(255),
+  COMPANY_TYPE character varying(30),
+  HR_NUMBER character varying(255),
+  FK_CONTACT_ID bigint NOT NULL,
+  CONSTRAINT TBL_COMPANY_PKEY PRIMARY KEY (id),
+  CONSTRAINT TBL_COMPANY__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT(ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_COMPANY
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_COMPANY TO CBD_SERVICE;
+
+INSERT INTO public.TBL_COMPANY (COMPANY_NAME, COMPANY_TYPE, HR_NUMBER, FK_CONTACT_ID) VALUES ( 'BigBang Logistic', 'Logistik', '123', 1 );
+INSERT INTO public.TBL_COMPANY (COMPANY_NAME, COMPANY_TYPE, HR_NUMBER, FK_CONTACT_ID) VALUES ( 'Pharma Peek', 'Pharma', '345', 2 );
+
+
+-- ---------------------------------------------
+-- TABLE TBL_CONTACT_PERSON
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_contact_person_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_contact_person_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_CONTACT_PERSON
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_contact_person_id_seq'::regclass),
+  FIRST_NAME character varying(255),
+  LAST_NAME character varying(255),
+  TITLE character varying(255),
+  FK_SALUTATION_ID bigint,
+  FK_REF_PERSON_TYPE_ID bigint NOT NULL,
+  FK_CONTACT_ID bigint NOT NULL,
+  FK_COMPANY_ID bigint NOT NULL,
+  CONSTRAINT TBL_CONTACT_PERSON_PKEY PRIMARY KEY (ID),
+  CONSTRAINT TBL_CONTACT_PERSON__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT (ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_CONTACT_PERSON__PERSON_TYPE_ID_FKEY FOREIGN KEY (FK_REF_PERSON_TYPE_ID)
+      REFERENCES public.REF_PERSON_TYPE (ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_CONTACT_PERSON__SALUTATION_ID_FKEY FOREIGN KEY (FK_SALUTATION_ID)
+           REFERENCES public.REF_SALUTATION (ID) MATCH SIMPLE
+           ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_CONTACT_PERSON__COMPANY_ID_FKEY FOREIGN KEY (FK_COMPANY_ID)
+       REFERENCES public.TBL_COMPANY (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_CONTACT_PERSON
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_CONTACT_PERSON TO CBD_SERVICE;
+
+INSERT INTO public.TBL_CONTACT_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID, FK_COMPANY_ID) VALUES ( 'Tabea', 'Reinebold', 'Dr.', 2, 1, 3, 2);
+INSERT INTO public.TBL_CONTACT_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID, FK_COMPANY_ID) VALUES ( 'Jan', 'Wacker', '', 1, 1, 4, 2);
+
+
+-- ---------------------------------------------
+-- TABLE TBL_EXTERNAL_PERSON
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_external_person_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_external_person_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_EXTERNAL_PERSON
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_external_person_id_seq'::regclass),
+  FIRST_NAME character varying(255),
+  LAST_NAME character varying(255),
+  TITLE character varying(255),
+  FK_SALUTATION_ID bigint,
+  FK_REF_PERSON_TYPE_ID bigint,
+  FK_CONTACT_ID bigint NOT NULL,
+  CONSTRAINT TBL_EXTERNAL_PERSON_PKEY PRIMARY KEY (id),
+  CONSTRAINT TBL_EXTERNAL_PERSON__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+       REFERENCES public.TBL_CONTACT (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_EXTERNAL_PERSON__SALUTATION_ID_FKEY FOREIGN KEY (FK_SALUTATION_ID)
+         REFERENCES public.REF_SALUTATION (ID) MATCH SIMPLE
+         ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_EXTERNAL_PERSON__PERSON_TYPE_ID_FKEY FOREIGN KEY (FK_REF_PERSON_TYPE_ID)
+           REFERENCES public.REF_PERSON_TYPE (ID) MATCH SIMPLE
+           ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_EXTERNAL_PERSON
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_EXTERNAL_PERSON TO CBD_SERVICE;
+
+INSERT INTO public.TBL_EXTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID) VALUES ( 'Monica', 'Grübel', 'Dipl.-Sportlehrerin', 2, 1, 7);
+INSERT INTO public.TBL_EXTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID) VALUES ( 'Maurice', 'Fürstenberg', 'B.A.', 2, 2, 8);
+
+
+-- ---------------------------------------------
+-- TABLE TBL_INTERNAL_PERSON
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_internal_person_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_internal_person_id_seq
+  OWNER TO CBD_SERVICE;
+CREATE TABLE public.TBL_INTERNAL_PERSON
+(
+   ID bigint NOT NULL DEFAULT nextval('tbl_internal_person_id_seq'::regclass),
+   FIRST_NAME character varying(255),
+   LAST_NAME character varying(255),
+   TITLE character varying(255),
+   FK_SALUTATION_ID bigint,
+   FK_REF_PERSON_TYPE_ID bigint,
+   DEPARTMENT character varying(255),
+   SID character varying(255),
+   USER_REF character varying(255),
+   FK_CONTACT_ID bigint NOT NULL,
+   CONSTRAINT TBL_INTERNAL_PERSON_PKEY PRIMARY KEY (ID),
+   CONSTRAINT TBL_INTERNAL_PERSON__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT (ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+   CONSTRAINT TBL_INTERNAL_PERSON__SALUTATION_ID_FKEY FOREIGN KEY (FK_SALUTATION_ID)
+         REFERENCES public.REF_SALUTATION (ID) MATCH SIMPLE
+         ON UPDATE NO ACTION ON DELETE NO ACTION,
+   CONSTRAINT TBL_INTERNAL_PERSON__PERSON_TYPE_ID_FKEY FOREIGN KEY (FK_REF_PERSON_TYPE_ID)
+         REFERENCES public.REF_PERSON_TYPE (ID) MATCH SIMPLE
+         ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_INTERNAL_PERSON
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_INTERNAL_PERSON TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_internal_person_sid ON public.TBL_INTERNAL_PERSON ( SID ASC );
+CREATE UNIQUE INDEX idx_tbl_internal_person_user_ref ON public.TBL_INTERNAL_PERSON ( USER_REF ASC );
+
+INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, SID, USER_REF, FK_CONTACT_ID) VALUES ( 'Pauline', 'Freudenberg', 'B.Sc.', 1, 1,'Abteilung Rechnungsstellung', '66cd78c3-6716-4ab3-b834-a199fc796b88', 'PFREUD',  5);
+INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, SID, USER_REF, FK_CONTACT_ID) VALUES ( 'Bernhardt', 'Iffland', '', 2, 2,'Kreativ', '4124e4e7-3488-4492-bf39-75e6a23a1c1a', 'BIFFL', 6);
+
+-- -------------------------------------
+-- VIEWS -------------------------------
+-- -------------------------------------
+DROP VIEW IF EXISTS V_GENERAL_CONTACT;
+
+CREATE VIEW V_GENERAL_CONTACT
+AS
+SELECT g.id,
+	c.uuid,
+	g.name,
+	c.contact_type,
+	g.fk_contact_id,
+	g.company_name,
+	g.company_type,
+	g.fk_salutation_id,
+	g.title,
+	g.first_name,
+	g.last_name,
+	c.note
+FROM tbl_contact c
+INNER JOIN (
+
+SELECT id,
+	company_name as name,
+	fk_contact_id,
+	company_name,
+	company_type,
+	null as fk_salutation_id,
+	null as title,
+	null as first_name,
+	null as last_name
+FROM tbl_company company
+
+UNION
+
+SELECT p.id,
+	p.last_name || ' ' || p.first_name || ' [' || c.company_name || ']' as name,
+	p.fk_contact_id,
+	c.company_name,
+	c.company_type,
+	p.fk_salutation_id,
+	p.title,
+	p.first_name,
+	p.last_name
+FROM tbl_contact_person p
+INNER JOIN tbl_company c ON c.id = p.fk_company_id
+
+UNION
+
+SELECT id,
+	last_name || ' ' || first_name as name,
+	fk_contact_id,
+	null as company_name,
+	null as company_type,
+	fk_salutation_id,
+	title,
+	first_name,
+	last_name
+FROM tbl_internal_person
+
+UNION
+
+SELECT id,
+	last_name || ' ' || first_name as name,
+	fk_contact_id,
+	null as company_name,
+	null as company_type,
+	fk_salutation_id,
+	title,
+	first_name,
+	last_name
+FROM tbl_external_person
+	) g
+ON g.fk_contact_id = c.ID;
+
+
+
+
+
+DROP VIEW IF EXISTS V_DETAILED_CONTACT;
+
+CREATE VIEW V_DETAILED_CONTACT
+AS
+SELECT c.id,
+    c.uuid,
+	c.name,
+	c.contact_type,
+	c.fk_contact_id,
+	c.company_name,
+	c.company_type,
+	s.uuid as salutation_uuid,
+	c.title,
+	c.first_name,
+	c.last_name,
+	c.note,
+	s.type as salutation_type,
+	a.street,
+	a.housenumber,
+	a.community
+
+FROM V_GENERAL_CONTACT c
+LEFT OUTER JOIN ref_salutation s ON c.fk_salutation_id = s.id
+LEFT OUTER JOIN tbl_address a ON a.fk_contact_id = c.fk_contact_id and is_main_address = true;
+
+ALTER VIEW public.V_DETAILED_CONTACT
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.V_GENERAL_CONTACT TO CBD_SERVICE;
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/db/migration/V0_4__CREATE_CBD_DB.sql b/src/main/resources/db/migration/V0_4__CREATE_CBD_DB.sql
new file mode 100644
index 0000000..ab5494a
--- /dev/null
+++ b/src/main/resources/db/migration/V0_4__CREATE_CBD_DB.sql
@@ -0,0 +1,638 @@
+-----------------------------------------------------------------------------------
+-- *******************************************************************************
+-- * Copyright (c) 2019 Contributors to the Eclipse Foundation
+-- *
+-- * See the NOTICE file(s) distributed with this work for additional
+-- * information regarding copyright ownership.
+-- *
+-- * This program and the accompanying materials are made available under the
+-- * terms of the Eclipse Public License v. 2.0 which is available at
+-- * http://www.eclipse.org/legal/epl-2.0.
+-- *
+-- * SPDX-License-Identifier: EPL-2.0
+-- *******************************************************************************
+-----------------------------------------------------------------------------------
+
+-- CREATE ROLE CBD_SERVICE LOGIN
+-- NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
+-- ALTER ROLE CBD_SERVICE with password 'cbd_service';
+
+-- ---------------------------------------------
+-- DROPS
+-- ---------------------------------------------
+DROP TABLE IF EXISTS public.VERSION CASCADE;
+
+DROP TABLE IF EXISTS public.TBL_ADDRESS CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_ADDRESS_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_COMMUNICATION CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_COMMUNICATION_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_CONTACT_PERSON CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_CONTACT_PERSON_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_COMPANY CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_COMPANY_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_EXTERNAL_PERSON CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_EXTERNAL_PERSON_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_INTERNAL_PERSON CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_INTERNAL_PERSON_ID_SEQ;
+
+DROP TABLE IF EXISTS public.TBL_CONTACT CASCADE;
+DROP SEQUENCE IF EXISTS public.TBL_CONTACT_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_ADDRESS_TYPE CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_ADDRESS_TYPE_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_PERSON_TYPE CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_PERSON_TYPE_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_COMMUNICATION_TYPE CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_COMMUNICATION_TYPE_ID_SEQ;
+
+DROP TABLE IF EXISTS public.REF_SALUTATION CASCADE;
+DROP SEQUENCE IF EXISTS public.REF_SALUTATION_ID_SEQ;
+
+-- ---------------------------------------------
+-- TABLE VERSION
+-- ---------------------------------------------
+CREATE TABLE public.VERSION
+(
+  ID integer NOT NULL,
+  VERSION character varying(50) NOT NULL,
+  CONSTRAINT REF_VERSION_PKEY PRIMARY KEY (id)
+);
+
+ALTER TABLE public.VERSION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.VERSION TO CBD_SERVICE;
+
+INSERT INTO public.VERSION (ID, VERSION) VALUES ( 1, '00-DEV' );
+
+
+-- ---------------------------------------------
+-- TABLE TBL_CONTACT
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_contact_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_contact_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_CONTACT
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_contact_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  CONTACT_TYPE character varying(3),
+  NOTE character varying(255),
+  CONSTRAINT TBL_CONTACT_PKEY PRIMARY KEY (ID)
+);
+
+
+
+ALTER TABLE public.TBL_CONTACT
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_CONTACT TO CBD_SERVICE;
+
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'ae3f2ec1-ccc5-4269-a48f-dd40e37fa14e', 'COM', 'company 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'fc7f598b-0d51-46bb-9563-99851fe6a3ad', 'COM', 'company 2 ' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '556b91be-6d57-432f-93ed-65604dd6e5cd', 'C_P', 'contact person 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '116380e3-25c5-4179-b40a-8abebe10fe07', 'C_P', 'contact person 2' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '7782179b-fb79-4370-8f71-f4c71470d006', 'I_P', 'internal person 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( '8963aa38-d021-4dc9-bd70-d3734ccd20c4', 'I_P', 'internal person 2' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'c862d604-5766-43d6-a7e8-a4bac2bd01e1', 'E_P', 'external person 1' );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE) VALUES ( 'fa3d981b-a7d6-4965-a623-cdbc69404153', 'E_P', 'exernal person 2' );
+
+CREATE UNIQUE INDEX idx_tbl_contact_contact_type ON public.TBL_CONTACT  ( ID ASC );
+CREATE UNIQUE INDEX idx_cntct_uuid ON public.TBL_CONTACT (UUID);
+
+
+-- ---------------------------------------------
+-- TABLE REF_ADDRESS_TYPE
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_address_type_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_address_type_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_ADDRESS_TYPE
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_address_type_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_ADDRESS_TYPE_PKEY PRIMARY KEY (ID)
+);
+
+ALTER TABLE public.REF_ADDRESS_TYPE
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_ADDRESS_TYPE TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_address_type_uuid ON public.REF_ADDRESS_TYPE ( UUID ASC );
+
+INSERT INTO public.REF_ADDRESS_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '3802e681-9396-434e-b19c-5fedcec40ba7', 'Geschäftsadresse', 'Adresse des Hauptfirmensitzes' );
+INSERT INTO public.REF_ADDRESS_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'f43ed6ac-9e7a-40f6-acc9-ec6b73eebf79', 'Privatadresse', 'private Anschrift' );
+INSERT INTO public.REF_ADDRESS_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '70fd0811-f674-4f3a-96a7-7ae29fc95188', 'Lieferadresse', 'Adresse für Lieferungen' );
+
+
+-- ---------------------------------------------
+-- TABLE REF_PERSON_TYPE
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_person_type_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_person_type_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_PERSON_TYPE
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_person_type_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_PERSON_TYPE_PKEY PRIMARY KEY (ID)
+);
+ALTER TABLE public.REF_PERSON_TYPE
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_PERSON_TYPE TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_person_type_uuid ON public.REF_PERSON_TYPE ( UUID ASC );
+
+INSERT INTO public.REF_PERSON_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '47ce68b7-6d44-453e-b421-19020fd791b5', 'Rechtsanwalt', '' );
+INSERT INTO public.REF_PERSON_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'a7522c72-14d0-4e9d-afe3-bfcb3ffbec10', 'Geschäftsführer', '' );
+INSERT INTO public.REF_PERSON_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '2eb4885e-7363-4918-90ed-b7d5d84cfd3f', 'Rechnungsempfänger', 'Person, der Rechnungen zukommen' );
+
+
+-- ---------------------------------------------
+-- TABLE REF_COMMUNICATION_TYPE
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_communication_type_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_communication_type_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_COMMUNICATION_TYPE
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_communication_type_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_COMMUNICATION_TYPE_PKEY PRIMARY KEY (ID)
+);
+ALTER TABLE public.REF_COMMUNICATION_TYPE
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_COMMUNICATION_TYPE TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_communication_type_uuid ON public.REF_COMMUNICATION_TYPE ( UUID ASC );
+
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '4757ca3a-72c2-4f13-a2f6-ce092e3eadf4', 'Mail', 'Mailadresse' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '77028572-ff57-4c1d-999a-78fa3fcbc1cd', 'Mobil', '' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'f7d5b343-00c2-4d7f-8e03-009aad3d90f7', 'Festnetz', '' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( '2bfe40f9-c4eb-4d2e-855f-6b0883912846', 'Fax', '' );
+INSERT INTO public.REF_COMMUNICATION_TYPE (UUID, TYPE, DESCRIPTION) VALUES ( 'd00d1a61-c8e7-43b2-959f-66e986731441', 'WhatsApp', '' );
+
+-- ---------------------------------------------
+-- TABLE REF_SALUTATION
+-- ---------------------------------------------
+CREATE SEQUENCE public.ref_salutation_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.ref_salutation_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.REF_SALUTATION
+(
+  ID bigint NOT NULL DEFAULT nextval('ref_salutation_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  TYPE character varying(30),
+  DESCRIPTION character varying(255),
+  CONSTRAINT REF_SALUTATION_PKEY PRIMARY KEY (ID)
+);
+ALTER TABLE public.REF_SALUTATION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.REF_SALUTATION TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_ref_salutation_uuid ON public.REF_SALUTATION ( UUID ASC );
+
+INSERT INTO public.REF_SALUTATION (UUID, TYPE, DESCRIPTION) VALUES ( '90119f18-5562-425d-9a36-3dd58ea125e5', 'Herr', 'Anrede männlich' );
+INSERT INTO public.REF_SALUTATION (UUID, TYPE, DESCRIPTION) VALUES ( '4e873baa-e4f5-4585-8b16-2db8fac66538', 'Frau', 'Anrede weiblich' );
+
+
+-- ---------------------------------------------
+-- TABLE TBL_ADDRESS
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_address_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_address_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_ADDRESS
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_address_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  FK_CONTACT_ID bigint NOT NULL,
+  FK_ADDRESS_TYPE bigint,
+  IS_MAIN_ADDRESS boolean,
+  POSTCODE character varying(30),
+  COMMUNITY character varying(255),
+  COMMUNITY_SUFFIX character varying(255),
+  STREET character varying(255),
+  HOUSENUMBER character varying(30),
+  WGS_84_ZONE character varying(255),
+  LATITUDE character varying(255),
+  LONGITUDE character varying(255),
+  URL_MAP character varying(255),
+  NOTE character varying(255),
+
+  CONSTRAINT TBL_ADDRESS_PKEY PRIMARY KEY (ID),
+  CONSTRAINT TBL_ADDRESS__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT(ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_ADDRESS__ADDRESS_TYPE_ID_FKEY FOREIGN KEY (FK_ADDRESS_TYPE)
+       REFERENCES public.REF_ADDRESS_TYPE (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_ADDRESS
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_ADDRESS TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_address_uuid ON public.TBL_ADDRESS ( UUID ASC );
+
+INSERT INTO public.TBL_ADDRESS (UUID, FK_CONTACT_ID, FK_ADDRESS_TYPE, IS_MAIN_ADDRESS, POSTCODE, COMMUNITY, COMMUNITY_SUFFIX, STREET, HOUSENUMBER, WGS_84_ZONE, LATITUDE, LONGITUDE, URL_MAP, NOTE) VALUES ( '37e800fe-64f0-4834-8b83-8453cbb936a5', 2, 1, true, '12345', 'Heringsdorf','', 'Flunderweg', '5', '', '53 NL', '3 WB','www.xyz', 'nur über Seeweg erreichbar');
+INSERT INTO public.TBL_ADDRESS (UUID, FK_CONTACT_ID, FK_ADDRESS_TYPE, IS_MAIN_ADDRESS, POSTCODE, COMMUNITY, COMMUNITY_SUFFIX, STREET, HOUSENUMBER, WGS_84_ZONE, LATITUDE, LONGITUDE, URL_MAP, NOTE) VALUES ( '8a1202ae-2532-474e-8367-a1f0e13e9fbd', 1, 2, false, '67890', 'Stralsund','', 'Schollendamm', '18', '', '53 N', '2 WB','www.xyz', 'Hochwassergefahr');
+
+
+-- ---------------------------------------------
+-- TABLE TBL_COMMUNICATION
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_communication_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_communication_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_COMMUNICATION
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_communication_id_seq'::regclass),
+  UUID uuid NOT NULL,
+  FK_CONTACT_ID bigint NOT NULL,
+  FK_COMMUNICATION_TYPE bigint,
+  COMMUNICATION_DATA character varying(1024),
+
+  CONSTRAINT TBL_COMMUNICATION_PKEY PRIMARY KEY (ID),
+  CONSTRAINT TBL_COMMUNICATION__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT(ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_COMMUNICATION__COMMUNICATION_TYPE_ID_FKEY FOREIGN KEY (FK_COMMUNICATION_TYPE)
+       REFERENCES public.REF_COMMUNICATION_TYPE (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_COMMUNICATION
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_COMMUNICATION TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_communication_uuid ON public.TBL_COMMUNICATION ( UUID ASC );
+
+INSERT INTO public.TBL_COMMUNICATION (UUID, FK_CONTACT_ID, FK_COMMUNICATION_TYPE, COMMUNICATION_DATA) VALUES ( '25f6d7cc-b168-4dd5-a36d-6f14b2f956e9', 2, 2, 'bitte melden Sie sich bei uns');
+INSERT INTO public.TBL_COMMUNICATION (UUID, FK_CONTACT_ID, FK_COMMUNICATION_TYPE, COMMUNICATION_DATA) VALUES ( 'a5fa380e-8f33-4ea7-9416-e03d11b91cae', 1, 3, 'bitte melden zwecks Terminabstimmung');
+
+
+-- ---------------------------------------------
+-- TABLE TBL_COMPANY
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_company_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_company_id_seq
+  OWNER TO CBD_SERVICE;
+
+
+CREATE TABLE public.TBL_COMPANY
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_company_id_seq'::regclass),
+  COMPANY_NAME character varying(255),
+  COMPANY_TYPE character varying(30),
+  HR_NUMBER character varying(255),
+  FK_CONTACT_ID bigint NOT NULL,
+  CONSTRAINT TBL_COMPANY_PKEY PRIMARY KEY (id),
+  CONSTRAINT TBL_COMPANY__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT(ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_COMPANY
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_COMPANY TO CBD_SERVICE;
+
+INSERT INTO public.TBL_COMPANY (COMPANY_NAME, COMPANY_TYPE, HR_NUMBER, FK_CONTACT_ID) VALUES ( 'BigBang Logistic', 'Logistik', '123', 1 );
+INSERT INTO public.TBL_COMPANY (COMPANY_NAME, COMPANY_TYPE, HR_NUMBER, FK_CONTACT_ID) VALUES ( 'Pharma Peek', 'Pharma', '345', 2 );
+
+
+-- ---------------------------------------------
+-- TABLE TBL_CONTACT_PERSON
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_contact_person_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_contact_person_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_CONTACT_PERSON
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_contact_person_id_seq'::regclass),
+  FIRST_NAME character varying(255),
+  LAST_NAME character varying(255),
+  TITLE character varying(255),
+  FK_SALUTATION_ID bigint,
+  FK_REF_PERSON_TYPE_ID bigint NOT NULL,
+  FK_CONTACT_ID bigint NOT NULL,
+  FK_COMPANY_ID bigint NOT NULL,
+  CONSTRAINT TBL_CONTACT_PERSON_PKEY PRIMARY KEY (ID),
+  CONSTRAINT TBL_CONTACT_PERSON__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT (ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_CONTACT_PERSON__PERSON_TYPE_ID_FKEY FOREIGN KEY (FK_REF_PERSON_TYPE_ID)
+      REFERENCES public.REF_PERSON_TYPE (ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_CONTACT_PERSON__SALUTATION_ID_FKEY FOREIGN KEY (FK_SALUTATION_ID)
+           REFERENCES public.REF_SALUTATION (ID) MATCH SIMPLE
+           ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_CONTACT_PERSON__COMPANY_ID_FKEY FOREIGN KEY (FK_COMPANY_ID)
+       REFERENCES public.TBL_COMPANY (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_CONTACT_PERSON
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_CONTACT_PERSON TO CBD_SERVICE;
+
+INSERT INTO public.TBL_CONTACT_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID, FK_COMPANY_ID) VALUES ( 'Tabea', 'Reinebold', 'Dr.', 2, 1, 3, 2);
+INSERT INTO public.TBL_CONTACT_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID, FK_COMPANY_ID) VALUES ( 'Jan', 'Wacker', '', 1, 1, 4, 2);
+
+
+-- ---------------------------------------------
+-- TABLE TBL_EXTERNAL_PERSON
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_external_person_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_external_person_id_seq
+  OWNER TO CBD_SERVICE;
+
+CREATE TABLE public.TBL_EXTERNAL_PERSON
+(
+  ID bigint NOT NULL DEFAULT nextval('tbl_external_person_id_seq'::regclass),
+  FIRST_NAME character varying(255),
+  LAST_NAME character varying(255),
+  TITLE character varying(255),
+  FK_SALUTATION_ID bigint,
+  FK_REF_PERSON_TYPE_ID bigint,
+  FK_CONTACT_ID bigint NOT NULL,
+  CONSTRAINT TBL_EXTERNAL_PERSON_PKEY PRIMARY KEY (id),
+  CONSTRAINT TBL_EXTERNAL_PERSON__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+       REFERENCES public.TBL_CONTACT (ID) MATCH SIMPLE
+       ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_EXTERNAL_PERSON__SALUTATION_ID_FKEY FOREIGN KEY (FK_SALUTATION_ID)
+         REFERENCES public.REF_SALUTATION (ID) MATCH SIMPLE
+         ON UPDATE NO ACTION ON DELETE NO ACTION,
+  CONSTRAINT TBL_EXTERNAL_PERSON__PERSON_TYPE_ID_FKEY FOREIGN KEY (FK_REF_PERSON_TYPE_ID)
+           REFERENCES public.REF_PERSON_TYPE (ID) MATCH SIMPLE
+           ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_EXTERNAL_PERSON
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_EXTERNAL_PERSON TO CBD_SERVICE;
+
+INSERT INTO public.TBL_EXTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID) VALUES ( 'Monica', 'Grübel', 'Dipl.-Sportlehrerin', 2, 1, 7);
+INSERT INTO public.TBL_EXTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, FK_CONTACT_ID) VALUES ( 'Maurice', 'Fürstenberg', 'B.A.', 2, 2, 8);
+
+
+-- ---------------------------------------------
+-- TABLE TBL_INTERNAL_PERSON
+-- ---------------------------------------------
+CREATE SEQUENCE public.tbl_internal_person_id_seq
+  INCREMENT 1
+  MINVALUE 1
+  MAXVALUE 9223372036854775807
+  START 1
+  CACHE 1;
+ALTER TABLE public.tbl_internal_person_id_seq
+  OWNER TO CBD_SERVICE;
+CREATE TABLE public.TBL_INTERNAL_PERSON
+(
+   ID bigint NOT NULL DEFAULT nextval('tbl_internal_person_id_seq'::regclass),
+   FIRST_NAME character varying(255),
+   LAST_NAME character varying(255),
+   TITLE character varying(255),
+   FK_SALUTATION_ID bigint,
+   FK_REF_PERSON_TYPE_ID bigint,
+   DEPARTMENT character varying(255),
+   SID character varying(255),
+   USER_REF character varying(255),
+   FK_CONTACT_ID bigint NOT NULL,
+   CONSTRAINT TBL_INTERNAL_PERSON_PKEY PRIMARY KEY (ID),
+   CONSTRAINT TBL_INTERNAL_PERSON__CONTACT_ID_FKEY FOREIGN KEY (FK_CONTACT_ID)
+      REFERENCES public.TBL_CONTACT (ID) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+   CONSTRAINT TBL_INTERNAL_PERSON__SALUTATION_ID_FKEY FOREIGN KEY (FK_SALUTATION_ID)
+         REFERENCES public.REF_SALUTATION (ID) MATCH SIMPLE
+         ON UPDATE NO ACTION ON DELETE NO ACTION,
+   CONSTRAINT TBL_INTERNAL_PERSON__PERSON_TYPE_ID_FKEY FOREIGN KEY (FK_REF_PERSON_TYPE_ID)
+         REFERENCES public.REF_PERSON_TYPE (ID) MATCH SIMPLE
+         ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+ALTER TABLE public.TBL_INTERNAL_PERSON
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.TBL_INTERNAL_PERSON TO CBD_SERVICE;
+
+CREATE UNIQUE INDEX idx_tbl_internal_person_sid ON public.TBL_INTERNAL_PERSON ( SID ASC );
+CREATE UNIQUE INDEX idx_tbl_internal_person_user_ref ON public.TBL_INTERNAL_PERSON ( USER_REF ASC );
+
+INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, SID, USER_REF, FK_CONTACT_ID) VALUES ( 'Pauline', 'Freudenberg', 'B.Sc.', 1, 1,'Abteilung Rechnungsstellung', '66cd78c3-6716-4ab3-b834-a199fc796b88', 'PFREUD',  5);
+INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, SID, USER_REF, FK_CONTACT_ID) VALUES ( 'Bernhardt', 'Iffland', '', 2, 2,'Kreativ', '4124e4e7-3488-4492-bf39-75e6a23a1c1a', 'BIFFL', 6);
+
+-- -------------------------------------
+-- VIEWS -------------------------------
+-- -------------------------------------
+DROP VIEW IF EXISTS VW_GENERAL_CONTACT CASCADE;
+
+CREATE VIEW VW_GENERAL_CONTACT
+AS
+SELECT g.id,
+	c.uuid,
+	g.name,
+	c.contact_type,
+	g.fk_contact_id,
+	g.company_name,
+	g.company_type,
+	g.fk_salutation_id,
+	g.fk_ref_person_type_id,
+	g.title,
+	g.first_name,
+	g.last_name,
+	g.department,
+	c.note
+FROM tbl_contact c
+INNER JOIN (
+
+SELECT id,
+	company_name as name,
+	fk_contact_id,
+	company_name,
+	company_type,
+	null as fk_salutation_id,
+	null as fk_ref_person_type_id,
+	null as title,
+	null as first_name,
+	null as last_name,
+	null as department
+FROM tbl_company company
+
+UNION
+
+SELECT p.id,
+	p.last_name || ' ' || p.first_name || ' [' || c.company_name || ']' as name,
+	p.fk_contact_id,
+	c.company_name,
+	c.company_type,
+	p.fk_salutation_id,
+	p.fk_ref_person_type_id,
+	p.title,
+	p.first_name,
+	p.last_name,
+	null as department
+FROM tbl_contact_person p
+INNER JOIN tbl_company c ON c.id = p.fk_company_id
+
+UNION
+
+SELECT id,
+	last_name || ' ' || first_name as name,
+	fk_contact_id,
+	null as company_name,
+	null as company_type,
+	fk_salutation_id,
+	fk_ref_person_type_id,
+	title,
+	first_name,
+	last_name,
+	department
+FROM tbl_internal_person
+
+UNION
+
+SELECT id,
+	last_name || ' ' || first_name as name,
+	fk_contact_id,
+	null as company_name,
+	null as company_type,
+	fk_salutation_id,
+	fk_ref_person_type_id,
+	title,
+	first_name,
+	last_name,
+	null as department
+FROM tbl_external_person
+	) g
+ON g.fk_contact_id = c.ID;
+
+ALTER VIEW public.VW_GENERAL_CONTACT
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.VW_GENERAL_CONTACT TO CBD_SERVICE;
+
+
+DROP VIEW IF EXISTS VW_DETAILED_CONTACT;
+
+CREATE VIEW VW_DETAILED_CONTACT
+AS
+SELECT c.id,
+    c.uuid,
+	c.name,
+	c.contact_type,
+	c.fk_contact_id,
+	c.company_name,
+	c.company_type,
+	s.uuid as salutation_uuid,
+	t.uuid as person_type_uuid,
+	c.title,
+	c.first_name,
+	c.last_name,
+	c.department,
+	c.note,
+	s.type as salutation_type,
+	t.type as person_type,
+	a.street,
+	a.housenumber,
+	a.community,
+
+	UPPER(
+        COALESCE(c.name, '') || '|@|'
+        || COALESCE(company_name, '') || '|@|'
+        || COALESCE(c.company_type, '') || '|@|'
+        || COALESCE(c.title, '') || '|@|'
+        || COALESCE(c.first_name, '') || '|@|'
+        || COALESCE(c.last_name, '') || '|@|'
+        || COALESCE(c.department, '') || '|@|'
+        || COALESCE(c.note, '') || '|@|'
+        || COALESCE(s.type, '') || '|@|'
+        || COALESCE(t.type, '') || '|@|'
+        || COALESCE(a.street, '') || '|@|'
+        || COALESCE(a.housenumber, '') || '|@|'
+        || COALESCE(a.community, '') || '|@|'
+        || COALESCE(com.communication_data, '')
+    )as searchfield
+FROM VW_GENERAL_CONTACT c
+LEFT OUTER JOIN ref_salutation s ON c.fk_salutation_id = s.id
+LEFT OUTER JOIN tbl_address a ON a.fk_contact_id = c.fk_contact_id and is_main_address = true
+LEFT OUTER JOIN ref_person_type t ON c.fk_ref_person_type_id = t.id
+LEFT OUTER JOIN tbl_communication com ON (com.id = c.id
+	AND com.fk_communication_type=(
+		SELECT ct.id FROM ref_communication_type ct WHERE UPPER(ct.type) LIKE 'MAIL' LIMIT 1 ) ) ;
+
+ALTER VIEW public.VW_DETAILED_CONTACT
+  OWNER TO CBD_SERVICE;
+GRANT ALL ON TABLE public.VW_DETAILED_CONTACT TO CBD_SERVICE;
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties
new file mode 100644
index 0000000..d64a217
--- /dev/null
+++ b/src/main/resources/messages.properties
@@ -0,0 +1,5 @@
+#Fehlermeldungen
+invalid.uuid.path.object=Die UUID entspricht nicht der UUID des \u00fcbergebenen Datensatzes.
+
+salutation.not.found=Anrede wurde nicht gefunden
+salutation.uuid.not.existing=Die \u00fcbergebene UUID einer Anrede existiert nicht
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/ContactBaseDataApplicationTests.java b/src/test/java/org/eclipse/openk/contactbasedata/ContactBaseDataApplicationTests.java
new file mode 100644
index 0000000..0d33d88
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/ContactBaseDataApplicationTests.java
@@ -0,0 +1,27 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class ContactBaseDataApplicationTests {
+
+	@Test
+	void contextLoads() {
+	}
+
+}
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java b/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
new file mode 100644
index 0000000..b1b4254
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
@@ -0,0 +1,58 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.config;
+
+import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
+import org.eclipse.openk.contactbasedata.mapper.*;
+import org.eclipse.openk.contactbasedata.service.*;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@EnableJpaRepositories(basePackages = "org.eclipse.openk.contactbasedata")
+@EntityScan(basePackageClasses = ContactBaseDataApplication.class)
+public class TestConfiguration {
+    @Bean
+    VersionMapper versionMapper() { return new VersionMapperImpl(); }
+
+    @Bean
+    VersionMapperImpl versionMapperImpl() { return new VersionMapperImpl(); }
+
+    @Bean
+    ExternalPersonMapper externalPersonMapper() { return new ExternalPersonMapperImpl(); }
+
+    @Bean
+    ContactMapper contactMapper() { return new ContactMapperImpl(); }
+
+    @Bean
+    SalutationMapper salutationMapper() { return new SalutationMapperImpl(); }
+
+    @Bean
+    public VersionService myVersionService() {
+        return new VersionService();
+    }
+
+    @Bean
+    public ContactService myContactService() { return new ContactService(); }
+
+    @Bean
+    public ExternalPersonService myExternalPersonService() { return new ExternalPersonService(); }
+
+    @Bean
+    public SalutationService mySalutationService() { return new SalutationService(); }
+
+    @Bean
+    public BaseContactService myBaseContactService() { return new BaseContactService(); }
+}
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
new file mode 100644
index 0000000..626d5e0
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
@@ -0,0 +1,63 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
+import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
+import org.eclipse.openk.contactbasedata.service.ContactService;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+
+import static org.hamcrest.Matchers.is;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+
+
+@SpringBootTest(classes = ContactBaseDataApplication.class)
+@AutoConfigureMockMvc
+public class ContactControllerTest {
+
+    @MockBean
+    private ContactService contactService;
+
+    @Autowired
+    private MockMvc mockMvc;
+
+
+    @Test
+    public void shouldReturnAllContacts() throws Exception {
+        Page<VwDetailedContact> retPage = MockDataHelper.mockVDetailedContactPage();
+
+        when(contactService.findDetailedContacts(
+                isNull(), isNull(), isNull(), any(Pageable.class))).thenReturn(retPage);
+
+        mockMvc.perform(get("/contacts"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+                .andExpect(jsonPath("totalElements", is(2)));
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonControllerTest.java
new file mode 100644
index 0000000..105f453
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonControllerTest.java
@@ -0,0 +1,121 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
+import org.eclipse.openk.contactbasedata.service.ExternalPersonService;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+
+import java.util.UUID;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+
+@SpringBootTest(classes = ContactBaseDataApplication.class)
+@AutoConfigureMockMvc
+public class ExternalPersonControllerTest {
+
+    @MockBean
+    private ExternalPersonService externalPersonService;
+
+    @Autowired
+    private MockMvc mockMvc;
+
+
+    @Test
+    public void shouldReturnARequestedExtPerson() throws Exception {
+        ExternalPersonDto ep = MockDataHelper.mockExternalPersonDto();
+
+        when(externalPersonService.findExternalPerson(any(UUID.class))).thenReturn(ep);
+
+        mockMvc.perform(get("/external-persons/"+UUID.randomUUID().toString()))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+                .andExpect(jsonPath("firstName", is(  ep.getFirstName())));
+    }
+
+
+    @Test
+    public void shouldReturnAllExtPerson() throws Exception {
+        Page<ExternalPersonDto> epPage = MockDataHelper.mockExternalPersonDtoPage();
+
+        when(externalPersonService.findExternalPersons(any(Pageable.class))).thenReturn(epPage);
+
+        mockMvc.perform(get("/external-persons"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+                .andExpect(jsonPath("totalElements", is(  2 )));
+    }
+
+    @Test
+    public void shouldUpdateExtPerson() throws Exception {
+        ExternalPersonDto ep = MockDataHelper.mockExternalPersonDto();
+
+        when( externalPersonService.updateExternalPerson(any(ExternalPersonDto.class))).thenReturn(ep);
+
+        mockMvc.perform(put("/external-persons/{uuid}", ep.getContactId().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(ep)))
+                /*.andExpect(jsonPath("$.lastName", Matchers.is("Testbeschreibung")))
+                .andExpect(jsonPath("$.displayId", Matchers.is(400)))
+                .andExpect(jsonPath("$.stockTypeId", Matchers.is("123")))*/
+                .andExpect(status().is2xxSuccessful());
+    }
+
+    @Test
+    public void shouldNotUpdateExtPersonDueToException() throws Exception {
+        ExternalPersonDto ep = MockDataHelper.mockExternalPersonDto();
+
+        when( externalPersonService.updateExternalPerson(any(ExternalPersonDto.class))).thenReturn(ep);
+
+        // provide different exception in url and object
+        mockMvc.perform(put("/external-persons/{uuid}", UUID.randomUUID().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(ep)))
+                .andExpect(status().isBadRequest());
+    }
+
+    @Test
+    public void shouldInsertExtPerson() throws Exception {
+        ExternalPersonDto ep = MockDataHelper.mockExternalPersonDto();
+
+        when( externalPersonService.insertExternalPerson(any(ExternalPersonDto.class))).thenReturn(ep);
+
+        mockMvc.perform(post("/external-persons")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(ep)))
+                .andExpect(jsonPath("$.lastName", is(ep.getLastName())))
+                .andExpect(jsonPath("$.contactId", not(ep.getContactId())))
+                .andExpect(jsonPath("$.contactNote", is(ep.getContactNote())))
+                .andExpect(status().is2xxSuccessful());
+    }
+
+}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/SalutationControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/SalutationControllerTest.java
new file mode 100644
index 0000000..edb8e5d
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/SalutationControllerTest.java
@@ -0,0 +1,135 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
+import org.eclipse.openk.contactbasedata.service.SalutationService;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+
+import java.util.List;
+import java.util.UUID;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+//import static org.springframework.mock.http.server.reactive.MockServerHttpRequest.post;
+//import static org.springframework.mock.http.server.reactive.MockServerHttpRequest.put;
+//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+//import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+//import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+//import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+
+
+
+
+
+@SpringBootTest(classes = ContactBaseDataApplication.class)
+@AutoConfigureMockMvc
+public class SalutationControllerTest {
+
+    @MockBean
+    private SalutationService saluationService;
+
+    @Autowired
+    private MockMvc mockMvc;
+
+    @Test
+    public void shouldReturnAllSalutations() throws Exception {
+        List<SalutationDto> sds = MockDataHelper.mockSalutationsDtos();
+
+        when(saluationService.findAllSalutations()).thenReturn(sds);
+
+        mockMvc.perform(get("/salutations"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON));
+    }
+
+    @Test
+    public void shouldReturnSingleSalutation() throws Exception {
+        SalutationDto salutationDto = MockDataHelper.mockSalutationDto();
+
+        when(saluationService.getSalutationByUuid(any(UUID.class))).thenReturn(salutationDto);
+
+        mockMvc.perform(get("/salutations/37454f86-2006-11ea-978f-2e728ce88125"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON));
+    }
+
+    @Test
+    public void shouldInsertSalutation() throws Exception {
+        SalutationDto salutationDto = MockDataHelper.mockSalutationDto();
+        salutationDto.setType("Master");
+        salutationDto.setDescription("of the universe");
+
+        when(saluationService.insertSalutation(any(SalutationDto.class)))
+                .thenReturn(salutationDto);
+
+        mockMvc.perform(post("/salutations")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(salutationDto)))
+                .andExpect(jsonPath("$.type", Matchers.is("Master")))
+                .andExpect(jsonPath("$.description", Matchers.is("of the universe" )));
+    }
+
+    @Test
+    public void shouldUpdateSalutation() throws Exception {
+        SalutationDto salutationDto = MockDataHelper.mockSalutationDto();
+        salutationDto.setUuid(UUID.randomUUID());
+
+        when(  saluationService.updateSalutation(any(SalutationDto.class))).thenReturn(salutationDto);
+
+        mockMvc.perform(put("/salutations/{uuid}", salutationDto.getUuid().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(salutationDto)))
+                .andExpect(status().is2xxSuccessful());
+    }
+
+    @Test
+    public void shouldNotUpdateSalutationDueToError() throws Exception {
+        SalutationDto salutationDto = MockDataHelper.mockSalutationDto();
+        salutationDto.setUuid(UUID.randomUUID());
+
+        when(  saluationService.updateSalutation(any(SalutationDto.class))).thenReturn(salutationDto);
+
+        // use different UUIDs for path and object
+        mockMvc.perform(put("/salutations/{uuid}", UUID.randomUUID().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(salutationDto)))
+                .andExpect(status().isBadRequest());
+    }
+
+
+    @Test
+    public void shouldDeleteSalutation() throws Exception {
+        mockMvc.perform(delete("/salutations/05ff2344-20a5-11ea-978f-2e728ce88125")
+                .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().is2xxSuccessful());
+    }
+
+}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/VersionControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/VersionControllerTest.java
new file mode 100644
index 0000000..60d394d
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/VersionControllerTest.java
@@ -0,0 +1,56 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
+import org.eclipse.openk.contactbasedata.service.VersionService;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.VersionDto;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+
+import static org.hamcrest.Matchers.is;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+@SpringBootTest(classes = ContactBaseDataApplication.class)
+@AutoConfigureMockMvc
+public class VersionControllerTest {
+
+    @MockBean
+    private VersionService versionService;
+
+    @Autowired
+    private MockMvc mockMvc;
+
+
+    @Test
+    public void shouldReturnVersion() throws Exception {
+        VersionDto versionDto = MockDataHelper.mockVersionDto();
+        when(versionService.getVersion()).thenReturn(versionDto);
+
+        mockMvc.perform(get("/version"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+                .andExpect(jsonPath("backendVersion", is(  "660")))
+                .andExpect(jsonPath("dbVersion", is("550")));
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
new file mode 100644
index 0000000..91788ba
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
@@ -0,0 +1,56 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import org.eclipse.openk.contactbasedata.config.TestConfiguration;
+import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
+import org.eclipse.openk.contactbasedata.repository.DetailedContactRepository;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.test.context.ContextConfiguration;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+//@RunWith(SpringRunner.class)
+@DataJpaTest
+@ContextConfiguration(classes = {TestConfiguration.class})
+
+public class ContactServiceTest {
+    @Qualifier("myContactService")
+    @Autowired
+    private ContactService contactService;
+
+    @MockBean
+    private DetailedContactRepository detailedContactRepository;
+
+    @Test
+    public void shouldFindDetailedContactsProperly() {
+        Page<VwDetailedContact> mockPaged = MockDataHelper.mockVDetailedContactPage();
+        when(detailedContactRepository.findAll(any(Pageable.class))).thenReturn(mockPaged);
+        Page<VwDetailedContact> retPage = contactService.findDetailedContacts(
+                null, null, null, PageRequest.of(0, 20));
+
+        assertEquals(mockPaged.getTotalElements(), retPage.getTotalElements());
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/ExternalPersonServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/ExternalPersonServiceTest.java
new file mode 100644
index 0000000..4574d26
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/ExternalPersonServiceTest.java
@@ -0,0 +1,194 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import org.eclipse.openk.contactbasedata.config.TestConfiguration;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.model.RefPersonType;
+import org.eclipse.openk.contactbasedata.model.RefSalutation;
+import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.eclipse.openk.contactbasedata.model.TblExternalPerson;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
+import org.eclipse.openk.contactbasedata.repository.ExternalPersonRepository;
+import org.eclipse.openk.contactbasedata.repository.PersonTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.junit.jupiter.api.Test;
+import org.mockito.stubbing.Answer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ContextConfiguration;
+
+import java.util.Optional;
+import java.util.UUID;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+@DataJpaTest
+@ContextConfiguration(classes = {TestConfiguration.class})
+
+public class ExternalPersonServiceTest {
+    @Qualifier("myExternalPersonService")
+    @Autowired
+    private ExternalPersonService externalPersonService;
+
+    @MockBean
+    private ExternalPersonRepository externalPersonRepository;
+
+    @MockBean
+    private ContactRepository contactRepository;
+
+    @MockBean
+    private SalutationRepository salutationRepository;
+
+    @MockBean
+    private PersonTypeRepository personTypeRepository;
+
+    @Test
+    public void shouldFindAnExternalPersonProperly() {
+        TblExternalPerson ep = MockDataHelper.mockExternalPerson();
+        when(externalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(ep));
+        ExternalPersonDto dto = externalPersonService.findExternalPerson(UUID.randomUUID());
+
+        assertEquals(ep.getContact().getUuid(), dto.getContactId());
+    }
+
+    @Test
+    public void shouldThrowInErrorCaseWithExternalPerson() {
+        TblExternalPerson ep = MockDataHelper.mockExternalPerson();
+        when(externalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
+        assertThrows(NotFoundException.class, () -> externalPersonService.findExternalPerson(UUID.randomUUID()));
+    }
+
+    @Test
+    public void shouldUpdateExternalPerson() {
+        ExternalPersonDto epDto = MockDataHelper.mockExternalPersonDto();
+        TblExternalPerson epTbl = MockDataHelper.mockExternalPerson();
+        when(externalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(epTbl));
+        when(salutationRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefSalutation()));
+        when(personTypeRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefPersonType()));
+
+        when(externalPersonRepository.save(any(TblExternalPerson.class)))
+                .then((Answer<TblExternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblExternalPerson) args[0];
+                });
+
+        ExternalPersonDto savedDto = externalPersonService.updateExternalPerson(epDto);
+        assertEquals(epTbl.getContact().getUuid(), savedDto.getContactId());
+        assertEquals(epTbl.getContact().getNote(), savedDto.getContactNote());
+        assertEquals(epTbl.getContact().getContactType(), savedDto.getContactType());
+        assertEquals(epTbl.getFirstName(), savedDto.getFirstName());
+        assertEquals(epTbl.getLastName(), savedDto.getLastName());
+        assertEquals(epTbl.getTitle(), savedDto.getTitle());
+        assertEquals(epTbl.getRefPersonType().getUuid(), savedDto.getPersonTypeId());
+        assertEquals(epTbl.getSalutation().getUuid(), savedDto.getSalutationId());
+    }
+
+    @Test
+    public void shouldNotUpdateExternalPerson_Exception1() {
+        ExternalPersonDto epDto = MockDataHelper.mockExternalPersonDto();
+        TblExternalPerson epTbl = MockDataHelper.mockExternalPerson();
+        when(externalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
+        when(salutationRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefSalutation()));
+        when(personTypeRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefPersonType()));
+
+        when(externalPersonRepository.save(any(TblExternalPerson.class)))
+                .then((Answer<TblExternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblExternalPerson) args[0];
+                });
+
+        assertThrows( NotFoundException.class, () -> externalPersonService.updateExternalPerson(epDto));
+    }
+
+    @Test
+    public void shouldNotUpdateExternalPerson_Exception2() {
+        ExternalPersonDto epDto = MockDataHelper.mockExternalPersonDto();
+        TblExternalPerson epTbl = MockDataHelper.mockExternalPerson();
+        when(externalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(epTbl));
+        when(salutationRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.empty());
+        when(personTypeRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefPersonType()));
+
+        when(externalPersonRepository.save(any(TblExternalPerson.class)))
+                .then((Answer<TblExternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblExternalPerson) args[0];
+                });
+
+        assertThrows( NotFoundException.class, () -> externalPersonService.updateExternalPerson(epDto));
+    }
+    @Test
+    public void shouldNotUpdateExternalPerson_Exception3() {
+        ExternalPersonDto epDto = MockDataHelper.mockExternalPersonDto();
+        TblExternalPerson epTbl = MockDataHelper.mockExternalPerson();
+        when(externalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(epTbl));
+        when(salutationRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefSalutation()));
+        when(personTypeRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.empty());
+
+        when(externalPersonRepository.save(any(TblExternalPerson.class)))
+                .then((Answer<TblExternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblExternalPerson) args[0];
+                });
+
+        assertThrows( NotFoundException.class, () -> externalPersonService.updateExternalPerson(epDto));
+    }
+
+    @Test
+    public void shouldInsertExternalPerson() {
+        ExternalPersonDto epDto = MockDataHelper.mockExternalPersonDto();
+        epDto.setContactId(null);
+        RefSalutation refSalutation = MockDataHelper.mockRefSalutation();
+        when(salutationRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(refSalutation));
+        RefPersonType refPersonType = MockDataHelper.mockRefPersonType();
+        when(personTypeRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(refPersonType));
+        when(contactRepository.save(any(TblContact.class)))
+                .then((Answer<TblContact>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblContact) args[0];
+                });
+        when(externalPersonRepository.save(any(TblExternalPerson.class)))
+                .then((Answer<TblExternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblExternalPerson) args[0];
+                });
+
+        ExternalPersonDto savedDto = externalPersonService.insertExternalPerson(epDto);
+        assertNotNull(savedDto.getContactId());
+        assertEquals(epDto.getContactNote(), savedDto.getContactNote());
+        assertEquals(epDto.getContactType(), savedDto.getContactType());
+        assertEquals(epDto.getFirstName(), savedDto.getFirstName());
+        assertEquals(epDto.getLastName(), savedDto.getLastName());
+        assertEquals(epDto.getTitle(), savedDto.getTitle());
+        assertEquals(refPersonType.getUuid(), savedDto.getPersonTypeId());
+        assertEquals(refSalutation.getUuid(), savedDto.getSalutationId());
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/SalutationServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/SalutationServiceTest.java
new file mode 100644
index 0000000..99f20d1
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/SalutationServiceTest.java
@@ -0,0 +1,125 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import org.eclipse.openk.contactbasedata.config.TestConfiguration;
+import org.eclipse.openk.contactbasedata.model.RefSalutation;
+import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.util.Assert;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+import static org.hibernate.validator.internal.util.Contracts.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.when;
+
+@DataJpaTest
+@ContextConfiguration(classes = {TestConfiguration.class})
+
+public class SalutationServiceTest {
+    @Qualifier("mySalutationService")
+    @Autowired
+    private SalutationService salutationService;
+
+    @MockBean
+    private SalutationRepository salutationRepository;
+
+    @Test
+    public void shouldFindAllSalutationsProperly() {
+        List<RefSalutation> rs = MockDataHelper.mockRefSalutations();
+        when(salutationRepository.findAll()).thenReturn(rs);
+        List<SalutationDto> retVals = salutationService.findAllSalutations();
+
+        assertEquals(rs.size(), retVals.size());
+        assertEquals(rs.size(), 2);
+        assertEquals(rs.get(1).getUuid(), retVals.get(1).getUuid());
+    }
+
+
+    @Test
+    public void shouldReturnSalutationByUuid() {
+
+        RefSalutation refSalutation = MockDataHelper.mockRefSalutation();
+        refSalutation.setType("Testtyp");
+        when( salutationRepository.findByUuid( any(UUID.class)) ).thenReturn(Optional.of(refSalutation));
+
+        SalutationDto salutationDto = salutationService.getSalutationByUuid(UUID.randomUUID());
+        assertEquals( salutationDto.getUuid(), refSalutation.getUuid() );
+        assertEquals( salutationDto.getType(), refSalutation.getType() );
+    }
+
+    @Test
+    public void shouldInsertSalutation(){
+        RefSalutation refSalutation = MockDataHelper.mockRefSalutation();
+
+        refSalutation.setUuid(UUID.fromString("1468275e-200b-11ea-978f-2e728ce88125"));
+        refSalutation.setType("Moin Herr");
+        refSalutation.setDescription("Anrede nordisch männlich");
+
+        SalutationDto salutationDto = MockDataHelper.mockSalutationDto();
+        salutationDto.setUuid(null);
+
+        when( salutationRepository.save( any( RefSalutation.class) )).thenReturn(refSalutation);
+
+        SalutationDto savedSalutationDto = salutationService.insertSalutation(salutationDto);
+        assertEquals("Moin Herr", savedSalutationDto.getType());
+        assertNotNull( savedSalutationDto.getUuid());
+    }
+
+    @Test
+    public void shouldUpdateSalutation() {
+
+        RefSalutation salutation = MockDataHelper.mockRefSalutation();
+        salutation.setType("Moin Frau");
+
+        SalutationDto salutationDto = MockDataHelper.mockSalutationDto();
+        salutationDto.setType("Moin Herr");
+
+        when( salutationRepository.findByUuid( any(UUID.class)) ).thenReturn(Optional.of(salutation));
+        when( salutationRepository.save( any(RefSalutation.class)) ).thenReturn(salutation);
+        SalutationDto salutationDtoUpdated = salutationService.updateSalutation(salutationDto);
+
+        assertEquals(salutation.getUuid(), salutationDtoUpdated.getUuid());
+        assertEquals("Moin Frau", salutationDtoUpdated.getType());
+    }
+
+
+    @Test
+    public void shouldDeleteSalutation() {
+
+        RefSalutation salutation = MockDataHelper.mockRefSalutation();
+
+        when(salutationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(salutation));
+        Mockito.doNothing().when(salutationRepository).delete( isA( RefSalutation.class ));
+        salutationService.removeSalutation(salutation.getUuid());
+
+        Mockito.verify(salutationRepository, times(1)).delete( salutation );
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/VersionServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/VersionServiceTest.java
new file mode 100644
index 0000000..271bc11
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/VersionServiceTest.java
@@ -0,0 +1,64 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import org.eclipse.openk.contactbasedata.config.TestConfiguration;
+import org.eclipse.openk.contactbasedata.constants.Constants;
+import org.eclipse.openk.contactbasedata.model.Version;
+import org.eclipse.openk.contactbasedata.repository.VersionRepository;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.VersionDto;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ContextConfiguration;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+//@RunWith(SpringRunner.class)
+@DataJpaTest
+@ContextConfiguration(classes = {TestConfiguration.class})
+
+public class VersionServiceTest {
+    @Qualifier("myVersionService")
+    @Autowired
+    private VersionService versionService;
+
+    @MockBean
+    private VersionRepository versionRepository;
+
+    @Test
+    public void shouldGetVersionProperly() {
+        Version mockVersion = MockDataHelper.mockVersion();
+        when(versionRepository.findById(any(Long.class))).thenReturn(Optional.of(mockVersion));
+        VersionDto versionDto = versionService.getVersion();
+
+        assertEquals( mockVersion.getVersion(), versionDto.getDbVersion() );
+    }
+
+    @Test
+    public void shouldGetVersionCorrectlyInErrorCase() {
+        when(versionRepository.findById(any(Long.class))).thenReturn(Optional.empty());
+        VersionDto versionDto = versionService.getVersion();
+        assertEquals(Constants.DB_VERSION_NOT_PRESENT, versionDto.getDbVersion() );
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
new file mode 100644
index 0000000..401bb41
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
@@ -0,0 +1,147 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.support;
+
+import org.eclipse.openk.contactbasedata.constants.Constants;
+import org.eclipse.openk.contactbasedata.model.*;
+import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
+import org.eclipse.openk.contactbasedata.viewmodel.VersionDto;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+public class MockDataHelper {
+
+    public static Version mockVersion() {
+        Version version = new Version();
+        version.setId(4711L);
+        version.setVersion("db-version_mock_1");
+        return version;
+    }
+
+    public static VersionDto mockVersionDto() {
+        VersionDto versionDto = new VersionDto();
+        versionDto.setBackendVersion("660");
+        versionDto.setDbVersion("550");
+        return versionDto;
+    }
+
+    public static VwDetailedContact mockVDetailedContact() {
+        VwDetailedContact contact = new VwDetailedContact();
+        contact.setId(1L);
+        contact.setUuid(UUID.randomUUID());
+        contact.setName("Haferkamp");
+        return contact;
+    }
+
+    public static Page<VwDetailedContact> mockVDetailedContactPage() {
+        VwDetailedContact v1 = mockVDetailedContact();
+        VwDetailedContact v2 = mockVDetailedContact();
+        v2.setId(2L);
+        v2.setName("Strofanov");
+        List<VwDetailedContact> list = Arrays.asList(v1, v2);
+        return new PageImpl<>(list, Pageable.unpaged(), list.size());
+    }
+
+    public static TblExternalPerson mockExternalPerson() {
+        TblContact c = new TblContact();
+        c.setId( 3L );
+        c.setContactType(Constants.CONTACT_TYPE_EXTERNAL_PERSON);
+        c.setUuid(UUID.randomUUID());
+        TblExternalPerson e = new TblExternalPerson();
+        e.setId( 34L );
+        e.setContact(c);
+        e.setFirstName("Florinda");
+        e.setLastName("Fieselbrink");
+        e.setTitle("Dr. von und zu");
+        e.setRefPersonType(mockRefPersonType());
+        e.setSalutation(mockRefSalutation());
+        c.setNote("Notiz am Rande");
+        return e;
+    }
+
+    public static ExternalPersonDto mockExternalPersonDto() {
+        ExternalPersonDto epd = new ExternalPersonDto();
+        epd.setContactId(UUID.randomUUID());
+        epd.setFirstName("Zotto");
+        epd.setLastName("Briketti");
+        epd.setContactType(Constants.CONTACT_TYPE_EXTERNAL_PERSON);
+        epd.setTitle("Dr. von und zu");
+        epd.setPersonTypeId(UUID.randomUUID());
+        epd.setSalutationId(UUID.randomUUID());
+        epd.setContactNote("Notiz am Rande");
+        return epd;
+    }
+
+    public static Page<ExternalPersonDto> mockExternalPersonDtoPage() {
+        ExternalPersonDto ep1 = mockExternalPersonDto();
+        ExternalPersonDto ep2 = mockExternalPersonDto();
+        ep2.setFirstName("Strofanov");
+        ep2.setContactId(UUID.randomUUID());
+        List<ExternalPersonDto> list = Arrays.asList(ep1, ep2);
+        return new PageImpl<>(list, Pageable.unpaged(), list.size());
+    }
+    public static RefSalutation mockRefSalutation() {
+        RefSalutation sal = new RefSalutation();
+        sal.setId(1L);
+        sal.setUuid(UUID.randomUUID());
+        sal.setDescription("Ave Marcus Antonius");
+        sal.setType("Maitre");
+        return sal;
+    }
+
+    public static SalutationDto mockSalutationDto() {
+        SalutationDto sal = new SalutationDto();
+        sal.setUuid(UUID.randomUUID());
+        sal.setDescription("Ave Caesar");
+        sal.setType("Maitre");
+        return sal;
+    }
+
+    public static List<SalutationDto> mockSalutationsDtos() {
+        List<SalutationDto> dtos = new LinkedList<>();
+        dtos.add( mockSalutationDto() );
+        SalutationDto sd2 = mockSalutationDto();
+        sd2.setType("Magistra");
+        sd2.setDescription("Ave Cleopatra");
+        dtos.add( sd2 );
+        return dtos;
+    }
+
+    public static List<RefSalutation> mockRefSalutations() {
+        List<RefSalutation> refs = new LinkedList<>();
+        refs.add( mockRefSalutation() );
+        RefSalutation sd2 = mockRefSalutation();
+        sd2.setType("Magistra");
+        sd2.setDescription("Ave Messalina");
+        refs.add( sd2 );
+        return refs;
+    }
+
+    public static RefPersonType mockRefPersonType() {
+        RefPersonType pt = new RefPersonType();
+        pt.setId(6L);
+        pt.setUuid(UUID.randomUUID());
+        pt.setDescription("Ehrenmann");
+        pt.setType("ehrenmann");
+        return pt;
+    }
+}
diff --git a/src/test/resouces/application.yml b/src/test/resouces/application.yml
new file mode 100644
index 0000000..63decee
--- /dev/null
+++ b/src/test/resouces/application.yml
@@ -0,0 +1,21 @@
+ #  *******************************************************************************
+ #  Copyright (c) 2019 Contributors to the Eclipse Foundation
+ #
+ #  See the NOTICE file(s) distributed with this work for additional
+ #  information regarding copyright ownership.
+ #
+ #  This program and the accompanying materials are made available under the
+ #  terms of the Eclipse Public License v. 2.0 which is available at
+ #  http://www.eclipse.org/legal/epl-2.0.
+ #
+ #  SPDX-License-Identifier: EPL-2.0
+ #  *******************************************************************************
+  spring:
+  datasource:
+    url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
+  jpa:
+    hibernate:
+      ddl-auto: create
+    show-sql: true
+  flyway:
+    enabled: false
\ No newline at end of file