diff --git a/db/README.md b/db/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..6c19b15d7a453252668a7c6cadacd8fdb51e6dbe
--- /dev/null
+++ b/db/README.md
@@ -0,0 +1,143 @@
+# gosexy/db
+
+This package is a wrapper of [mgo](http://launchpad.net/mgo), [database/sql](http://golang.org/pkg/database/sql) and some of its database drivers friends, the goal of this abstraction is to provide a common, simplified, consistent layer for working with different databases using Go.
+
+## Installation
+
+    $ go get github.com/xiam/gosexy/db
+
+## Available interfaces
+
+* MongoDB with [mgo](http://launchpad.net/mgo)
+* MySQL with [go-mysql-driver](http://code.google.com/p/go-mysql-driver/)
+* PostgreSQL with (a fork of) [pq](https://github.com/bmizerany/pq)
+* SQLite3 with (a fork of) [sqlite3](https://github.com/mattn/go-sqlite3)
+
+## Usage
+
+Import ``github.com/xiam/gosexy/db`` into your project.
+
+A handful of methods will be available, each database has its specific ways of doing the same task but this will be handled by the drivers, the interface is the same for all of them.
+
+### Setting up a database
+
+The first step is to choose a driver and set up the connection, this is how it would be done using ``MysqlSession``
+
+    sess := db.MysqlSession(db.DataSource{Host: "localhost", Database: "test", User: "myuser", Password: "mypass"})
+
+The ``db.DataSource`` is a generic structure than can store connection values in a consistent way.
+
+    // Connection and authentication data.
+    type DataSource struct {
+      Host     string
+      Port     int
+      Database string
+      User     string
+      Password string
+    }
+
+You may use other drivers to setup a connection, available drivers are ``db.MysqlSession``, ``db.MongodbSession``, ``db.PostgresqlSession`` and ``db.SqliteSession`` each one of them receives a ``db.DataSource`` and returns a ``db.Database``.
+
+### Connecting to the database
+
+Use your recently configured ``db.Database`` to request the driver to actually connect to the selected database.
+
+    // Setting up database.
+    sess := db.MysqlSession(db.DataSource{Host: "localhost", Database: "test", User: "myuser", Password: "mypass"})
+    sess.Open()
+
+    // Don't forget to close the connection when it's not required anymore.
+	  defer sess.Close()
+
+### Database methods.
+
+The ``db.Database`` interface exposes the very same methods for all databases.
+
+    // Database methods.
+    type Database interface {
+      Driver() interface{}
+
+      Open() error
+      Close() error
+
+      Collection(string) Collection
+      Collections() []string
+
+      Use(string) error
+      Drop() error
+    }
+
+#### db.Database.Driver() interface{}
+
+Returns the raw driver as an ``interface{}``, for example, if you're using ``MongoSession`` it will return an interface to ``*mgo.Session``, and if you're using ``MysqlSession`` it will return an interface to ``*sql.DB``, this is the only method that may return different data structures on different databases.
+
+#### db.Database.Open() error
+
+Requests a connection to the database session. Returns an error if it fails.
+
+#### db.Database.Close() error
+
+Disconnects from the database session. Returns an error if it fails.
+
+#### db.Database.Collection(name string) Collection
+
+Returns a ``db.Collection`` object from the current database given the name, collections are sets of rows or documents, this could be a MongoDB collection or a MySQL/PostgreSQL/SQLite table. You can create, read, update or delete rows from a collection. Please read all the methods avaiable for ``db.Collection`` further into this manual.
+
+#### db.Database.Collections() []string
+
+Returns the names of all the collections in the current database.
+
+#### db.Database.Use(name string) error
+
+Makes the session switch between databases given the name. Returns an error if it fails.
+
+#### db.Database.Drop() error
+
+Erases the entire database and all the collections. Returns an error if it fails.
+
+### Collection methods
+
+Collections are sets of rows or documents, this could be a MongoDB collection or a MySQL/PostgreSQL/SQLite table. You can create, read, update or delete rows from a collection.
+
+When you request data from a Collection with ``Find()`` or ``FindAll()``, a special structure named ``Item`` will be returned.
+
+    // Collection methods.
+    type Collection interface {
+      Append(...interface{}) bool
+
+      Count(...interface{}) int
+
+      Find(...interface{}) Item
+      FindAll(...interface{}) []Item
+
+      Update(...interface{}) bool
+
+      Remove(...interface{}) bool
+
+      Truncate() bool
+    }
+
+    // Rows from a result.
+    type Item map[string]interface{}
+
+#### db.Collection.Append(...interface{}) bool
+
+#### db.Collection.Count(...interface{}) int
+
+#### db.Collection.Find(...interface{}) Item
+
+#### db.Collection.FindAll(...interface{}) []Item
+
+#### db.Collection.Update(...interface{}) bool
+
+#### db.Collection.Remove(...interface{}) bool
+
+#### db.Collection.Truncate() bool
+
+## Documentation
+
+You can read ``gosexy/db`` documentation from a terminal
+
+    $ go doc github.com/xiam/gosexy/db
+
+Or you can [browse it](http://go.pkgdoc.org/github.com/xiam/gosexy/db) online.
diff --git a/db/mongo.go b/db/mongo.go
index 53db7770b788937b0eea12ba696a4a3d28d866bc..5cd7fd8a938dbb90119f9e9787f46052f059daba 100644
--- a/db/mongo.go
+++ b/db/mongo.go
@@ -67,7 +67,7 @@ func (c *MongoDataSourceCollection) marshal(where Where) map[string]interface{}
 	return conds
 }
 
-// Deletes all rows in a collection. In MongoDataSource, deletes the whole collection.
+// Deletes the whole collection.
 func (c *MongoDataSourceCollection) Truncate() bool {
 	err := c.collection.DropCollection()
 
diff --git a/db/mysql.go b/db/mysql.go
index 54b5b55f8d35570ad4f8841d6b0eba1a4957a0e4..d1b74a02219d387d7d3088cb4b7a393a8e356bfd 100644
--- a/db/mysql.go
+++ b/db/mysql.go
@@ -245,7 +245,7 @@ func (my *MysqlDataSource) Use(database string) error {
 	return nil
 }
 
-// Drops the current active database.
+// Drops the currently active database.
 func (my *MysqlDataSource) Drop() error {
 	my.session.Query(fmt.Sprintf("DROP DATABASE %s", my.config.Database))
 	return nil
@@ -374,7 +374,7 @@ func (t *MysqlTable) compileConditions(term interface{}) (string, sqlArgs) {
 	return "", args
 }
 
-// Converts Where{} structures into SQL.
+// Converts Where{} structures into SQL before processing them in a query.
 func (t *MysqlTable) marshal(where Where) (string, []string) {
 
 	for key, val := range where {
@@ -666,7 +666,7 @@ func (t *MysqlTable) Find(terms ...interface{}) Item {
 	return item
 }
 
-// Inserts a row into the table.
+// Inserts rows into the currently active table.
 func (t *MysqlTable) Append(items ...interface{}) bool {
 
 	itop := len(items)
@@ -696,7 +696,7 @@ func (t *MysqlTable) Append(items ...interface{}) bool {
 	return true
 }
 
-// Returns a MySQL table object by name.
+// Returns a MySQL table structure by name.
 func (my *MysqlDataSource) Collection(name string) Collection {
 
 	if collection, ok := my.collections[name]; ok == true {
diff --git a/db/postgresql.go b/db/postgresql.go
index 3fa548f6b97b68fef1d1e47f79de0628edbb9741..31697c5e58446118afd1ca638cac46b2bfbf2628 100644
--- a/db/postgresql.go
+++ b/db/postgresql.go
@@ -87,6 +87,7 @@ func pgValues(values []string) sqlValues {
 	return ret
 }
 
+// Stores PostgreSQL session data.
 type PostgresqlDataSource struct {
 	config      DataSource
 	session     *sql.DB
@@ -186,12 +187,14 @@ func (pg *PostgresqlDataSource) pgExec(method string, terms ...interface{}) sql.
 	return res[0].Elem().Interface().(sql.Rows)
 }
 
+// Represents a PostgreSQL table.
 type PostgresqlTable struct {
 	parent *PostgresqlDataSource
 	name   string
 	types  map[string]reflect.Kind
 }
 
+// Configures and returns a PostgreSQL dabase session.
 func PostgresqlSession(config DataSource) Database {
 	m := &PostgresqlDataSource{}
 	m.config = config
@@ -199,7 +202,7 @@ func PostgresqlSession(config DataSource) Database {
 	return m
 }
 
-// Closes a previously opened MySQL database session.
+// Closes a previously opened PostgreSQL database session.
 func (pg *PostgresqlDataSource) Close() error {
 	if pg.session != nil {
 		return pg.session.Close()
@@ -207,6 +210,7 @@ func (pg *PostgresqlDataSource) Close() error {
 	return nil
 }
 
+// Tries to open a connection to the current PostgreSQL session.
 func (pg *PostgresqlDataSource) Open() error {
 	var err error
 
@@ -233,11 +237,13 @@ func (pg *PostgresqlDataSource) Open() error {
 	return nil
 }
 
+// Changes the active database.
 func (pg *PostgresqlDataSource) Use(database string) error {
 	pg.config.Database = database
 	return pg.Open()
 }
 
+// Deletes the currently active database.
 func (pg *PostgresqlDataSource) Drop() error {
 	pg.session.Query(fmt.Sprintf("DROP DATABASE %s", pg.config.Database))
 	return nil
@@ -248,6 +254,7 @@ func (pg *PostgresqlDataSource) Driver() interface{} {
 	return pg.session
 }
 
+// Returns the list of PostgreSQL tables in the current database.
 func (pg *PostgresqlDataSource) Collections() []string {
 	var collections []string
 	var collection string
@@ -381,6 +388,7 @@ func (t *PostgresqlTable) marshal(where Where) (string, []string) {
 	return "", []string{}
 }
 
+// Deletes all the rows in the table.
 func (t *PostgresqlTable) Truncate() bool {
 
 	t.parent.pgExec(
@@ -391,6 +399,7 @@ func (t *PostgresqlTable) Truncate() bool {
 	return false
 }
 
+// Deletes all the rows in the table that match certain conditions.
 func (t *PostgresqlTable) Remove(terms ...interface{}) bool {
 
 	conditions, cargs := t.compileConditions(terms)
@@ -408,6 +417,7 @@ func (t *PostgresqlTable) Remove(terms ...interface{}) bool {
 	return true
 }
 
+// Modifies all the rows in the table that match certain conditions.
 func (t *PostgresqlTable) Update(terms ...interface{}) bool {
 	var fields string
 	var fargs sqlArgs
@@ -436,6 +446,7 @@ func (t *PostgresqlTable) Update(terms ...interface{}) bool {
 	return true
 }
 
+// Returns all the rows in the table that match certain conditions.
 func (t *PostgresqlTable) FindAll(terms ...interface{}) []Item {
 	var itop int
 
@@ -612,6 +623,7 @@ func (t *PostgresqlTable) FindAll(terms ...interface{}) []Item {
 	return items
 }
 
+// Returns the number of rows in the current table that match certain conditions.
 func (t *PostgresqlTable) Count(terms ...interface{}) int {
 
 	terms = append(terms, Fields{"COUNT(1) AS _total"})
@@ -629,6 +641,7 @@ func (t *PostgresqlTable) Count(terms ...interface{}) int {
 	return 0
 }
 
+// Returns the first row in the table that matches certain conditions.
 func (t *PostgresqlTable) Find(terms ...interface{}) Item {
 
 	var item Item
@@ -647,6 +660,7 @@ func (t *PostgresqlTable) Find(terms ...interface{}) Item {
 	return item
 }
 
+// Inserts rows into the currently active table.
 func (t *PostgresqlTable) Append(items ...interface{}) bool {
 
 	itop := len(items)
@@ -676,6 +690,7 @@ func (t *PostgresqlTable) Append(items ...interface{}) bool {
 	return true
 }
 
+// Returns a MySQL table structure by name.
 func (pg *PostgresqlDataSource) Collection(name string) Collection {
 
 	if collection, ok := pg.collections[name]; ok == true {
diff --git a/db/sqlite.go b/db/sqlite.go
index a8f8283e8c9dadaa069ca390dcaefea914a97250..1a0d4c8c3242abf2fd6e3bd168af89653f7bfa2d 100644
--- a/db/sqlite.go
+++ b/db/sqlite.go
@@ -87,6 +87,7 @@ func slValues(values []string) sqlValues {
 	return ret
 }
 
+// Stores driver's session data.
 type SqliteDataSource struct {
 	config      DataSource
 	session     *sql.DB
@@ -197,12 +198,14 @@ func (sl *SqliteDataSource) slExec(method string, terms ...interface{}) sql.Rows
 
 }
 
+// Represents a SQLite table.
 type SqliteTable struct {
 	parent *SqliteDataSource
 	name   string
 	types  map[string]reflect.Kind
 }
 
+// Configures and returns a SQLite database session.
 func SqliteSession(config DataSource) Database {
 	m := &SqliteDataSource{}
 	m.config = config
@@ -215,6 +218,7 @@ func (sl *SqliteDataSource) Driver() interface{} {
 	return sl.session
 }
 
+// Tries to open a connection to the current SQLite session.
 func (sl *SqliteDataSource) Open() error {
 	var err error
 
@@ -233,6 +237,7 @@ func (sl *SqliteDataSource) Open() error {
 	return nil
 }
 
+// Closes a previously opened SQLite database session.
 func (sl *SqliteDataSource) Close() error {
 	if sl.session != nil {
 		return sl.session.Close()
@@ -240,17 +245,20 @@ func (sl *SqliteDataSource) Close() error {
 	return nil
 }
 
+// Changes the active database.
 func (sl *SqliteDataSource) Use(database string) error {
 	sl.config.Database = database
 	sl.session.Query(fmt.Sprintf("USE %s", database))
 	return nil
 }
 
+// Deletes the currently active database.
 func (sl *SqliteDataSource) Drop() error {
 	sl.session.Query(fmt.Sprintf("DROP DATABASE %s", sl.config.Database))
 	return nil
 }
 
+// Returns the list of SQLite tables in the current database.
 func (sl *SqliteDataSource) Collections() []string {
 	var collections []string
 	var collection string
@@ -385,6 +393,7 @@ func (t *SqliteTable) marshal(where Where) (string, []string) {
 	return "", []string{}
 }
 
+// Deletes all the rows in the table.
 func (t *SqliteTable) Truncate() bool {
 
 	t.parent.slExec(
@@ -394,6 +403,8 @@ func (t *SqliteTable) Truncate() bool {
 
 	return false
 }
+
+// Deletes all the rows in the table that match certain conditions.
 func (t *SqliteTable) Remove(terms ...interface{}) bool {
 
 	conditions, cargs := t.compileConditions(terms)
@@ -411,6 +422,7 @@ func (t *SqliteTable) Remove(terms ...interface{}) bool {
 	return true
 }
 
+// Modifies all the rows in the table that match certain conditions.
 func (t *SqliteTable) Update(terms ...interface{}) bool {
 	var fields string
 	var fargs sqlArgs
@@ -439,6 +451,7 @@ func (t *SqliteTable) Update(terms ...interface{}) bool {
 	return true
 }
 
+// Returns all the rows in the table that match certain conditions.
 func (t *SqliteTable) FindAll(terms ...interface{}) []Item {
 	var itop int
 
@@ -615,6 +628,7 @@ func (t *SqliteTable) FindAll(terms ...interface{}) []Item {
 	return items
 }
 
+// Returns the number of rows in the current table that match certain conditions.
 func (t *SqliteTable) Count(terms ...interface{}) int {
 
 	terms = append(terms, Fields{"COUNT(1) AS _total"})
@@ -632,6 +646,7 @@ func (t *SqliteTable) Count(terms ...interface{}) int {
 	return 0
 }
 
+// Returns the first row in the table that matches certain conditions.
 func (t *SqliteTable) Find(terms ...interface{}) Item {
 
 	var item Item
@@ -650,6 +665,7 @@ func (t *SqliteTable) Find(terms ...interface{}) Item {
 	return item
 }
 
+// Inserts rows into the currently active table.
 func (t *SqliteTable) Append(items ...interface{}) bool {
 
 	itop := len(items)
@@ -680,6 +696,7 @@ func (t *SqliteTable) Append(items ...interface{}) bool {
 	return true
 }
 
+// Returns a SQLite table structure by name.
 func (sl *SqliteDataSource) Collection(name string) Collection {
 
 	if collection, ok := sl.collections[name]; ok == true {