Index: trunk/src/org/openstreetmap/josm/tools/ExifReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ExifReader.java	(revision 9498)
+++ trunk/src/org/openstreetmap/josm/tools/ExifReader.java	(revision 9499)
@@ -42,5 +42,5 @@
             Metadata metadata = JpegMetadataReader.readMetadata(filename);
             String dateStr = null;
-            OUTER:
+            String subSeconds = null;
             for (Directory dirIt : metadata.getDirectories()) {
                 for (Tag tag : dirIt.getTags()) {
@@ -48,9 +48,14 @@
                             !tag.getDescription().matches("\\[[0-9]+ .+\\]")) {
                         dateStr = tag.getDescription();
-                        break OUTER; // prefer this tag if known
                     }
                     if (tag.getTagType() == ExifIFD0Directory.TAG_DATETIME /* 0x0132 */ ||
                         tag.getTagType() == ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED /* 0x9004 */) {
-                        dateStr = tag.getDescription();
+                        if (dateStr != null) {
+                            // prefer TAG_DATETIME_ORIGINAL
+                            dateStr = tag.getDescription();
+                        }
+                    }
+                    if (tag.getTagType() == ExifIFD0Directory.TAG_SUBSECOND_TIME_ORIGINAL) {
+                        subSeconds = tag.getDescription();
                     }
                 }
@@ -58,5 +63,14 @@
             if (dateStr != null) {
                 dateStr = dateStr.replace('/', ':'); // workaround for HTC Sensation bug, see #7228
-                return DateUtils.fromString(dateStr);
+                final Date date = DateUtils.fromString(dateStr);
+                if (subSeconds != null) {
+                    try {
+                        date.setTime(date.getTime() + Integer.parseInt(subSeconds));
+                    } catch (NumberFormatException e) {
+                        Main.warn("Failed parsing sub seconds from [{0}]", subSeconds);
+                        Main.warn(e);
+                    }
+                }
+                return date;
             }
         } catch (Exception e) {
Index: trunk/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java	(revision 9498)
+++ trunk/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java	(revision 9499)
@@ -8,4 +8,5 @@
 import java.text.DecimalFormat;
 import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -47,4 +48,15 @@
 
     /**
+     * Tests reading sub-seconds from the EXIF header
+     * @throws ParseException  if {@link ExifReader#readTime} fails to parse date/time of sample file
+     */
+    @Test
+    public void testReadTimeSubSecond1() throws ParseException {
+        Date date = ExifReader.readTime(new File("data_nodist/IMG_20150711_193419.jpg"));
+        String dateStr = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(date);
+        assertEquals("2015-07-11T19:34:19.100", dateStr);
+    }
+
+    /**
      * Test orientation extraction
      */
