diff --git a/go.mod b/go.mod
index bda42c9..2a6f17d 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,7 @@ go 1.22.1
 
 require (
 	github.com/dumacp/smartcard v0.1.5
-	github.com/gmrtd/gmrtd v0.0.0-20240804154717-fe91101179fb
+	github.com/gmrtd/gmrtd v0.0.0-20240812161507-951402263c99
 	github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c
 )
 
@@ -12,5 +12,5 @@ require (
 	github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1 // indirect
 	github.com/ebfe/brainpool v0.0.0-20130314170211-492e4d960f63 // indirect
 	github.com/ebfe/scard v0.0.0-20230420082256-7db3f9b7c8a7 // indirect
-	golang.org/x/sys v0.23.0 // indirect
+	golang.org/x/sys v0.24.0 // indirect
 )
diff --git a/go.sum b/go.sum
index 7a5467a..7755227 100644
--- a/go.sum
+++ b/go.sum
@@ -54,6 +54,10 @@ github.com/gmrtd/gmrtd v0.0.0-20240804150410-ad0942f9038e h1:PX7/escpY+Bq7puicat
 github.com/gmrtd/gmrtd v0.0.0-20240804150410-ad0942f9038e/go.mod h1:yMi0ExfvEj/Tb1LZ1dfAyGe7ZVuv6kasax77Oj6HD8I=
 github.com/gmrtd/gmrtd v0.0.0-20240804154717-fe91101179fb h1:vEgi9ZC09u43/ZbfnMRkuBXWQdYNCySrdZ5adaQ3gk0=
 github.com/gmrtd/gmrtd v0.0.0-20240804154717-fe91101179fb/go.mod h1:yMi0ExfvEj/Tb1LZ1dfAyGe7ZVuv6kasax77Oj6HD8I=
+github.com/gmrtd/gmrtd v0.0.0-20240812125037-707ec1f31f2c h1:3HD2ccGSRptMuaahEU51pyxolfd24ywJwG8KjmMLrss=
+github.com/gmrtd/gmrtd v0.0.0-20240812125037-707ec1f31f2c/go.mod h1:yMi0ExfvEj/Tb1LZ1dfAyGe7ZVuv6kasax77Oj6HD8I=
+github.com/gmrtd/gmrtd v0.0.0-20240812161507-951402263c99 h1:YdNOeak+iphgZqglCtrZU3wK9SU3XOFtYX8WYmVsUY4=
+github.com/gmrtd/gmrtd v0.0.0-20240812161507-951402263c99/go.mod h1:yMi0ExfvEj/Tb1LZ1dfAyGe7ZVuv6kasax77Oj6HD8I=
 github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
 github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
 golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
@@ -64,3 +68,5 @@ golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
 golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
 golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
+golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
diff --git a/template.tpl b/template.tpl
index 854f0bd..0135288 100644
--- a/template.tpl
+++ b/template.tpl
@@ -12,6 +12,16 @@ h2 {
 </head>
 <body>
 
+{{define "fileHexAndTlv"}}
+<div><pre>
+{{. | BytesToHex}}
+</pre></div>
+
+<div><pre>
+{{. | TlvBytesToString}}
+</pre></div>
+{{end}}
+
 <h1>GMRTD</h1>
 
 <div><pre>
@@ -29,108 +39,66 @@ ATS: {{.Ats | BytesToHex}}
 </pre></div>
 
 <h2>CardAccess</h2>
-{{if .CardAccess}}
-<div><pre>
-{{.CardAccess.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.CardAccess.RawData | TlvBytesToString}}
-</pre></div>
+{{if .Mf.CardAccess}}
+{{template "fileHexAndTlv" .Mf.CardAccess.RawData}}
 {{else}}
 <i>No data</i>
 {{end}}
 
 <h2>CardSecurity</h2>
-{{if .CardSecurity}}
-<div><pre>
-{{.CardSecurity.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.CardSecurity.RawData | TlvBytesToString}}
-</pre></div>
+{{if .Mf.CardSecurity}}
+{{template "fileHexAndTlv" .Mf.CardSecurity.RawData}}
 {{else}}
 <i>No data</i>
 {{end}}
 
 <h2>DIR</h2>
-{{if .Dir}}
-<div><pre>
-{{.Dir.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dir.RawData | TlvBytesToString}}
-</pre></div>
+{{if .Mf.Dir}}
+{{template "fileHexAndTlv" .Mf.Dir.RawData}}
 {{else}}
 <i>No data</i>
 {{end}}
 
 <h2>COM</h2>
-{{if .Com}}
-<div><pre>
-{{.Com.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Com.RawData | TlvBytesToString}}
-</pre></div>
+{{if .Mf.Lds1.Com}}
+{{template "fileHexAndTlv" .Mf.Lds1.Com.RawData}}
 {{else}}
 <i>No data</i>
 {{end}}
 
-<h2>SOD</h2>
-{{if .Sod}}
-<div><pre>
-{{.Sod.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Sod.RawData | TlvBytesToString}}
-</pre></div>
+<h2>SOD <sub>Document Security Object</sub></h2>
+{{if .Mf.Lds1.Sod}}
+{{template "fileHexAndTlv" .Mf.Lds1.Sod.RawData}}
 {{else}}
 <i>No data</i>
 {{end}}
 
-<h2>DG1</h2>
-{{if .Dg1}}
-<div><pre>
-{{.Dg1.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dg1.RawData | TlvBytesToString}}
-</pre></div>
+<h2>DG1 <sub>Machine Readable Zone Information</sub></h2>
+{{if .Mf.Lds1.Dg1}}
+{{template "fileHexAndTlv" .Mf.Lds1.Dg1.RawData}}
 
 <div><pre>
-DocumentCode  : {{.Dg1.Mrz.DocumentCode}}
-IssuingState  : {{.Dg1.Mrz.IssuingState}}
-NameOfHolder  : [Primary] {{.Dg1.Mrz.NameOfHolder.Primary}} [Secondary] {{.Dg1.Mrz.NameOfHolder.Secondary}}
-DocumentNumber: {{.Dg1.Mrz.DocumentNumber}}
-Nationality   : {{.Dg1.Mrz.Nationality}}
-DateOfBirth   : {{.Dg1.Mrz.DateOfBirth}}
-Sex           : {{.Dg1.Mrz.Sex}}
-DateOfExpiry  : {{.Dg1.Mrz.DateOfExpiry}}
-OptionalData  : {{.Dg1.Mrz.OptionalData}}
-OptionalData2 : {{.Dg1.Mrz.OptionalData2}}
+DocumentCode  : {{.Mf.Lds1.Dg1.Mrz.DocumentCode}}
+IssuingState  : {{.Mf.Lds1.Dg1.Mrz.IssuingState}}
+NameOfHolder  : [Primary] {{.Mf.Lds1.Dg1.Mrz.NameOfHolder.Primary}} [Secondary] {{.Mf.Lds1.Dg1.Mrz.NameOfHolder.Secondary}}
+DocumentNumber: {{.Mf.Lds1.Dg1.Mrz.DocumentNumber}}
+Nationality   : {{.Mf.Lds1.Dg1.Mrz.Nationality}}
+DateOfBirth   : {{.Mf.Lds1.Dg1.Mrz.DateOfBirth}}
+Sex           : {{.Mf.Lds1.Dg1.Mrz.Sex}}
+DateOfExpiry  : {{.Mf.Lds1.Dg1.Mrz.DateOfExpiry}}
+OptionalData  : {{.Mf.Lds1.Dg1.Mrz.OptionalData}}
+OptionalData2 : {{.Mf.Lds1.Dg1.Mrz.OptionalData2}}
 </pre></div>
 {{else}}
 <i>No data</i>
 {{end}}
 
-<h2>DG2</h2>
-{{if .Dg2}}
-<div><pre>
-{{.Dg2.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dg2.RawData | TlvBytesToString}}
-</pre></div>
+<h2>DG2 <sub>Encoded Identification Features - Face</sub></h2>
+{{if .Mf.Lds1.Dg2}}
+{{template "fileHexAndTlv" .Mf.Lds1.Dg2.RawData}}
 
 <!-- TODO - would be good got DG2 to provide an easier way to access the images -->
-{{ range .Dg2.BITs }}
+{{ range .Mf.Lds1.Dg2.BITs }}
     {{ range .BDB.Facial.Images }}
         <img src="data:image/jpeg;base64,{{.Data | BytesToBase64}}" />
         <br/>
@@ -143,123 +111,82 @@ OptionalData2 : {{.Dg1.Mrz.OptionalData2}}
 <i>No data</i>
 {{end}}
 
-<h2>DG7</h2>
-{{if .Dg7}}
-<div><pre>
-{{.Dg7.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dg7.RawData | TlvBytesToString}}
-</pre></div>
+<h2>DG7 <sub>Displayed Signature or Usual Mark</sub></h2>
+{{if .Mf.Lds1.Dg7}}
+{{template "fileHexAndTlv" .Mf.Lds1.Dg7.RawData}}
+<!-- TODO - output any image(s) -->
 {{else}}
 <i>No data</i>
 {{end}}
 
-<h2>DG11</h2>
-{{if .Dg11}}
-<div><pre>
-{{.Dg11.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dg11.RawData | TlvBytesToString}}
-</pre></div>
-
-<div><pre>
-NameOfHolder        : {{.Dg11.Details.NameOfHolder}}
-OtherNames          : {{.Dg11.Details.OtherNames}}
-PersonalNumber      : {{.Dg11.Details.PersonalNumber}}
-FullDateOfBirth     : {{.Dg11.Details.FullDateOfBirth}}
-PlaceOfBirth        : {{.Dg11.Details.PlaceOfBirth}}
-Address             : {{.Dg11.Details.Address}}
-Telephone           : {{.Dg11.Details.Telephone}}
-Profession          : {{.Dg11.Details.Profession}}
-Title               : {{.Dg11.Details.Title}}
-PersonalSummary     : {{.Dg11.Details.PersonalSummary}}
-ProofOfCitizenship  : {{.Dg11.Details.ProofOfCitizenship | BytesToHex}}
-OtherTravelDocuments: {{.Dg11.Details.OtherTravelDocuments}}
-CustodyInformation  : {{.Dg11.Details.CustodyInformation}}
+<h2>DG11 <sub>Additional Personal Detail(s)</sub></h2>
+{{if .Mf.Lds1.Dg11}}
+{{template "fileHexAndTlv" .Mf.Lds1.Dg11.RawData}}
+
+<div><pre>
+NameOfHolder        : {{.Mf.Lds1.Dg11.Details.NameOfHolder}}
+OtherNames          : {{.Mf.Lds1.Dg11.Details.OtherNames}}
+PersonalNumber      : {{.Mf.Lds1.Dg11.Details.PersonalNumber}}
+FullDateOfBirth     : {{.Mf.Lds1.Dg11.Details.FullDateOfBirth}}
+PlaceOfBirth        : {{.Mf.Lds1.Dg11.Details.PlaceOfBirth}}
+Address             : {{.Mf.Lds1.Dg11.Details.Address}}
+Telephone           : {{.Mf.Lds1.Dg11.Details.Telephone}}
+Profession          : {{.Mf.Lds1.Dg11.Details.Profession}}
+Title               : {{.Mf.Lds1.Dg11.Details.Title}}
+PersonalSummary     : {{.Mf.Lds1.Dg11.Details.PersonalSummary}}
+ProofOfCitizenship  : {{.Mf.Lds1.Dg11.Details.ProofOfCitizenship | BytesToHex}}
+OtherTravelDocuments: {{.Mf.Lds1.Dg11.Details.OtherTravelDocuments}}
+CustodyInformation  : {{.Mf.Lds1.Dg11.Details.CustodyInformation}}
 </div></pre>
 
 {{else}}
 <i>No data</i>
 {{end}}
 
-<h2>DG12</h2>
-{{if .Dg12}}
-<div><pre>
-{{.Dg12.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dg12.RawData | TlvBytesToString}}
-</pre></div>
+<h2>DG12 <sub>Additional Document Detail(s)</sub></h2>
+{{if .Mf.Lds1.Dg12}}
+{{template "fileHexAndTlv" .Mf.Lds1.Dg12.RawData}}
 
 <div><pre>
-IssuingAuthority           : {{.Dg12.Details.IssuingAuthority}}
-DateOfIssue                : {{.Dg12.Details.DateOfIssue}}
-OtherPersons               : {{.Dg12.Details.OtherPersons}}
-EndorsementsAndObservations: {{.Dg12.Details.EndorsementsAndObservations}}
-TaxExitRequirements        : {{.Dg12.Details.TaxExitRequirements}}
-ImageFront                 : {{.Dg12.Details.ImageFront | BytesToHex}}
-ImageRear                  : {{.Dg12.Details.ImageRear | BytesToHex}}
-PersoDateTime              : {{.Dg12.Details.PersoDateTime}}
-PersoSystemSerialNumber    : {{.Dg12.Details.PersoSystemSerialNumber}}
+IssuingAuthority           : {{.Mf.Lds1.Dg12.Details.IssuingAuthority}}
+DateOfIssue                : {{.Mf.Lds1.Dg12.Details.DateOfIssue}}
+OtherPersons               : {{.Mf.Lds1.Dg12.Details.OtherPersons}}
+EndorsementsAndObservations: {{.Mf.Lds1.Dg12.Details.EndorsementsAndObservations}}
+TaxExitRequirements        : {{.Mf.Lds1.Dg12.Details.TaxExitRequirements}}
+ImageFront                 : {{.Mf.Lds1.Dg12.Details.ImageFront | BytesToHex}}
+ImageRear                  : {{.Mf.Lds1.Dg12.Details.ImageRear | BytesToHex}}
+PersoDateTime              : {{.Mf.Lds1.Dg12.Details.PersoDateTime}}
+PersoSystemSerialNumber    : {{.Mf.Lds1.Dg12.Details.PersoSystemSerialNumber}}
 </pre></div>
 
 {{else}}
 <i>No data</i>
 {{end}}
 
-<h2>DG13</h2>
-{{if .Dg13}}
-<div><pre>
-{{.Dg13.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dg13.RawData | TlvBytesToString}}
-</pre></div>
+<h2>DG13 <sub>Optional Detail(s)</sub></h2>
+{{if .Mf.Lds1.Dg13}}
+{{template "fileHexAndTlv" .Mf.Lds1.Dg13.RawData}}
 {{else}}
 <i>No data</i>
 {{end}}
 
-<h2>DG14</h2>
-{{if .Dg14}}
-<div><pre>
-{{.Dg14.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dg14.RawData | TlvBytesToString}}
-</pre></div>
+<h2>DG14 <sub>Security Options</sub></h2>
+{{if .Mf.Lds1.Dg14}}
+{{template "fileHexAndTlv" .Mf.Lds1.Dg14.RawData}}
 {{else}}
 <i>No data</i>
 {{end}}
 
-<h2>DG15</h2>
-{{if .Dg15}}
-<div><pre>
-{{.Dg15.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dg15.RawData | TlvBytesToString}}
-</pre></div>
+<h2>DG15 <sub>Active Authentication Public Key Info</sub></h2>
+{{if .Mf.Lds1.Dg15}}
+{{template "fileHexAndTlv" .Mf.Lds1.Dg15.RawData}}
 {{else}}
 <i>No data</i>
 {{end}}
 
-<h2>DG16</h2>
-{{if .Dg16}}
-<div><pre>
-{{.Dg16.RawData | BytesToHex}}
-</pre></div>
-
-<div><pre>
-{{.Dg16.RawData | TlvBytesToString}}
-</pre></div>
+<h2>DG16 <sub>Person(s) to Notify</sub></h2>
+{{if .Mf.Lds1.Dg16}}
+{{template "fileHexAndTlv" .Mf.Lds1.Dg16.RawData}}
 {{else}}
 <i>No data</i>
 {{end}}