diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 21dbd40b1d2..0dc7d68983b 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -441,6 +441,8 @@ tramp-default-method-alist
 (defconst tramp-default-method-marker "-"
   "Marker for default method in remote file names.")

+(add-to-list 'tramp-methods `(,tramp-default-method-marker))
+
 (defcustom tramp-default-user nil
   "Default user to use for transferring files.
 It is nil by default; otherwise settings in configuration files like
@@ -1414,9 +1416,13 @@ tramp-password-prompt-not-unique
 during direct remote copying with scp.")

 (defconst tramp-completion-file-name-handler-alist
-  '((file-name-all-completions
+  '((expand-file-name . tramp-completion-handle-expand-file-name)
+    (file-exists-p . tramp-completion-handle-file-exists-p)
+    (file-name-all-completions
      . tramp-completion-handle-file-name-all-completions)
-    (file-name-completion . tramp-completion-handle-file-name-completion))
+    (file-name-completion . tramp-completion-handle-file-name-completion)
+    (file-name-directory . tramp-completion-handle-file-name-directory)
+    (file-name-nondirectory . tramp-completion-handle-file-name-nondirectory))
   "Alist of completion handler functions.
 Used for file names matching `tramp-completion-file-name-regexp'.
 Operations not mentioned here will be handled by Tramp's file
@@ -1707,7 +1713,6 @@ tramp-dissect-file-name
 		     :port port :localname localname :hop hop))
 	  ;; The method must be known.
 	  (unless (or nodefault non-essential
-		      (string-equal method tramp-default-method-marker)
 		      (assoc method tramp-methods))
 	    (tramp-user-error
 	     v "Method `%s' is not known." method))
@@ -2941,6 +2946,30 @@ tramp-connectable-p
         (and vec (process-live-p (get-process (tramp-buffer-name vec))))
 	(not non-essential))))

+(defun tramp-completion-handle-expand-file-name (filename &optional directory)
+  "Like `expand-file-name' for partial Tramp files."
+  (if (file-name-absolute-p filename)
+      filename
+    (concat (or directory default-directory "/") filename)))
+
+(defun tramp-completion-handle-file-exists-p (filename)
+  "Like `file-exists-p' for partial Tramp files."
+  ;; We need special handling only when a method is needed.  Then we
+  ;; regard all files "/method:" or "/[method/" as existent, if
+  ;; "method" is a valid Tramp method.
+  (or (and (not (string-empty-p tramp-method-regexp))
+           (string-match
+	    (rx
+	     (regexp tramp-prefix-regexp)
+	     (group (regexp tramp-method-regexp))
+	     (regexp tramp-postfix-method-regexp))
+            filename)
+           ;; Is it a valid method?
+           (member
+            filename
+            (tramp-get-completion-methods (match-string 1 filename))))
+      (tramp-run-real-handler #'file-exists-p (list filename))))
+
 ;; Method, host name and user name completion.
 ;; `tramp-completion-dissect-file-name' returns a list of
 ;; `tramp-file-name' structures.  For all of them we return possible
@@ -3176,6 +3205,27 @@ tramp-get-completion-user-host
   (unless (zerop (+ (length user) (length host)))
     (tramp-completion-make-tramp-file-name method user host nil)))

+(defun tramp-completion-handle-file-name-directory (filename)
+  "Like `file-name-directory' for partial Tramp files."
+  ;; We need special handling only when a method is needed.  Then we
+  ;; return "/method:" or "/[method/", if "method" is a valid Tramp
+  ;; method.
+  (if (and (not (string-empty-p tramp-method-regexp))
+           (string-match
+            (rx (group
+	         (regexp tramp-prefix-regexp)
+                 (group (regexp tramp-method-regexp))
+	         (regexp tramp-postfix-method-regexp)))
+            filename)
+           ;; Is it a valid method?
+           (assoc (match-string 2 filename) tramp-methods))
+      (match-string 1 filename)
+    (tramp-run-real-handler #'file-name-directory (list filename))))
+
+(defun tramp-completion-handle-file-name-nondirectory (filename)
+  "Like `file-name-nondirectory' for partial Tramp files."
+  (tramp-compat-string-replace (file-name-directory filename) "" filename))
+
 (defun tramp-parse-default-user-host (method)
   "Return a list of (user host) tuples allowed to access for METHOD.
 This function is added always in `tramp-get-completion-function'
