diff --git a/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/MarathonServiceManagerTest.java b/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/MarathonServiceManagerTest.java
index c01de37..0baf722 100644
--- a/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/MarathonServiceManagerTest.java
+++ b/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/MarathonServiceManagerTest.java
@@ -22,10 +22,8 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import org.apache.aries.containers.Service;
@@ -161,11 +159,9 @@
         App app1 = new App();
         app1.setLabels(Collections.singletonMap(MarathonServiceManager.SERVICE_NAME, "svc1"));
 
-        Map<String, String> labels = new HashMap<>();
-        labels.put("somelabel", "somevalue");
-        labels.put(MarathonServiceManager.SERVICE_NAME, "svc2");
         App app2 = new App();
-        app2.setLabels(labels);
+        app2.addLabel("somelabel", "somevalue");
+        app2.addLabel(MarathonServiceManager.SERVICE_NAME, "svc2");
 
         GetAppsResponse sar = Mockito.mock(GetAppsResponse.class);
         Mockito.when(sar.getApps()).thenReturn(Arrays.asList(app1, app2));
diff --git a/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/ServiceImplTest.java b/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/ServiceImplTest.java
index e71d1f4..b435d72 100644
--- a/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/ServiceImplTest.java
+++ b/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/ServiceImplTest.java
@@ -18,6 +18,15 @@
  */
 package org.apache.aries.containers.marathon.impl;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.aries.containers.Container;
 import org.apache.aries.containers.ServiceConfig;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -28,6 +37,7 @@
 import mesosphere.marathon.client.Marathon;
 import mesosphere.marathon.client.model.v2.App;
 import mesosphere.marathon.client.model.v2.GetAppResponse;
+import mesosphere.marathon.client.model.v2.Task;
 
 public class ServiceImplTest {
     @Test
@@ -63,6 +73,62 @@
         assertEquals(3, svc.getActualInstanceCount());
     }
 
+    @Test
+    public void testListContainers() {
+        Marathon mc = Mockito.mock(Marathon.class);
+
+        List<Task> tasks = new ArrayList<>();
+        Task t1 = new Task();
+        t1.setId("task1");
+        t1.setHost("1.2.3.4");
+        t1.setPorts(Arrays.asList(1180, 1190));
+        tasks.add(t1);
+        Task t2 = new Task();
+        t2.setId("task2");
+        t2.setHost("4.3.2.1");
+        t2.setPorts(Arrays.asList(8080, 9090));
+        tasks.add(t2);
+
+        App a = new App();
+        a.setTasks(tasks);
+        GetAppResponse gar = getAppResponse(a);
+        Mockito.when(mc.getApp("mid1")).thenReturn(gar);
+
+        ServiceConfig cfg = ServiceConfig.builder("svc1", "a/b/c:d").
+                port(80).port(90).
+                build();
+        App app = new App();
+        app.setId("mid1");
+        ServiceImpl svc = new ServiceImpl(mc, app, cfg);
+
+        List<Container> containers = svc.listContainers();
+        assertEquals(2, containers.size());
+
+        Set<String> foundTasks = new HashSet<>();
+        for (Container c : containers) {
+            foundTasks.add(c.getID());
+            assertSame(svc, c.getService());
+
+            switch (c.getID()) {
+            case "task1":
+                assertEquals("1.2.3.4", c.getHostName());
+                Map<Integer,Integer> ports1 = new HashMap<>();
+                ports1.put(80, 1180);
+                ports1.put(90, 1190);
+                assertEquals(ports1, c.getExposedPorts());
+                break;
+            case "task2":
+                assertEquals("4.3.2.1", c.getHostName());
+                Map<Integer,Integer> ports2 = new HashMap<>();
+                ports2.put(80, 8080);
+                ports2.put(90, 9090);
+                assertEquals(ports2, c.getExposedPorts());
+                break;
+            }
+        }
+        assertEquals(new HashSet<>(Arrays.asList("task1", "task2")), foundTasks);
+    }
+
     private GetAppResponse getAppResponse(App a) {
         GetAppResponse gar = Mockito.mock(GetAppResponse.class);
         Mockito.when(gar.getApp()).thenReturn(a);
