diff --git a/.travis.yml b/.travis.yml
index a392a526d0620eab656396d8f3a7522d3453232c..dc78028717733a6e398cbb8ad601fef40f58db75 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -28,4 +28,5 @@ after_success:
 
 env:
   global:
-    - secure: "Azb2kN3sVX4KYy4LCrqUqmvCOoePRfDcq9EVfPuJxexrKbkubU4WRxay13ZwGKLvdiL6MXeGYdaNdULDDoxFdREid6T8ZwXdVgEYRg6RanBXs4PME8PNAk3sr0vX92jUpPe6uiLTi3HFilD96IXM/QuPgmjaTUGlxg/tNqVvMO1MnVhSZw8nbC3GRX8K/iMzBE1J0bbYc0nQ5KR2QDLuUPl7ddYzA/OeXxkOdGc3oPAXL3JveRvKRN6WfCbtzn31AYPba2h3LQ6r4XzwL4ZGU1Kpvm/CWsNGtRhZHJ5fh5TFZzVKlK8ndEM747ApdiyYkbpSUCFqkU6W8MP2fwSBH9HK4n6MKY/JZUFc6D0HhDpfgOcRrvRgydkHR5ubQx/+PRfvh3jxDaMGizlxiKGlKaFctxkB2JZCGFm+kGnKNRhxj7ibsDVDn2Mx72x0wE5LAybqsx3eoBno/DPU04YeGCVuA9BIzLQunCa051sxH1/UPUe2tE0cios2SUVLKtCDgawLohWwWDrBQU4hk6ZepZlYY2jo/vRq+xYkYH1ISUDNacu6lu8vfkFBOZBfDmIQQK0+fHnZI7TLeLfbW0iR7Ep9dgbAkw829OpMUof9Kk1YPfIlJ4CUkFKtKH2vP15+QRyDt6oDzSHlmpJLNQECoTG7gMsxsRRBrr5gI5eYtqI="
\ No newline at end of file
+    - secure: "Azb2kN3sVX4KYy4LCrqUqmvCOoePRfDcq9EVfPuJxexrKbkubU4WRxay13ZwGKLvdiL6MXeGYdaNdULDDoxFdREid6T8ZwXdVgEYRg6RanBXs4PME8PNAk3sr0vX92jUpPe6uiLTi3HFilD96IXM/QuPgmjaTUGlxg/tNqVvMO1MnVhSZw8nbC3GRX8K/iMzBE1J0bbYc0nQ5KR2QDLuUPl7ddYzA/OeXxkOdGc3oPAXL3JveRvKRN6WfCbtzn31AYPba2h3LQ6r4XzwL4ZGU1Kpvm/CWsNGtRhZHJ5fh5TFZzVKlK8ndEM747ApdiyYkbpSUCFqkU6W8MP2fwSBH9HK4n6MKY/JZUFc6D0HhDpfgOcRrvRgydkHR5ubQx/+PRfvh3jxDaMGizlxiKGlKaFctxkB2JZCGFm+kGnKNRhxj7ibsDVDn2Mx72x0wE5LAybqsx3eoBno/DPU04YeGCVuA9BIzLQunCa051sxH1/UPUe2tE0cios2SUVLKtCDgawLohWwWDrBQU4hk6ZepZlYY2jo/vRq+xYkYH1ISUDNacu6lu8vfkFBOZBfDmIQQK0+fHnZI7TLeLfbW0iR7Ep9dgbAkw829OpMUof9Kk1YPfIlJ4CUkFKtKH2vP15+QRyDt6oDzSHlmpJLNQECoTG7gMsxsRRBrr5gI5eYtqI="
+    - RUST_TEST_THREADS=1
diff --git a/appveyor.yml b/appveyor.yml
index 070c05d64e5b5196cf4b6670b9d0f7da08fe82eb..ec22c1b4e6999701df7261af4a97a9e063eb30c5 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -8,5 +8,8 @@ install:
 
 build: false
 
+environment:
+  RUST_TEST_THREADS: 1
+
 test_script:
-  - cargo test --verbose
\ No newline at end of file
+  - cargo test --verbose
diff --git a/src/packet.rs b/src/packet.rs
index 51d19235c882f00d0bad075a867ee17613151b78..c2a8b09dd2b570c4c641aef03aeaed6f8a9acbe6 100644
--- a/src/packet.rs
+++ b/src/packet.rs
@@ -199,95 +199,94 @@ impl Packet {
 		match header_result {
 			Ok(header) => {
 				let token_length = header.get_token_length();
-				let (mut token, mut payload) = (Vec::new(), Vec::new());
-				let mut options: BTreeMap<usize, LinkedList<Vec<u8>>> = BTreeMap::new();
+				let options_start: usize = 4 + token_length as usize;
 
-				if token_length > 0 {
-					if token_length > 8 {
-						return Err(ParseError::InvalidTokenLength);
-					}
+				if token_length > 8 {
+					return Err(ParseError::InvalidTokenLength);
+				}
 
-					let options_start: usize = 4 + token_length as usize;
-					if options_start > buf.len() {
-						return Err(ParseError::InvalidTokenLength);
-					}
+				if options_start > buf.len() {
+					return Err(ParseError::InvalidTokenLength);
+				}
 
-					token = buf[4..options_start].to_vec();
+				let token = buf[4..options_start].to_vec();
 
-					let mut idx = options_start;
-					let mut options_number = 0;
-					while idx < buf.len() {
-						let byte = buf[idx];
+				let mut idx = options_start;
+				let mut options_number = 0;
+				let mut options: BTreeMap<usize, LinkedList<Vec<u8>>> = BTreeMap::new();
+				while idx < buf.len() {
+					let byte = buf[idx];
 
-						if byte == 255 || idx > buf.len() {
-							break;
-						}
+					if byte == 255 || idx > buf.len() {
+						break;
+					}
 
-						let mut delta = (byte >> 4) as usize;
-						let mut length = (byte & 0xF) as usize;
+					let mut delta = (byte >> 4) as usize;
+					let mut length = (byte & 0xF) as usize;
 
-						idx += 1;
+					idx += 1;
 
-						if delta == 13 {
-							if idx >= buf.len() {
-								return Err(ParseError::InvalidOptionLength);
-							}
-							delta = buf[idx] as usize + 13;
-							idx += 1;
-						} else if delta == 14 {
-							if idx + 1 >= buf.len() {
-								return Err(ParseError::InvalidOptionLength);
-							}
-
-							delta = (u16::from_be(u8_to_unsigned_be!(buf, idx, idx + 1, u16)) + 269) as usize;
-							idx += 2;
-						} else if delta == 15 {
-							return Err(ParseError::InvalidOptionDelta);
+					if delta == 13 {
+						if idx >= buf.len() {
+							return Err(ParseError::InvalidOptionLength);
 						}
-
-						if length == 13 {
-							if idx >= buf.len() {
-								return Err(ParseError::InvalidOptionLength);
-							}
-
-							length = buf[idx] as usize + 13;
-							idx += 1;
-						} else if length == 14 {
-							if idx + 1 >= buf.len() {
-								return Err(ParseError::InvalidOptionLength);
-							}
-
-							length = (u16::from_be(u8_to_unsigned_be!(buf, idx, idx + 1, u16)) + 269) as usize;
-							idx += 2;
-						} else if length == 15 {
+						delta = buf[idx] as usize + 13;
+						idx += 1;
+					} else if delta == 14 {
+						if idx + 1 >= buf.len() {
 							return Err(ParseError::InvalidOptionLength);
 						}
 
-						options_number += delta;
+						delta = (u16::from_be(u8_to_unsigned_be!(buf, idx, idx + 1, u16)) + 269) as usize;
+						idx += 2;
+					} else if delta == 15 {
+						return Err(ParseError::InvalidOptionDelta);
+					}
 
-						let end = idx + length;
-						if end > buf.len() {
+					if length == 13 {
+						if idx >= buf.len() {
 							return Err(ParseError::InvalidOptionLength);
 						}
-						let options_value = buf[idx..end].to_vec();
-
-						if options.contains_key(&options_number) {
-							let mut options_list = options.get_mut(&options_number).unwrap();
-							options_list.push_back(options_value);
-						} else {
-							let mut list = LinkedList::new();
-							list.push_back(options_value);
-							options.insert(options_number, list);
+
+						length = buf[idx] as usize + 13;
+						idx += 1;
+					} else if length == 14 {
+						if idx + 1 >= buf.len() {
+							return Err(ParseError::InvalidOptionLength);
 						}
 
-						idx += length;
+						length = (u16::from_be(u8_to_unsigned_be!(buf, idx, idx + 1, u16)) + 269) as usize;
+						idx += 2;
+					} else if length == 15 {
+						return Err(ParseError::InvalidOptionLength);
 					}
 
-					if idx < buf.len() {
-						payload = buf[(idx + 1)..buf.len()].to_vec();
+					options_number += delta;
+
+					let end = idx + length;
+					if end > buf.len() {
+						return Err(ParseError::InvalidOptionLength);
+					}
+					let options_value = buf[idx..end].to_vec();
+
+					if options.contains_key(&options_number) {
+						let mut options_list = options.get_mut(&options_number).unwrap();
+						options_list.push_back(options_value);
+					} else {
+						let mut list = LinkedList::new();
+						list.push_back(options_value);
+						options.insert(options_number, list);
 					}
+
+					idx += length;
+				}
+
+				let mut payload = Vec::new();
+				if idx < buf.len() {
+					payload = buf[(idx + 1)..buf.len()].to_vec();
 				}
 
+
 				Ok(Packet {
 					header: header,
 					token: token,
@@ -508,4 +507,4 @@ mod test {
 		}
 		QuickCheck::new().tests(10000).gen(StdGen::new(rand::thread_rng(), 1500)).quickcheck(run as fn(Vec<u8>) -> TestResult)
 	}
-}
\ No newline at end of file
+}
diff --git a/src/server.rs b/src/server.rs
index 9bdb9e42b5b821332a68fad1ae4b6cef0204b30f..54514a8dcefdf98c07c82594c6eb8ebaf9377b7a 100644
--- a/src/server.rs
+++ b/src/server.rs
@@ -177,7 +177,7 @@ mod test {
 	fn test_echo_server() {
 		let mut server = CoAPServer::new("127.0.0.1:5683").unwrap();
 		server.handle(request_handler).unwrap();
-		
+
 		let client = CoAPClient::new("127.0.0.1:5683").unwrap();
 		let mut packet = Packet::new();
 		packet.header.set_version(1);
@@ -191,4 +191,22 @@ mod test {
 		let recv_packet = client.receive().unwrap();
 		assert_eq!(recv_packet.payload, b"test-echo".to_vec());
 	}
-}
\ No newline at end of file
+
+	#[test]
+	fn test_echo_server_no_token() {
+		let mut server = CoAPServer::new("127.0.0.1:5683").unwrap();
+		server.handle(request_handler).unwrap();
+
+		let client = CoAPClient::new("127.0.0.1:5683").unwrap();
+		let mut packet = Packet::new();
+		packet.header.set_version(1);
+		packet.header.set_type(PacketType::Confirmable);
+		packet.header.set_code("0.01");
+		packet.header.set_message_id(1);
+		packet.add_option(OptionType::UriPath, b"test-echo".to_vec());
+		client.send(&packet).unwrap();
+
+		let recv_packet = client.receive().unwrap();
+		assert_eq!(recv_packet.payload, b"test-echo".to_vec());
+	}
+}