conflicts resolved,
merge with KON-18
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 584b02f..7f25a06 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java
@@ -18,12 +18,17 @@
 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.AddressService;
 import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.annotation.Secured;
+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;
 
@@ -45,4 +50,69 @@
         return addressService.getAddressesByContactUuid(contactUuid);
     }
 
+    @GetMapping("/{contactUuid}/addresses/{addressUuid}")
+    @ApiOperation(value = "Eine bestimmte Adresse eines bestimmten Kontakts anzeigen.")
+    @ApiResponses(value = {
+            @ApiResponse(code = 404, message = "Kontaktadresse nicht gefunden."),
+            @ApiResponse(code = 400, message = "Ungültige Anfrage."),
+            @ApiResponse(code = 200, message = "Kontaktadresse erfolgreich gelesen.")})
+    public AddressDto readAddress(
+            @PathVariable UUID contactUuid,
+            @PathVariable UUID addressUuid) {
+
+        return addressService.getAddress(contactUuid, addressUuid);
+    }
+
+
+    @PostMapping("/{contactUuid}/addresses")
+    @ApiOperation(value = "Anlegen einer neuen Adresse")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Adresse erfolgreich angelegt"),
+            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
+    })
+    public ResponseEntity<AddressDto> insertAddress(
+            @PathVariable UUID contactUuid,
+            @Validated @RequestBody AddressDto addressDto) {
+        if (!contactUuid.equals(addressDto.getContactUuid())) {
+            throw new BadRequestException("invalid.uuid.path.object");
+        }
+        AddressDto savedAddressDto = addressService.insertAddress(contactUuid, addressDto);
+        URI location = ServletUriComponentsBuilder
+                .fromCurrentRequestUri()
+                .path("/{uuid}")
+                .buildAndExpand(savedAddressDto.getUuid())
+                .toUri();
+        return ResponseEntity.created(location).body(savedAddressDto);
+    }
+
+
+    @PutMapping("/{contactUuid}/addresses/{addressUuid}")
+    @ApiOperation(value = "Eine bestimmte Adresse eines bestimmten Kontakts bearbeiten.")
+    @ApiResponses(value = {
+            @ApiResponse(code = 404, message = "Adresse nicht gefunden."),
+            @ApiResponse(code = 400, message = "Ungültige Anfrage."),
+            @ApiResponse(code = 200, message = "Adresse erfolgreich geändert.")})
+    public ResponseEntity updateAddress(
+            @PathVariable UUID contactUuid,
+            @PathVariable UUID addressUuid,
+            @Validated @RequestBody AddressDto addressDto) {
+        if (!addressUuid.equals(addressDto.getUuid())) {
+            throw new BadRequestException("invalid.uuid.path.object");
+        }
+        addressService.updateAddress(contactUuid, addressDto);
+        return ResponseEntity.ok().build();
+    }
+
+    @DeleteMapping("{contactUuid}/addresses/{addressUuid}")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiOperation(value = "Eine bestimmte Adresse eines bestimmten Kontakts löschen")
+    @ApiResponses(value = {
+            @ApiResponse(code = 204, message = "Erfolgreich gelöscht"),
+            @ApiResponse(code = 400, message = "Ungültige Anfrage"),
+            @ApiResponse(code = 404, message = "Nicht gefunden")})
+    public void deleteAddress(@PathVariable("contactUuid") UUID contactUuid,
+                              @PathVariable("addressUuid") UUID addressUuid) {
+        addressService.deleteAddress(contactUuid, addressUuid);
+    }
+
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/enums/OperationType.java b/src/main/java/org/eclipse/openk/contactbasedata/enums/OperationType.java
new file mode 100644
index 0000000..c65a95e
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/enums/OperationType.java
@@ -0,0 +1,7 @@
+package org.eclipse.openk.contactbasedata.enums;
+
+public enum OperationType {
+    INSERT, UPDATE, CREATE, DELETE
+
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/exceptions/OperationDeniedException.java b/src/main/java/org/eclipse/openk/contactbasedata/exceptions/OperationDeniedException.java
new file mode 100644
index 0000000..f4440ae
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/exceptions/OperationDeniedException.java
@@ -0,0 +1,16 @@
+package org.eclipse.openk.contactbasedata.exceptions;
+
+import org.eclipse.openk.contactbasedata.enums.OperationType;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(code = HttpStatus.NOT_ACCEPTABLE)
+public class OperationDeniedException extends RuntimeException{
+
+    public OperationDeniedException() {
+
+    }
+
+    public OperationDeniedException(OperationType operation, 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
index e5a68cc..171fe9b 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressMapper.java
@@ -17,10 +17,24 @@
 import org.eclipse.openk.contactbasedata.model.TblAddress;
 import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
 import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
 import org.mapstruct.ReportingPolicy;
 
 @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
 public interface AddressMapper {
 
+    @Mappings({
+            @Mapping( source="tblContact.uuid", target="contactUuid"),
+            @Mapping( source="wgs_84_zone", target="wgs84Zone"),
+            @Mapping( source="refAddressType.uuid", target="addressTypeUuid"),
+    })
     AddressDto toAddressDto(TblAddress tblAdress);
+
+    @Mappings({
+
+            @Mapping( source="wgs84Zone", target="wgs_84_zone")
+    })
+    TblAddress toTblAddress(AddressDto adressDto);
+
 }
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java
index 30c59a2..4726130 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java
@@ -17,8 +17,6 @@
 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)
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java
index 276ac63..1282d06 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java
@@ -42,6 +42,7 @@
     private String urlMap;
     private String note;
 
+
     @ManyToOne
     @JoinColumn( name = "fk_contact_id")
     private TblContact tblContact;
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 d7e4bc5..19ef6d4 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressRepository.java
@@ -15,14 +15,29 @@
 package org.eclipse.openk.contactbasedata.repository;
 
 import org.eclipse.openk.contactbasedata.model.TblAddress;
+import org.eclipse.openk.contactbasedata.model.TblContact;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
 import java.util.List;
+import java.util.Optional;
 import java.util.UUID;
 
 public interface AddressRepository extends JpaRepository<TblAddress, Long> {
 
-    @Query("select a from TblAddress a where a.tblContact.uuid = ?1")
-    List< TblAddress > findByTblContactUuid(final UUID contactUuid);
+    public Optional<TblAddress> findByUuid(UUID uuid );
 
+    @Query("select a from TblAddress a where a.tblContact.uuid = ?1")
+    public List< TblAddress > findByTblContactUuid(final UUID contactUuid);
+
+    Optional<TblAddress> findByTblContactAndUuid(TblContact tblContact, UUID uuid);
+
+    @Query("select count(*) from TblAddress a where a.tblContact.id=:contactId and a.isMainAddress=:isMainAddress")
+    Long countByContactIdAndIsMainAddress(@Param("contactId") Long contactId, @Param("isMainAddress") boolean isMainAddress);
+
+    @Query("select count(*) from TblAddress a where a.tblContact.id=:contactId and a.isMainAddress=:isMainAddress and uuid <> :addressUuid")
+    Long countByContactIdAndMainAddressIsNotSame(@Param("contactId") Long supplierId, @Param("isMainAddress") Boolean isMmainAddress, @Param("addressUuid") UUID addressUuid);
 }
+
+
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 37d932e..ad03785 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java
@@ -15,13 +15,20 @@
 package org.eclipse.openk.contactbasedata.service;
 
 import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.enums.OperationType;
+import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.exceptions.OperationDeniedException;
 import org.eclipse.openk.contactbasedata.mapper.AddressMapper;
 import org.eclipse.openk.contactbasedata.model.TblAddress;
+import org.eclipse.openk.contactbasedata.model.TblContact;
 import org.eclipse.openk.contactbasedata.repository.AddressRepository;
+import org.eclipse.openk.contactbasedata.repository.AddressTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
 import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
 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;
@@ -33,6 +40,12 @@
     private AddressRepository addressRepository;
 
     @Autowired
+    private AddressTypeRepository addressTypeRepository;
+
+    @Autowired
+    private ContactRepository contactRepository;
+
+    @Autowired
     AddressMapper addressMapper;
 
 
@@ -44,4 +57,88 @@
     }
 
 
+    public AddressDto getAddress(UUID contactUuid, UUID addressUuid){
+        TblAddress tblAddress = addressRepository.findByUuid(addressUuid)
+                .orElseThrow( () -> new NotFoundException("address.uuid.not.existing"));
+        if(!tblAddress.getTblContact().getUuid().equals(contactUuid)) {
+            throw new BadRequestException("invalid.uuid.path.object");
+        }
+        return addressMapper.toAddressDto(tblAddress);
+    }
+
+    @Transactional
+    public AddressDto insertAddress(UUID contactUuid, AddressDto addressDto) {
+
+        TblContact tblContact = contactRepository
+                                .findByUuid(contactUuid)
+                                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
+
+        TblAddress addressToSave = addressMapper.toTblAddress(addressDto);
+        addressToSave.setUuid(UUID.randomUUID());
+        addressToSave.setTblContact(tblContact);
+
+        if (addressDto.getIsMainAddress()!=null && addressDto.getIsMainAddress() && !checkUniqueMainAddressForContactForInsert(tblContact.getId())) {
+            throw new OperationDeniedException(OperationType.UPDATE, "main.address.already.existing");
+        }
+
+        setFromAddressDto(addressToSave, addressDto);
+
+        TblAddress savedAddress = addressRepository.save(addressToSave);
+        return addressMapper.toAddressDto(savedAddress);
+    }
+
+    @Transactional
+    public AddressDto updateAddress(UUID contactUuid, AddressDto addressDto) {
+
+        TblContact contact = contactRepository.findByUuid(contactUuid)
+                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
+
+        TblAddress address = addressRepository.findByUuid(addressDto.getUuid())
+                .orElseThrow(() -> new NotFoundException("address.uuid.not.existing"));
+
+        TblAddress addressToSave = addressMapper.toTblAddress(addressDto);
+        addressToSave.setTblContact(contact);
+        addressToSave.setId(address.getId());
+
+        if (addressDto.getIsMainAddress()!=null && addressDto.getIsMainAddress() && !checkUniqueMainAddressForContactForUpdate(contact.getId(), addressDto.getUuid())) {
+            throw new OperationDeniedException(OperationType.UPDATE, "main.address.already.existing");
+        }
+
+        setFromAddressDto(addressToSave, addressDto);
+        TblAddress savedAddress = addressRepository.save(addressToSave);
+        return addressMapper.toAddressDto(savedAddress);
+    }
+
+
+    @Transactional
+    public void deleteAddress(UUID contactUuid, UUID addressUuid) {
+        TblContact tblContact = contactRepository.findByUuid(contactUuid)
+                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
+        TblAddress tblAddress = addressRepository.findByTblContactAndUuid(tblContact, addressUuid)
+                .orElseThrow(() -> new NotFoundException("address.uuid.not.existing"));
+
+        addressRepository.delete(tblAddress);
+    }
+
+    private boolean checkUniqueMainAddressForContactForInsert(Long contactId){
+        return addressRepository.countByContactIdAndIsMainAddress(contactId, true) == 0;
+    }
+
+    private boolean checkUniqueMainAddressForContactForUpdate( Long contactId, UUID addressUuid){
+       Long result = addressRepository.countByContactIdAndMainAddressIsNotSame(contactId,true, addressUuid) ;
+       return result==0;
+    }
+
+    private void setFromAddressDto( TblAddress destTblAddress, AddressDto sourceDto ) {
+
+        if( sourceDto.getAddressTypeUuid() != null ) {
+            destTblAddress.setRefAddressType( addressTypeRepository
+                    .findByUuid(sourceDto.getAddressTypeUuid())
+                    .orElseThrow(() -> new NotFoundException("address.type.uuid.not.existing")));
+        }
+        else {
+            destTblAddress.setRefAddressType(null);
+        }
+    }
+
 }
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 9b61df1..feeead7 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
@@ -25,6 +25,10 @@
 
     @JsonProperty("id")
     private UUID uuid;
+
+    @JsonProperty("contactId")
+    private UUID contactUuid;
+
     private Boolean isMainAddress;
     private String postcode;
     private String community;
@@ -38,8 +42,8 @@
     private String note;
 
     //fromAddressType
-    @JsonProperty("adressId")
-    private UUID adressUuid;
+    @JsonProperty("addressTypeId")
+    private UUID addressTypeUuid;
     private String type;
     private String description;
 }
diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties
index 935091e..2469ea6 100644
--- a/src/main/resources/messages.properties
+++ b/src/main/resources/messages.properties
@@ -8,3 +8,7 @@
 communication.type.uuid.not.existing= Die \u00fcbergebene UUID eines Kommunikationstyps existiert nicht
 contact.uuid.not.existing= Die \u00fcbergebene UUID eines Kontaktes existiert nicht
 person.type.uuid.not.existing= Die \u00fcbergebene UUID eines Personentyps existiert nicht
+address.uuid.not.existing= Die \u00fcbergebene UUID einer Adresse existiert nicht
+address.type.uuid.not.existing= Die \u00fcbergebene UUID eines Adresstyps existiert nicht
+
+main.address.already.existing F\u00fcdiesen Kontakt existiert bereits eine Hauptadresse
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressControllerTest.java
index 7ca9747..5e72971 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressControllerTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressControllerTest.java
@@ -15,11 +15,13 @@
 package org.eclipse.openk.contactbasedata.controller;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import jdk.nashorn.internal.ir.annotations.Ignore;
 import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
 import org.eclipse.openk.contactbasedata.service.AddressService;
 import org.eclipse.openk.contactbasedata.service.SalutationService;
 import org.eclipse.openk.contactbasedata.support.MockDataHelper;
 import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
+import org.eclipse.openk.contactbasedata.viewmodel.CommunicationTypeDto;
 import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
 import org.hamcrest.Matchers;
 import org.junit.jupiter.api.Test;
@@ -59,4 +61,87 @@
                 .andExpect(content().contentType(MediaType.APPLICATION_JSON));
     }
 
+    @Test
+    public void shouldReturnSingleAddress() throws Exception {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+
+        when(addressService.getAddress(any(UUID.class), any(UUID.class))).thenReturn(addressDto);
+
+        mockMvc.perform(get("/contacts/fc7f598b-0d51-46bb-9563-99851fe6a3ad/addresses/72e2ade0-376c-11ea-978f-2e728ce88125"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON));
+    }
+
+
+    @Test
+    public void shouldInsertAddress() throws Exception {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        addressDto.setUuid(UUID.fromString("1ad98d00-3774-11ea-850d-2e728ce88125"));
+        addressDto.setCommunity("Mullewapp");
+        addressDto.setCommunitySuffix("Nieder-");
+        addressDto.setHousenumber("15");
+        addressDto.setIsMainAddress(true);
+        addressDto.setLatitude("52°N");
+        addressDto.setLongitude("3°W");
+        addressDto.setNote("Zufahrt über Hof");
+        addressDto.setPostcode("12356");
+        addressDto.setStreet("Weideweg");
+        addressDto.setUrlMap("www.xyz");
+        addressDto.setWgs84Zone("84");
+        addressDto.setContactUuid(UUID.fromString("1ad98f8a-3774-11ea-850d-2e728ce88125"));
+        addressDto.setType("Privat");
+        addressDto.setDescription("???");
+        addressDto.setAddressTypeUuid(UUID.fromString("5956e65e-3774-11ea-978f-2e728ce88125"));
+
+        when(addressService.insertAddress(any(UUID.class), any(AddressDto.class)))
+                .thenReturn(addressDto);
+
+        mockMvc.perform(post("/contacts/{uuid}/addresses", addressDto.getContactUuid())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(addressDto)))
+                .andExpect(jsonPath("$.id", Matchers.is("1ad98d00-3774-11ea-850d-2e728ce88125")))
+                .andExpect(jsonPath("$.community", Matchers.is("Mullewapp" )))
+                .andExpect(jsonPath("$.communitySuffix", Matchers.is("Nieder-" )))
+                .andExpect(jsonPath("$.housenumber", Matchers.is("15" )))
+                .andExpect(jsonPath("$.isMainAddress", Matchers.is(true )))
+                .andExpect(jsonPath("$.latitude", Matchers.is("52°N" )))
+                .andExpect(jsonPath("$.longitude", Matchers.is("3°W" )))
+                .andExpect(jsonPath("$.note", Matchers.is("Zufahrt über Hof" )))
+                .andExpect(jsonPath("$.postcode", Matchers.is("12356" )))
+                .andExpect(jsonPath("$.street", Matchers.is("Weideweg" )))
+                .andExpect(jsonPath("$.urlMap", Matchers.is("www.xyz" )))
+                .andExpect(jsonPath("$.wgs84Zone", Matchers.is("84" )))
+                .andExpect(jsonPath("$.contactId", Matchers.is("1ad98f8a-3774-11ea-850d-2e728ce88125" )))
+                .andExpect(jsonPath("$.type", Matchers.is("Privat" )))
+                .andExpect(jsonPath("$.description", Matchers.is("???" )))
+                .andExpect(jsonPath("$.addressTypeId", Matchers.is("5956e65e-3774-11ea-978f-2e728ce88125" )));
+
+    }
+
+
+    @Test
+    public void shouldUpdateAddress() throws Exception {
+
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        when( addressService.updateAddress(any(UUID.class), any(AddressDto.class))).thenReturn(addressDto);
+
+        mockMvc.perform(put("/contacts/{contactUuid}/addresses/{addressUuid}", addressDto.getContactUuid(), addressDto.getUuid())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(addressDto)))
+                .andExpect(status().is2xxSuccessful());
+    }
+
+    @Test
+    public void shouldNotUpdateAddress() throws Exception {
+
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        when( addressService.updateAddress(any(UUID.class), any(AddressDto.class))).thenReturn(addressDto);
+
+        mockMvc.perform(put("/contacts/{contactUuid}/addresses/{addressUuid}", addressDto.getContactUuid(), UUID.randomUUID().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(addressDto)))
+                .andExpect(status().isBadRequest());
+    }
+
+
 }
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/AddressServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/AddressServiceTest.java
index 19b25c0..ff0bee5 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/service/AddressServiceTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/AddressServiceTest.java
@@ -15,15 +15,22 @@
 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.exceptions.OperationDeniedException;
+import org.eclipse.openk.contactbasedata.model.RefAddressType;
 import org.eclipse.openk.contactbasedata.model.RefSalutation;
 import org.eclipse.openk.contactbasedata.model.TblAddress;
+import org.eclipse.openk.contactbasedata.model.TblContact;
 import org.eclipse.openk.contactbasedata.repository.AddressRepository;
+import org.eclipse.openk.contactbasedata.repository.AddressTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
 import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
 import org.eclipse.openk.contactbasedata.support.MockDataHelper;
 import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
 import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
+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;
@@ -36,8 +43,8 @@
 
 import static org.hibernate.validator.internal.util.Contracts.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.isA;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.when;
 
@@ -52,6 +59,12 @@
     @MockBean
     private AddressRepository addressRepository;
 
+    @MockBean
+    private ContactRepository contactRepository;
+
+    @MockBean
+    private AddressTypeRepository addressTypeRepository;
+
     @Test
     public void shouldReturnAddressesByContactUuid() {
 
@@ -61,4 +74,205 @@
         List<AddressDto> dtoList = addressService.getAddressesByContactUuid(UUID.randomUUID());
         assertEquals(dtoList.size(), 2 );
     }
+
+    @Test
+    public void shouldReturnAddressesByContactUuidAndAddressUuid() {
+
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        when(addressRepository.findByUuid( any(UUID.class)) ).thenReturn(Optional.of(tblAddress));
+
+        AddressDto dto = addressService.getAddress(tblAddress.getTblContact().getUuid(), UUID.randomUUID());
+        assertEquals(tblAddress.getUuid(), dto.getUuid() );
+    }
+
+    @Test
+    public void shouldUpdateAddress() {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        TblContact tblContact = MockDataHelper.mockTblContact();
+        RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+        tblAddress.setTblContact(tblContact);
+
+        when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+        when(addressRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblAddress));
+        when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+        when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+
+        AddressDto savedAddress = addressService.updateAddress(addressDto.getUuid(), addressDto);
+
+        assertEquals(tblAddress.getTblContact().getUuid(), savedAddress.getContactUuid());
+        assertEquals(tblAddress.getUuid(), savedAddress.getUuid());
+        assertEquals(tblAddress.getCommunity(), savedAddress.getCommunity());
+        assertEquals(tblAddress.getCommunitySuffix(), savedAddress.getCommunitySuffix());
+        assertEquals(tblAddress.getHousenumber(), savedAddress.getHousenumber());
+        assertEquals(tblAddress.getIsMainAddress(), savedAddress.getIsMainAddress());
+        assertEquals(tblAddress.getLatitude(), savedAddress.getLatitude());
+        assertEquals(tblAddress.getLongitude(), savedAddress.getLongitude());
+        assertEquals(tblAddress.getPostcode(), savedAddress.getPostcode());
+        assertEquals(tblAddress.getStreet(), savedAddress.getStreet());
+        assertEquals(tblAddress.getRefAddressType().getUuid(), savedAddress.getAddressTypeUuid()); //klappt nicht, da UUIDs von RefAddressType unterschiedlich
+        assertEquals(tblAddress.getUrlMap(), savedAddress.getUrlMap());
+        assertEquals(tblAddress.getWgs_84_zone(), savedAddress.getWgs84Zone());
+    }
+
+    @Test
+    public void shouldNotUpdateAddress_Exception1() {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        TblContact tblContact = MockDataHelper.mockTblContact();
+        RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+        tblAddress.setTblContact(tblContact);
+
+        when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.empty());
+        when(addressRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblAddress));
+        when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+        when(addressRepository.save(any(TblAddress.class)))
+                .then((Answer<TblAddress>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblAddress) args[0];
+                });
+
+        assertThrows( NotFoundException.class, () -> addressService.updateAddress(addressDto.getUuid(), addressDto));
+    }
+
+    @Test
+    public void shouldNotUpdateAddress_Exception2() {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        TblContact tblContact = MockDataHelper.mockTblContact();
+        tblAddress.setTblContact(tblContact);
+
+        when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+        when(addressRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblAddress));
+        when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.empty());
+        when(addressRepository.save(any(TblAddress.class)))
+                .then((Answer<TblAddress>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblAddress) args[0];
+                });
+
+        assertThrows( NotFoundException.class, () -> addressService.updateAddress(addressDto.getUuid(), addressDto));
+    }
+
+    @Test
+    public void shouldNotUpdateAddress_Exception3() {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        addressDto.setIsMainAddress(true);
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        tblAddress.setIsMainAddress(true);
+        TblContact tblContact = MockDataHelper.mockTblContact();
+        RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+        tblAddress.setTblContact(tblContact);
+
+        when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+        when(addressRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblAddress));
+        when(addressRepository.countByContactIdAndMainAddressIsNotSame(any(Long.class), anyBoolean(), any(UUID.class)) ).thenReturn(3L);
+        when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+
+        when(addressRepository.save(any(TblAddress.class)))
+                .then((Answer<TblAddress>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblAddress) args[0];
+                });
+
+        assertThrows( OperationDeniedException.class, () -> addressService.updateAddress(addressDto.getUuid(), addressDto));
+
+    }
+
+    @Test
+    public void shouldInsertAddress() {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        TblContact tblContact = MockDataHelper.mockTblContact();
+        RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+        tblAddress.setTblContact(tblContact);
+
+        when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+        when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+        when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+
+        AddressDto savedAddress = addressService.insertAddress(addressDto.getUuid(), addressDto);
+
+        assertNotNull(savedAddress.getContactUuid());
+        assertEquals(tblAddress.getTblContact().getUuid(), savedAddress.getContactUuid());
+        assertEquals(tblAddress.getUuid(), savedAddress.getUuid());
+        assertEquals(tblAddress.getCommunity(), savedAddress.getCommunity());
+        assertEquals(tblAddress.getCommunitySuffix(), savedAddress.getCommunitySuffix());
+        assertEquals(tblAddress.getHousenumber(), savedAddress.getHousenumber());
+        assertEquals(tblAddress.getIsMainAddress(), savedAddress.getIsMainAddress());
+        assertEquals(tblAddress.getLatitude(), savedAddress.getLatitude());
+        assertEquals(tblAddress.getLongitude(), savedAddress.getLongitude());
+        assertEquals(tblAddress.getPostcode(), savedAddress.getPostcode());
+        assertEquals(tblAddress.getStreet(), savedAddress.getStreet());
+        assertEquals(tblAddress.getRefAddressType().getUuid(), savedAddress.getAddressTypeUuid());
+        assertEquals(tblAddress.getUrlMap(), savedAddress.getUrlMap());
+        assertEquals(tblAddress.getWgs_84_zone(), savedAddress.getWgs84Zone());
+
+    }
+
+    @Test
+    public void shouldNotInsertAddress_Exception_1() {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        TblContact tblContact = MockDataHelper.mockTblContact();
+        RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+        tblAddress.setTblContact(tblContact);
+
+        when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.empty());
+        when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+        when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+
+        assertThrows( NotFoundException.class, () -> addressService.insertAddress(addressDto.getUuid(), addressDto));
+
+    }
+
+    @Test
+    public void shouldNotInsertAddress_Exception_2() {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        TblContact tblContact = MockDataHelper.mockTblContact();
+        RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+        tblAddress.setTblContact(tblContact);
+
+        when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+        when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+        when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.empty());
+
+        assertThrows( NotFoundException.class, () -> addressService.insertAddress(addressDto.getUuid(), addressDto));
+    }
+
+
+    @Test
+    public void shouldNotInsertAddress_Exception3() {
+        AddressDto addressDto = MockDataHelper.mockAddressDto();
+        addressDto.setIsMainAddress(true);
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        tblAddress.setIsMainAddress(true);
+        TblContact tblContact = MockDataHelper.mockTblContact();
+        tblAddress.setTblContact(tblContact);
+
+        when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+        when(addressRepository.countByContactIdAndIsMainAddress(anyLong(), anyBoolean())).thenReturn(2L);
+        when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+
+        assertThrows( OperationDeniedException.class, () -> addressService.insertAddress(addressDto.getUuid(), addressDto));
+
+    }
+
+
+    @Test
+    public void shouldDeleteAddress() {
+        TblAddress tblAddress = MockDataHelper.mockTblAddress();
+        TblContact tblContact = MockDataHelper.mockTblContact();
+        tblAddress.setTblContact(tblContact);
+
+        when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+        when(addressRepository.findByTblContactAndUuid(any(TblContact.class), any(UUID.class))).thenReturn(Optional.of(tblAddress));
+        Mockito.doNothing().when(addressRepository).delete( isA( TblAddress.class ));
+
+        addressService.deleteAddress(tblContact.getUuid(), tblAddress.getUuid());
+
+        Mockito.verify(addressRepository, times(1)).delete( tblAddress );
+    }
+
 }
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 c4724ff..1fd010e 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
@@ -217,9 +217,9 @@
         tblAddress.setLongitude("2E");
         tblAddress.setNote("-");
         tblAddress.setPostcode("67890");
-        //tblAddress.setRefAddressType();
+        tblAddress.setRefAddressType(mockRefAddressType());
         tblAddress.setStreet("Moosrosenweg");
-        //tblAddress.setTblContact();
+        tblAddress.setTblContact(mockTblContact());
         tblAddress.setUrlMap("-");
         tblAddress.setUuid(UUID.fromString("f34dfffc-314a-11ea-978f-2e728ce88125"));
         tblAddress.setWgs_84_zone("-");
@@ -238,13 +238,15 @@
         addressDto.setLongitude("2E");
         addressDto.setNote("-");
         addressDto.setPostcode("67890");
-        //addressDto.setRefAddressType();
+        addressDto.setAddressTypeUuid(UUID.randomUUID());
         addressDto.setStreet("Moosrosenweg");
-        //addressDto.setTblContact();
+        addressDto.setContactUuid(UUID.randomUUID());
         addressDto.setUrlMap("-");
         addressDto.setUuid(UUID.fromString("f34dfffc-314a-11ea-978f-2e728ce88125"));
         addressDto.setWgs84Zone("-");
 
+        addressDto.setContactUuid(UUID.randomUUID());
+
         return addressDto;
     }
 
@@ -291,7 +293,7 @@
         tblAddressDto2.setLongitude("3E");
         tblAddressDto2.setNote("-");
         tblAddressDto2.setPostcode("87655");
-        //tblAddressDto2.setRefAddressType();
+        tblAddressDto2.setRefAddressType(mockRefAddressType());
         tblAddressDto2.setStreet("Birkenweg");
         //tblAddressDto2.setTblContact();
         tblAddressDto2.setUrlMap("-");
@@ -420,4 +422,23 @@
         return new PageImpl<>(list, Pageable.unpaged(), list.size());
     }
 
+    public static TblContact mockTblContact(){
+        TblContact tblContact = new TblContact();
+        tblContact.setId(5L);
+        tblContact.setUuid(UUID.randomUUID());
+        tblContact.setNote("Notiz");
+        tblContact.setContactType("E_P");
+
+        return tblContact;
+    }
+
+    public static ContactDto mockContactDto(){
+        ContactDto contactDto = new ContactDto();
+        contactDto.setUuid(UUID.randomUUID());
+        contactDto.setNote("Notiz");
+        contactDto.setContactType("E_P");
+
+        return contactDto;
+    }
+
 }