diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
index 82a85d6..7d35734 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/CompanyController.java
@@ -61,7 +61,7 @@
             @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
     public Page<CompanyDto> readCompanys(
             @PageableDefault(sort = {"companyName"}, direction = Sort.Direction.ASC) Pageable pageable){
-            return companyService.findCompanys(pageable);
+            return companyService.findCompanies(pageable);
     }
 
     @PostMapping
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
index 388794a..02b0d1c 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/CompanyService.java
@@ -64,7 +64,7 @@
         );
     }
 
-    public Page<CompanyDto> findCompanys(Pageable pageable) {
+    public Page<CompanyDto> findCompanies(Pageable pageable) {
         return companyRepository.findAll(pageable).map(companyMapper::toCompanyDto);
     }
 
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 2ec988e..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,9 +422,6 @@
         return new PageImpl<>(list, Pageable.unpaged(), list.size());
     }
 
-
-
-    xxxx
     public static TblCompany mockCompany() {
         TblContact c = new TblContact();
         c.setId( 10L );
@@ -439,47 +436,32 @@
         return tblCompany;
     }
 
-    public static InternalPersonDto mockInternalPersonDto() {
-        InternalPersonDto ipd = new InternalPersonDto();
-        ipd.setContactUuid(UUID.randomUUID());
-        ipd.setFirstName("Hella");
-        ipd.setLastName("Wahnsinn");
-        ipd.setContactType(Constants.CONTACT_TYPE_INTERNAL_PERSON);
-        ipd.setTitle("Mrs.");
-        ipd.setDepartment("Beschwerdemanagement");
-        ipd.setUid("222-888");
-        ipd.setUserRef("HWAHNS");
-        ipd.setPersonTypeUuid(UUID.randomUUID());
-        ipd.setSalutationUuid(UUID.randomUUID());
-        ipd.setContactNote("Vorsicht");
-        return ipd;
+    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<InternalPersonDto> mockInternalPersonDtoPage(){
+    public static Page<CompanyDto> mockCompanyDtoPage(){
 
-        InternalPersonDto ip1 = mockInternalPersonDto();
+        CompanyDto com1 = mockCompanyDto();
 
-        InternalPersonDto ip2 = new InternalPersonDto();
-        ip2.setContactUuid(UUID.randomUUID());
-        ip2.setFirstName("Fritz");
-        ip2.setLastName("Alter");
-        ip2.setContactType(Constants.CONTACT_TYPE_INTERNAL_PERSON);
-        ip2.setTitle("Dr.");
-        ip2.setDepartment("Geschäftsführung");
-        ip2.setUid("333-999");
-        ip2.setUserRef("FALTER");
-        ip2.setPersonTypeUuid(UUID.randomUUID());
-        ip2.setSalutationUuid(UUID.randomUUID());
-        ip2.setContactNote("Gründer");
+        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<InternalPersonDto> list = Arrays.asList(ip1, ip2);
+        List<CompanyDto> list = Arrays.asList(com1, com2);
         return new PageImpl<>(list, Pageable.unpaged(), list.size());
     }
 
-
-    yyyy
-
-
     public static TblContact mockTblContact(){
         TblContact tblContact = new TblContact();
         tblContact.setId(5L);
