diff --git a/ftp/ftp.go b/ftp/ftp.go
index d0e6b863d..2acc9736e 100644
--- a/ftp/ftp.go
+++ b/ftp/ftp.go
@@ -4,7 +4,7 @@ package ftp
 import (
 	"io"
 	"net/url"
-	"path/filepath"
+	"path"
 	"strings"
 	"sync"
 	"time"
@@ -101,7 +101,7 @@ func ftpConnection(name, root string) (*ftp.ServerConn, *url.URL, error) {
 	if err != nil {
 		return nil, nil, errors.Wrap(err, "open ftp connection url parse")
 	}
-	u.Path = filepath.Join(u.Path, root)
+	u.Path = path.Join(u.Path, root)
 	fs.Debugf(nil, "New ftp Connection with name %s and url %s (path %s)", name, u.String(), u.Path)
 	globalMux.Lock()
 	defer globalMux.Unlock()
@@ -148,12 +148,15 @@ func NewFs(name, root string) (fs.Fs, error) {
 func (f *Fs) NewObject(remote string) (fs.Object, error) {
 	fs.Debugf(f, "ENTER function 'NewObject' called with remote %s", remote)
 	defer fs.Debugf(f, "EXIT function 'NewObject'")
-	dir := filepath.Dir(remote)
-	base := filepath.Base(remote)
+	dir := path.Dir(remote)
+	base := path.Base(remote)
 
 	f.mu.Lock()
-	files, _ := f.c.List(dir)
+	files, err := f.c.List(dir)
 	f.mu.Unlock()
+	if err != nil {
+		return nil, err
+	}
 	for i := range files {
 		if files[i].Name == base {
 			o := &Object{
@@ -177,11 +180,15 @@ func (f *Fs) list(out fs.ListOpts, dir string, curlevel int) {
 	fs.Debugf(f, "ENTER function 'list'")
 	defer fs.Debugf(f, "EXIT function 'list'")
 	f.mu.Lock()
-	files, _ := f.c.List(filepath.Join(f.root, dir))
+	files, err := f.c.List(path.Join(f.root, dir))
 	f.mu.Unlock()
+	if err != nil {
+		out.SetError(err)
+		return
+	}
 	for i := range files {
 		object := files[i]
-		newremote := filepath.Join(dir, object.Name)
+		newremote := path.Join(dir, object.Name)
 		switch object.Type {
 		case ftp.EntryTypeFolder:
 			if out.IncludeDirectory(newremote) {
@@ -192,7 +199,7 @@ func (f *Fs) list(out fs.ListOpts, dir string, curlevel int) {
 					Count: -1,
 				}
 				if curlevel < out.Level() {
-					f.list(out, filepath.Join(dir, object.Name), curlevel+1)
+					f.list(out, path.Join(dir, object.Name), curlevel+1)
 				}
 				if out.AddDir(d) {
 					return
@@ -262,12 +269,16 @@ func (f *Fs) Put(in io.Reader, src fs.ObjectInfo) (fs.Object, error) {
 func (f *Fs) getInfo(remote string) (*FileInfo, error) {
 	fs.Debugf(f, "ENTER function 'getInfo' on file %s", remote)
 	defer fs.Debugf(f, "EXIT function 'getInfo'")
-	dir := filepath.Dir(remote)
-	base := filepath.Base(remote)
+	dir := path.Dir(remote)
+	base := path.Base(remote)
 
 	f.mu.Lock()
-	files, _ := f.c.List(dir)
+	files, err := f.c.List(dir)
 	f.mu.Unlock()
+	if err != nil {
+		return nil, err
+	}
+
 	for i := range files {
 		if files[i].Name == base {
 			info := &FileInfo{
@@ -296,12 +307,12 @@ func (f *Fs) mkdir(abspath string) error {
 	return err
 }
 
-// Mkdir creates the container if it doesn't exist
+// Mkdir creates the directory if it doesn't exist
 func (f *Fs) Mkdir(dir string) error {
 	// This actually works as mkdir -p
 	fs.Debugf(f, "ENTER function 'Mkdir' on '%s/%s'", f.root, dir)
 	defer fs.Debugf(f, "EXIT function 'Mkdir' on '%s/%s'", f.root, dir)
-	abspath := filepath.Join(f.root, dir)
+	abspath := path.Join(f.root, dir)
 	tokens := strings.Split(abspath, "/")
 	curdir := ""
 	for i := range tokens {
@@ -320,21 +331,21 @@ func (f *Fs) Mkdir(dir string) error {
 func (f *Fs) Rmdir(dir string) error {
 	// This is actually a recursive remove directory
 	f.mu.Lock()
-	files, err := f.c.List(filepath.Join(f.root, dir))
+	files, err := f.c.List(path.Join(f.root, dir))
 	f.mu.Unlock()
 	if err != nil {
 		return errors.Wrap(err, "rmdir")
 	}
 	for i := range files {
 		if files[i].Type == ftp.EntryTypeFolder {
-			err = f.Rmdir(filepath.Join(dir, files[i].Name))
+			err = f.Rmdir(path.Join(dir, files[i].Name))
 			if err != nil {
 				return errors.Wrap(err, "rmdir")
 			}
 		}
 	}
 	f.mu.Lock()
-	err = f.c.RemoveDir(filepath.Join(f.root, dir))
+	err = f.c.RemoveDir(path.Join(f.root, dir))
 	f.mu.Unlock()
 	return err
 }
@@ -402,7 +413,7 @@ func (f *ftpReadCloser) Close() error {
 
 // Open an object for read
 func (o *Object) Open(options ...fs.OpenOption) (io.ReadCloser, error) {
-	path := filepath.Join(o.fs.root, o.remote)
+	path := path.Join(o.fs.root, o.remote)
 	fs.Debugf(o.fs, "ENTER function 'Open' on file '%s' in root '%s'", o.remote, o.fs.root)
 	defer fs.Debugf(o.fs, "EXIT function 'Open' %s", path)
 	c, _, err := ftpConnection(o.fs.name, o.fs.root)
@@ -418,7 +429,7 @@ func (o *Object) Open(options ...fs.OpenOption) (io.ReadCloser, error) {
 
 // makeAllDir creates the parent directories for the object
 func (o *Object) makeAllDir() error {
-	tokens := strings.Split(filepath.Dir(o.remote), "/")
+	tokens := strings.Split(path.Dir(o.remote), "/")
 	dir := ""
 	for i := range tokens {
 		dir += tokens[i] + "/"
@@ -441,7 +452,7 @@ func (o *Object) Update(in io.Reader, src fs.ObjectInfo) error {
 	if err != nil {
 		return errors.Wrap(err, "update")
 	}
-	path := filepath.Join(o.fs.root, o.remote)
+	path := path.Join(o.fs.root, o.remote)
 	c, _, err := ftpConnection(o.fs.name, o.fs.root)
 	if err != nil {
 		return errors.Wrap(err, "update")
@@ -459,12 +470,14 @@ func (o *Object) Update(in io.Reader, src fs.ObjectInfo) error {
 
 // Remove an object
 func (o *Object) Remove() error {
-	path := filepath.Join(o.fs.root, o.remote)
+	path := path.Join(o.fs.root, o.remote)
 	fs.Debugf(o, "ENTER function 'Remove' for obejct at %s", path)
 	defer fs.Debugf(o, "EXIT function 'Remove' for obejct at %s", path)
 	// Check if it's a directory or a file
-	info, _ := o.fs.getInfo(path)
-	var err error
+	info, err := o.fs.getInfo(path)
+	if err != nil {
+		return err
+	}
 	if info.IsDir {
 		err = o.fs.Rmdir(o.remote)
 	} else {