diff --git a/HTMLKit.xcodeproj/project.pbxproj b/HTMLKit.xcodeproj/project.pbxproj
index 2fb0750..0da4ce7 100644
--- a/HTMLKit.xcodeproj/project.pbxproj
+++ b/HTMLKit.xcodeproj/project.pbxproj
@@ -117,6 +117,9 @@
624B371E1B24E9BA0010BDDF /* CSSInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 624B371C1B24E9BA0010BDDF /* CSSInputStream.h */; };
624B371F1B24E9BA0010BDDF /* CSSInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B371D1B24E9BA0010BDDF /* CSSInputStream.m */; };
624B37201B24E9BA0010BDDF /* CSSInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B371D1B24E9BA0010BDDF /* CSSInputStream.m */; };
+ 624B7DDC1B2E3AAB00A4BD61 /* CSSToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 624B7DDA1B2E3AAB00A4BD61 /* CSSToken.h */; };
+ 624B7DDD1B2E3AAB00A4BD61 /* CSSToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B7DDB1B2E3AAB00A4BD61 /* CSSToken.m */; };
+ 624B7DDE1B2E3AAB00A4BD61 /* CSSToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B7DDB1B2E3AAB00A4BD61 /* CSSToken.m */; };
624B9FB21AE0313300646C4C /* HTMLKitStringCategoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB11AE0313300646C4C /* HTMLKitStringCategoryTests.m */; };
624B9FB31AE0313300646C4C /* HTMLKitStringCategoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB11AE0313300646C4C /* HTMLKitStringCategoryTests.m */; };
624B9FB51AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */; };
@@ -285,6 +288,8 @@
624B28C31B04190D0048D328 /* NSCharacterSet+HTMLKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSCharacterSet+HTMLKit.m"; sourceTree = ""; };
624B371C1B24E9BA0010BDDF /* CSSInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSInputStream.h; sourceTree = ""; };
624B371D1B24E9BA0010BDDF /* CSSInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSInputStream.m; sourceTree = ""; };
+ 624B7DDA1B2E3AAB00A4BD61 /* CSSToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSToken.h; sourceTree = ""; };
+ 624B7DDB1B2E3AAB00A4BD61 /* CSSToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSToken.m; sourceTree = ""; };
624B9FB11AE0313300646C4C /* HTMLKitStringCategoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitStringCategoryTests.m; sourceTree = ""; };
624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitOrderedDictionaryTests.m; sourceTree = ""; };
624FC3791AE591D80015DDF9 /* HTMLKitNodesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitNodesTests.m; sourceTree = ""; };
@@ -379,6 +384,8 @@
624B371D1B24E9BA0010BDDF /* CSSInputStream.m */,
623F13A81AFC11D900C90BF4 /* CSSTokenizer.h */,
623F13A91AFC11D900C90BF4 /* CSSTokenizer.m */,
+ 624B7DDA1B2E3AAB00A4BD61 /* CSSToken.h */,
+ 624B7DDB1B2E3AAB00A4BD61 /* CSSToken.m */,
62491C461AFE51F100ACF9E2 /* CSSLexer.h */,
62491C451AFE51F100ACF9E2 /* CSSLexer.c */,
62079BE71AF56F1E00D3B402 /* CSSSelector.h */,
@@ -657,6 +664,7 @@
62D89DB21AE7081600B6243D /* HTMLTokenizerCharacters.h in Headers */,
62D89DB31AE7081600B6243D /* HTMLNamespaces.h in Headers */,
624B28BC1B03DAB70048D328 /* HTMLNodeFilter.h in Headers */,
+ 624B7DDC1B2E3AAB00A4BD61 /* CSSToken.h in Headers */,
624B28BF1B0413200048D328 /* CSSAttributeSelector.h in Headers */,
62D89DB41AE7081600B6243D /* HTMLElementTypes.h in Headers */,
62D89DB51AE7081600B6243D /* HTMLElementAdjustment.h in Headers */,
@@ -871,6 +879,7 @@
6279F87619E1808D00F12EE5 /* HTMLElement.m in Sources */,
625A150A19C78ABA00AD0C32 /* HTMLInputStreamReader.m in Sources */,
623857931A9E772B003A45D9 /* HTMLDocument.m in Sources */,
+ 624B7DDE1B2E3AAB00A4BD61 /* CSSToken.m in Sources */,
623406E81ADB05AD004677A3 /* HTMLDocumentFragment.m in Sources */,
624717B91B21FE5400B38302 /* HTMLNodeFilter.m in Sources */,
624493A819CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */,
@@ -937,6 +946,7 @@
6279F87519E1808D00F12EE5 /* HTMLElement.m in Sources */,
625A150919C78ABA00AD0C32 /* HTMLInputStreamReader.m in Sources */,
623857921A9E772B003A45D9 /* HTMLDocument.m in Sources */,
+ 624B7DDD1B2E3AAB00A4BD61 /* CSSToken.m in Sources */,
623406E71ADB05AD004677A3 /* HTMLDocumentFragment.m in Sources */,
624717B81B21FE5400B38302 /* HTMLNodeFilter.m in Sources */,
624493A719CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */,
diff --git a/HTMLKit/CSSToken.h b/HTMLKit/CSSToken.h
new file mode 100644
index 0000000..cc06fdb
--- /dev/null
+++ b/HTMLKit/CSSToken.h
@@ -0,0 +1,80 @@
+//
+// CSSToken.h
+// HTMLKit
+//
+// Created by Iska on 15/06/15.
+// Copyright (c) 2015 BrainCookie. All rights reserved.
+//
+
+#import
+
+typedef NS_ENUM(NSUInteger, CSSTokenType)
+{
+ CSSTokenTypeIdent,
+ CSSTokenTypeFunction,
+ CSSTokenTypeAtKeyword,
+ CSSTokenTypeHash,
+ CSSTokenTypeString,
+ CSSTokenTypeBadString,
+ CSSTokenTypeURL,
+ CSSTokenTypeBadURL,
+ CSSTokenTypeDelim,
+ CSSTokenTypeNumber,
+ CSSTokenTypePercentage,
+ CSSTokenTypeDimension,
+ CSSTokenTypeUnicodeRange,
+ CSSTokenTypeIncludeMatch,
+ CSSTokenTypeDashMatch,
+ CSSTokenTypePrefixMatch,
+ CSSTokenTypeSuffixMatch,
+ CSSTokenTypeSubstringMatch,
+ CSSTokenTypeColumn,
+ CSSTokenTypeWhitespace,
+ CSSTokenTypeCommentDeclarationOpen,
+ CSSTokenTypeCommentDeclarationClose,
+ CSSTokenTypeColon,
+ CSSTokenTypeSemicolon,
+ CSSTokenTypeComma,
+ CSSTokenTypeSquareBracketOpen,
+ CSSTokenTypeSquareBracketClose,
+ CSSTokenTypeParenthesisOpen,
+ CSSTokenTypeParenthesisClose,
+ CSSTokenTypeCurlyBracketOpen,
+ CSSTokenTypeCurlyBracketClose,
+ CSSTokenTypeEOF
+};
+
+@interface CSSToken : NSObject
+
+@property (nonatomic, assign) CSSTokenType type;
+@property (nonatomic, assign) NSUInteger start;
+@property (nonatomic, assign) NSUInteger end;
+@property (nonatomic, copy) NSString *text;
+
++ (instancetype)tokenWithType:(CSSTokenType)type;
+
+@end
+
+#pragma mark - Numeric Tokens
+
+typedef NS_ENUM(NSUInteger, CSSNumericTokenType)
+{
+ CSSNumericTokenTypeInteger,
+ CSSNumericTokenTypeNumber
+};
+
+
+@interface CSSNumericToken : CSSToken
+@property (nonatomic, assign) CSSNumericTokenType numericType;
+@property (nonatomic, strong) NSNumber *value;
+@end
+
+@interface CSSDimensionToken : CSSNumericToken
+@property (nonatomic, copy) NSString *unit;
+@end
+
+@interface CSSNumberToken : CSSNumericToken
+@end
+
+@interface CSSPercentageToken : CSSNumericToken
+@end
diff --git a/HTMLKit/CSSToken.m b/HTMLKit/CSSToken.m
new file mode 100644
index 0000000..22bf324
--- /dev/null
+++ b/HTMLKit/CSSToken.m
@@ -0,0 +1,62 @@
+//
+// CSSToken.m
+// HTMLKit
+//
+// Created by Iska on 15/06/15.
+// Copyright (c) 2015 BrainCookie. All rights reserved.
+//
+
+#import "CSSToken.h"
+
+@implementation CSSToken
+
++ (instancetype)tokenWithType:(CSSTokenType)type
+{
+ CSSToken *token = [[self alloc] init];
+ token.type = type;
+ return token;
+}
+
+- (instancetype)initWithType:(CSSTokenType)type
+{
+ self = [super init];
+ if (self) {
+ self.type = type;
+ }
+ return self;
+}
+
+@end
+
+@implementation CSSNumericToken
+@end
+
+@implementation CSSDimensionToken
+
+- (instancetype)init
+{
+ self = [self initWithType:CSSTokenTypeDimension];
+ return self;
+}
+
+@end
+
+@implementation CSSNumberToken
+
+- (instancetype)init
+{
+ self = [self initWithType:CSSTokenTypeNumber];
+ return self;
+}
+
+@end
+
+@implementation CSSPercentageToken
+
+- (instancetype)init
+{
+ self = [self initWithType:CSSTokenTypePercentage];
+ return self;
+}
+
+@end
\ No newline at end of file