diff --git a/tests/src/com/android/gallery3d/exif/ExifParserTest.java b/tests/src/com/android/gallery3d/exif/ExifParserTest.java
index 38b1f2f..c93e09a 100644
--- a/tests/src/com/android/gallery3d/exif/ExifParserTest.java
+++ b/tests/src/com/android/gallery3d/exif/ExifParserTest.java
@@ -21,6 +21,7 @@
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class ExifParserTest extends ExifXmlDataTestCase {
     private static final String TAG = "ExifParserTest";
@@ -33,7 +34,7 @@
         super(imgPath, xmlPath);
     }
 
-    private List<Map<Short, String>> mGroundTruth;
+    private List<Map<Short, Set<String>>> mGroundTruth;
 
     @Override
     public void setUp() throws Exception {
@@ -83,20 +84,21 @@
         if (tag.getTagId() == ExifTag.TAG_MAKER_NOTE
                 || tag.getTagId() == ExifTag.TAG_USER_COMMENT) return;
 
-        String truthString = mGroundTruth.get(tag.getIfd()).get(tag.getTagId());
+        Set<String> truth = mGroundTruth.get(tag.getIfd()).get(tag.getTagId());
 
-        if (truthString == null) {
+        if (truth == null) {
             fail(String.format("Unknown Tag %02x", tag.getTagId()) + ", " + getImageTitle());
         }
 
         String dataString = tag.valueToString().trim();
-        assertEquals(String.format("Tag %02x", tag.getTagId()) + ", " + getImageTitle(),
-                truthString.trim(), dataString);
+        assertTrue(String.format("Tag %02x", tag.getTagId()) + ", " + getImageTitle()
+                + ": " + dataString,
+                truth.contains(dataString));
     }
 
     private void parseOneIfd(int ifd, int options) throws Exception {
         try {
-            Map<Short, String> expectedResult = mGroundTruth.get(ifd);
+            Map<Short, Set<String>> expectedResult = mGroundTruth.get(ifd);
             int numOfTag = 0;
             ExifParser parser = ExifParser.parse(getImageInputStream(), options);
             int event = parser.next();
diff --git a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
index 6a884ea..40d269e 100644
--- a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
+++ b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java
@@ -20,6 +20,7 @@
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class ExifReaderTest extends ExifXmlDataTestCase {
     private static final String TAG = "ExifReaderTest";
@@ -36,7 +37,7 @@
         try {
             ExifReader reader = new ExifReader();
             ExifData exifData = reader.read(getImageInputStream());
-            List<Map<Short, String>> groundTruth = ExifXmlReader.readXml(getXmlParser());
+            List<Map<Short, Set<String>>> groundTruth = ExifXmlReader.readXml(getXmlParser());
             for (int i = 0; i < IfdId.TYPE_IFD_COUNT; i++) {
                 checkIfd(exifData.getIfdData(i), groundTruth.get(i));
             }
@@ -104,7 +105,7 @@
         }
     }
 
-    private void checkIfd(IfdData ifd, Map<Short, String> ifdValue) {
+    private void checkIfd(IfdData ifd, Map<Short, Set<String>> ifdValue) {
         if (ifd == null) {
             assertEquals(getImageTitle(), 0 ,ifdValue.size());
             return;
@@ -115,8 +116,10 @@
             if (ExifTag.isSubIfdOffsetTag(tag.getTagId())
                     || tag.getTagId() == ExifTag.TAG_MAKER_NOTE) continue;
             if (tag.getTagId() != ExifTag.TAG_USER_COMMENT) {
-                assertEquals(String.format("Tag %x, ", tag.getTagId()) + getImageTitle(),
-                        ifdValue.get(tag.getTagId()).trim(), tag.valueToString().trim());
+                Set<String> truth = ifdValue.get(tag.getTagId());
+                assertNotNull(String.format("Tag %x, ", tag.getTagId()) + getImageTitle(), truth);
+                assertTrue(String.format("Tag %x, ", tag.getTagId()) + getImageTitle(),
+                        truth.contains(tag.valueToString().trim()));
             }
             size++;
         }
diff --git a/tests/src/com/android/gallery3d/exif/ExifXmlReader.java b/tests/src/com/android/gallery3d/exif/ExifXmlReader.java
index 139b0ca..54def27 100644
--- a/tests/src/com/android/gallery3d/exif/ExifXmlReader.java
+++ b/tests/src/com/android/gallery3d/exif/ExifXmlReader.java
@@ -22,8 +22,10 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class ExifXmlReader {
     private static final String TAG_EXIF = "exif";
@@ -44,13 +46,13 @@
      * @throws XmlPullParserException
      * @throws IOException
      */
-    static public List<Map<Short, String>> readXml(XmlPullParser parser)
+    static public List<Map<Short, Set<String>>> readXml(XmlPullParser parser)
             throws XmlPullParserException, IOException {
 
-        List<Map<Short, String>> exifData =
-                new ArrayList<Map<Short, String>>(IfdId.TYPE_IFD_COUNT);
+        List<Map<Short, Set<String>>> exifData =
+                new ArrayList<Map<Short, Set<String>>>(IfdId.TYPE_IFD_COUNT);
         for (int i = 0; i < IfdId.TYPE_IFD_COUNT; i++) {
-            exifData.add(new HashMap<Short, String>());
+            exifData.add(new HashMap<Short, Set<String>>());
         }
 
         while (parser.next() != XmlPullParser.END_DOCUMENT) {
@@ -79,7 +81,12 @@
             if (ifdId < 0) {
                 // TODO: the MarkerNote segment.
             } else {
-                exifData.get(ifdId).put(id, value);
+                Set<String> tagData = exifData.get(ifdId).get(id);
+                if (tagData == null) {
+                    tagData = new HashSet<String>();
+                    exifData.get(ifdId).put(id, tagData);
+                }
+                tagData.add(value.trim());
             }
 
             parser.require(XmlPullParser.END_TAG, null, null);
