diff --git a/git_cl.py b/git_cl.py
index f1772c7..b9a3567 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -43,6 +43,7 @@
 import metrics
 import metrics_utils
 import owners
+import owners_client
 import owners_finder
 import presubmit_canned_checks
 import presubmit_support
@@ -1251,7 +1252,7 @@
     assert self.GetIssue(), 'issue is required to update description'
 
     if gerrit_util.HasPendingChangeEdit(
-        self._GetGerritHost(), self._GerritChangeIdentifier()):
+        self.GetGerritHost(), self._GerritChangeIdentifier()):
       if not force:
         confirm_or_exit(
             'The description cannot be modified while the issue has a pending '
@@ -1259,9 +1260,9 @@
             'or delete it.\n\n', action='delete the unpublished edit')
 
       gerrit_util.DeletePendingChangeEdit(
-        self._GetGerritHost(), self._GerritChangeIdentifier())
+        self.GetGerritHost(), self._GerritChangeIdentifier())
     gerrit_util.SetCommitMessage(
-        self._GetGerritHost(), self._GerritChangeIdentifier(),
+        self.GetGerritHost(), self._GerritChangeIdentifier(),
         description, notify='NONE')
 
     self.description = description
@@ -1307,7 +1308,7 @@
         gclient_utils.FileWrite(description_file, description)
         args.extend(['--json_output', json_output])
         args.extend(['--description_file', description_file])
-        args.extend(['--gerrit_project', self._GetGerritProject()])
+        args.extend(['--gerrit_project', self.GetGerritProject()])
 
         start = time_time()
         cmd = ['vpython', PRESUBMIT_SUPPORT] + args
@@ -1479,7 +1480,7 @@
       labels = {'Commit-Queue': vote_map[new_state]}
       notify = False if new_state == _CQState.DRY_RUN else None
       gerrit_util.SetReview(
-          self._GetGerritHost(), self._GerritChangeIdentifier(),
+          self.GetGerritHost(), self._GerritChangeIdentifier(),
           labels=labels, notify=notify)
       return 0
     except KeyboardInterrupt:
@@ -1497,7 +1498,7 @@
       # Still raise exception so that stack trace is printed.
       raise
 
-  def _GetGerritHost(self):
+  def GetGerritHost(self):
     # Lazy load of configs.
     self.GetCodereviewServer()
     if self._gerrit_host and '.' not in self._gerrit_host:
@@ -1536,7 +1537,7 @@
         self._gerrit_server = 'https://%s' % self._gerrit_host
     return self._gerrit_server
 
-  def _GetGerritProject(self):
+  def GetGerritProject(self):
     """Returns Gerrit project name based on remote git URL."""
     remote_url = self.GetRemoteUrl()
     if remote_url is None:
@@ -1561,7 +1562,7 @@
     Not to be confused by value of "Change-Id:" footer.
     If Gerrit project can be determined, this will speed up Gerrit HTTP API RPC.
     """
-    project = self._GetGerritProject()
+    project = self.GetGerritProject()
     if project:
       return gerrit_util.ChangeIdentifier(project, self.GetIssue())
     # Fall back on still unique, but less efficient change number.
@@ -1647,14 +1648,14 @@
     if not isinstance(cookies_auth, gerrit_util.CookiesAuthenticator):
       return
 
-    cookies_user = cookies_auth.get_auth_email(self._GetGerritHost())
+    cookies_user = cookies_auth.get_auth_email(self.GetGerritHost())
     if self.GetIssueOwner() == cookies_user:
       return
     logging.debug('change %s owner is %s, cookies user is %s',
                   self.GetIssue(), self.GetIssueOwner(), cookies_user)
     # Maybe user has linked accounts or something like that,
     # so ask what Gerrit thinks of this user.
-    details = gerrit_util.GetAccountDetails(self._GetGerritHost(), 'self')
+    details = gerrit_util.GetAccountDetails(self.GetGerritHost(), 'self')
     if details['email'] == self.GetIssueOwner():
       return
     if not force:
@@ -1757,7 +1758,7 @@
 
   def AddComment(self, message, publish=None):
     gerrit_util.SetReview(
-        self._GetGerritHost(), self._GerritChangeIdentifier(),
+        self.GetGerritHost(), self._GerritChangeIdentifier(),
         msg=message, ready=publish)
 
   def GetCommentsSummary(self, readable=True):
@@ -1768,9 +1769,9 @@
         options=['MESSAGES', 'DETAILED_ACCOUNTS',
                  'CURRENT_REVISION']).get('messages', [])
     file_comments = gerrit_util.GetChangeComments(
-        self._GetGerritHost(), self._GerritChangeIdentifier())
+        self.GetGerritHost(), self._GerritChangeIdentifier())
     robot_file_comments = gerrit_util.GetChangeRobotComments(
-        self._GetGerritHost(), self._GerritChangeIdentifier())
+        self.GetGerritHost(), self._GerritChangeIdentifier())
 
     # Add the robot comments onto the list of comments, but only
     # keep those that are from the latest patchset.
@@ -1796,7 +1797,7 @@
           patchset = 'PS%d' % comment['patch_set']
         line = comment.get('line', 0)
         url = ('https://%s/c/%s/%s/%s#%s%s' %
-            (self._GetGerritHost(), self.GetIssue(), comment['patch_set'], path,
+            (self.GetGerritHost(), self.GetIssue(), comment['patch_set'], path,
              'b' if comment.get('side') == 'PARENT' else '',
              str(line) if line else ''))
         comments[key][path][patchset][line] = (url, comment['message'])
@@ -1856,11 +1857,11 @@
 
   def CloseIssue(self):
     gerrit_util.AbandonChange(
-        self._GetGerritHost(), self._GerritChangeIdentifier(), msg='')
+        self.GetGerritHost(), self._GerritChangeIdentifier(), msg='')
 
   def SubmitIssue(self, wait_for_merge=True):
     gerrit_util.SubmitChange(
-        self._GetGerritHost(), self._GerritChangeIdentifier(),
+        self.GetGerritHost(), self._GerritChangeIdentifier(),
         wait_for_merge=wait_for_merge)
 
   def _GetChangeDetail(self, options=None):
@@ -1888,7 +1889,7 @@
 
     try:
       data = gerrit_util.GetChangeDetail(
-          self._GetGerritHost(), self._GerritChangeIdentifier(), options_set)
+          self.GetGerritHost(), self._GerritChangeIdentifier(), options_set)
     except gerrit_util.GerritError as e:
       if e.http_status == 404:
         raise GerritChangeNotExists(self.GetIssue(), self.GetCodereviewServer())
@@ -1901,7 +1902,7 @@
     assert self.GetIssue(), 'issue must be set to query Gerrit'
     try:
       data = gerrit_util.GetChangeCommit(
-          self._GetGerritHost(), self._GerritChangeIdentifier())
+          self.GetGerritHost(), self._GerritChangeIdentifier())
     except gerrit_util.GerritError as e:
       if e.http_status == 404:
         raise GerritChangeNotExists(self.GetIssue(), self.GetCodereviewServer())
@@ -2189,7 +2190,7 @@
       remote, remote_branch = self.GetRemoteBranch()
       should_retry = remote_branch == DEFAULT_OLD_BRANCH and \
           gerrit_util.GetProjectHead(
-              self._gerrit_host, self._GetGerritProject()) == 'refs/heads/main'
+              self._gerrit_host, self.GetGerritProject()) == 'refs/heads/main'
       if not should_retry:
         DieWithError(str(e), change_desc)
 
@@ -2273,12 +2274,12 @@
     cc = [email.strip() for email in cc if email.strip()]
     if change_desc.get_cced():
       cc.extend(change_desc.get_cced())
-    if self._GetGerritHost() == 'chromium-review.googlesource.com':
+    if self.GetGerritHost() == 'chromium-review.googlesource.com':
       valid_accounts = set(reviewers + cc)
       # TODO(crbug/877717): relax this for all hosts.
     else:
       valid_accounts = gerrit_util.ValidAccounts(
-          self._GetGerritHost(), reviewers + cc)
+          self.GetGerritHost(), reviewers + cc)
     logging.info('accounts %s are recognized, %s invalid',
                  sorted(valid_accounts),
                  set(reviewers + cc).difference(set(valid_accounts)))
@@ -2341,8 +2342,8 @@
 
     if change_desc.get_reviewers(tbr_only=True):
       score = gerrit_util.GetCodeReviewTbrScore(
-          self._GetGerritHost(),
-          self._GetGerritProject())
+          self.GetGerritHost(),
+          self.GetGerritProject())
       refspec_opts.append('l=Code-Review+%s' % score)
 
     # Gerrit sorts hashtags, so order is not important.
@@ -2359,7 +2360,7 @@
     refspec = '%s:refs/for/%s%s' % (ref_to_push, branch, refspec_suffix)
 
     git_push_metadata = {
-        'gerrit_host': self._GetGerritHost(),
+        'gerrit_host': self.GetGerritHost(),
         'title': options.title or '<untitled>',
         'change_id': change_id,
         'description': change_desc.description,
@@ -2383,7 +2384,7 @@
       # GetIssue() is not set in case of non-squash uploads according to tests.
       # TODO(crbug.com/751901): non-squash uploads in git cl should be removed.
       gerrit_util.AddReviewers(
-          self._GetGerritHost(),
+          self.GetGerritHost(),
           self._GerritChangeIdentifier(),
           reviewers, cc,
           notify=bool(options.send_mail))
@@ -4769,12 +4770,15 @@
     if len(args) == 0:
       print('No files specified for --show-all. Nothing to do.')
       return 0
+    project = cl.GetGerritProject()
+    branch = cl.GetCommonAncestorWithUpstream()
+    client = owners_client.DepotToolsClient(
+        host=cl.GetGerritHost(),
+        root=settings.GetRoot(),
+        branch=branch)
     for arg in args:
-      base_branch = cl.GetCommonAncestorWithUpstream()
-      database = owners.Database(settings.GetRoot(), open, os.path)
-      database.load_data_needed_for([arg])
       print('Owners for %s:' % arg)
-      for owner in sorted(database.all_possible_owners([arg], None)):
+      for owner in client.ListOwnersForFile(project, branch, arg):
         print(' - %s' % owner)
     return 0
 
diff --git a/owners_client.py b/owners_client.py
index e5f2be1..49be62f 100644
--- a/owners_client.py
+++ b/owners_client.py
@@ -79,7 +79,7 @@
 
 class DepotToolsClient(OwnersClient):
   """Implement OwnersClient using owners.py Database."""
-  def __init__(self, host, root, fopen, os_path, branch):
+  def __init__(self, host, root, branch, fopen=open, os_path=os.path):
     super(DepotToolsClient, self).__init__(host)
     self._root = root
     self._fopen = fopen
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index 18852b1..8b144e8 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -231,7 +231,7 @@
                    side_effect=[git_cl.GitPushError(), None]).start()
     mock.patch('git_cl.Changelist.GetRemoteBranch',
                return_value=('foo', 'bar')).start()
-    mock.patch('git_cl.Changelist._GetGerritProject',
+    mock.patch('git_cl.Changelist.GetGerritProject',
                return_value='foo').start()
     mock.patch('git_cl.gerrit_util.GetProjectHead',
                return_value='refs/heads/main').start()
@@ -253,7 +253,7 @@
                    side_effect=[git_cl.GitPushError(), None]).start()
     mock.patch('git_cl.Changelist.GetRemoteBranch',
                return_value=('foo', git_cl.DEFAULT_OLD_BRANCH)).start()
-    mock.patch('git_cl.Changelist._GetGerritProject',
+    mock.patch('git_cl.Changelist.GetGerritProject',
                return_value='foo').start()
     mock.patch('git_cl.gerrit_util.GetProjectHead',
                return_value='refs/heads/old_default').start()
@@ -275,7 +275,7 @@
                    side_effect=[git_cl.GitPushError(), None]).start()
     mock.patch('git_cl.Changelist.GetRemoteBranch',
                return_value=('foo', git_cl.DEFAULT_OLD_BRANCH)).start()
-    mock.patch('git_cl.Changelist._GetGerritProject',
+    mock.patch('git_cl.Changelist.GetGerritProject',
                return_value='foo').start()
     mock.patch('git_cl.gerrit_util.GetProjectHead',
                return_value='refs/heads/main').start()
@@ -2236,7 +2236,7 @@
         sys.stdout.getvalue())
 
   def _mock_gerrit_changes_for_detail_cache(self):
-    mock.patch('git_cl.Changelist._GetGerritHost', lambda _: 'host').start()
+    mock.patch('git_cl.Changelist.GetGerritHost', lambda _: 'host').start()
 
   def test_gerrit_change_detail_cache_simple(self):
     self._mock_gerrit_changes_for_detail_cache()
@@ -2760,7 +2760,7 @@
     mock.patch('git_cl.time_time').start()
     mock.patch('metrics.collector').start()
     mock.patch('subprocess2.Popen').start()
-    mock.patch('git_cl.Changelist._GetGerritProject',
+    mock.patch('git_cl.Changelist.GetGerritProject',
         return_value='https://chromium-review.googlesource.com').start()
     self.addCleanup(mock.patch.stopall)
     self.temp_count = 0
@@ -2987,7 +2987,7 @@
         'git_cl.Changelist.GetCodereviewServer',
         return_value='https://chromium-review.googlesource.com').start()
     mock.patch(
-        'git_cl.Changelist._GetGerritHost',
+        'git_cl.Changelist.GetGerritHost',
         return_value='chromium-review.googlesource.com').start()
     mock.patch(
         'git_cl.Changelist.GetMostRecentPatchset',
diff --git a/tests/owners_client_test.py b/tests/owners_client_test.py
index 691c24e..58cc4cc 100644
--- a/tests/owners_client_test.py
+++ b/tests/owners_client_test.py
@@ -78,7 +78,7 @@
         return_value={}).start()
     self.addCleanup(mock.patch.stopall)
     self.client = owners_client.DepotToolsClient(
-        'host', '/', self.fopen, self.repo, 'branch')
+        'host', '/', 'branch', self.fopen, self.repo)
 
   def testListOwners(self):
     self.assertEquals(
