diff --git a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
index 0c14ff0a8..53f557aab 100644
--- a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
+++ b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
@@ -11,6 +11,8 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.nio.file.InvalidPathException;
+import java.time.Year;
+import java.time.ZoneOffset;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -94,6 +96,19 @@ public AddImageryLayerAction(ImageryInfo info) {
      */
     private static ImageryInfo convertImagery(ImageryInfo info) {
         try {
+            if (info.getUrl().contains("{time}")) {
+                final String instant = Year.now().atDay(1).atStartOfDay(ZoneOffset.UTC).toInstant().toString();
+                final String example = String.join("/", instant, instant);
+                final String initialSelectionValue = info.getDate() != null ? info.getDate() : example;
+                final String userDate = JOptionPane.showInputDialog(MainApplication.getMainFrame(),
+                        tr("Time filter for {0} such as {1}", info.getName(), example),
+                        initialSelectionValue);
+                if (userDate == null) {
+                    return null;
+                }
+                info.setDate(userDate);
+                // TODO ImageryLayerInfo.save
+            }
             switch(info.getImageryType()) {
             case WMS_ENDPOINT:
                 // convert to WMS type
diff --git a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
index 6bf1c45d1..50cfb87ed 100644
--- a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
+++ b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
@@ -276,7 +276,9 @@ public boolean equals(Object o) {
     private String countryCode = "";
     /**
       * creation date of the imagery (in the form YYYY-MM-DD;YYYY-MM-DD, where
-      * DD and MM as well as a second date are optional)
+      * DD and MM as well as a second date are optional).
+      *
+      * Also used as time filter for WMS time={time} parameter (such as Sentinel-2)
       * @since 11570
       */
     private String date;
diff --git a/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java b/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
index 23f1103f5..94391d4fa 100644
--- a/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
+++ b/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
@@ -21,6 +21,7 @@
 import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.gui.layer.WMSLayer;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Tile Source handling WMS providers
@@ -29,8 +30,6 @@
  * @since 8526
  */
 public class TemplatedWMSTileSource extends AbstractWMSTileSource implements TemplatedTileSource {
-    private final Map<String, String> headers = new ConcurrentHashMap<>();
-    private final Set<String> serverProjections;
     // CHECKSTYLE.OFF: SingleSpaceSeparator
     private static final Pattern PATTERN_HEADER = Pattern.compile("\\{header\\(([^,]+),([^}]+)\\)\\}");
     private static final Pattern PATTERN_PROJ   = Pattern.compile("\\{proj\\}");
@@ -42,16 +41,23 @@
     private static final Pattern PATTERN_N      = Pattern.compile("\\{n\\}");
     private static final Pattern PATTERN_WIDTH  = Pattern.compile("\\{width\\}");
     private static final Pattern PATTERN_HEIGHT = Pattern.compile("\\{height\\}");
+    private static final Pattern PATTERN_TIME   = Pattern.compile("\\{time\\}"); // Sentinel-2
     private static final Pattern PATTERN_PARAM  = Pattern.compile("\\{([^}]+)\\}");
     // CHECKSTYLE.ON: SingleSpaceSeparator
 
     private static final NumberFormat LATLON_FORMAT = new DecimalFormat("###0.0000000", new DecimalFormatSymbols(Locale.US));
 
     private static final Pattern[] ALL_PATTERNS = {
-        PATTERN_HEADER, PATTERN_PROJ, PATTERN_WKID, PATTERN_BBOX, PATTERN_W, PATTERN_S, PATTERN_E, PATTERN_N, PATTERN_WIDTH, PATTERN_HEIGHT
+            PATTERN_HEADER, PATTERN_PROJ, PATTERN_WKID, PATTERN_BBOX,
+            PATTERN_W, PATTERN_S, PATTERN_E, PATTERN_N,
+            PATTERN_WIDTH, PATTERN_HEIGHT, PATTERN_TIME,
     };
 
+    private final Set<String> serverProjections;
+    private final Map<String, String> headers = new ConcurrentHashMap<>();
+    private final String date;
     private final boolean switchLatLon;
+
     /**
      * Creates a tile source based on imagery info
      * @param info imagery info
@@ -61,6 +67,7 @@ public TemplatedWMSTileSource(ImageryInfo info, Projection tileProjection) {
         super(info, tileProjection);
         this.serverProjections = new TreeSet<>(info.getServerProjections());
         this.headers.putAll(info.getCustomHttpHeaders());
+        this.date = info.getDate();
         handleTemplate();
         initProjection();
         // Bounding box coordinates have to be switched for WMS 1.3.0 EPSG:4326.
@@ -143,6 +150,9 @@ public String getTileUrl(int zoom, int tilex, int tiley) {
             case "height":
                 replacement = String.valueOf(getTileSize());
                 break;
+            case "time":
+                replacement = Utils.encodeUrl(date);
+                break;
             default:
                 replacement = '{' + matcher.group(1) + '}';
             }
