CMS. The 2nd CMS test passed happily, for the signed data type
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Tag.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Tag.java
index 89f5e88..3768ae7 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Tag.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Tag.java
@@ -85,6 +85,10 @@
         return universalTag() == UniversalTag.EOC;
     }
 
+    public boolean isNull() {
+        return universalTag() == UniversalTag.NULL;
+    }
+
     public boolean isUniversal() {
         return tagClass().isUniversal();
     }
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/parse/Asn1ParseResult.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/parse/Asn1ParseResult.java
index 6aebeae..bf80ced 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/parse/Asn1ParseResult.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/parse/Asn1ParseResult.java
@@ -88,7 +88,7 @@
         return headerLen;
     }
 
-    protected int getOffset() {
+    public int getOffset() {
         return getBodyStart() - getHeaderLength();
     }
 
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
index 42a1446..97221ce 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
@@ -92,39 +92,41 @@
 
         int lastPos = -1, foundPos = -1;
 
-        for (Asn1ParseResult parsingItem : parseResults) {
-            if (parsingItem.isEOC()) {
+        for (Asn1ParseResult parseItem : parseResults) {
+            if (parseItem.isEOC() || parseItem.isNull()) {
                 continue;
             }
 
             foundPos = -1;
             for (int i = lastPos + 1; i < fieldInfos.length; ++i) {
-                if (parsingItem.isContextSpecific()) {
-                    if (fieldInfos[i].getTagNo() == parsingItem.tagNo()) {
+                if (parseItem.isContextSpecific()) {
+                    if (fieldInfos[i].getTagNo() == parseItem.tagNo()) {
                         foundPos = i;
                         break;
                     }
-                } else if (fields[i].tag().equals(parsingItem.tag())) {
+                } else if (fields[i].tag().equals(parseItem.tag())) {
                     foundPos = i;
                     break;
                 }
             }
             if (foundPos == -1) {
-                throw new IOException("Unexpected item with tag: " + parsingItem.tag());
+                String error = String.format("Unexpected item tag=%s, off=%d",
+                    parseItem.tag(), parseItem.getOffset());
+                throw new IOException(error);
             }
             lastPos = foundPos;
 
-            AbstractAsn1Type<?> fieldValue = (AbstractAsn1Type<?>) fields[foundPos];
+            Asn1Type fieldValue = fields[foundPos];
             if (fieldValue instanceof Asn1Any) {
                 Asn1Any any = (Asn1Any) fieldValue;
-                any.setField(parsingItem);
+                any.setField(parseItem);
                 any.setFieldInfo(fieldInfos[foundPos]);
             } else {
-                if (parsingItem.isContextSpecific()) {
-                    Asn1Binder.bindWithTagging(parsingItem, fieldValue,
+                if (parseItem.isContextSpecific()) {
+                    Asn1Binder.bindWithTagging(parseItem, fieldValue,
                             fieldInfos[foundPos].getTaggingOption());
                 } else {
-                    Asn1Binder.bind(parsingItem, fieldValue);
+                    Asn1Binder.bind(parseItem, fieldValue);
                 }
             }
         }
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Object.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Object.java
index 643d5d0..e4a88b0 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Object.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Object.java
@@ -66,34 +66,37 @@
     }
 
     public void usePrimitive(boolean isPrimitive) {
-        tag.usePrimitive(isPrimitive);
+        tag().usePrimitive(isPrimitive);
     }
 
     public boolean isPrimitive() {
-        return tag.isPrimitive();
+        return tag().isPrimitive();
     }
 
-
     public boolean isUniversal() {
-        return tag.isUniversal();
+        return tag().isUniversal();
     }
 
     public boolean isAppSpecific() {
-        return tag.isAppSpecific();
+        return tag().isAppSpecific();
     }
 
     public boolean isContextSpecific() {
-        return tag.isContextSpecific();
+        return tag().isContextSpecific();
     }
 
     public boolean isTagSpecific() {
-        return tag.isSpecific();
+        return tag().isSpecific();
     }
 
     public boolean isEOC() {
         return tag().isEOC();
     }
 
+    public boolean isNull() {
+        return tag().isNull();
+    }
+
     public boolean isSimple() {
         return Asn1Simple.isSimple(tag());
     }
diff --git a/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java b/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java
index d4e1a75..04e2aef 100644
--- a/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java
@@ -21,6 +21,7 @@
 
 import org.apache.kerby.asn1.Asn1;
 import org.apache.kerby.cms.type.ContentInfo;
+import org.apache.kerby.cms.type.SignedData;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -38,12 +39,9 @@
             contentInfo.decode(data);
             Asn1.dump(contentInfo);
 
-            //To be fixed.
-            /*
             SignedData signedData =
                 contentInfo.getContentAs(SignedData.class);
             Asn1.dump(signedData);
-            */
         } catch (Exception e) {
             e.printStackTrace();
             Assert.fail();