  NTSTATUS check_name(connection_struct *conn, const char *name);
  int get_real_filename(connection_struct *conn, const char *path,
  		      const char *name, TALLOC_CTX *mem_ctx,
+@@ -1037,6 +1038,7 @@ void stat_cache_add( const char *full_orig_name,
+ 		char *translated_path,
+ 		bool case_sensitive);
+ bool stat_cache_lookup(connection_struct *conn,
++			bool posix_paths,
+ 			char **pp_name,
+ 			char **pp_dirpath,
+ 			char **pp_start,
+diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c
+index e2ccc74..e910982 100644
+--- a/source3/smbd/statcache.c
++++ b/source3/smbd/statcache.c
+@@ -150,6 +150,7 @@ void stat_cache_add( const char *full_orig_name,
+  * Look through the stat cache for an entry
+  *
+  * @param conn    A connection struct to do the stat() with.
++ * @param posix_paths Whether to lookup using stat() or lstat()
+  * @param name    The path we are attempting to cache, modified by this routine
+  *                to be correct as far as the cache can tell us. We assume that
+  *		  it is a talloc'ed string from top of stack, we free it if
+@@ -166,6 +167,7 @@ void stat_cache_add( const char *full_orig_name,
+  */
+ 
+ bool stat_cache_lookup(connection_struct *conn,
++			bool posix_paths,
+ 			char **pp_name,
+ 			char **pp_dirpath,
+ 			char **pp_start,
+@@ -181,6 +183,7 @@ bool stat_cache_lookup(connection_struct *conn,
+ 	char *name;
+ 	TALLOC_CTX *ctx = talloc_tos();
+ 	struct smb_filename smb_fname;
++	int ret;
+ 
+ 	*pp_dirpath = NULL;
+ 	*pp_start = *pp_name;
+@@ -283,7 +286,13 @@ bool stat_cache_lookup(connection_struct *conn,
+ 	ZERO_STRUCT(smb_fname);
+ 	smb_fname.base_name = translated_path;
+ 
+-	if (SMB_VFS_STAT(conn, &smb_fname) != 0) {
++	if (posix_paths) {
++		ret = SMB_VFS_LSTAT(conn, &smb_fname);
++	} else {
++		ret = SMB_VFS_STAT(conn, &smb_fname);
++	}
++
++	if (ret != 0) {
+ 		/* Discard this entry - it doesn't exist in the filesystem. */
+ 		memcache_delete(smbd_memcache(), STAT_CACHE,
+ 				data_blob_const(chk_name, strlen(chk_name)));
 diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
-index 0931fff..284635d 100644
+index 0931fff..129ab01 100644
 --- a/source3/smbd/trans2.c
 +++ b/source3/smbd/trans2.c
 @@ -2271,6 +2271,7 @@ static void call_trans2findfirst(connection_struct *conn,

 /*
  * smb_filename
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 25301e6..691a779 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -977,26 +977,39 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
 }
 

 			break;
 		default:
 			reply_nterror(req, NT_STATUS_INVALID_LEVEL);
@@ -2331,8 +2333,7 @@ close_if_end = %d requires_resume_key = %d level = 0x%x, max_data_bytes = %d\n",
 	ntstatus = filename_convert(ctx, conn,
 				    req->flags2 & FLAGS2_DFS_PATHNAMES,
 				    directory,
-				    (UCF_SAVE_LCOMP |
-					UCF_ALWAYS_ALLOW_WCARD_LCOMP),
+				    ucf_flags,
 				    &mask_contains_wcard,
 				    &smb_dname);
 	if (!NT_STATUS_IS_OK(ntstatus)) {
@@ -5103,6 +5104,7 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
 	} else {
 		uint32_t name_hash;
 		char *fname = NULL;
