Index: /trunk/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java	(revision 19425)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java	(revision 19426)
@@ -77,4 +77,5 @@
         final GpxImageDatumSettings datumSettings = settings.getDatumSettings();
         final long offset = settings.getOffset();
+        final TimeSource imgTimeSource = settings.getImgTimeSource();
 
         boolean isFirst = true;
@@ -145,5 +146,5 @@
                     }
                     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;
@@ -153,5 +154,5 @@
         }
         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);
         }
@@ -362,4 +363,5 @@
                                         WayPoint curWp,
                                         long curWpTime,
+                                        TimeSource imgTimeSource,
                                         long offset,
                                         boolean interpolate,
@@ -376,5 +378,5 @@
             i = images.size() - 1;
         } else {
-            i = getLastIndexOfListBefore(images, curWpTime);
+            i = getLastIndexOfListBefore(images, curWpTime, imgTimeSource);
         }
 
@@ -427,5 +429,5 @@
                 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;
@@ -460,5 +462,5 @@
             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;
@@ -548,5 +550,5 @@
                     }
 
-                    curTmp.setGpsTime(curImg.getExifInstant().minusMillis(offset));
+                    curTmp.setGpsTime(curImg.getTimeSourceInstant(imgTimeSource).minusMillis(offset));
                     curTmp.flagNewGpsData();
                     curImg.tmpUpdated();
@@ -579,13 +581,13 @@
      * @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;
 
@@ -596,5 +598,5 @@
         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 {
@@ -602,10 +604,10 @@
             }
         }
-        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++;
         }
Index: /trunk/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelationSettings.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelationSettings.java	(revision 19425)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelationSettings.java	(revision 19426)
@@ -12,4 +12,5 @@
     private final long offset;
     private final boolean forceTags;
+    private final TimeSource imgTimeSource;
     private final GpxImageDirectionPositionSettings directionPositionSettings;
     private final GpxImageDatumSettings datumSettings;
@@ -21,5 +22,5 @@
      */
     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)
@@ -31,9 +32,13 @@
      * @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 19426 @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));
     }
@@ -43,13 +48,18 @@
      * @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 19426 @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);
@@ -70,4 +80,13 @@
     public boolean isForceTags() {
         return forceTags;
+    }
+
+    /**
+     * Return the selected image clock source, which is camera internal time, or GPS time
+     * @return the clock source
+     * @since 19426
+     */
+    public TimeSource getImgTimeSource() {
+        return imgTimeSource;
     }
 
@@ -92,4 +111,5 @@
     public String toString() {
         return "[offset=" + offset + ", forceTags=" + forceTags
+                + ", clock source=" + imgTimeSource
                 + ", directionPositionSettings=" + directionPositionSettings
                 + ", datumSettings=" + datumSettings + ']';
Index: /trunk/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java	(revision 19425)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java	(revision 19426)
@@ -335,4 +335,21 @@
     public boolean hasExifGpsTime() {
         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 19426
+     */
+    @Override
+    public Instant getTimeSourceInstant(TimeSource timeSource) {
+        switch (timeSource) {
+            case EXIFGPSTIME:
+                return getExifGpsInstant();
+            case EXIFCAMTIME:
+                return getExifInstant();
+        }
+        return null;
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/gpx/TimeSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/TimeSource.java	(revision 19426)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/TimeSource.java	(revision 19426)
@@ -0,0 +1,14 @@
+// License: GPL. For details, see LICENSE file.
+
+package org.openstreetmap.josm.data.gpx;
+
+/**
+ * Time sources available in the image Exif metadata.
+ * @since 19426
+ */
+public enum TimeSource {
+    /**Time from the camera internal clock (RTC)*/
+    EXIFCAMTIME,
+    /**Time from the camera GPS clock*/
+    EXIFGPSTIME
+}
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 19425)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 19426)
@@ -33,4 +33,5 @@
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JButton;
@@ -39,4 +40,5 @@
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
+import javax.swing.JRadioButton;
 import javax.swing.JSeparator;
 import javax.swing.SwingConstants;
@@ -57,4 +59,5 @@
 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;
@@ -89,4 +92,5 @@
     private static JosmComboBoxModel<GpxDataWrapper> gpxModel;
     private static boolean forceTags;
+    private static TimeSource imgTimeSource;
 
     private final transient GeoImageLayer yLayer;
@@ -254,4 +258,6 @@
     private JosmTextField tfTimezone;
     private JosmTextField tfOffset;
+    private JRadioButton rbTimeFromCamera;
+    private JRadioButton rbTimeFromGps;
     private JCheckBox cbExifImg;
     private JCheckBox cbTaggedImg;
@@ -485,4 +491,5 @@
     }
 
+    // CHECKSTYLE.OFF: ExecutableStatementCount
     @Override
     public void actionPerformed(ActionEvent ae) {
@@ -521,4 +528,12 @@
         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"));
@@ -586,4 +601,20 @@
         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);
@@ -652,4 +683,6 @@
         tfTimezone.getDocument().addDocumentListener(statusBarUpdater);
         tfOffset.getDocument().addDocumentListener(statusBarUpdater);
+        rbTimeFromCamera.addItemListener(statusBarUpdaterWithRepaint);
+        rbTimeFromGps.addItemListener(statusBarUpdaterWithRepaint);
         cbExifImg.addItemListener(statusBarUpdaterWithRepaint);
         cbTaggedImg.addItemListener(statusBarUpdaterWithRepaint);
@@ -682,4 +715,5 @@
         }
     }
+    // CHECKSTYLE.ON: ExecutableStatementCount
 
     public GpxImageDatumSettings getSettings() {
@@ -784,4 +818,11 @@
             }
 
+            // 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.
@@ -800,5 +841,5 @@
             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));
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/EditImagesSequenceAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/EditImagesSequenceAction.java	(revision 19425)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/EditImagesSequenceAction.java	(revision 19426)
@@ -17,4 +17,5 @@
 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;
@@ -83,5 +84,5 @@
             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();
         }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageMetadata.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageMetadata.java	(revision 19425)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageMetadata.java	(revision 19426)
@@ -12,4 +12,5 @@
 
 import org.openstreetmap.josm.data.coor.ILatLon;
+import org.openstreetmap.josm.data.gpx.TimeSource;
 import org.openstreetmap.josm.data.imagery.street_level.Projections;
 
@@ -115,4 +116,12 @@
      */
     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 19426
+     */
+    Instant getTimeSourceInstant(TimeSource timeSource);
 
     /**
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java	(revision 19425)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java	(revision 19426)
@@ -18,4 +18,5 @@
 
 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;
@@ -362,4 +363,9 @@
 
     @Override
+    public Instant getTimeSourceInstant(TimeSource timeSource) {
+        return this.getTimeSourceInstant(timeSource);
+    }
+
+    @Override
     public Instant getExifGpsInstant() {
         return this.exifGpsTime;
