diff --git a/HTMLKit.xcodeproj/project.pbxproj b/HTMLKit.xcodeproj/project.pbxproj
index 9a4ad39..9c96abd 100644
--- a/HTMLKit.xcodeproj/project.pbxproj
+++ b/HTMLKit.xcodeproj/project.pbxproj
@@ -10,6 +10,9 @@
6234584E1A9D2FA4009BD491 /* HTMLNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 6234584C1A9D2FA4009BD491 /* HTMLNode.h */; };
6234584F1A9D2FA4009BD491 /* HTMLNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 6234584D1A9D2FA4009BD491 /* HTMLNode.m */; };
623458501A9D2FA4009BD491 /* HTMLNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 6234584D1A9D2FA4009BD491 /* HTMLNode.m */; };
+ 623857961A9E8606003A45D9 /* HTMLDocumentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 623857941A9E8606003A45D9 /* HTMLDocumentType.h */; };
+ 623857971A9E8606003A45D9 /* HTMLDocumentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 623857951A9E8606003A45D9 /* HTMLDocumentType.m */; };
+ 623857981A9E8606003A45D9 /* HTMLDocumentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 623857951A9E8606003A45D9 /* HTMLDocumentType.m */; };
624493A619CCC54100BCDDF4 /* HTMLTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 624493A419CCC54100BCDDF4 /* HTMLTokenizer.h */; };
624493A719CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 624493A519CCC54100BCDDF4 /* HTMLTokenizer.m */; };
624493A819CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 624493A519CCC54100BCDDF4 /* HTMLTokenizer.m */; };
@@ -104,6 +107,8 @@
6223211D1A969B9300BACED5 /* HTMLElementTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLElementTypes.h; sourceTree = ""; };
6234584C1A9D2FA4009BD491 /* HTMLNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLNode.h; sourceTree = ""; };
6234584D1A9D2FA4009BD491 /* HTMLNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLNode.m; sourceTree = ""; };
+ 623857941A9E8606003A45D9 /* HTMLDocumentType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLDocumentType.h; sourceTree = ""; };
+ 623857951A9E8606003A45D9 /* HTMLDocumentType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLDocumentType.m; sourceTree = ""; };
624493A419CCC54100BCDDF4 /* HTMLTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLTokenizer.h; sourceTree = ""; };
624493A519CCC54100BCDDF4 /* HTMLTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLTokenizer.m; sourceTree = ""; };
624493A919CCE84A00BCDDF4 /* HTMLTokenizerStates.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLTokenizerStates.h; sourceTree = ""; };
@@ -254,6 +259,8 @@
6234584D1A9D2FA4009BD491 /* HTMLNode.m */,
6279F87219E1808D00F12EE5 /* HTMLElement.h */,
6279F87319E1808D00F12EE5 /* HTMLElement.m */,
+ 623857941A9E8606003A45D9 /* HTMLDocumentType.h */,
+ 623857951A9E8606003A45D9 /* HTMLDocumentType.m */,
625A14B619C7829400AD0C32 /* Supporting Files */,
);
name = "Source Code";
@@ -343,6 +350,7 @@
625A150819C78ABA00AD0C32 /* HTMLInputStreamReader.h in Headers */,
62AE593519F97D880043F069 /* HTMLParseErrorToken.h in Headers */,
62AE594919F9948A0043F069 /* HTMLCharacterToken.h in Headers */,
+ 623857961A9E8606003A45D9 /* HTMLDocumentType.h in Headers */,
6234584E1A9D2FA4009BD491 /* HTMLNode.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -502,6 +510,7 @@
625A150A19C78ABA00AD0C32 /* HTMLInputStreamReader.m in Sources */,
624493A819CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */,
625A14BE19C7829400AD0C32 /* HTMLKit.m in Sources */,
+ 623857981A9E8606003A45D9 /* HTMLDocumentType.m in Sources */,
62AE594B19F9948A0043F069 /* HTMLCharacterToken.m in Sources */,
623458501A9D2FA4009BD491 /* HTMLNode.m in Sources */,
62F31FDF19E9DCCF007F0657 /* HTMLTokenizerEntities.m in Sources */,
@@ -532,6 +541,7 @@
625A150919C78ABA00AD0C32 /* HTMLInputStreamReader.m in Sources */,
624493A719CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */,
625A150219C783DE00AD0C32 /* HTMLKit.m in Sources */,
+ 623857971A9E8606003A45D9 /* HTMLDocumentType.m in Sources */,
62AE594A19F9948A0043F069 /* HTMLCharacterToken.m in Sources */,
6234584F1A9D2FA4009BD491 /* HTMLNode.m in Sources */,
62F31FDE19E9DCCF007F0657 /* HTMLTokenizerEntities.m in Sources */,
diff --git a/HTMLKit/HTMLDocumentType.h b/HTMLKit/HTMLDocumentType.h
new file mode 100644
index 0000000..f02d42e
--- /dev/null
+++ b/HTMLKit/HTMLDocumentType.h
@@ -0,0 +1,21 @@
+//
+// HTMLDocumentType.h
+// HTMLKit
+//
+// Created by Iska on 25/02/15.
+// Copyright (c) 2015 BrainCookie. All rights reserved.
+//
+
+#import "HTMLNode.h"
+
+@interface HTMLDocumentType : HTMLNode
+
+@property (nonatomic, copy, readonly) NSString *publicIdentifier;
+
+@property (nonatomic, copy, readonly) NSString *systemIdentifier;
+
+- (instancetype)initWithName:(NSString *)name
+ publicIdentifier:(NSString *)publicIdentifier
+ systemIdentifier:(NSString *)systemIdentifier;
+
+@end
diff --git a/HTMLKit/HTMLDocumentType.m b/HTMLKit/HTMLDocumentType.m
new file mode 100644
index 0000000..dc2de5b
--- /dev/null
+++ b/HTMLKit/HTMLDocumentType.m
@@ -0,0 +1,35 @@
+//
+// HTMLDocumentType.m
+// HTMLKit
+//
+// Created by Iska on 25/02/15.
+// Copyright (c) 2015 BrainCookie. All rights reserved.
+//
+
+#import "HTMLDocumentType.h"
+
+@implementation HTMLDocumentType
+
+- (instancetype)initWithName:(NSString *)name
+ publicIdentifier:(NSString *)publicIdentifier
+ systemIdentifier:(NSString *)systemIdentifier
+{
+ self = [super initWithName:name type:HTMLDocumentTypeNode];
+ if (self) {
+ _publicIdentifier = [publicIdentifier copy] ?: @"";
+ _systemIdentifier = [systemIdentifier copy] ?: @"";
+ }
+ return self;
+}
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(NSZone *)zone
+{
+ HTMLDocumentType *copy = [super copyWithZone:zone];
+ copy->_publicIdentifier = self.publicIdentifier;
+ copy->_systemIdentifier = self.systemIdentifier;
+ return copy;
+}
+
+@end