diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py
index 7c6044634957adb0fcf0525abd78dd2182013f1a_bWVyY3VyaWFsL2ZpbGVtZXJnZS5weQ==..5d3b5847266055a3b85d7bb9c2678b32d49a8583_bWVyY3VyaWFsL2ZpbGVtZXJnZS5weQ== 100644
--- a/mercurial/filemerge.py
+++ b/mercurial/filemerge.py
@@ -470,7 +470,7 @@
     success, status = tagmerge.merge(repo, fcd, fco, fca)
     return success, status, False
 
-@internaltool('dump', fullmerge)
+@internaltool('dump', fullmerge, binary=True, symlink=True)
 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
     """
     Creates three versions of the files to merge, containing the
@@ -496,7 +496,7 @@
     repo.wwrite(fd + ".base", fca.data(), fca.flags())
     return False, 1, False
 
-@internaltool('forcedump', mergeonly)
+@internaltool('forcedump', mergeonly, binary=True, symlink=True)
 def _forcedump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
                 labels=None):
     """
diff --git a/mercurial/registrar.py b/mercurial/registrar.py
index 7c6044634957adb0fcf0525abd78dd2182013f1a_bWVyY3VyaWFsL3JlZ2lzdHJhci5weQ==..5d3b5847266055a3b85d7bb9c2678b32d49a8583_bWVyY3VyaWFsL3JlZ2lzdHJhci5weQ== 100644
--- a/mercurial/registrar.py
+++ b/mercurial/registrar.py
@@ -399,7 +399,8 @@
         internalmerge = registrar.internalmerge()
 
         @internalmerge('mymerge', internalmerge.mergeonly,
-                       onfailure=None, precheck=None):
+                       onfailure=None, precheck=None,
+                       binary=False, symlink=False):
         def mymergefunc(repo, mynode, orig, fcd, fco, fca,
                         toolconf, files, labels=None):
             '''Explanation of this internal merge tool ....
@@ -430,6 +431,12 @@
     'files' and 'labels'. If it returns false value, merging is aborted
     immediately (and file is marked as "unresolved").
 
+    Optional argument 'binary' is a binary files capability of internal
+    merge tool. 'nomerge' merge type implies binary=True.
+
+    Optional argument 'symlink' is a symlinks capability of inetrnal
+    merge function. 'nomerge' merge type implies symlink=True.
+
     'internalmerge' instance in example above can be used to
     decorate multiple functions.
 
@@ -447,7 +454,8 @@
     fullmerge = 'fullmerge'  # both premerge and merge
 
     def _extrasetup(self, name, func, mergetype,
-                    onfailure=None, precheck=None):
+                    onfailure=None, precheck=None,
+                    binary=False, symlink=False):
         func.mergetype = mergetype
         func.onfailure = onfailure
         func.precheck = precheck
@@ -451,3 +459,9 @@
         func.mergetype = mergetype
         func.onfailure = onfailure
         func.precheck = precheck
+
+        binarycap = binary or mergetype == self.nomerge
+        symlinkcap = symlink or mergetype == self.nomerge
+
+        # actual capabilities, which this internal merge tool has
+        func.capabilities = {"binary": binarycap, "symlink": symlinkcap}