diff --git a/.gitignore b/.gitignore
index a06a05b..361c9ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,9 @@
 # Mac
 .DS_Store
 
+# goenv
+.go-version
+
 # Gradle
 .gradle/
 .gogradle/
@@ -27,10 +30,12 @@
 openwhisk/_test/*.jar
 openwhisk/_test/compile/
 openwhisk/_test/output/
+openwhisk/_test/venv/
 openwhisk/action/
 openwhisk/compile/
 openwhisk/debug.test
 *.pyc
+*.env
 
 # Eclipse
 tests/bin/
diff --git a/CHANGES.md b/CHANGES.md
index 44a7c61..6d83c4d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -17,7 +17,8 @@
 #
 -->
 
-# next release
+# 1.17.1
+- support for zipping and unzipping symbolic links (required to support virtualenvs)
 - go 1.15 runtime upgraded to 1.15.13
 
 # 1.17.0
diff --git a/openwhisk/_test/build.sh b/openwhisk/_test/build.sh
index fe17a65..769c58e 100755
--- a/openwhisk/_test/build.sh
+++ b/openwhisk/_test/build.sh
@@ -60,4 +60,4 @@
 echo exec/env >helloack/exec.env
 zip -j helloack.zip helloack/*
 
-
+python3 -m venv venv
diff --git a/openwhisk/util_test.go b/openwhisk/util_test.go
index 586520a..fc0d810 100644
--- a/openwhisk/util_test.go
+++ b/openwhisk/util_test.go
@@ -138,6 +138,7 @@
 	os.Remove(file.Name())
 }
 
+// printing output only if no errors
 func sys(cli string, args ...string) {
 	os.Chmod(cli, 0755)
 	cmd := exec.Command(cli, args...)
@@ -149,6 +150,17 @@
 	}
 }
 
+// version printing output also when errors
+func sys2(cli string, args ...string) {
+	os.Chmod(cli, 0755)
+	cmd := exec.Command(cli, args...)
+	out, err := cmd.CombinedOutput()
+	fmt.Print(string(out))
+	if err != nil {
+		log.Print(err)
+	}
+}
+
 func exists(dir, filename string) error {
 	path := fmt.Sprintf("%s/%d/%s", dir, highestDir(dir), filename)
 	_, err := os.Stat(path)
diff --git a/openwhisk/version.go b/openwhisk/version.go
index fd310fe..d8ede5b 100644
--- a/openwhisk/version.go
+++ b/openwhisk/version.go
@@ -17,4 +17,4 @@
 package openwhisk
 
 // Version number - internal
-var Version = "1.16.0"
+var Version = "1.17.1"
diff --git a/openwhisk/zip.go b/openwhisk/zip.go
index fd4b994..f327a53 100644
--- a/openwhisk/zip.go
+++ b/openwhisk/zip.go
@@ -60,24 +60,42 @@
 	os.MkdirAll(dest, 0755)
 	// Closure to address file descriptors issue with all the deferred .Close() methods
 	extractAndWriteFile := func(f *zip.File) error {
+
+		path := filepath.Join(dest, f.Name)
+		isLink := f.FileInfo().Mode()&os.ModeSymlink == os.ModeSymlink
+
+		// dir
+		if f.FileInfo().IsDir() && !isLink {
+			return os.MkdirAll(path, f.Mode())
+		}
+
+		// open file
 		rc, err := f.Open()
-		defer rc.Close()
 		if err != nil {
 			return err
 		}
-		path := filepath.Join(dest, f.Name)
-		if f.FileInfo().IsDir() {
-			return os.MkdirAll(path, 0755)
+		defer rc.Close()
+
+		// link
+		if isLink {
+			buf, err := ioutil.ReadAll(rc)
+			if err != nil {
+				return err
+			}
+			return os.Symlink(string(buf), path)
 		}
+
+		// file
+		// eventually create a missing ddir
 		err = os.MkdirAll(filepath.Dir(path), 0755)
 		if err != nil {
 			return err
 		}
 		file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
-		defer file.Close()
 		if err != nil {
 			return err
 		}
+		defer file.Close()
 		_, err = io.Copy(file, rc)
 		return err
 	}
@@ -96,24 +114,56 @@
 	zwr := zip.NewWriter(buf)
 	dir = filepath.Clean(dir)
 	err := filepath.Walk(dir, func(filePath string, info os.FileInfo, err error) error {
-		if info.IsDir() {
+
+		// trim the relevant part of the path
+		relPath := strings.TrimPrefix(filePath, dir)
+		if relPath == "" {
 			return nil
 		}
+		relPath = relPath[1:]
 		if err != nil {
 			return err
 		}
-		relPath := strings.TrimPrefix(filePath, dir)[1:]
-		zipFile, err := zwr.Create(relPath)
-		if err != nil {
-			return err
+
+		// create a proper entry
+		isLink := (info.Mode() & os.ModeSymlink) == os.ModeSymlink
+		header := &zip.FileHeader{
+			Name:   relPath,
+			Method: zip.Deflate,
 		}
-		fsFile, err := os.Open(filePath)
-		if err != nil {
-			return err
-		}
-		_, err = io.Copy(zipFile, fsFile)
-		if err != nil {
-			return err
+		if isLink {
+			header.SetMode(0755 | os.ModeSymlink)
+			w, err := zwr.CreateHeader(header)
+			if err != nil {
+				return err
+			}
+			ln, err := os.Readlink(filePath)
+			if err != nil {
+				return err
+			}
+			w.Write([]byte(ln))
+		} else if info.IsDir() {
+			header.Name = relPath + "/"
+			header.SetMode(0755)
+			_, err := zwr.CreateHeader(header)
+			if err != nil {
+				return err
+			}
+		} else if info.Mode().IsRegular() {
+			header.SetMode(0755)
+			w, err := zwr.CreateHeader(header)
+			if err != nil {
+				return err
+			}
+			fsFile, err := os.Open(filePath)
+			if err != nil {
+				return err
+			}
+			defer fsFile.Close()
+			_, err = io.Copy(w, fsFile)
+			if err != nil {
+				return err
+			}
 		}
 		return nil
 	})
diff --git a/openwhisk/zip_test.go b/openwhisk/zip_test.go
index f386ef0..c72d5f3 100644
--- a/openwhisk/zip_test.go
+++ b/openwhisk/zip_test.go
@@ -18,6 +18,7 @@
 
 import (
 	"fmt"
+	"io/ioutil"
 	"os"
 )
 
@@ -54,3 +55,23 @@
 	// ./action/unzip/exec.jar
 	// <nil>
 }
+
+func Example_venv() {
+	os.RemoveAll("./action/unzip")
+	os.Mkdir("./action/unzip", 0755)
+	buf, err := Zip("_test/venv")
+	fmt.Println(1, err)
+	err = ioutil.WriteFile("/tmp/appo.zip", buf, 0644)
+	fmt.Println(2, err)
+	err = UnzipOrSaveJar(buf, "./action/unzip", "./action/unzip/exec.jar")
+	sys("bash", "-c", "cd action/unzip/bin && find . -type l -name python && rm ./python")
+	sys2("bash", "-c", "diff -qr _test/venv action/unzip 2>/dev/null")
+	fmt.Println(3, err)
+	// Output:
+	// 1 <nil>
+	// 2 <nil>
+	// ./python
+	// Only in _test/venv/bin: python
+	// 3 <nil>
+
+}
