add PosixRename optional support same as Lstat
diff --git a/request-interfaces.go b/request-interfaces.go
index ccd89ea..e1d55f8 100644
--- a/request-interfaces.go
+++ b/request-interfaces.go
@@ -39,8 +39,7 @@
 	Filewrite(*Request) (io.WriterAt, error)
 }
 
-// OpenFileWriter is a FileWriter that implements the generic OpenFile
-// method.
+// OpenFileWriter is a FileWriter that implements the generic OpenFile method.
 // You need to implement this optional interface if you want to be able
 // to read and write from/to the same handle.
 // Called for Methods: Open
@@ -56,6 +55,14 @@
 	Filecmd(*Request) error
 }
 
+// PosixRenameFileCmder is a FileCmder that implements the Lstat method.
+// If this interface is implemented PosixRename requests will call it
+// otherwise they will be handled in the same way as Rename
+type PosixRenameFileCmder interface {
+	FileCmder
+	PosixRename(*Request) error
+}
+
 // FileLister should return an object that fulfils the ListerAt interface
 // Note in cases of an error, the error text will be sent to the client.
 // Called for Methods: List, Stat, Readlink
@@ -67,6 +74,7 @@
 // If this interface is implemented Lstat requests will call it
 // otherwise they will be handled in the same way as Stat
 type LstatFileLister interface {
+	FileLister
 	Lstat(*Request) (ListerAt, error)
 }
 
diff --git a/request-server.go b/request-server.go
index b1fee47..2264994 100644
--- a/request-server.go
+++ b/request-server.go
@@ -223,7 +223,7 @@
 				rpkt = request.call(rs.Handlers, pkt, rs.pktMgr.alloc, orderID)
 			}
 		case *sshFxpExtendedPacketPosixRename:
-			request := NewRequest("Rename", pkt.Oldpath)
+			request := NewRequest("PosixRename", pkt.Oldpath)
 			request.Target = pkt.Newpath
 			rpkt = request.call(rs.Handlers, pkt, rs.pktMgr.alloc, orderID)
 		case hasHandle:
diff --git a/request.go b/request.go
index e452752..98ff04c 100644
--- a/request.go
+++ b/request.go
@@ -212,7 +212,7 @@
 		return fileput(handlers.FilePut, r, pkt, alloc, orderID)
 	case "Open":
 		return fileputget(handlers.FilePut, r, pkt, alloc, orderID)
-	case "Setstat", "Rename", "Rmdir", "Mkdir", "Link", "Symlink", "Remove":
+	case "Setstat", "Rename", "Rmdir", "Mkdir", "Link", "Symlink", "Remove", "PosixRename":
 		return filecmd(handlers.FileCmd, r, pkt)
 	case "List":
 		return filelist(handlers.FileList, r, pkt)
@@ -353,12 +353,24 @@
 
 // wrap FileCmder handler
 func filecmd(h FileCmder, r *Request, pkt requestPacket) responsePacket {
-
 	switch p := pkt.(type) {
 	case *sshFxpFsetstatPacket:
 		r.Flags = p.Flags
 		r.Attrs = p.Attrs.([]byte)
 	}
+
+	if r.Method == "PosixRename" {
+		if posixRenamer, ok := h.(PosixRenameFileCmder); ok {
+			err := posixRenamer.PosixRename(r)
+			return statusFromError(pkt, err)
+		}
+
+		// PosixRenameFileCmder not implemented handle this request as a Rename
+		r.Method = "Rename"
+		err := h.Filecmd(r)
+		return statusFromError(pkt, err)
+	}
+
 	err := h.Filecmd(r)
 	return statusFromError(pkt, err)
 }