diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
new file mode 100644
index 0000000..7d35734
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
@@ -0,0 +1,102 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
+import org.eclipse.openk.contactbasedata.service.CompanyService;
+import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+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.security.access.annotation.Secured;
+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("/companies")
+public class CompanyController {
+    @Autowired
+    private CompanyService companyService;
+
+    @GetMapping("/{contactUuid}")
+    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
+    @ApiOperation(value = "Anzeigen einer Firma")
+    @ApiResponses(value = { @ApiResponse(code = 200, message = "Erfolgreich durchgeführt"),
+                            @ApiResponse(code = 404, message = "Firma wurde nicht gefunden")})
+    @ResponseStatus(HttpStatus.OK)
+    public CompanyDto getCompany(@PathVariable UUID contactUuid) {
+        return companyService.findCompany(contactUuid);
+    }
+
+    @GetMapping
+    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
+    @ApiOperation(value = "Anzeigen aller Firmen", notes = "Sortieren ist möglich. Firmen werden seitenweise geliefert.")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    public Page<CompanyDto> readCompanys(
+            @PageableDefault(sort = {"companyName"}, direction = Sort.Direction.ASC) Pageable pageable){
+            return companyService.findCompanies(pageable);
+    }
+
+    @PostMapping
+    @Secured("ROLE_KON-ADMIN")
+    @ApiOperation(value = "Anlegen einer Firma")
+    @ApiResponses(value = {
+            @ApiResponse(code = 201, message = "Firma erfolgreich angelegt"),
+            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
+    })
+    public ResponseEntity<CompanyDto> insertCompany(
+            @Validated @RequestBody CompanyDto companyDto) {
+        CompanyDto savedCompanyDto = companyService.insertCompany(companyDto);
+        URI location = ServletUriComponentsBuilder
+                .fromCurrentRequestUri()
+                .path("/{uuid}")
+                .buildAndExpand(savedCompanyDto.getContactUuid())
+                .toUri();
+        return ResponseEntity.created(location).body(savedCompanyDto);
+    }
+
+    @PutMapping("/{contactUuid}")
+    @Secured("ROLE_KON-ADMIN")
+    @ApiOperation(value = "Ändern einer externen Person")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Firma wurde aktualisiert"),
+            @ApiResponse(code = 400, message = "Ungültige Eingabe"),
+            @ApiResponse(code = 404, message = "Nicht gefunden")})
+    public ResponseEntity updateCompany(@PathVariable UUID contactUuid, @Validated @RequestBody CompanyDto companyDto) {
+
+        if (!companyDto.getContactUuid().equals(contactUuid)) {
+            throw new BadRequestException("invalid.uuid.path.object");
+        }
+
+        companyService.updateCompany(companyDto);
+        return ResponseEntity.ok().build();
+    }
+}
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java
index 458eecc..662f832 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/CompanyMapper.java
@@ -24,7 +24,16 @@
 @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
 public interface CompanyMapper {
     @Mappings({
-            @Mapping( source="contact.uuid", target="contactUuid")
+            @Mapping( source="contact.uuid", target="contactUuid"),
+            @Mapping( source="contact.contactType", target="contactType"),
+            @Mapping( source="contact.note", target="contactNote"),
     })
     CompanyDto toCompanyDto(TblCompany tblCompany);
+
+    @Mappings({
+            @Mapping( source="contactUuid", target="contact.uuid"),
+            @Mapping( source="contactType", target="contact.contactType"),
+            @Mapping( source="contactNote", target="contact.note"),
+    })
+    TblCompany toTblCompany(CompanyDto companyDto);
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java
index 23e288c..658e81c 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ExternalPersonMapper.java
@@ -26,7 +26,6 @@
 
     @Mappings({
             @Mapping( source="contact.uuid", target="contactUuid"),
-            //@Mapping( source="contact.uuid", target="contactId"),
             @Mapping( source="contact.contactType", target="contactType"),
             @Mapping( source="contact.note", target="contactNote"),
             @Mapping( source="refPersonType.uuid", target="personTypeUuid"),
@@ -37,7 +36,6 @@
     ExternalPersonDto toExternalPersonDto(TblExternalPerson tblExternalPerson);
 
     @Mappings({
-            //@Mapping( source="id", target="uuid"),
             @Mapping( source="contactUuid", target="contact.uuid"),
             @Mapping( source="contactType", target="contact.contactType"),
             @Mapping( source="contactNote", target="contact.note"),
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
index 8895d39..77f2316 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblCompany.java
@@ -33,6 +33,7 @@
     private String hrNumber;
 
     @OneToOne
+    @JoinColumn( name = "fk_contact_id")
     private TblContact contact;
 
     @OneToMany
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/CompanyRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/CompanyRepository.java
new file mode 100644
index 0000000..b27c86c
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/CompanyRepository.java
@@ -0,0 +1,28 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.TblCompany;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.Optional;
+import java.util.UUID;
+
+public interface CompanyRepository extends JpaRepository<TblCompany, Long > {
+    @Query("select co from TblCompany co where co.contact.uuid = :contactUuid")
+    Optional<TblCompany> findByTblContactUuid(@Param("contactUuid") UUID contactUuid);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
new file mode 100644
index 0000000..02b0d1c
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
@@ -0,0 +1,110 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.constants.Constants;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.mapper.CompanyMapper;
+import org.eclipse.openk.contactbasedata.mapper.ContactMapper;
+import org.eclipse.openk.contactbasedata.model.TblCompany;
+import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.eclipse.openk.contactbasedata.repository.CompanyRepository;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
+import org.eclipse.openk.contactbasedata.repository.PersonTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
+import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+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 CompanyService {
+    @Autowired
+    private CompanyRepository companyRepository;
+
+    @Autowired
+    private ContactRepository contactRepository;
+
+    @Autowired
+    private SalutationRepository salutationRepository;
+
+    @Autowired
+    private PersonTypeRepository personTypeRepository;
+
+    @Autowired
+    private CompanyMapper companyMapper;
+
+    @Autowired
+    private ContactMapper contactMapper;
+
+    @Autowired
+    private BaseContactService baseContactService;
+
+    public CompanyDto findCompany(UUID contactUuid) {
+        return companyMapper.toCompanyDto(
+                companyRepository.findByTblContactUuid(contactUuid).orElseThrow(NotFoundException::new)
+        );
+    }
+
+    public Page<CompanyDto> findCompanies(Pageable pageable) {
+        return companyRepository.findAll(pageable).map(companyMapper::toCompanyDto);
+    }
+
+
+    @Transactional
+    public CompanyDto insertCompany(CompanyDto companyDto) {
+        TblContact contactToSave = new TblContact();
+        contactToSave.setUuid(UUID.randomUUID());
+        contactToSave.setContactType(Constants.CONTACT_TYPE_COMPANY);
+
+        TblCompany companyToSave = companyMapper.toTblCompany(companyDto);
+        companyToSave.setContact(contactToSave);
+        contactRepository.save(companyToSave.getContact());
+
+        setFromCompanyDto( companyToSave, companyDto );
+
+        // Then save dependent Model-Object
+        return companyMapper.toCompanyDto(companyRepository.save(companyToSave));
+    }
+
+    @Transactional
+    public CompanyDto updateCompany(CompanyDto companyDto){
+        TblCompany companyUpdated;
+
+        //Interne Person holen
+        TblCompany existingCompany = companyRepository
+                .findByTblContactUuid(companyDto.getContactUuid())
+                .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
+
+        existingCompany.setCompanyName(companyDto.getCompanyName());
+        existingCompany.setCompanyType(companyDto.getCompanyType());
+
+        setFromCompanyDto( existingCompany, companyDto );
+        companyUpdated = companyRepository.save(existingCompany);
+
+        return companyMapper.toCompanyDto(companyUpdated);
+    }
+
+    private void setFromCompanyDto( TblCompany destTblCompany, CompanyDto sourceDto ) {
+
+        destTblCompany.getContact().setNote(sourceDto.getContactNote());
+    }
+}
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 3378d51..834d699 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/CompanyDto.java
@@ -22,9 +22,6 @@
 
 @Data
 public class CompanyDto implements Serializable {
-
-    @JsonProperty("id")
-    private UUID uuid;
     private String companyName;
     private String companyType;
     private String hrNumber;
@@ -33,5 +30,5 @@
     @JsonProperty("contactId")
     private UUID contactUuid;
     private String contactType;
-    private String note;
+    private String contactNote;
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
index 25a0675..a77b23b 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ContactPersonDto.java
@@ -23,8 +23,6 @@
 @Data
 public class ContactPersonDto implements Serializable {
 
-    @JsonProperty("id")
-    private UUID uuid;
     private String firstName;
     private String lastName;
     private String title;
@@ -36,7 +34,8 @@
     private String note;
 
     //from Company
-    private String companyId;
+    @JsonProperty("companyContactId")
+    private UUID companyContactUuid;
     private String companyName;
     private String companyType;
     private String hrNumber;
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 975f786..8dcf590 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/ExternalPersonDto.java
@@ -23,8 +23,6 @@
 @Data
 public class ExternalPersonDto implements Serializable {
 
-    @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 e07c8c7..9da4ff6 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
@@ -22,9 +22,6 @@
 
 @Data
 public class InternalPersonDto implements Serializable {
-
-    @JsonProperty("id")
-    private UUID uuid;
     private String firstName;
     private String lastName;
     private String title;
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 a5961c3..62524b1 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
@@ -42,6 +42,9 @@
     InternalPersonMapper internalPersonMapper() { return new InternalPersonMapperImpl(); }
 
     @Bean
+    CompanyMapper companyMapper() { return new CompanyMapperImpl(); }
+
+    @Bean
     ContactMapper contactMapper() { return new ContactMapperImpl(); }
 
     @Bean
@@ -74,6 +77,9 @@
     public InternalPersonService myInternalPersonService() { return new InternalPersonService(); }
 
     @Bean
+    public CompanyService myCompanyService() { return new CompanyService(); }
+
+    @Bean
     public SalutationService mySalutationService() { return new SalutationService(); }
 
     @Bean
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/CompanyControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/CompanyControllerTest.java
new file mode 100644
index 0000000..27963ea
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/CompanyControllerTest.java
@@ -0,0 +1,119 @@
+/*
+ *******************************************************************************
+ * 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.CompanyService;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+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.context.ActiveProfiles;
+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
+@ActiveProfiles("test") // Todo: Find a better way to configure the tests
+public class CompanyControllerTest {
+
+    @MockBean
+    private CompanyService companyService;
+
+    @Autowired
+    private MockMvc mockMvc;
+
+
+    @Test
+    public void shouldReturnARequestedExtPerson() throws Exception {
+        CompanyDto ep = MockDataHelper.mockCompanyDto();
+
+        when(companyService.findCompany(any(UUID.class))).thenReturn(ep);
+
+        mockMvc.perform(get("/companies/"+UUID.randomUUID().toString()))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+                .andExpect(jsonPath("companyName", is(  ep.getCompanyName())));
+    }
+
+
+    @Test
+    public void shouldReturnAllExtPerson() throws Exception {
+        Page<CompanyDto> epPage = MockDataHelper.mockCompanyDtoPage();
+
+        when(companyService.findCompanies(any(Pageable.class))).thenReturn(epPage);
+
+        mockMvc.perform(get("/companies"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+                .andExpect(jsonPath("totalElements", is(  2 )));
+    }
+
+    @Test
+    public void shouldUpdateExtPerson() throws Exception {
+        CompanyDto ep = MockDataHelper.mockCompanyDto();
+
+        when( companyService.updateCompany(any(CompanyDto.class))).thenReturn(ep);
+
+        mockMvc.perform(put("/companies/{uuid}", ep.getContactUuid().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(ep)))
+                .andExpect(status().is2xxSuccessful());
+    }
+
+    @Test
+    public void shouldNotUpdateExtPersonDueToException() throws Exception {
+        CompanyDto ep = MockDataHelper.mockCompanyDto();
+
+        when( companyService.updateCompany(any(CompanyDto.class))).thenReturn(ep);
+
+        // provide different exception in url and object
+        mockMvc.perform(put("/companies/{uuid}", UUID.randomUUID().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(ep)))
+                .andExpect(status().isBadRequest());
+    }
+
+    @Test
+    public void shouldInsertExtPerson() throws Exception {
+        CompanyDto companyDto = MockDataHelper.mockCompanyDto();
+
+        when( companyService.insertCompany(any(CompanyDto.class))).thenReturn(companyDto);
+
+        mockMvc.perform(post("/companies")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(companyDto)))
+                .andExpect(jsonPath("$.companyName", is(companyDto.getCompanyName())))
+                .andExpect(jsonPath("$.contactId", not(companyDto.getContactUuid())))
+                .andExpect(jsonPath("$.contactNote", is(companyDto.getContactNote())))
+                .andExpect(status().is2xxSuccessful());
+    }
+}
\ 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 04e7abc..5850ad6 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
@@ -422,6 +422,46 @@
         return new PageImpl<>(list, Pageable.unpaged(), list.size());
     }
 
+    public static TblCompany mockCompany() {
+        TblContact c = new TblContact();
+        c.setId( 10L );
+        c.setContactType(Constants.CONTACT_TYPE_COMPANY);
+        c.setUuid(UUID.randomUUID());
+        TblCompany tblCompany = new TblCompany();
+        tblCompany.setId( 12L );
+        tblCompany.setContact(c);
+        tblCompany.setCompanyName("Kuemmelbrot");
+        tblCompany.setCompanyType("GmbH");
+        c.setNote("insolvent");
+        return tblCompany;
+    }
+
+    public static CompanyDto mockCompanyDto() {
+        CompanyDto tblCompany = new CompanyDto();
+        tblCompany.setContactUuid(UUID.randomUUID());
+        tblCompany.setCompanyName("Kuemmelbrot");
+        tblCompany.setCompanyType("GmbH");
+        tblCompany.setContactType(Constants.CONTACT_TYPE_COMPANY);
+
+        tblCompany.setContactNote("Vorsicht");
+        return tblCompany;
+    }
+
+    public static Page<CompanyDto> mockCompanyDtoPage(){
+
+        CompanyDto com1 = mockCompanyDto();
+
+        CompanyDto com2 = new CompanyDto();
+        com2.setContactUuid(UUID.randomUUID());
+        com2.setCompanyName("Sputnik 2000");
+        com2.setCompanyType("AG");
+        com2.setContactType(Constants.CONTACT_TYPE_COMPANY);
+        com2.setContactNote("Gründer");
+
+        List<CompanyDto> list = Arrays.asList(com1, com2);
+        return new PageImpl<>(list, Pageable.unpaged(), list.size());
+    }
+
     public static TblContact mockTblContact(){
         TblContact tblContact = new TblContact();
         tblContact.setId(5L);
