diff --git a/hgext/lfs/__init__.py b/hgext/lfs/__init__.py
--- a/hgext/lfs/__init__.py
+++ b/hgext/lfs/__init__.py
@@ -87,7 +87,9 @@ Configs::
     #   git-lfs endpoint
     # - file:///tmp/path
     #   local filesystem, usually for testing
-    # if unset, lfs will prompt setting this when it must use this value.
+    # if unset, lfs will assume the repository at ``paths.default`` also handles
+    # blob storage for http(s) URLs.  Otherwise, lfs will prompt to set this
+    # when it must use this value.
     # (default: unset)
     url = https://example.com/repo.git/info/lfs
 
diff --git a/hgext/lfs/blobstore.py b/hgext/lfs/blobstore.py
--- a/hgext/lfs/blobstore.py
+++ b/hgext/lfs/blobstore.py
@@ -532,8 +532,29 @@ def _verify(oid, content):
                           hint=_('run hg verify'))
 
 def remote(repo):
-    """remotestore factory. return a store in _storemap depending on config"""
+    """remotestore factory. return a store in _storemap depending on config
+
+    If ``lfs.url`` is specified, use that remote endpoint.  Otherwise, try to
+    infer the endpoint, based on the remote repository using the same path
+    adjustments as git.  As an extension, 'http' is supported as well so that
+    ``hg serve`` works out of the box.
+
+    https://github.com/git-lfs/git-lfs/blob/master/docs/api/server-discovery.md
+    """
     url = util.url(repo.ui.config('lfs', 'url') or '')
+    if url.scheme is None:
+        # TODO: investigate 'paths.remote:lfsurl' style path customization,
+        # and fall back to inferring from 'paths.remote' if unspecified.
+        defaulturl = util.url(repo.ui.config('paths', 'default') or b'')
+
+        # TODO: support local paths as well.
+        # TODO: consider the ssh -> https transformation that git applies
+        if defaulturl.scheme in (b'http', b'https'):
+            defaulturl.path = defaulturl.path or b'' + b'.git/info/lfs'
+
+            url = util.url(bytes(defaulturl))
+            repo.ui.note(_('lfs: assuming remote store: %s\n') % url)
+
     scheme = url.scheme
     if scheme not in _storemap:
         raise error.Abort(_('lfs: unknown url scheme: %s') % scheme)
diff --git a/hgext/lfs/wrapper.py b/hgext/lfs/wrapper.py
--- a/hgext/lfs/wrapper.py
+++ b/hgext/lfs/wrapper.py
@@ -257,7 +257,9 @@ def _prefetchfiles(repo, ctx, files):
             pointers.append(p)
 
     if pointers:
-        repo.svfs.lfsremoteblobstore.readbatch(pointers, localstore)
+        # Recalculating the repo store here allows 'paths.default' that is set
+        # on the repo by a clone command to be used for the update.
+        blobstore.remote(repo).readbatch(pointers, localstore)
 
 def _canskipupload(repo):
     # if remotestore is a null store, upload is a no-op and can be skipped
diff --git a/tests/test-lfs-serve.t b/tests/test-lfs-serve.t
--- a/tests/test-lfs-serve.t
+++ b/tests/test-lfs-serve.t
@@ -34,7 +34,6 @@ for flag '0x2000'!" if the extension is 
 masked by the Internal Server Error message).
   $ cat >> $HGRCPATH <<EOF
   > [lfs]
-  > url=file:$TESTTMP/dummy-remote/
   > usercache = null://
   > threshold=10
   > [web]
diff --git a/tests/test-lfs-test-server.t b/tests/test-lfs-test-server.t
--- a/tests/test-lfs-test-server.t
+++ b/tests/test-lfs-test-server.t
@@ -157,6 +157,7 @@ Clear the cache to force a download
   resolving manifests
    branchmerge: False, force: False, partial: False
    ancestor: 000000000000, local: 000000000000+, remote: 99a7098854a3
+  http auth: user foo, password ***
   Status: 200
   Content-Length: 311 (git-server !)
   Content-Length: 352 (hg-server !)
@@ -328,6 +329,7 @@ Clear the cache to force a download
   resolving manifests
    branchmerge: False, force: False, partial: False
    ancestor: 99a7098854a3, local: 99a7098854a3+, remote: dfca2c9e2ef2
+  http auth: user foo, password ***
   Status: 200
   Content-Length: 608 (git-server !)
   Content-Length: 670 (hg-server !)
@@ -417,6 +419,7 @@ TODO: give the proper error indication f
   resolving manifests
    branchmerge: False, force: True, partial: False
    ancestor: dfca2c9e2ef2+, local: dfca2c9e2ef2+, remote: dfca2c9e2ef2
+  http auth: user foo, password ***
   Status: 200
   Content-Length: 311 (git-server !)
   Content-Length: 183 (hg-server !)
@@ -516,6 +519,7 @@ Archive will prefetch blobs in a group
   $ rm -rf .hg/store/lfs `hg config lfs.usercache`
   $ hg archive --debug -r 1 ../archive
   http auth: user foo, password ***
+  http auth: user foo, password ***
   Status: 200
   Content-Length: 905 (git-server !)
   Content-Length: 988 (hg-server !)
@@ -611,6 +615,7 @@ Cat will prefetch blobs in a group
   $ rm -rf .hg/store/lfs `hg config lfs.usercache`
   $ hg cat --debug -r 1 a b c
   http auth: user foo, password ***
+  http auth: user foo, password ***
   Status: 200
   Content-Length: 608 (git-server !)
   Content-Length: 670 (hg-server !)
@@ -685,6 +690,7 @@ Revert will prefetch blobs in a group
   reverting b
   reverting c
   reverting d
+  http auth: user foo, password ***
   Status: 200
   Content-Length: 905 (git-server !)
   Content-Length: 988 (hg-server !)
@@ -781,6 +787,7 @@ Check error message when the remote miss
   resolving manifests
    branchmerge: False, force: True, partial: False
    ancestor: 62fdbaf221c6+, local: 62fdbaf221c6+, remote: ef0564edf47e
+  http auth: user foo, password ***
   Status: 200
   Content-Length: 308 (git-server !)
   Content-Length: 186 (hg-server !)
@@ -892,6 +899,7 @@ Check error message when object does not
   resolving manifests
    branchmerge: False, force: False, partial: False
    ancestor: 000000000000, local: 000000000000+, remote: d2a338f184a8
+  http auth: user foo, password ***
   Status: 200
   Content-Length: 308 (git-server !)
   Content-Length: 186 (hg-server !)