diff --git a/SabreTools.Data.Models/NoIntroDatabase/Archive.cs b/SabreTools.Data.Models/NoIntroDatabase/Archive.cs
new file mode 100644
index 00000000..adb12582
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/Archive.cs
@@ -0,0 +1,119 @@
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("archive")]
+ public class Archive
+ {
+ [XmlAttribute("number")]
+ public string? Number { get; set; }
+
+ [XmlAttribute("clone")]
+ public string? Clone { get; set; }
+
+ [XmlAttribute("regparent")]
+ public string? RegParent { get; set; }
+
+ [XmlAttribute("mergeof")]
+ public string? MergeOf { get; set; }
+
+ [XmlAttribute("mergename")]
+ public string? MergeName { get; set; }
+
+ [XmlAttribute("name")]
+ public string? Name { get; set; }
+
+ [XmlAttribute("name_alt")]
+ public string? NameAlt { get; set; }
+
+ [XmlAttribute("region")]
+ public string? Region { get; set; }
+
+ [XmlAttribute("languages")]
+ public string? Languages { get; set; }
+
+ /// byte
+ [XmlAttribute("showlang")]
+ public string? ShowLang { get; set; }
+
+ [XmlAttribute("langchecked")]
+ public string? LangChecked { get; set; }
+
+ [XmlAttribute("version1")]
+ public string? Version1 { get; set; }
+
+ [XmlAttribute("version2")]
+ public string? Version2 { get; set; }
+
+ [XmlAttribute("devstatus")]
+ public string? DevStatus { get; set; }
+
+ [XmlAttribute("additional")]
+ public string? Additional { get; set; }
+
+ [XmlAttribute("special1")]
+ public string? Special1 { get; set; }
+
+ [XmlAttribute("special2")]
+ public string? Special2 { get; set; }
+
+ /// byte
+ [XmlAttribute("alt")]
+ public string? Alt { get; set; }
+
+ [XmlAttribute("gameid1")]
+ public string? GameId1 { get; set; }
+
+ [XmlAttribute("gameid2")]
+ public string? GameId2 { get; set; }
+
+ [XmlAttribute("description")]
+ public string? Description { get; set; }
+
+ /// byte
+ [XmlAttribute("bios")]
+ public string? Bios { get; set; }
+
+ /// byte
+ [XmlAttribute("licensed")]
+ public string? Licensed { get; set; }
+
+ /// byte
+ [XmlAttribute("pirate")]
+ public string? Pirate { get; set; }
+
+ /// byte
+ [XmlAttribute("physical")]
+ public string? Physical { get; set; }
+
+ /// byte
+ [XmlAttribute("complete")]
+ public string? Complete { get; set; }
+
+ /// byte
+ [XmlAttribute("adult")]
+ public string? Adult { get; set; }
+
+ /// byte
+ [XmlAttribute("dat")]
+ public string? Dat { get; set; }
+
+ /// byte
+ [XmlAttribute("listed")]
+ public string? Listed { get; set; }
+
+ /// byte
+ [XmlAttribute("private")]
+ public string? Private { get; set; }
+
+ [XmlAttribute("sticky_note")]
+ public string? StickyNote { get; set; }
+
+ [XmlAttribute("datter_note")]
+ public string? DatterNote { get; set; }
+
+ [XmlAttribute("categories")]
+ public string? Categories { get; set; }
+ }
+}
diff --git a/SabreTools.Data.Models/NoIntroDatabase/Datafile.cs b/SabreTools.Data.Models/NoIntroDatabase/Datafile.cs
new file mode 100644
index 00000000..bf7b0a95
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/Datafile.cs
@@ -0,0 +1,12 @@
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("datafile")]
+ public class Datafile
+ {
+ [XmlElement("game", typeof(Game))]
+ public Game[]? Game { get; set; }
+ }
+}
diff --git a/SabreTools.Data.Models/NoIntroDatabase/File.cs b/SabreTools.Data.Models/NoIntroDatabase/File.cs
new file mode 100644
index 00000000..9421c4bf
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/File.cs
@@ -0,0 +1,88 @@
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("file")]
+ public class File
+ {
+ [XmlAttribute("id")]
+ public string? Id { get; set; }
+
+ [XmlAttribute("append_to_source_id")]
+ public string? AppendToSourceId { get; set; }
+
+ [XmlAttribute("forcename")]
+ public string? ForceName { get; set; }
+
+ [XmlAttribute("forcescenename")]
+ public string? ForceSceneName { get; set; }
+
+ /// byte
+ [XmlAttribute("emptydir")]
+ public string? EmptyDir { get; set; }
+
+ [XmlAttribute("extension")]
+ public string? Extension { get; set; }
+
+ [XmlAttribute("item")]
+ public string? Item { get; set; }
+
+ [XmlAttribute("date")]
+ public string? Date { get; set; }
+
+ [XmlAttribute("format")]
+ public string? Format { get; set; }
+
+ [XmlAttribute("note")]
+ public string? Note { get; set; }
+
+ [XmlAttribute("filter")]
+ public string? Filter { get; set; }
+
+ [XmlAttribute("version")]
+ public string? Version { get; set; }
+
+ [XmlAttribute("update_type")]
+ public string? UpdateType { get; set; }
+
+ [XmlAttribute("size")]
+ public string? Size { get; set; }
+
+ [XmlAttribute("crc32")]
+ public string? CRC32 { get; set; }
+
+ [XmlAttribute("md5")]
+ public string? MD5 { get; set; }
+
+ [XmlAttribute("sha1")]
+ public string? SHA1 { get; set; }
+
+ [XmlAttribute("sha256")]
+ public string? SHA256 { get; set; }
+
+ [XmlAttribute("serial")]
+ public string? Serial { get; set; }
+
+ [XmlAttribute("header")]
+ public string? Header { get; set; }
+
+ /// byte
+ [XmlAttribute("bad")]
+ public string? Bad { get; set; }
+
+ /// byte
+ [XmlAttribute("mia")]
+ public string? MIA { get; set; }
+
+ /// byte
+ [XmlAttribute("unique")]
+ public string? Unique { get; set; }
+
+ [XmlAttribute("mergename")]
+ public string? MergeName { get; set; }
+
+ [XmlAttribute("unique_attachment")]
+ public string? UniqueAttachment { get; set; }
+ }
+}
diff --git a/SabreTools.Data.Models/NoIntroDatabase/Game.cs b/SabreTools.Data.Models/NoIntroDatabase/Game.cs
new file mode 100644
index 00000000..97d65850
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/Game.cs
@@ -0,0 +1,24 @@
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("game")]
+ public class Game
+ {
+ [XmlAttribute("name")]
+ public string? Name { get; set; }
+
+ [XmlElement("archive", typeof(Archive))]
+ public Archive? Archive { get; set; }
+
+ [XmlElement("media", typeof(Media))]
+ public Media[]? Media { get; set; }
+
+ [XmlElement("source", typeof(Source))]
+ public Source[]? Source { get; set; }
+
+ [XmlElement("release", typeof(Release))]
+ public Release[]? Release { get; set; }
+ }
+}
diff --git a/SabreTools.Data.Models/NoIntroDatabase/Media.cs b/SabreTools.Data.Models/NoIntroDatabase/Media.cs
new file mode 100644
index 00000000..89556081
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/Media.cs
@@ -0,0 +1,10 @@
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("media")]
+ public class Media
+ {
+ // This item is empty
+ }
+}
diff --git a/SabreTools.Data.Models/NoIntroDatabase/Release.cs b/SabreTools.Data.Models/NoIntroDatabase/Release.cs
new file mode 100644
index 00000000..d6488ae2
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/Release.cs
@@ -0,0 +1,19 @@
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("release")]
+ public class Release
+ {
+ [Required]
+ [XmlElement("details", typeof(ReleaseDetails))]
+ public ReleaseDetails? Details { get; set; }
+
+ [XmlElement("serials", typeof(Serials))]
+ public Serials? Serials { get; set; }
+
+ [XmlElement("file", typeof(File))]
+ public File[]? File { get; set; }
+ }
+}
diff --git a/SabreTools.Data.Models/NoIntroDatabase/ReleaseDetails.cs b/SabreTools.Data.Models/NoIntroDatabase/ReleaseDetails.cs
new file mode 100644
index 00000000..c3c19ef5
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/ReleaseDetails.cs
@@ -0,0 +1,57 @@
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("details")]
+ public class ReleaseDetails
+ {
+ [XmlAttribute("id")]
+ public string? Id { get; set; }
+
+ [XmlAttribute("append_to_number")]
+ public string? AppendToNumber { get; set; }
+
+ [XmlAttribute("date")]
+ public string? Date { get; set; }
+
+ [XmlAttribute("originalformat")]
+ public string? OriginalFormat { get; set; }
+
+ [XmlAttribute("group")]
+ public string? Group { get; set; }
+
+ [XmlAttribute("dirname")]
+ public string? DirName { get; set; }
+
+ [XmlAttribute("nfoname")]
+ public string? NfoName { get; set; }
+
+ [XmlAttribute("nfosize")]
+ public string? NfoSize { get; set; }
+
+ [XmlAttribute("nfocrc")]
+ public string? NfoCRC { get; set; }
+
+ [XmlAttribute("archivename")]
+ public string? ArchiveName { get; set; }
+
+ [XmlAttribute("rominfo")]
+ public string? RomInfo { get; set; }
+
+ [XmlAttribute("category")]
+ public string? Category { get; set; }
+
+ [XmlAttribute("comment")]
+ public string? Comment { get; set; }
+
+ [XmlAttribute("tool")]
+ public string? Tool { get; set; }
+
+ [XmlAttribute("region")]
+ public string? Region { get; set; }
+
+ [XmlAttribute("origin")]
+ public string? Origin { get; set; }
+ }
+}
diff --git a/SabreTools.Data.Models/NoIntroDatabase/Serials.cs b/SabreTools.Data.Models/NoIntroDatabase/Serials.cs
new file mode 100644
index 00000000..37787bec
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/Serials.cs
@@ -0,0 +1,50 @@
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("serials")]
+ public class Serials
+ {
+ [XmlAttribute("media_serial1")]
+ public string? MediaSerial1 { get; set; }
+
+ [XmlAttribute("media_serial2")]
+ public string? MediaSerial2 { get; set; }
+
+ [XmlAttribute("media_serial3")]
+ public string? MediaSerial3 { get; set; }
+
+ [XmlAttribute("pcb_serial")]
+ public string? PCBSerial { get; set; }
+
+ [XmlAttribute("romchip_serial1")]
+ public string? RomChipSerial1 { get; set; }
+
+ [XmlAttribute("romchip_serial2")]
+ public string? RomChipSerial2 { get; set; }
+
+ [XmlAttribute("lockout_serial")]
+ public string? LockoutSerial { get; set; }
+
+ [XmlAttribute("savechip_serial")]
+ public string? SaveChipSerial { get; set; }
+
+ [XmlAttribute("chip_serial")]
+ public string? ChipSerial { get; set; }
+
+ [XmlAttribute("box_serial")]
+ public string? BoxSerial { get; set; }
+
+ [XmlAttribute("mediastamp")]
+ public string? MediaStamp { get; set; }
+
+ [XmlAttribute("box_barcode")]
+ public string? BoxBarcode { get; set; }
+
+ [XmlAttribute("digital_serial1")]
+ public string? DigitalSerial1 { get; set; }
+
+ [XmlAttribute("digital_serial2")]
+ public string? DigitalSerial2 { get; set; }
+ }
+}
diff --git a/SabreTools.Data.Models/NoIntroDatabase/Source.cs b/SabreTools.Data.Models/NoIntroDatabase/Source.cs
new file mode 100644
index 00000000..8f3ecaeb
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/Source.cs
@@ -0,0 +1,19 @@
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("source")]
+ public class Source
+ {
+ [Required]
+ [XmlElement("details", typeof(SourceDetails))]
+ public SourceDetails? Details { get; set; }
+
+ [XmlElement("serials", typeof(Serials))]
+ public Serials? Serials { get; set; }
+
+ [XmlElement("file", typeof(File))]
+ public File[]? File { get; set; }
+ }
+}
diff --git a/SabreTools.Data.Models/NoIntroDatabase/SourceDetails.cs b/SabreTools.Data.Models/NoIntroDatabase/SourceDetails.cs
new file mode 100644
index 00000000..21d86321
--- /dev/null
+++ b/SabreTools.Data.Models/NoIntroDatabase/SourceDetails.cs
@@ -0,0 +1,87 @@
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace SabreTools.Data.Models.NoIntroDatabase
+{
+ [XmlRoot("details")]
+ public class SourceDetails
+ {
+ [XmlAttribute("id")]
+ public string? Id { get; set; }
+
+ [XmlAttribute("append_to_number")]
+ public string? AppendToNumber { get; set; }
+
+ [XmlAttribute("section")]
+ public string? Section { get; set; }
+
+ [XmlAttribute("rominfo")]
+ public string? RomInfo { get; set; }
+
+ [XmlAttribute("d_date")]
+ public string? DumpDate { get; set; }
+
+ /// byte
+ [XmlAttribute("d_date_info")]
+ public string? DumpDateInfo { get; set; }
+
+ [XmlAttribute("r_date")]
+ public string? ReleaseDate { get; set; }
+
+ /// byte
+ [XmlAttribute("r_date_info")]
+ public string? ReleaseDateInfo { get; set; }
+
+ [XmlAttribute("dumper")]
+ public string? Dumper { get; set; }
+
+ [XmlAttribute("project")]
+ public string? Project { get; set; }
+
+ [XmlAttribute("originalformat")]
+ public string? OriginalFormat { get; set; }
+
+ /// byte
+ [XmlAttribute("nodump")]
+ public string? Nodump { get; set; }
+
+ [XmlAttribute("tool")]
+ public string? Tool { get; set; }
+
+ [XmlAttribute("origin")]
+ public string? Origin { get; set; }
+
+ [XmlAttribute("comment1")]
+ public string? Comment1 { get; set; }
+
+ [XmlAttribute("comment2")]
+ public string? Comment2 { get; set; }
+
+ [XmlAttribute("link1")]
+ public string? Link1 { get; set; }
+
+ /// byte
+ [XmlAttribute("link1_public")]
+ public string? Link1Public { get; set; }
+
+ [XmlAttribute("link2")]
+ public string? Link2 { get; set; }
+
+ /// byte
+ [XmlAttribute("link2_public")]
+ public string? Link2Public { get; set; }
+
+ [XmlAttribute("link3")]
+ public string? Link3 { get; set; }
+
+ /// byte
+ [XmlAttribute("link3_public")]
+ public string? Link3Public { get; set; }
+
+ [XmlAttribute("region")]
+ public string? Region { get; set; }
+
+ [XmlAttribute("media_title")]
+ public string? MediaTitle { get; set; }
+ }
+}
diff --git a/SabreTools.Data.Models/README.MD b/SabreTools.Data.Models/README.MD
index 07e8c2d6..a4e1d2cf 100644
--- a/SabreTools.Data.Models/README.MD
+++ b/SabreTools.Data.Models/README.MD
@@ -55,6 +55,7 @@ Below is a list of all existing namespaces with the `SabreTools.Data.Models` pre
| `NES` | Nintendo Entertainment System (NES) and Famicom (FC) carts |
| `NewExecutable` | New Executable (NE) |
| `Nitro` | Nintendo DS carts |
+| `NoIntroDatabase` | No-Intro Database Exports |
| `OfflineList` | OfflineList XML-based metadata files |
| `OLE` | Object Linking and Embedding (OLE) |
| `OpenMSX` | OpenMSX XML-based metadata files |
@@ -105,6 +106,7 @@ Not all of this information was able to be gathered directly from the files in q
| [cabextract/libmspack](https://www.cabextract.org.uk/) | LZ |
| [cxbx](https://www.caustik.com/cxbx/) | XboxExecutable |
| [Cxbx-Reloaded](https://github.com/Cxbx-Reloaded/Cxbx-Reloaded/) | XboxExecutable |
+| [Dat-o-Matic Upload XSD](https://datomatic.no-intro.org/stuff/example_upload_custom.xsd) | NoIntroDatabase |
| [DBox](https://dbox.tools/) | Xbox |
| [DebugInfo.com](https://www.debuginfo.com/index.html) | PortableExecutable |
| [Devilsclaw](https://devilsclaws.net/) | PFF |