Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.contactBaseData.backend into KON_110-SpringSecurity
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java
index e5ef1be..5ac7356 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java
@@ -43,62 +43,4 @@
         return addressService.getAddressesByContactUuid(contactUuid);
     }
 
-
-//    @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/CommunicationTypeController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/CommunicationTypeController.java
index fe6b031..f0e5f71 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/CommunicationTypeController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/CommunicationTypeController.java
@@ -5,21 +5,14 @@
 import io.swagger.annotations.ApiResponses;
 import lombok.extern.log4j.Log4j2;
 import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
-import org.eclipse.openk.contactbasedata.service.CommunicationTypeService;
-import org.eclipse.openk.contactbasedata.service.ExternalPersonService;
+import org.eclipse.openk.contactbasedata.service.CommunicationTypeService;;
 import org.eclipse.openk.contactbasedata.viewmodel.CommunicationTypeDto;
-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.List;
 import java.util.UUID;
@@ -76,8 +69,7 @@
     public ResponseEntity updateCommunicationType(@PathVariable UUID uuid, @Validated @RequestBody CommunicationTypeDto communicationTypeDto) {
 
         if (!communicationTypeDto.getUuid().equals(uuid)) {
-            // TODO: Msg extrahieren
-            throw new BadRequestException("Die Id des Pfades stimmt nicht mit der des Objekts überein");
+            throw new BadRequestException("invalid.uuid.path.object");
         }
 
         communicationTypeService.updateCommunicationType(communicationTypeDto);
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonController.java
index 367b648..87d10d7 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonController.java
@@ -28,7 +28,6 @@
     @Autowired
     private ExternalPersonService externalPersonService;
 
-
     @GetMapping("/{contactUuid}")
     @ApiOperation(value = "Anzeigen einer externen Person")
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Erfolgreich durchgeführt"),
@@ -39,7 +38,7 @@
     }
 
     @GetMapping
-    @ApiOperation(value = "Anzeigen aller externen Personen", notes = "Sortieren ist möglich. Lieferanten werden seitenweise geliefert.")
+    @ApiOperation(value = "Anzeigen aller externen Personen", notes = "Sortieren ist möglich. Externe Personen werden seitenweise geliefert.")
     @ResponseStatus(HttpStatus.OK)
     @ApiResponses(value = {
             @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
@@ -74,8 +73,7 @@
     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");
+            throw new BadRequestException("invalid.uuid.path.object");
         }
 
         externalPersonService.updateExternalPerson(externalPersonDto);
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/InternalPersonController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/InternalPersonController.java
new file mode 100644
index 0000000..2322a6a
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/InternalPersonController.java
@@ -0,0 +1,82 @@
+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.InternalPersonService;
+import org.eclipse.openk.contactbasedata.viewmodel.InternalPersonDto;
+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("/internal-persons")
+public class InternalPersonController {
+    @Autowired
+    private InternalPersonService internalPersonService;
+
+    @GetMapping("/{contactUuid}")
+    @ApiOperation(value = "Anzeigen einer internen Person")
+    @ApiResponses(value = { @ApiResponse(code = 200, message = "Erfolgreich durchgeführt"),
+                            @ApiResponse(code = 404, message = "Person wurde nicht gefunden")})
+    @ResponseStatus(HttpStatus.OK)
+    public InternalPersonDto getInternalPerson(@PathVariable UUID contactUuid) {
+        return internalPersonService.findInternalPerson(contactUuid);
+    }
+
+    @GetMapping
+    @ApiOperation(value = "Anzeigen aller internen Personen", notes = "Sortieren ist möglich. Interne Personen werden seitenweise geliefert.")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    public Page<InternalPersonDto> readInternalPersons(
+            @PageableDefault(sort = {"lastName"}, direction = Sort.Direction.ASC) Pageable pageable){
+            return internalPersonService.findInternalPersons(pageable);
+    }
+
+    @PostMapping
+    @ApiOperation(value = "Anlegen einer internen Person")
+    @ApiResponses(value = {
+            @ApiResponse(code = 201, message = "interne Person erfolgreich angelegt"),
+            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
+    })
+    public ResponseEntity<InternalPersonDto> insertInternalPerson(
+            @Validated @RequestBody InternalPersonDto internalPersonDto) {
+        InternalPersonDto savedInternalPersonDto = internalPersonService.insertInternalPerson(internalPersonDto);
+        URI location = ServletUriComponentsBuilder
+                .fromCurrentRequestUri()
+                .path("/{uuid}")
+                .buildAndExpand(savedInternalPersonDto.getContactId())
+                .toUri();
+        return ResponseEntity.created(location).body(savedInternalPersonDto);
+    }
+
+    @PutMapping("/{contactUuid}")
+    @ApiOperation(value = "Ändern einer internen Person")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Interne Person wurde aktualisiert"),
+            @ApiResponse(code = 400, message = "Ungültige Eingabe"),
+            @ApiResponse(code = 404, message = "Nicht gefunden")})
+    public ResponseEntity updateInternalPerson(@PathVariable UUID contactUuid, @Validated @RequestBody InternalPersonDto internalPersonDto) {
+
+        if (!internalPersonDto.getContactId().equals(contactUuid)) {
+            throw new BadRequestException("invalid.uuid.path.object");
+        }
+
+        internalPersonService.updateInternalPerson(internalPersonDto);
+        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
index 0bf4bb8..1176ec3 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/SalutationController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/SalutationController.java
@@ -84,7 +84,7 @@
             @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) {
+    public ResponseEntity updateSalutation(@PathVariable UUID salutationUuid, @Validated @RequestBody SalutationDto salutationDto) {
 
         if (!salutationDto.getUuid().equals(salutationUuid)) {
             throw new BadRequestException("invalid.uuid.path.object");
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationTypeMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationTypeMapper.java
index 958fd5d..99b947f 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationTypeMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CommunicationTypeMapper.java
@@ -15,7 +15,6 @@
 package org.eclipse.openk.contactbasedata.mapper;
 
 import org.eclipse.openk.contactbasedata.model.RefCommunicationType;
-import org.eclipse.openk.contactbasedata.viewmodel.CommunicationDto;
 import org.eclipse.openk.contactbasedata.viewmodel.CommunicationTypeDto;
 import org.mapstruct.Mapper;
 import org.mapstruct.ReportingPolicy;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/InternalPersonMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/InternalPersonMapper.java
index d0855a9..e1f28c6 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/InternalPersonMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/InternalPersonMapper.java
@@ -15,7 +15,6 @@
 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;
@@ -25,8 +24,26 @@
 @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
 public interface InternalPersonMapper {
 
+
     @Mappings({
-            @Mapping( source="contact.uuid", target="id")
+            @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")
     })
     InternalPersonDto toInternalPersonDto(TblInternalPerson tblInternalPerson);
+
+    @Mappings({
+            @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")
+    })
+    TblInternalPerson toTblInternalPerson(InternalPersonDto internalPersonDto);
 }
\ 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
index 99a67ea..19c3b23 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblInternalPerson.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblInternalPerson.java
@@ -30,17 +30,21 @@
     private String firstName;
     private String lastName;
     private String title;
+    private String department;
     private String sid;
     private String userRef;
 
 
     @OneToOne
+    @JoinColumn( name = "fk_contact_id")
     private TblContact contact;
 
-    @OneToOne
-    private RefSalutation refSalutation;
+    @ManyToOne
+    @JoinColumn( name = "fk_salutation_id")
+    private RefSalutation salutation;
 
-    @OneToOne
+    @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/repository/AddressRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressRepository.java
index 085eb00..d7e4bc5 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressRepository.java
@@ -14,13 +14,10 @@
  */
 package org.eclipse.openk.contactbasedata.repository;
 
-import org.eclipse.openk.contactbasedata.model.RefSalutation;
 import org.eclipse.openk.contactbasedata.model.TblAddress;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
-
 import java.util.List;
-import java.util.Optional;
 import java.util.UUID;
 
 public interface AddressRepository extends JpaRepository<TblAddress, Long> {
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/CommunicationTypeRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/CommunicationTypeRepository.java
index 61eed73..af45b7e 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/CommunicationTypeRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/CommunicationTypeRepository.java
@@ -1,10 +1,7 @@
 package org.eclipse.openk.contactbasedata.repository;
 
 import org.eclipse.openk.contactbasedata.model.RefCommunicationType;
-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;
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java
index c32af23..76de05a 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/ContactRepository.java
@@ -2,7 +2,6 @@
 
 import org.eclipse.openk.contactbasedata.model.TblContact;
 import org.springframework.data.jpa.repository.JpaRepository;
-
 import java.util.Optional;
 import java.util.UUID;
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/ExternalPersonRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/ExternalPersonRepository.java
index 4f9dd2e..b09ea8f 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/ExternalPersonRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/ExternalPersonRepository.java
@@ -3,7 +3,6 @@
 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;
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java
new file mode 100644
index 0000000..a2f7a8b
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java
@@ -0,0 +1,13 @@
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.TblInternalPerson;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import java.util.Optional;
+import java.util.UUID;
+
+public interface InternalPersonRepository extends JpaRepository<TblInternalPerson, Long > {
+    @Query("select ip from TblInternalPerson ip where ip.contact.uuid = ?1")
+    Optional< TblInternalPerson > 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
index 35276b2..98b0d7a 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/PersonTypeRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/PersonTypeRepository.java
@@ -15,7 +15,6 @@
 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;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/SalutationRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/SalutationRepository.java
index 511685f..ed70443 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/SalutationRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/SalutationRepository.java
@@ -16,7 +16,6 @@
 
 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;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java
index e03ec03..37d932e 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java
@@ -15,20 +15,12 @@
 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.AddressMapper;
-import org.eclipse.openk.contactbasedata.mapper.SalutationMapper;
-import org.eclipse.openk.contactbasedata.model.RefSalutation;
 import org.eclipse.openk.contactbasedata.model.TblAddress;
 import org.eclipse.openk.contactbasedata.repository.AddressRepository;
-import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
 import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
-import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.UUID;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/BaseContactService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/BaseContactService.java
index 6c7c357..8ef4c32 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/BaseContactService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/BaseContactService.java
@@ -27,10 +27,9 @@
 
     public TblContact getContact(UUID contactUuid){
 
-        //TODO: Fehlermeldung mit message!
         return contactRepository
                 .findByUuid(contactUuid)
-                .orElseThrow(() -> new NotFoundException("Der Kontakt konnte nicht gefunden werden"));
+                .orElseThrow(() -> new NotFoundException("contact.not.found"));
     }
 
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/CommunicationTypeService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/CommunicationTypeService.java
index ddc7a6c..c7bc333 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/CommunicationTypeService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/CommunicationTypeService.java
@@ -1,22 +1,13 @@
 package org.eclipse.openk.contactbasedata.service;
 
 import lombok.extern.log4j.Log4j2;
-import org.eclipse.openk.contactbasedata.constants.Constants;
-import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
 import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
 import org.eclipse.openk.contactbasedata.mapper.CommunicationTypeMapper;
-import org.eclipse.openk.contactbasedata.mapper.ContactMapper;
-import org.eclipse.openk.contactbasedata.mapper.ExternalPersonMapper;
 import org.eclipse.openk.contactbasedata.model.*;
 import org.eclipse.openk.contactbasedata.repository.*;
 import org.eclipse.openk.contactbasedata.viewmodel.CommunicationTypeDto;
-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.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/ExternalPersonService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/ExternalPersonService.java
index 6ba6e67..2c1b8db 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/ExternalPersonService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/ExternalPersonService.java
@@ -83,17 +83,12 @@
                 .findByTblContactUuid(externalPersonDto.getContactId())
                 .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
 
-//        TblExternalPerson externalPersonToSave = externalPersonMapper.toTblExternalPerson(externalPersonDto);
-//        externalPersonToSave.setId(existingExternalPerson.getId());
-
         existingExternalPerson.setLastName(externalPersonDto.getLastName());
         existingExternalPerson.setFirstName(externalPersonDto.getFirstName());
         existingExternalPerson.setTitle(externalPersonDto.getTitle());
 
         setFromExternalPersonDto( existingExternalPerson, externalPersonDto );
-        //setFromExternalPersonDto( externalPersonToSave, externalPersonDto );
         externalPersonUpdated = externalPersonRepository.save(existingExternalPerson);
-        //externalPersonUpdated = externalPersonRepository.save(externalPersonToSave);
 
         return externalPersonMapper.toExternalPersonDto(externalPersonUpdated);
     }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java
new file mode 100644
index 0000000..a8afa8f
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java
@@ -0,0 +1,103 @@
+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.InternalPersonMapper;
+import org.eclipse.openk.contactbasedata.model.*;
+import org.eclipse.openk.contactbasedata.repository.*;
+import org.eclipse.openk.contactbasedata.viewmodel.InternalPersonDto;
+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 InternalPersonService {
+    @Autowired
+    private InternalPersonRepository internalPersonRepository;
+
+    @Autowired
+    private ContactRepository contactRepository;
+
+    @Autowired
+    private SalutationRepository salutationRepository;
+
+    @Autowired
+    private PersonTypeRepository personTypeRepository;
+
+    @Autowired
+    private InternalPersonMapper internalPersonMapper;
+
+    @Autowired
+    private ContactMapper contactMapper;
+
+    @Autowired
+    private BaseContactService baseContactService;
+
+    public InternalPersonDto findInternalPerson(UUID contactUuid) {
+        return internalPersonMapper.toInternalPersonDto(
+                internalPersonRepository.findByTblContactUuid(contactUuid).orElseThrow(NotFoundException::new)
+        );
+    }
+
+    public Page<InternalPersonDto> findInternalPersons(Pageable pageable) {
+        return internalPersonRepository.findAll(pageable).map(internalPersonMapper::toInternalPersonDto);
+    }
+
+
+    @Transactional
+    public InternalPersonDto insertInternalPerson(InternalPersonDto internalPersonDto) {
+        TblContact contactToSave = new TblContact();
+        contactToSave.setUuid(UUID.randomUUID());
+        contactToSave.setContactType(Constants.CONTACT_TYPE_INTERNAL_PERSON);
+
+        TblInternalPerson internalPersonToSave = internalPersonMapper.toTblInternalPerson(internalPersonDto);
+        internalPersonToSave.setContact(contactToSave);
+        contactRepository.save(internalPersonToSave.getContact());
+
+        setFromInternalPersonDto( internalPersonToSave, internalPersonDto );
+        // Save Contact first
+
+        // Then save dependent Model-Object
+        return internalPersonMapper.toInternalPersonDto(internalPersonRepository.save(internalPersonToSave));
+    }
+
+    @Transactional
+    public InternalPersonDto updateInternalPerson(InternalPersonDto internalPersonDto){
+        TblInternalPerson internalPersonUpdated;
+
+        //Interne Person holen
+        TblInternalPerson existingInternalPerson = internalPersonRepository
+                .findByTblContactUuid(internalPersonDto.getContactId())
+                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
+
+        existingInternalPerson.setLastName(internalPersonDto.getLastName());
+        existingInternalPerson.setFirstName(internalPersonDto.getFirstName());
+        existingInternalPerson.setTitle(internalPersonDto.getTitle());
+
+        setFromInternalPersonDto( existingInternalPerson, internalPersonDto );
+        internalPersonUpdated = internalPersonRepository.save(existingInternalPerson);
+
+        return internalPersonMapper.toInternalPersonDto(internalPersonUpdated);
+    }
+
+    private void setFromInternalPersonDto( TblInternalPerson destTblInternalPerson, InternalPersonDto sourceDto ) {
+        RefSalutation salutationUpdated = salutationRepository
+                .findByUuid(sourceDto.getSalutationId())
+                .orElseThrow(() -> new NotFoundException("salutation.uuid.not.existing"));
+        RefPersonType personTypeUpdated = personTypeRepository
+                .findByUuid(sourceDto.getPersonTypeId())
+                .orElseThrow(() -> new NotFoundException("person.type.uuid.not.existing"));
+
+        destTblInternalPerson.setSalutation(salutationUpdated);
+        destTblInternalPerson.setRefPersonType(personTypeUpdated);
+
+        destTblInternalPerson.getContact().setNote(sourceDto.getContactNote());
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
index 85ef29f..855e92e 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
@@ -1,5 +1,6 @@
 package org.eclipse.openk.contactbasedata.viewmodel;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -7,8 +8,9 @@
 
 @Data
 public class AddressDto implements Serializable {
-    private UUID uuid;
 
+    @JsonProperty("id")
+    private UUID uuid;
     private Boolean isMainAddress;
     private String postcode;
     private String community;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressTypeDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressTypeDto.java
index 8a4a6b7..ac4a496 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressTypeDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressTypeDto.java
@@ -1,5 +1,6 @@
 package org.eclipse.openk.contactbasedata.viewmodel;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -7,6 +8,8 @@
 
 @Data
 public class AddressTypeDto implements Serializable {
+
+    @JsonProperty("id")
     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
index 76ac357..81e34ef 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationDto.java
@@ -1,5 +1,6 @@
 package org.eclipse.openk.contactbasedata.viewmodel;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -8,7 +9,8 @@
 @Data
 public class CommunicationDto implements Serializable {
 
-    private Long id;
+    @JsonProperty("id")
+    private UUID  uuid;
     private String communicationData;
 
     //fromCommunicationType
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationTypeDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationTypeDto.java
index c861000..4f2e342 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationTypeDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CommunicationTypeDto.java
@@ -1,5 +1,6 @@
 package org.eclipse.openk.contactbasedata.viewmodel;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -7,6 +8,8 @@
 
 @Data
 public class CommunicationTypeDto implements Serializable {
+
+    @JsonProperty("id")
     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
index 5b40347..48ccac1 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java
@@ -7,6 +7,8 @@
 
 @Data
 public class CompanyDto implements Serializable {
+
+
     private UUID id;
     private String companyName;
     private String companyType;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactDto.java
index 8640323..efd16af 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactDto.java
@@ -1,5 +1,6 @@
 package org.eclipse.openk.contactbasedata.viewmodel;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -7,6 +8,8 @@
 
 @Data
 public class ContactDto implements Serializable {
+
+    @JsonProperty("id")
     private UUID id;
     private String contactType;
     private String note;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
index d90d76e..cf8cd41 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
@@ -1,5 +1,6 @@
 package org.eclipse.openk.contactbasedata.viewmodel;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -8,7 +9,8 @@
 @Data
 public class ExternalPersonDto implements Serializable {
 
-    //private UUID id;
+    @JsonProperty("id")
+    private UUID uuid;
     private String firstName;
     private String lastName;
     private String title;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
index d6cc25f..83a001e 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
@@ -1,5 +1,6 @@
 package org.eclipse.openk.contactbasedata.viewmodel;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -8,24 +9,25 @@
 @Data
 public class InternalPersonDto implements Serializable {
 
-    private UUID id;
+    @JsonProperty("id")
+    private UUID uuid;
     private String firstName;
     private String lastName;
     private String title;
+    private String department;
     private String sid;
     private String userRef;
 
     //from Contact
+    private UUID contactId;
     private String contactType;
-    private String note;
+    private String contactNote;
 
     // from RefPersonType
     private UUID personTypeId;
-    private String personTypeType;
-    private String personTypeDescription;
+    private String personType;
 
     //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
index 5292b9c..61b47b0 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/PersonTypeDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/PersonTypeDto.java
@@ -1,5 +1,6 @@
 package org.eclipse.openk.contactbasedata.viewmodel;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -7,6 +8,8 @@
 
 @Data
 public class PersonTypeDto implements Serializable {
+
+    @JsonProperty("id")
     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
index 67e2995..f1c74f2 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/SalutationDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/SalutationDto.java
@@ -1,5 +1,6 @@
 package org.eclipse.openk.contactbasedata.viewmodel;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -7,6 +8,8 @@
 
 @Data
 public class SalutationDto implements Serializable {
+
+    @JsonProperty("id")
     private UUID uuid;
     private String  type;
     private String description;
diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties
index b4541ed..935091e 100644
--- a/src/main/resources/messages.properties
+++ b/src/main/resources/messages.properties
@@ -3,6 +3,7 @@
 
 address.not.found=Adresse wurde nicht gefunden
 salutation.not.found=Anrede wurde nicht gefunden
+contact.not.found=Kontakt wurde nicht gefunden
 salutation.uuid.not.existing=Die \u00fcbergebene UUID einer Anrede existiert nicht
 communication.type.uuid.not.existing= Die \u00fcbergebene UUID eines Kommunikationstyps existiert nicht
 contact.uuid.not.existing= Die \u00fcbergebene UUID eines Kontaktes existiert nicht
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java b/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
index 7290e6d..8323d28 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
@@ -39,6 +39,9 @@
     ExternalPersonMapper externalPersonMapper() { return new ExternalPersonMapperImpl(); }
 
     @Bean
+    InternalPersonMapper internalPersonMapper() { return new InternalPersonMapperImpl(); }
+
+    @Bean
     ContactMapper contactMapper() { return new ContactMapperImpl(); }
 
     @Bean
@@ -62,6 +65,9 @@
     public ExternalPersonService myExternalPersonService() { return new ExternalPersonService(); }
 
     @Bean
+    public InternalPersonService myInternalPersonService() { return new InternalPersonService(); }
+
+    @Bean
     public SalutationService mySalutationService() { return new SalutationService(); }
 
     @Bean
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonControllerTest.java
index 105f453..c4fc5a5 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonControllerTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/ExternalPersonControllerTest.java
@@ -84,9 +84,6 @@
         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());
     }
 
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/InternalPersonControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/InternalPersonControllerTest.java
new file mode 100644
index 0000000..54b535e
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/InternalPersonControllerTest.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.service.InternalPersonService;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.eclipse.openk.contactbasedata.viewmodel.InternalPersonDto;
+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.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 InternalPersonControllerTest {
+
+    @MockBean
+    private InternalPersonService internalPersonService;
+
+    @Autowired
+    private MockMvc mockMvc;
+
+
+    @Test
+    public void shouldReturnARequestedIntPerson() throws Exception {
+        InternalPersonDto ip = MockDataHelper.mockInternalPersonDto();
+
+        when(internalPersonService.findInternalPerson(any(UUID.class))).thenReturn(ip);
+
+        mockMvc.perform(get("/internal-persons/"+UUID.randomUUID().toString()))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+                .andExpect(jsonPath("firstName", is(  ip.getFirstName())));
+    }
+
+
+    @Test
+    public void shouldReturnAllIntPersons() throws Exception {
+        Page<InternalPersonDto> ipPage = MockDataHelper.mockInternalPersonDtoPage();
+
+        when(internalPersonService.findInternalPersons(any(Pageable.class))).thenReturn(ipPage);
+
+        mockMvc.perform(get("/internal-persons"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+                .andExpect(jsonPath("totalElements", is(  2 )));
+    }
+
+    @Test
+    public void shouldUpdateIntPerson() throws Exception {
+        InternalPersonDto ip = MockDataHelper.mockInternalPersonDto();
+
+        when( internalPersonService.updateInternalPerson(any(InternalPersonDto.class))).thenReturn(ip);
+
+        mockMvc.perform(put("/internal-persons/{uuid}", ip.getContactId().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(ip)))
+                .andExpect(status().is2xxSuccessful());
+    }
+
+    @Test
+    public void shouldNotUpdateIntPersonDueToException() throws Exception {
+        InternalPersonDto ip = MockDataHelper.mockInternalPersonDto();
+
+        when( internalPersonService.updateInternalPerson(any(InternalPersonDto.class))).thenReturn(ip);
+
+        // provide different exception in url and object
+        mockMvc.perform(put("/internal-persons/{uuid}", UUID.randomUUID().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(ip)))
+                .andExpect(status().isBadRequest());
+    }
+
+    @Test
+    public void shouldInsertIntPerson() throws Exception {
+        InternalPersonDto ip = MockDataHelper.mockInternalPersonDto();
+
+        when( internalPersonService.insertInternalPerson(any(InternalPersonDto.class))).thenReturn(ip);
+
+        mockMvc.perform(post("/internal-persons")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(ip)))
+                .andExpect(jsonPath("$.lastName", is(ip.getLastName())))
+                .andExpect(jsonPath("$.contactId", not(ip.getContactId())))
+                .andExpect(jsonPath("$.contactNote", is(ip.getContactNote())))
+                .andExpect(status().is2xxSuccessful());
+    }
+
+}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/InternalPersonServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/InternalPersonServiceTest.java
new file mode 100644
index 0000000..6a18eef
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/InternalPersonServiceTest.java
@@ -0,0 +1,192 @@
+/*
+ *******************************************************************************
+ * 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.*;
+import org.eclipse.openk.contactbasedata.repository.*;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
+import org.eclipse.openk.contactbasedata.viewmodel.InternalPersonDto;
+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 InternalPersonServiceTest {
+    @Qualifier("myInternalPersonService")
+    @Autowired
+    private InternalPersonService internalPersonService;
+
+    @MockBean
+    private InternalPersonRepository internalPersonRepository;
+
+    @MockBean
+    private ContactRepository contactRepository;
+
+    @MockBean
+    private SalutationRepository salutationRepository;
+
+    @MockBean
+    private PersonTypeRepository personTypeRepository;
+
+    @Test
+    public void shouldFindAnInternalPersonProperly() {
+        TblInternalPerson ip = MockDataHelper.mockInternalPerson();
+        when(internalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(ip));
+        InternalPersonDto dto = internalPersonService.findInternalPerson(UUID.randomUUID());
+
+        assertEquals(ip.getContact().getUuid(), dto.getContactId());
+    }
+
+    @Test
+    public void shouldThrowInErrorCaseWithInternalPerson() {
+        TblInternalPerson ip = MockDataHelper.mockInternalPerson();
+        when(internalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
+        assertThrows(NotFoundException.class, () -> internalPersonService.findInternalPerson(UUID.randomUUID()));
+    }
+
+    @Test
+    public void shouldUpdateInternalPerson() {
+        InternalPersonDto ipDto = MockDataHelper.mockInternalPersonDto();
+        TblInternalPerson ipTbl = MockDataHelper.mockInternalPerson();
+        when(internalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(ipTbl));
+        when(salutationRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefSalutation()));
+        when(personTypeRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefPersonType()));
+
+        when(internalPersonRepository.save(any(TblInternalPerson.class)))
+                .then((Answer<TblInternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblInternalPerson) args[0];
+                });
+
+        InternalPersonDto savedDto = internalPersonService.updateInternalPerson(ipDto);
+        assertEquals(ipTbl.getContact().getUuid(), savedDto.getContactId());
+        assertEquals(ipTbl.getContact().getNote(), savedDto.getContactNote());
+        assertEquals(ipTbl.getContact().getContactType(), savedDto.getContactType());
+        assertEquals(ipTbl.getFirstName(), savedDto.getFirstName());
+        assertEquals(ipTbl.getLastName(), savedDto.getLastName());
+        assertEquals(ipTbl.getTitle(), savedDto.getTitle());
+        assertEquals(ipTbl.getUserRef(), savedDto.getUserRef());
+        assertEquals(ipTbl.getDepartment(), savedDto.getDepartment());
+        assertEquals(ipTbl.getSid(), savedDto.getSid());
+        assertEquals(ipTbl.getRefPersonType().getUuid(), savedDto.getPersonTypeId());
+        assertEquals(ipTbl.getSalutation().getUuid(), savedDto.getSalutationId());
+    }
+
+    @Test
+    public void shouldNotUpdateInternalPerson_Exception1() {
+        InternalPersonDto ipDto = MockDataHelper.mockInternalPersonDto();
+        TblInternalPerson ipTbl = MockDataHelper.mockInternalPerson();
+        when(internalPersonRepository.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(internalPersonRepository.save(any(TblInternalPerson.class)))
+                .then((Answer<TblInternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblInternalPerson) args[0];
+                });
+
+        assertThrows( NotFoundException.class, () -> internalPersonService.updateInternalPerson(ipDto));
+    }
+
+    @Test
+    public void shouldNotUpdateInternalPerson_Exception2() {
+        InternalPersonDto epDto = MockDataHelper.mockInternalPersonDto();
+        TblInternalPerson epTbl = MockDataHelper.mockInternalPerson();
+        when(internalPersonRepository.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(internalPersonRepository.save(any(TblInternalPerson.class)))
+                .then((Answer<TblInternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblInternalPerson) args[0];
+                });
+
+        assertThrows( NotFoundException.class, () -> internalPersonService.updateInternalPerson(epDto));
+    }
+    @Test
+    public void shouldNotUpdateInternalPerson_Exception3() {
+        InternalPersonDto ipDto = MockDataHelper.mockInternalPersonDto();
+        TblInternalPerson ipTbl = MockDataHelper.mockInternalPerson();
+        when(internalPersonRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(ipTbl));
+        when(salutationRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefSalutation()));
+        when(personTypeRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.empty());
+
+        when(internalPersonRepository.save(any(TblInternalPerson.class)))
+                .then((Answer<TblInternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblInternalPerson) args[0];
+                });
+
+        assertThrows( NotFoundException.class, () -> internalPersonService.updateInternalPerson(ipDto));
+    }
+
+    @Test
+    public void shouldInsertInternalPerson() {
+        InternalPersonDto ipDto = MockDataHelper.mockInternalPersonDto();
+        ipDto.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(internalPersonRepository.save(any(TblInternalPerson.class)))
+                .then((Answer<TblInternalPerson>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblInternalPerson) args[0];
+                });
+
+        InternalPersonDto savedDto = internalPersonService.insertInternalPerson(ipDto);
+        assertNotNull(savedDto.getContactId());
+        assertEquals(ipDto.getContactNote(), savedDto.getContactNote());
+        assertEquals(ipDto.getContactType(), savedDto.getContactType());
+        assertEquals(ipDto.getFirstName(), savedDto.getFirstName());
+        assertEquals(ipDto.getLastName(), savedDto.getLastName());
+        assertEquals(ipDto.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/support/MockDataHelper.java b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
index 11d6e90..d637058 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
@@ -16,11 +16,7 @@
 
 import org.eclipse.openk.contactbasedata.constants.Constants;
 import org.eclipse.openk.contactbasedata.model.*;
-import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
-import org.eclipse.openk.contactbasedata.viewmodel.CommunicationTypeDto;
-import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
-import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
-import org.eclipse.openk.contactbasedata.viewmodel.VersionDto;
+import org.eclipse.openk.contactbasedata.viewmodel.*;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Pageable;
@@ -273,8 +269,8 @@
         ctDto2.setDescription("Mobil");
         ctDto2.setType("Mobil");
         CommunicationTypeDto ctDto3 = mockCommunicationTypeDto();
-        ctDto3.setDescription("Persönlich");
-        ctDto3.setType("Persönlich");
+        ctDto3.setDescription("Pers�nlich");
+        ctDto3.setType("Pers�nlich");
 
         List<CommunicationTypeDto> listCtDto = new ArrayList<>();
         listCtDto.add(ctDto1);
@@ -291,8 +287,8 @@
         ct2.setDescription("Mobil");
         ct2.setType("Mobil");
         RefCommunicationType ct3 = mockRefCommunicationType();
-        ct3.setDescription("Persönlich");
-        ct3.setType("Persönlich");
+        ct3.setDescription("Pers�nlich");
+        ct3.setType("Pers�nlich");
 
         List<RefCommunicationType> listCt = new ArrayList<>();
         listCt.add(ct1);
@@ -301,4 +297,62 @@
 
         return listCt;
     }
+
+    public static TblInternalPerson mockInternalPerson() {
+        TblContact c = new TblContact();
+        c.setId( 10L );
+        c.setContactType(Constants.CONTACT_TYPE_INTERNAL_PERSON);
+        c.setUuid(UUID.randomUUID());
+        TblInternalPerson i = new TblInternalPerson();
+        i.setId( 12L );
+        i.setContact(c);
+        i.setFirstName("Wolfi");
+        i.setLastName("Weinbrenner");
+        i.setTitle("Freiherr");
+        i.setDepartment("Forschung");
+        i.setSid("111-777");
+        i.setUserRef("WWEINB");
+        i.setRefPersonType(mockRefPersonType());
+        i.setSalutation(mockRefSalutation());
+        c.setNote("Teilzeit");
+        return i;
+    }
+
+    public static InternalPersonDto mockInternalPersonDto() {
+        InternalPersonDto ipd = new InternalPersonDto();
+        ipd.setContactId(UUID.randomUUID());
+        ipd.setFirstName("Hella");
+        ipd.setLastName("Wahnsinn");
+        ipd.setContactType(Constants.CONTACT_TYPE_INTERNAL_PERSON);
+        ipd.setTitle("Mrs.");
+        ipd.setDepartment("Beschwerdemanagement");
+        ipd.setSid("222-888");
+        ipd.setUserRef("HWAHNS");
+        ipd.setPersonTypeId(UUID.randomUUID());
+        ipd.setSalutationId(UUID.randomUUID());
+        ipd.setContactNote("Vorsicht");
+        return ipd;
+    }
+
+    public static Page<InternalPersonDto> mockInternalPersonDtoPage(){
+
+        InternalPersonDto ip1 = mockInternalPersonDto();
+
+        InternalPersonDto ip2 = new InternalPersonDto();
+        ip2.setContactId(UUID.randomUUID());
+        ip2.setFirstName("Fritz");
+        ip2.setLastName("Alter");
+        ip2.setContactType(Constants.CONTACT_TYPE_INTERNAL_PERSON);
+        ip2.setTitle("Dr.");
+        ip2.setDepartment("Geschäftsführung");
+        ip2.setSid("333-999");
+        ip2.setUserRef("FALTER");
+        ip2.setPersonTypeId(UUID.randomUUID());
+        ip2.setSalutationId(UUID.randomUUID());
+        ip2.setContactNote("Gründer");
+
+        List<InternalPersonDto> list = Arrays.asList(ip1, ip2);
+        return new PageImpl<>(list, Pageable.unpaged(), list.size());
+    }
+
 }