diff --git a/runnable-mail_test.go b/runnable-mail_test.go
index 8398d36d175a74dbc153c5b444afa7e3fa8b5b2b..ecdf3e4bce037549f4295458b16283e3d42a2cee 100644
--- a/runnable-mail_test.go
+++ b/runnable-mail_test.go
@@ -10,9 +10,11 @@ import (
 	"time"
 )
 
-func startTestSMTPDockerImageAndContainer(t *testing.T, ctx context.Context) (string, error) {
+func startTestSMTPDockerImageAndContainer(t *testing.T, ctx context.Context) (*mockPortContainer, error) {
 	t.Helper()
 
+	mc := &mockPortContainer{}
+
 	smtpPortMap := nat.PortMap{
 		"1025/tcp": []nat.PortBinding{
 			{
@@ -28,24 +30,33 @@ func startTestSMTPDockerImageAndContainer(t *testing.T, ctx context.Context) (st
 		},
 	}
 
-	smtpCmd := []string{} // Ihr Command hier, falls nötig
-	smtpVolume := ""      // Ihr Volume hier
-	smtpPorts, err := startTestDockerImageAndContainer(t, ctx, "axllent/mailpit", smtpPortMap, smtpCmd, smtpVolume)
+	mr := &mockRunnable{
+		ctx:       ctx,
+		imageName: "axllent/mailpit",
+		portMap:   smtpPortMap,
+		cmd:       []string{},
+		volume:    "",
+		t:         t,
+	}
+
+	smtpPorts, err := mr.startTestDockerImageAndContainer()
 
 	if err != nil {
-		return "", err
+		return mc, err
 	}
 
 	pp := *smtpPorts
 
 	px, ok := pp["1025/tcp"]
 	if !ok {
-		return "", fmt.Errorf("1025/tcp port not found")
+		return mc, fmt.Errorf("1025/tcp port not found")
 	}
 
 	smtpPort := px[0].HostPort
 
-	return smtpPort, nil
+	mc.setPort(smtpPort)
+
+	return mc, nil
 
 	//cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
 	//if err != nil {
@@ -152,23 +163,23 @@ func TestMailRunner(t *testing.T) {
 	//portAsString := fmt.Sprintf("%d", portAsInt)
 	//_ = listener.Close()
 
-	var portAsString string
+	var pc *mockPortContainer
 	var err error
 
 	done := make(chan bool)
-	go func() {
-		portAsString, err = startTestSMTPDockerImageAndContainer(t, ctx)
-		if err != nil {
-			t.Errorf("Unexpected error: %v", err)
-			cancel()
-		}
-		done <- true
-	}()
+	//go func() {
+	pc, err = startTestSMTPDockerImageAndContainer(t, ctx)
+	if err != nil {
+		t.Errorf("Unexpected error: %v", err)
+		cancel()
+	}
+	done <- true
+	//}()
 
 	waitCtx, waitCancel := context.WithTimeout(ctx, 60*time.Second)
 	defer waitCancel()
 	for {
-		conn, err := net.DialTimeout("tcp", net.JoinHostPort(DOCKER_TEST_HOST_IP, portAsString), 1*time.Second)
+		conn, err := net.DialTimeout("tcp", net.JoinHostPort(DOCKER_TEST_HOST_IP, pc.getPort()), 1*time.Second)
 		if err == nil {
 			err = conn.Close()
 			assert.Nil(t, err)
@@ -192,7 +203,7 @@ func TestMailRunner(t *testing.T) {
 		Subject:  "this is a test",
 		Body:     "this is the body",
 		Server:   DOCKER_TEST_HOST_IP,
-		Port:     portAsString,
+		Port:     pc.getPort(),
 		Username: "",
 		Password: "",
 		Headers: map[string]string{
diff --git a/runnable-sftp_test.go b/runnable-sftp_test.go
index 53db3cb9afd533c055269162e8867e5c26687706..df297db5b5759db7dd112c26b3ae2d91b725a53c 100644
--- a/runnable-sftp_test.go
+++ b/runnable-sftp_test.go
@@ -12,7 +12,7 @@ import (
 	"time"
 )
 
-func startSFTPTestDockerImageAndContainer(t *testing.T, volume string, ctx context.Context) (string, error) {
+func startSFTPTestDockerImageAndContainer(t *testing.T, volumePath string, ctx context.Context) (string, error) {
 	t.Helper()
 
 	sftpPortMap := nat.PortMap{
@@ -25,8 +25,18 @@ func startSFTPTestDockerImageAndContainer(t *testing.T, volume string, ctx conte
 	}
 
 	sftpCmd := []string{"demo:secret:::upload"}
-	sftpVolume := volume // Ihr Volume hier
-	sftpPorts, err := startTestDockerImageAndContainer(t, ctx, "atmoz/sftp:alpine", sftpPortMap, sftpCmd, sftpVolume)
+	sftpVolume := volumePath // Ihr Volume hier
+
+	mr := &mockRunnable{
+		ctx:       ctx,
+		imageName: "atmoz/sftp:alpine",
+		portMap:   sftpPortMap,
+		cmd:       sftpCmd,
+		volume:    sftpVolume,
+		t:         t,
+	}
+
+	sftpPorts, err := mr.startTestDockerImageAndContainer()
 	if err != nil {
 		return "", err
 	}
@@ -240,6 +250,12 @@ func TestSFTPCRunnerLocalToRemote(t *testing.T) {
 }
 
 func TestSFTPCRunnerRemoteToLocal(t *testing.T) {
+
+	if os.Getenv("CI_SERVER") != "" {
+		t.Skip("Skipping test because CI_SERVER is set")
+		// TODO: run this test in CI
+	}
+
 	ctb := context.Background()
 	ctx, cancel := context.WithCancel(ctb)
 	t.Cleanup(func() {
@@ -266,23 +282,26 @@ func TestSFTPCRunnerRemoteToLocal(t *testing.T) {
 		}
 	}
 
-	var portAsString string
+	var mpContainer mockPortContainer
 	var err error
 
 	done := make(chan bool)
 	go func() {
-		portAsString, err = startSFTPTestDockerImageAndContainer(t, tempSrcDir, ctx)
+		portAsString, err := startSFTPTestDockerImageAndContainer(t, tempSrcDir, ctx)
 		if err != nil {
 			t.Errorf("Unexpected error: %v", err)
 			cancel()
 		}
+
+		mpContainer.setPort(portAsString)
+
 		done <- true
 	}()
 
 	waitCtx, waitCancel := context.WithTimeout(ctx, 60*time.Second)
 	defer waitCancel()
 	for {
-		conn, err := net.DialTimeout("tcp", net.JoinHostPort(DOCKER_TEST_HOST_IP, portAsString), 1*time.Second)
+		conn, err := net.DialTimeout("tcp", net.JoinHostPort(DOCKER_TEST_HOST_IP, mpContainer.getPort()), 1*time.Second)
 		if err == nil {
 			err = conn.Close()
 			assert.Nil(t, err)
@@ -302,8 +321,7 @@ func TestSFTPCRunnerRemoteToLocal(t *testing.T) {
 
 	tempDir := t.TempDir()
 
-	portAsInt, err := strconv.Atoi(portAsString)
-	assert.NoError(t, err)
+	portAsInt := mpContainer.getPortAsInt()
 
 	sftpRunnable := &SFTPRunnable{
 		Host:              DOCKER_TEST_HOST_IP,
diff --git a/utils.go b/utils.go
index ad993b5c5de4fee634785f3fd8fb51d2f5b3de25..62ddc89a6af9d2da3485ec93d9f16bac3ac93fae 100644
--- a/utils.go
+++ b/utils.go
@@ -6,6 +6,8 @@ import (
 	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/client"
 	"github.com/docker/go-connections/nat"
+	"strconv"
+	"sync"
 	"testing"
 	"time"
 )
@@ -14,9 +16,55 @@ const (
 	DOCKER_TEST_HOST_IP = "172.17.0.1"
 )
 
-func startTestDockerImageAndContainer(t *testing.T, ctx context.Context, imageName string, portMap nat.PortMap, cmd []string, volume string) (*nat.PortMap, error) {
+type mockPortContainer struct {
+	mu   sync.Mutex
+	port string
+}
+
+func (mp *mockPortContainer) getPort() string {
+	mp.mu.Lock()
+	defer mp.mu.Unlock()
+	return mp.port
+}
+
+func (mp *mockPortContainer) setPort(port string) {
+	mp.mu.Lock()
+	defer mp.mu.Unlock()
+	mp.port = port
+}
+
+func (mp *mockPortContainer) getPortAsInt() int {
+	mp.mu.Lock()
+	defer mp.mu.Unlock()
+	port, _ := strconv.Atoi(mp.port)
+	return port
+}
+
+type mockRunnable struct {
+	mu        sync.Mutex
+	ctx       context.Context
+	imageName string
+	portMap   nat.PortMap
+	cmd       []string
+	volume    string
+	t         *testing.T
+	hostPort  string
+	creatVol  bool
+}
+
+func (mr *mockRunnable) startTestDockerImageAndContainer() (*nat.PortMap, error) {
+	mr.mu.Lock()
+	defer mr.mu.Unlock()
+
+	t := mr.t
 	t.Helper()
 
+	ctx := mr.ctx
+	imageName := mr.imageName
+	portMap := mr.portMap
+	cmd := mr.cmd
+	volPath := mr.volume
+
 	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
 	if err != nil {
 		return nil, err
@@ -37,8 +85,8 @@ func startTestDockerImageAndContainer(t *testing.T, ctx context.Context, imageNa
 		PortBindings: portMap,
 	}
 
-	if volume != "" {
-		hostConfig.Binds = append(hostConfig.Binds, volume+":/home/demo/upload")
+	if volPath != "" {
+		hostConfig.Binds = append(hostConfig.Binds, volPath+":/home/demo/upload")
 	}
 
 	resp, err := cli.ContainerCreate(ctx, &container.Config{