diff --git a/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java b/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java
index d5a1d71fa6..99d368566f 100644
--- a/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java
+++ b/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java
@@ -76,6 +76,7 @@ public final class GpxImageCorrelation {
         final GpxImageDirectionPositionSettings dirpos = settings.getDirectionPositionSettings();
         final GpxImageDatumSettings datumSettings = settings.getDatumSettings();
         final long offset = settings.getOffset();
+        final TimeSource imgTimeSource = settings.getImgTimeSource();
 
         boolean isFirst = true;
         long prevWpTime = 0;
@@ -144,7 +145,7 @@ public final class GpxImageCorrelation {
                         }
                     }
                     WayPoint nextWp = i < size - 1 ? wps.get(i + 1) : null;
-                    ret += matchPoints(images, prevWp, prevWpTime, curWp, curWpTime, offset,
+                    ret += matchPoints(images, prevWp, prevWpTime, curWp, curWpTime, imgTimeSource, offset,
                                        interpolate, tagTime, nextWp, dirpos, datumSettings);
                     prevWp = curWp;
                     prevWpTime = curWpTime;
@@ -152,7 +153,7 @@ public final class GpxImageCorrelation {
             }
         }
         if (trkTag && prevWp != null) {
-            ret += matchPoints(images, prevWp, prevWpTime, prevWp, prevWpTime, offset,
+            ret += matchPoints(images, prevWp, prevWpTime, prevWp, prevWpTime, imgTimeSource, offset,
                                false, trkTagTime, null, dirpos, datumSettings);
         }
         Logging.debug("Correlated {0} total points", ret);
@@ -361,6 +362,7 @@ public final class GpxImageCorrelation {
                                         long prevWpTime,
                                         WayPoint curWp,
                                         long curWpTime,
+                                        TimeSource imgTimeSource,
                                         long offset,
                                         boolean interpolate,
                                         int tagTime,
@@ -375,7 +377,7 @@ public final class GpxImageCorrelation {
         if (isLast) {
             i = images.size() - 1;
         } else {
-            i = getLastIndexOfListBefore(images, curWpTime);
+            i = getLastIndexOfListBefore(images, curWpTime, imgTimeSource);
         }
 
         if (Logging.isDebugEnabled()) {
@@ -426,7 +428,7 @@ public final class GpxImageCorrelation {
             while (i >= 0) {
                 final GpxImageEntry curImg = images.get(i);
                 final GpxImageEntry curTmp = curImg.getTmp();
-                final long time = curImg.getExifInstant().toEpochMilli();
+                final long time = curImg.getTimeSourceInstant(imgTimeSource).toEpochMilli();
                 if ((!isLast && time > curWpTime) || time < prevWpTime) {
                     break;
                 }
@@ -459,7 +461,7 @@ public final class GpxImageCorrelation {
             LatLon nextCoorForDirection = nextWp.getCoor();
             while (i >= 0) {
                 final GpxImageEntry curImg = images.get(i);
-                final long imgTime = curImg.getExifInstant().toEpochMilli();
+                final long imgTime = curImg.getTimeSourceInstant(imgTimeSource).toEpochMilli();
                 if (imgTime < prevWpTime) {
                     break;
                 }
@@ -547,7 +549,7 @@ public final class GpxImageCorrelation {
                             curTmp.setExifGpsDatum("WGS-84");
                     }
 
-                    curTmp.setGpsTime(curImg.getExifInstant().minusMillis(offset));
+                    curTmp.setGpsTime(curImg.getTimeSourceInstant(imgTimeSource).minusMillis(offset));
                     curTmp.flagNewGpsData();
                     curImg.tmpUpdated();
 
@@ -578,15 +580,15 @@ public final class GpxImageCorrelation {
      * @param searchedTime time to search
      * @return index of last image before given time
      */
-    private static int getLastIndexOfListBefore(List<? extends GpxImageEntry> images, long searchedTime) {
+    private static int getLastIndexOfListBefore(List<? extends GpxImageEntry> images, long searchedTime, TimeSource imgTimeSource) {
         int lstSize = images.size();
 
         // No photos or the first photo taken is later than the search period
-        if (lstSize == 0 || searchedTime < images.get(0).getExifInstant().toEpochMilli())
+        if (lstSize == 0 || searchedTime < images.get(0).getTimeSourceInstant(imgTimeSource).toEpochMilli())
             return -1;
 
         // The search period is later than the last photo
-        if (searchedTime > images.get(lstSize - 1).getExifInstant().toEpochMilli())
+        if (searchedTime > images.get(lstSize - 1).getTimeSourceInstant(imgTimeSource).toEpochMilli())
             return lstSize-1;
 
         // The searched index is somewhere in the middle, do a binary search from the beginning
@@ -595,18 +597,18 @@ public final class GpxImageCorrelation {
         int endIndex = lstSize-1;
         while (endIndex - startIndex > 1) {
             curIndex = (endIndex + startIndex) / 2;
-            if (searchedTime > images.get(curIndex).getExifInstant().toEpochMilli()) {
+            if (searchedTime > images.get(curIndex).getTimeSourceInstant(imgTimeSource).toEpochMilli()) {
                 startIndex = curIndex;
             } else {
                 endIndex = curIndex;
             }
         }
-        if (searchedTime < images.get(endIndex).getExifInstant().toEpochMilli())
+        if (searchedTime < images.get(endIndex).getTimeSourceInstant(imgTimeSource).toEpochMilli())
             return startIndex;
 
         // This final loop is to check if photos with the exact same EXIF time follows
-        while ((endIndex < (lstSize - 1)) && (images.get(endIndex).getExifInstant().toEpochMilli()
-                == images.get(endIndex + 1).getExifInstant().toEpochMilli())) {
+        while ((endIndex < (lstSize - 1)) && (images.get(endIndex).getTimeSourceInstant(imgTimeSource).toEpochMilli()
+                == images.get(endIndex + 1).getTimeSourceInstant(imgTimeSource).toEpochMilli())) {
             endIndex++;
         }
         return endIndex;
diff --git a/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelationSettings.java b/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelationSettings.java
index 5e2d9ef699..292ba46805 100644
--- a/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelationSettings.java
+++ b/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelationSettings.java
@@ -11,6 +11,7 @@ public class GpxImageCorrelationSettings {
 
     private final long offset;
     private final boolean forceTags;
+    private final TimeSource imgTimeSource;
     private final GpxImageDirectionPositionSettings directionPositionSettings;
     private final GpxImageDatumSettings datumSettings;
 
@@ -20,7 +21,7 @@ public class GpxImageCorrelationSettings {
      * @param forceTags force tagging of all photos, otherwise prefs are used
      */
     public GpxImageCorrelationSettings(long offset, boolean forceTags) {
-        this(offset, forceTags,
+        this(offset, forceTags, TimeSource.EXIFCAMTIME,
         new GpxImageDirectionPositionSettings(false, 0, false, 0, 0, 0),
         new GpxImageDatumSettings(false, null)
         );
@@ -30,11 +31,15 @@ public class GpxImageCorrelationSettings {
      * Constructs a new {@code GpxImageCorrelationSettings}.
      * @param offset offset in milliseconds
      * @param forceTags force tagging of all photos, otherwise prefs are used
+     * @param imgTimeSource select image clock source: 
+     *                      "exifCamTime" for camera internal clock
+     *                      "exifGpsTime for the GPS clock of the camera
      * @param directionPositionSettings direction/position settings
+     * @since xxx @imgTimeSource was added
      */
-    public GpxImageCorrelationSettings(long offset, boolean forceTags,
+    public GpxImageCorrelationSettings(long offset, boolean forceTags, TimeSource imgTimeSource,
             GpxImageDirectionPositionSettings directionPositionSettings) {
-        this(offset, forceTags, directionPositionSettings,
+        this(offset, forceTags, imgTimeSource, directionPositionSettings,
         new GpxImageDatumSettings(false, null));
     }
 
@@ -42,15 +47,20 @@ public class GpxImageCorrelationSettings {
      * Constructs a new {@code GpxImageCorrelationSettings}.
      * @param offset offset in milliseconds
      * @param forceTags force tagging of all photos, otherwise prefs are used
+     * @param imgTimeSource select image clock source: 
+     *                      "exifCamTime" for camera internal clock
+     *                      "exifGpsTime for the GPS clock of the camera
      * @param directionPositionSettings direction/position settings
      * @param datumSettings GPS datum settings
      * @since 19387 @datumSettings was added
+     * @since xxx @imgTimeSource was added
      */
-    public GpxImageCorrelationSettings(long offset, boolean forceTags,
+    public GpxImageCorrelationSettings(long offset, boolean forceTags, TimeSource imgTimeSource,
             GpxImageDirectionPositionSettings directionPositionSettings,
             GpxImageDatumSettings datumSettings) {
         this.offset = offset;
         this.forceTags = forceTags;
+        this.imgTimeSource = imgTimeSource;
         this.directionPositionSettings = Objects.requireNonNull(directionPositionSettings);
         this.datumSettings = Objects.requireNonNull(datumSettings);
     }
@@ -71,6 +81,15 @@ public class GpxImageCorrelationSettings {
         return forceTags;
     }
 
+    /**
+     * Return the selected image clock source, which is camera internal time, or GPS time
+     * @return the clock source
+     * @since xxx
+     */
+    public TimeSource getImgTimeSource() {
+        return imgTimeSource;
+    }
+
     /**
      * Returns the direction/position settings.
      * @return the direction/position settings
@@ -91,6 +110,7 @@ public class GpxImageCorrelationSettings {
     @Override
     public String toString() {
         return "[offset=" + offset + ", forceTags=" + forceTags
+                + ", clock source=" + imgTimeSource
                 + ", directionPositionSettings=" + directionPositionSettings
                 + ", datumSettings=" + datumSettings + ']';
     }
diff --git a/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java b/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java
index 9842da34c8..0af80eb500 100644
--- a/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java
+++ b/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java
@@ -336,6 +336,23 @@ public class GpxImageEntry implements Comparable<GpxImageEntry>, IQuadBucketType
         return exifGpsTime != null;
     }
 
+    /**
+     * Return the time value selected with the parameter.
+     * @param timeSource the wanted time value, exifCamTime or exifGpsTime
+     * @return exifInstant or exifGpsInstant value
+     * @since xxx
+     */
+    @Override
+    public Instant getTimeSourceInstant(TimeSource timeSource) {
+        switch (timeSource) {
+            case EXIFGPSTIME:
+                return getExifGpsInstant();
+            case EXIFCAMTIME:
+                return getExifInstant();
+        }
+        return null;
+    }
+
     private static Date getDefensiveDate(Instant date) {
         if (date == null)
             return null;
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
index 14d7b3f843..43bfaac1aa 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
@@ -32,12 +32,14 @@ import java.util.function.Consumer;
 
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
+import javax.swing.JRadioButton;
 import javax.swing.JSeparator;
 import javax.swing.SwingConstants;
 import javax.swing.event.ChangeEvent;
@@ -56,6 +58,7 @@ import org.openstreetmap.josm.data.gpx.GpxImageCorrelationSettings;
 import org.openstreetmap.josm.data.gpx.GpxImageDatumSettings;
 import org.openstreetmap.josm.data.gpx.GpxTimeOffset;
 import org.openstreetmap.josm.data.gpx.GpxTimezone;
+import org.openstreetmap.josm.data.gpx.TimeSource;
 import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.ExtendedDialog;
@@ -88,6 +91,7 @@ public class CorrelateGpxWithImages extends AbstractAction implements ExpertMode
 
     private static JosmComboBoxModel<GpxDataWrapper> gpxModel;
     private static boolean forceTags;
+    private static TimeSource imgTimeSource;
 
     private final transient GeoImageLayer yLayer;
     private transient CorrelationSupportLayer supportLayer;
@@ -253,6 +257,8 @@ public class CorrelateGpxWithImages extends AbstractAction implements ExpertMode
     private JButton buttonSupport;
     private JosmTextField tfTimezone;
     private JosmTextField tfOffset;
+    private JRadioButton rbTimeFromCamera;
+    private JRadioButton rbTimeFromGps;
     private JCheckBox cbExifImg;
     private JCheckBox cbTaggedImg;
     private JCheckBox cbShowThumbs;
@@ -520,6 +526,14 @@ public class CorrelateGpxWithImages extends AbstractAction implements ExpertMode
         tfOffset = new JosmTextField(10);
         tfOffset.setText(delta.formatOffset());
 
+        // Image Time/Clock source choice 
+        rbTimeFromCamera = new JRadioButton(tr("Camera clock"));
+        rbTimeFromCamera.setSelected(true);
+        rbTimeFromGps = new JRadioButton(tr("Camera GPS clock"));        
+        ButtonGroup timeSourceGroup = new ButtonGroup();
+        timeSourceGroup.add(rbTimeFromCamera);
+        timeSourceGroup.add(rbTimeFromGps);
+
         JButton buttonViewGpsPhoto = new JButton(tr("<html>Use photo of an accurate clock,<br>e.g. GPS receiver display</html>"));
         buttonViewGpsPhoto.setIcon(ImageProvider.get("clock"));
         buttonViewGpsPhoto.addActionListener(new SetOffsetActionListener());
@@ -586,6 +600,22 @@ public class CorrelateGpxWithImages extends AbstractAction implements ExpertMode
         gbc.gridx = 3;
         panelTf.add(buttonAdjust, gbc);
 
+        // Image time source choice
+        gbc = GBC.eol();
+        gbc.gridx = 0;
+        gbc.gridy = y++;
+        panelTf.add(new JLabel(tr("Image time source:")), gbc);
+
+        gbc = GBC.eol();
+        gbc.gridx = 1;
+        gbc.gridy = y++;
+        panelTf.add(rbTimeFromCamera, gbc);
+
+        gbc = GBC.eol();
+        gbc.gridx = 1;
+        gbc.gridy = y++;
+        panelTf.add(rbTimeFromGps, gbc);
+
         gbc = GBC.eol().grid(0, y++).fill(GridBagConstraints.HORIZONTAL).insets(0, 12, 0, 0);
         panelTf.add(new JSeparator(SwingConstants.HORIZONTAL), gbc);
         panelTf.add(labelPosition, GBC.eol().grid(0, y++));
@@ -619,7 +649,7 @@ public class CorrelateGpxWithImages extends AbstractAction implements ExpertMode
         //TODO An AutoCompComboBox would be nice to list the recent datum values. I don't have the skill to add it.
         tfDatum = new JosmTextField(loadGpsDatum(), 8);
         tfDatum.setToolTipText(tr("<html>Enter the datum for your images coordinates. Default value is WGS-84.<br>" + 
-                                "For RTK it could be your local CRS epsg code.<br>(e.g. EPSG:9782 for France mainland.)</html>"));
+                                "For RTK it could be your local CRS epsg code.<br>(e.g. EPSG:9781 for France mainland.)</html>"));
         tfDatum.setEnabled(false);
 
         expertPanel.add(labelExtTags, GBC.eol().grid(0, 1));
@@ -651,6 +681,8 @@ public class CorrelateGpxWithImages extends AbstractAction implements ExpertMode
 
         tfTimezone.getDocument().addDocumentListener(statusBarUpdater);
         tfOffset.getDocument().addDocumentListener(statusBarUpdater);
+        rbTimeFromCamera.addItemListener(statusBarUpdaterWithRepaint);
+        rbTimeFromGps.addItemListener(statusBarUpdaterWithRepaint);
         cbExifImg.addItemListener(statusBarUpdaterWithRepaint);
         cbTaggedImg.addItemListener(statusBarUpdaterWithRepaint);
         cbAddGpsDatum.addItemListener(statusBarUpdaterWithRepaint);
@@ -783,6 +815,13 @@ public class CorrelateGpxWithImages extends AbstractAction implements ExpertMode
                 return e.getMessage();
             }
 
+            // Set image time source from the radio button status
+            if (rbTimeFromGps.isSelected()) {
+                imgTimeSource = TimeSource.EXIFGPSTIME;
+            } else {
+                imgTimeSource = TimeSource.EXIFCAMTIME;
+            }
+
             // The selection of images we are about to correlate may have changed.
             // So reset all images.
             yLayer.discardTmp();
@@ -799,7 +838,7 @@ public class CorrelateGpxWithImages extends AbstractAction implements ExpertMode
             final long offsetMs = ((long) (timezone.getHours() * TimeUnit.HOURS.toMillis(1))) + delta.getMilliseconds(); // in milliseconds
             lastNumMatched = GpxImageCorrelation.matchGpxTrack(dateImgLst, selGpx.data,
                     pDirectionPosition.isVisible() ?
-                            new GpxImageCorrelationSettings(offsetMs, forceTags, pDirectionPosition.getSettings(),
+                            new GpxImageCorrelationSettings(offsetMs, forceTags, imgTimeSource, pDirectionPosition.getSettings(),
                                                             new GpxImageDatumSettings(cbAddGpsDatum.isSelected(), tfDatum.getText())) :
                             new GpxImageCorrelationSettings(offsetMs, forceTags));
 
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/EditImagesSequenceAction.java b/src/org/openstreetmap/josm/gui/layer/geoimage/EditImagesSequenceAction.java
index ee93220b87..6d84ef2310 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/EditImagesSequenceAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/EditImagesSequenceAction.java
@@ -16,6 +16,7 @@ import javax.swing.event.ChangeListener;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.data.gpx.GpxImageCorrelation;
 import org.openstreetmap.josm.data.gpx.GpxImageCorrelationSettings;
+import org.openstreetmap.josm.data.gpx.TimeSource;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.geoimage.CorrelateGpxWithImages.RepaintTheMapListener;
@@ -82,7 +83,7 @@ public class EditImagesSequenceAction extends JosmAction {
             // Create a temporary copy for each image
             dateImgLst.forEach(ie -> ie.createTmp().unflagNewGpsData());
             GpxImageCorrelation.matchGpxTrack(dateImgLst, yLayer.getFauxGpxData(),
-                            new GpxImageCorrelationSettings(0, false, pDirectionPosition.getSettings()));
+                            new GpxImageCorrelationSettings(0, false, TimeSource.EXIFCAMTIME, pDirectionPosition.getSettings()));
             yLayer.updateBufferAndRepaint();
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageMetadata.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageMetadata.java
index 7aebccd962..5b3ee7e9dc 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageMetadata.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageMetadata.java
@@ -11,6 +11,7 @@ import java.time.Instant;
 import java.util.List;
 
 import org.openstreetmap.josm.data.coor.ILatLon;
+import org.openstreetmap.josm.data.gpx.TimeSource;
 import org.openstreetmap.josm.data.imagery.street_level.Projections;
 
 /**
@@ -115,6 +116,14 @@ public interface ImageMetadata {
      */
     boolean hasExifGpsTime();
 
+    /**
+     * Return the time value selected with the parameter.
+     * @param timeSource the wanted time value, exifCamTime or exifGpsTime
+     * @return exifInstant or exifGpsInstant value
+     * @since xxx
+     */
+    Instant getTimeSourceInstant(TimeSource timeSource);
+
     /**
      * Get the EXIF coordinates
      * @return The location of the image
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java b/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java
index 344c8b5e11..bbc99db52b 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java
@@ -17,6 +17,7 @@ import java.util.Objects;
 import java.util.function.Supplier;
 
 import org.openstreetmap.josm.data.coor.ILatLon;
+import org.openstreetmap.josm.data.gpx.TimeSource;
 import org.openstreetmap.josm.data.imagery.street_level.IImageEntry;
 import org.openstreetmap.josm.data.imagery.street_level.Projections;
 import org.openstreetmap.josm.tools.HttpClient;
@@ -360,6 +361,11 @@ public class RemoteEntry implements IImageEntry<RemoteEntry>, ImageMetadata {
         return this.exifTime != null;
     }
 
+    @Override
+    public Instant getTimeSourceInstant(TimeSource timeSource) {
+        return this.getTimeSourceInstant(timeSource);
+    }
+
     @Override
     public Instant getExifGpsInstant() {
         return this.exifGpsTime;
