Index: trunk/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java	(revision 15215)
+++ trunk/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java	(revision 15219)
@@ -5,4 +5,5 @@
 import java.io.IOException;
 import java.util.Date;
+import java.util.List;
 import java.util.Objects;
 import java.util.function.Consumer;
@@ -21,4 +22,5 @@
 import com.drew.metadata.exif.ExifIFD0Directory;
 import com.drew.metadata.exif.GpsDirectory;
+import com.drew.metadata.iptc.IptcDirectory;
 import com.drew.metadata.jpeg.JpegDirectory;
 
@@ -41,4 +43,9 @@
     /** Temporary source of GPS time if not correlated with GPX track. */
     private Date exifGpsTime;
+
+    private String iptcCaption;
+    private String iptcHeadline;
+    private List<String> iptcKeywords;
+    private String iptcObjectName;
 
     /**
@@ -333,4 +340,76 @@
     public void setExifImgDir(Double exifDir) {
         this.exifImgDir = exifDir;
+    }
+
+    /**
+     * Sets the IPTC caption.
+     * @param iptcCaption the IPTC caption
+     * @since 15219
+     */
+    public void setIptcCaption(String iptcCaption) {
+        this.iptcCaption = iptcCaption;
+    }
+
+    /**
+     * Sets the IPTC headline.
+     * @param iptcHeadline the IPTC headline
+     * @since 15219
+     */
+    public void setIptcHeadline(String iptcHeadline) {
+        this.iptcHeadline = iptcHeadline;
+    }
+
+    /**
+     * Sets the IPTC keywords.
+     * @param iptcKeywords the IPTC keywords
+     * @since 15219
+     */
+    public void setIptcKeywords(List<String> iptcKeywords) {
+        this.iptcKeywords = iptcKeywords;
+    }
+
+    /**
+     * Sets the IPTC object name.
+     * @param iptcObjectName the IPTC object name
+     * @since 15219
+     */
+    public void setIptcObjectName(String iptcObjectName) {
+        this.iptcObjectName = iptcObjectName;
+    }
+
+    /**
+     * Returns the IPTC caption.
+     * @return the IPTC caption
+     * @since 15219
+     */
+    public String getIptcCaption() {
+        return iptcCaption;
+    }
+
+    /**
+     * Returns the IPTC headline.
+     * @return the IPTC headline
+     * @since 15219
+     */
+    public String getIptcHeadline() {
+        return iptcHeadline;
+    }
+
+    /**
+     * Returns the IPTC keywords.
+     * @return the IPTC keywords
+     * @since 15219
+     */
+    public List<String> getIptcKeywords() {
+        return iptcKeywords;
+    }
+
+    /**
+     * Returns the IPTC object name.
+     * @return the IPTC object name
+     * @since 15219
+     */
+    public String getIptcObjectName() {
+        return iptcObjectName;
     }
 
@@ -556,4 +635,12 @@
 
         ifNotNull(dirGps.getGpsDate(), this::setExifGpsTime);
+
+        IptcDirectory dirIptc = metadata.getFirstDirectoryOfType(IptcDirectory.class);
+        if (dirIptc != null) {
+            ifNotNull(ExifReader.readCaption(dirIptc), this::setIptcCaption);
+            ifNotNull(ExifReader.readHeadline(dirIptc), this::setIptcHeadline);
+            ifNotNull(ExifReader.readKeywords(dirIptc), this::setIptcKeywords);
+            ifNotNull(ExifReader.readObjectName(dirIptc), this::setIptcObjectName);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 15215)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 15219)
@@ -14,4 +14,5 @@
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.util.Optional;
 
 import javax.swing.Box;
@@ -473,4 +474,8 @@
                 osd.append(tr("\nGPS time: {0}", dtf.format(entry.getGpsTime())));
             }
+            Optional.ofNullable(entry.getIptcCaption()).map(s -> tr("\nCaption: {0}", s)).ifPresent(osd::append);
+            Optional.ofNullable(entry.getIptcHeadline()).map(s -> tr("\nHeadline: {0}", s)).ifPresent(osd::append);
+            Optional.ofNullable(entry.getIptcKeywords()).map(s -> tr("\nKeywords: {0}", s)).ifPresent(osd::append);
+            Optional.ofNullable(entry.getIptcObjectName()).map(s -> tr("\nObject name: {0}", s)).ifPresent(osd::append);
 
             imgDisplay.setOsdText(osd.toString());
Index: trunk/src/org/openstreetmap/josm/tools/ExifReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ExifReader.java	(revision 15215)
+++ trunk/src/org/openstreetmap/josm/tools/ExifReader.java	(revision 15219)
@@ -7,4 +7,5 @@
 import java.time.DateTimeException;
 import java.util.Date;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
@@ -24,4 +25,5 @@
 import com.drew.metadata.exif.ExifSubIFDDirectory;
 import com.drew.metadata.exif.GpsDirectory;
+import com.drew.metadata.iptc.IptcDirectory;
 
 /**
@@ -327,4 +329,44 @@
 
     /**
+     * Returns the caption of the given IPTC directory.
+     * @param dirIptc The IPTC directory
+     * @return The caption entered, or {@code null} if missing or if {@code dirIptc} is null
+     * @since 15219
+     */
+    public static String readCaption(IptcDirectory dirIptc) {
+        return dirIptc == null ? null : dirIptc.getDescription(IptcDirectory.TAG_CAPTION);
+    }
+
+    /**
+     * Returns the headline of the given IPTC directory.
+     * @param dirIptc The IPTC directory
+     * @return The headline entered, or {@code null} if missing or if {@code dirIptc} is null
+     * @since 15219
+     */
+    public static String readHeadline(IptcDirectory dirIptc) {
+        return dirIptc == null ? null : dirIptc.getDescription(IptcDirectory.TAG_HEADLINE);
+    }
+
+    /**
+     * Returns the keywords of the given IPTC directory.
+     * @param dirIptc The IPTC directory
+     * @return The keywords entered, or {@code null} if missing or if {@code dirIptc} is null
+     * @since 15219
+     */
+    public static List<String> readKeywords(IptcDirectory dirIptc) {
+        return dirIptc == null ? null : dirIptc.getKeywords();
+    }
+
+    /**
+     * Returns the object name of the given IPTC directory.
+     * @param dirIptc The IPTC directory
+     * @return The object name entered, or {@code null} if missing or if {@code dirIptc} is null
+     * @since 15219
+     */
+    public static String readObjectName(IptcDirectory dirIptc) {
+        return dirIptc == null ? null : dirIptc.getDescription(IptcDirectory.TAG_OBJECT_NAME);
+    }
+
+    /**
      * Returns a Transform that fixes the image orientation.
      *
