diff --git a/docs/source/markdown/podman-volume-ls.1.md b/docs/source/markdown/podman-volume-ls.1.md
index 489057446c..b562aff613 100644
--- a/docs/source/markdown/podman-volume-ls.1.md
+++ b/docs/source/markdown/podman-volume-ls.1.md
@@ -24,6 +24,7 @@ Volumes can be filtered by the following attributes:
 - name
 - opt
 - scope
+- until
 
 #### **--format**=*format*
 
diff --git a/pkg/api/server/register_volumes.go b/pkg/api/server/register_volumes.go
index d58bf0662c..fb02cffcfc 100644
--- a/pkg/api/server/register_volumes.go
+++ b/pkg/api/server/register_volumes.go
@@ -68,6 +68,7 @@ func (s *APIServer) registerVolumeHandlers(r *mux.Router) error {
 	//        - label=<key> or label=<key>:<value> Matches volumes based on the presence of a label alone or a label and a value.
 	//        - name=<volume-name> Matches all of volume name.
 	//        - opt=<driver-option> Matches a storage driver options
+	//        - `until=<timestamp>` List volumes created before this timestamp. The `<timestamp>` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time.
 	// responses:
 	//   '200':
 	//     "$ref": "#/responses/VolumeList"
@@ -166,6 +167,7 @@ func (s *APIServer) registerVolumeHandlers(r *mux.Router) error {
 	//        - driver=<volume-driver-name> Matches volumes based on their driver.
 	//        - label=<key> or label=<key>:<value> Matches volumes based on the presence of a label alone or a label and a value.
 	//        - name=<volume-name> Matches all of volume name.
+	//        - `until=<timestamp>` List volumes created before this timestamp. The `<timestamp>` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time.
 	//
 	//      Note:
 	//        The boolean `dangling` filter is not yet implemented for this endpoint.
diff --git a/pkg/domain/filters/volumes.go b/pkg/domain/filters/volumes.go
index df23c31c08..d55c44ef5e 100644
--- a/pkg/domain/filters/volumes.go
+++ b/pkg/domain/filters/volumes.go
@@ -51,6 +51,12 @@ func GenerateVolumeFilters(filters url.Values) ([]libpod.VolumeFilter, error) {
 					}
 					return false
 				})
+			case "until":
+				f, err := createUntilFilterVolumeFunction(val)
+				if err != nil {
+					return nil, err
+				}
+				vf = append(vf, f)
 			case "dangling":
 				danglingVal := val
 				invert := false
@@ -93,16 +99,11 @@ func GeneratePruneVolumeFilters(filters url.Values) ([]libpod.VolumeFilter, erro
 					return util.MatchLabelFilters([]string{filterVal}, v.Labels())
 				})
 			case "until":
-				until, err := util.ComputeUntilTimestamp([]string{filterVal})
+				f, err := createUntilFilterVolumeFunction(filterVal)
 				if err != nil {
 					return nil, err
 				}
-				vf = append(vf, func(v *libpod.Volume) bool {
-					if !until.IsZero() && v.CreatedTime().Before(until) {
-						return true
-					}
-					return false
-				})
+				vf = append(vf, f)
 			default:
 				return nil, errors.Errorf("%q is an invalid volume filter", filter)
 			}
@@ -110,3 +111,16 @@ func GeneratePruneVolumeFilters(filters url.Values) ([]libpod.VolumeFilter, erro
 	}
 	return vf, nil
 }
+
+func createUntilFilterVolumeFunction(filter string) (libpod.VolumeFilter, error) {
+	until, err := util.ComputeUntilTimestamp([]string{filter})
+	if err != nil {
+		return nil, err
+	}
+	return func(v *libpod.Volume) bool {
+		if !until.IsZero() && v.CreatedTime().Before(until) {
+			return true
+		}
+		return false
+	}, nil
+}
diff --git a/test/apiv2/30-volumes.at b/test/apiv2/30-volumes.at
index b639e05f9a..fd15422930 100644
--- a/test/apiv2/30-volumes.at
+++ b/test/apiv2/30-volumes.at
@@ -174,6 +174,8 @@ t POST libpod/volumes/create \
 # with date way back in the past, volume should not be deleted (compat api)
 t POST volumes/prune?filters='{"until":["500000"]}' 200
 t GET libpod/volumes/json?filters='{"label":["testuntilcompat"]}' 200 length=1
+t GET libpod/volumes/json?filters='{"until":["500000"]}' 200 length=0
+t GET libpod/volumes/json?filters='{"until":["5000000000"]}' 200 length=1
 
 # with date far in the future, volume should be deleted (compat api)
 t POST volumes/prune?filters='{"until":["5000000000"]}' 200
diff --git a/test/e2e/volume_ls_test.go b/test/e2e/volume_ls_test.go
index ff3551ad96..0dd1a2b7cc 100644
--- a/test/e2e/volume_ls_test.go
+++ b/test/e2e/volume_ls_test.go
@@ -101,6 +101,22 @@ var _ = Describe("Podman volume ls", func() {
 		Expect(len(session.OutputToStringArray())).To(Equal(0))
 	})
 
+	It("podman ls volume with --filter until flag", func() {
+		session := podmanTest.Podman([]string{"volume", "create"})
+		session.WaitWithDefaultTimeout()
+		Expect(session).Should(Exit(0))
+
+		session = podmanTest.Podman([]string{"volume", "ls", "--filter", "until=5000000000"})
+		session.WaitWithDefaultTimeout()
+		Expect(session).Should(Exit(0))
+		Expect(len(session.OutputToStringArray())).To(Equal(2))
+
+		session = podmanTest.Podman([]string{"volume", "ls", "--filter", "until=50000"})
+		session.WaitWithDefaultTimeout()
+		Expect(session).Should(Exit(0))
+		Expect(len(session.OutputToStringArray())).To(Equal(0))
+	})
+
 	It("podman volume ls with --filter dangling", func() {
 		volName1 := "volume1"
 		session := podmanTest.Podman([]string{"volume", "create", volName1})