diff --git a/README b/README
index 1c4bd74..bf99296 100644
--- a/README
+++ b/README
@@ -1,25 +1,129 @@
-JSMN - Minimalistic JSON parser library
-=======================================
-jsmn (pronounced right as `jasmine`) is a simple and clean library for parsing
-JSON (JavaScript Object Notation) data format.
+JSMN
+====
-You can find more information on JSON at http://www.json.org/
+jsmn (pronounced like 'jasmine') is a minimalistic JSON parser in C. It can be
+easily integrated into resource-limited or embedded projects.
+
+You can find more information on JSON at (http://www.json.org/)
Philosophy
-==========
+----------
+
+Most JSON parsers offer you a bunch of functions to load JSON data, parse it
+and extract any value by its name. jsmn proves that checking the correctness of
+every JSON packet or allocating temporary objects to store parsed JSON fields
+is an overkill.
-jsmn will never be large and complex. This means it will never have extra
-features or any bloated dependencies, besides libc.
-It will always be suitable for embedded systems and other resource-limited
-systems. It will always have clear API.
+JSON format itself is extremely simple, so why should we complicate it?
+
+jsmn is designed to be **robust** (it should work fine even with erroneous
+data), **fast** (it should parse data on the fly), **portable** (no unneeded
+dependencies or non-standard C extensions). An of course, **simplicity** is a
+key feature - simple code style, simple algorithm, simple integration.
Features
-========
+--------
+
+* compatible with C89
+* no dependencies (even libc!)
+* about 200 lines of code
+* extremely small code footprint
+* no dynamic memory allocation
+* incremental single-pass parsing
+* library code is covered with unit-tests
+
+Design
+------
+
+The rudimentary jsmn object is a **token**.
+
+When parsing is done, token objects contain start and end positions of JSON
+token inside the JSON data block. You can just copy a corresponding range of
+bytes and get token value.
+
+Another propetry of token is token type. It describes the type of the
+corresponding JSON object.
+
+jsmn supports the following token types:
+
+* Object - a container of key-value pairs, e.g.:
+ `{ "foo":"bar", "x":0.3 }`
+* Array - a sequence of values, e.g.:
+ `[ 1, 2, 3 ]`
+* String - a quoted sequence of chars, e.g.: `"foo"`
+* Primitive - a number, a boolean (`true`, `false`) or `null`
+
+jsmn doesn't handle specific JSON data types. It just points to the token
+boundaries - you should parse single data fields by your own if you need this.
+
+Get sources
+-----------
+
+Clone the repository (you should have mercurial installed):
+
+ $ hg clone http://bitbucket.org/zserge/jsmn jsmn
+
+Repository layout it simple: jsmn.c and jsmn.h are library files; demo.c is an
+example of how to use jsmn (it is also used in unit testing); test.sh is a test
+script. You will also find README, LICENSE and Makefile files inside.
+
+API
+---
+
+Token types are described by `jsontype_t`:
+
+ typedef enum {
+ JSON_OBJECT,
+ JSON_ARRAY,
+ JSON_STRING,
+ JSON_PRIMITIVE
+ } jsontype_t;
+
+**Note:** primitive tokens are not divided into numbers, booleans and null,
+because one can easily tell the type using the first character:
+
+* 't', 'f'
- boolean
+* 'n'
- null
+* '-', '0'..'9'
- number
+
+Tokens are described with `jsontok_t`:
+
+ typedef struct {
+ jsontype_t type;
+ int start;
+ int end;
+ } jsontok_t;
+
+**Note:** string tokens point to the first character after
+the opening quote and the previous symbol before final quote. This was made
+to simplify string extraction from JSON data.
+
+All job is done by `jsmn_parser` object. You can initialize a new parser using:
+
+ struct jsmn_parser parser;
+ jsmntok_t tokens[10];
+
+ jsmn_init_parser(&parser, js, &tokens, 10);
+
+This will create a parser, that can parse up to 10 JSON tokens from `js` string.
+
+Later, you can use `jsmn_parse(&parser)` function to process JSON string with the parser.
+It something goes wrong, you will return an error. Error will be one of these:
+
+* `JSON_SUCCESS` - everything went fine. String was parsed
+* `JSON_ERROR_INVAL` - bad token, JSON string is corrupted
+* `JSON_ERROR_NOMEM` - not enough tokens, JSON string is too large
+* `JSON_ERROR_PART` - JSON string is too short, it doesn't contain the whole JSON data
+
+If you get `JSON_ERROR_NOMEM`, you can allocate more tokens and call `jsmn_parse` once more.
+If you read json data from the stream, you can call jsmn_parse and check if
+return value is `JSON_ERROR_PART` to see if you have reached the end of JSON
+data.
+
+Other info
+----------
-o Just 200 lines of code
-o Full C89 compatibility
-o No memory allocation inside the library code
-o A single pass is required to parse JSON data
-o MIT license (you can include this code into your proprietary software)
+This software is distributed under [MIT license](http://www.opensource.org/licenses/mit-license.php),
+ so feel free to integrate it in your commercial products.