diff --git dbtng_example/dbtng_example.info dbtng_example/dbtng_example.info
new file mode 100644
index 0000000..6a3346f
--- /dev/null
+++ dbtng_example/dbtng_example.info
@@ -0,0 +1,8 @@
+; $Id$
+name = DBTNG example
+description = An example module showing how use the database API: DBTNG.
+package = Example modules
+core = 7.x
+files[] = dbtng_example.module
+files[] = dbtng_example.install
+files[] = dbtng_example.test
diff --git dbtng_example/dbtng_example.install dbtng_example/dbtng_example.install
new file mode 100644
index 0000000..f41eaa3
--- /dev/null
+++ dbtng_example/dbtng_example.install
@@ -0,0 +1,116 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Install, update and uninstall functions for the dbtng example module.
+ */
+
+/**
+ * Implementation of hook_install().
+ *
+ * In Drupal 7, there is no need to install schema using this hook, the schema
+ * is already installed before this hook is called.
+ *
+ * We will create a default entry in the database.
+ *
+ * @see hook_install()
+ */
+function dbtng_example_install() {
+  // Outside of the .install file we would use drupal_write_record() to
+  // populate the database, but it cannot be used here, so we'll use
+  // db_insert().
+
+  // Add a default entry.
+  $fields = array(
+    'name'    => 'John',
+    'surname' => 'Doe',
+    'age'     => 0,
+  );
+  db_insert('dbtng_example')
+    ->fields($fields)
+    ->execute();
+
+  // Add another entry.
+  $fields = array(
+    'name'    => 'John',
+    'surname' => 'Roe',
+    'age'     => 100,
+    'uid'     => 1,
+  );
+  db_insert('dbtng_example')
+    ->fields($fields)
+    ->execute();
+
+}
+
+/**
+ * Implementation of hook_uninstall().
+ *
+ * As in hook_install, there is no need to uninstall schema, Drupal will do it
+ * for us.
+ *
+ * @see hook_uninstall()
+ */
+function dbtng_example_uninstall() {
+}
+
+
+/**
+ * Implements hook_schema().
+ *
+ * Define the database tables used by this module.
+ * Remember that the easiest way to create the code for hook_schema is with
+ * the schema module:
+ * @link http://drupal.org/project/schema @endlink
+ *
+ * @see hook_schema()
+ */
+function dbtng_example_schema() {
+
+  $schema['dbtng_example'] = array(
+    'description' => 'Stores example person entries for demonstration purposes.',
+    'fields' => array(
+      'pid'  => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique person ID.',
+      ),
+      'uid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "Creator user's {users}.uid",
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Name of the person.',
+      ),
+      'surname' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Surname of the person.',
+      ),
+      'age' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'The age of the person in years.',
+      )
+    ),
+    'primary key' => array('pid'),
+    'indexes' => array(
+      'name'    => array('name'),
+      'surname' => array('surname'),
+      'age'     => array('age'),
+    ),
+  );
+
+  return $schema;
+}
diff --git dbtng_example/dbtng_example.module dbtng_example/dbtng_example.module
new file mode 100644
index 0000000..86b1c61
--- /dev/null
+++ dbtng_example/dbtng_example.module
@@ -0,0 +1,560 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * This is an example outlining how a module can make use of the new DBTNG
+ * database API in Drupal 7.
+ *
+ * @todo Demonstrate transaction usage.
+ *
+ * General documentation is available at
+ * @link database Database abstraction layer documentation @endlink and
+ * at @link http://drupal.org/node/310069 @endlink.
+ *
+ */
+
+/**
+ * @defgroup database_examples Database Examples
+ * @{
+ * These examples show basic database examples, including DBTNG.
+ *
+ * General documentation is available at
+ * @link database Database abstraction layer documentation @endlink and
+ * at @link http://drupal.org/node/310069 @endlink.
+ *
+ * The several examples here demonstrate basic database usage.
+ *
+ * In Drupal 6, the recommended method to save or update an entry in the
+ * database was drupal_write_record() or db_query().
+ *
+ * In Drupal 7 and forward, the usage of db_query()
+ * for INSERT, UPDATE, or DELETE
+ * is deprecated, because it is database-dependent. Instead specific functions
+ * are provided to perform these operations: db_insert(), db_update(),
+ * and db_delete() do the job now. (Note that db_write_record() is also
+ * deprecated.)
+ *
+ * db_insert() example:
+ * @code
+ *   // INSERT INTO {dbtng_example} (name, surname) VALUES('John, 'Doe')
+ *   db_insert('dbtng_example')
+ *     ->fields(array('name' => 'John', 'surname' => 'Doe'))
+ *     ->execute();
+ * @endcode
+ *
+ * db_update() example:
+ * @code
+ *   // UPDATE {dbtng_example} SET name = 'Jane' WHERE name = 'John'
+ *   db_update('dbtng_example')
+ *     ->fields(array('name' => 'Jane'))
+ *     ->condition('name', 'John')
+ *     ->execute();
+ * @endcode
+ *
+ * db_delete() example:
+ * @code
+ *   // DELETE FROM {dbtng_example} WHERE name = 'Jane'
+ *   db_delete('dbtng_example')
+ *     ->condition('name', 'Jane')
+ *     ->execute();
+ * @endcode
+ *
+ * See @link database Database Abstraction Layer @endlink
+ * @see db_insert()
+ * @see db_update()
+ * @see db_delete()
+ * @see drupal_write_record()
+ * @}
+*/
+
+
+
+/**
+ * Save entry in the database.
+ *
+ * The underlying DBTNG version is db_insert().
+ *
+ * This example will show both.
+ *
+ * In Drupal 6, this would have been:
+ * @code
+ *   db_query(
+ *     "INSERT INTO {dbtng_example} (name, surname, age)
+ *       VALUES ('%s', '%s', '%d')",
+ *     $entry['name'],
+ *     $entry['surname'],
+ *     $entry['age']
+ *   );
+ *
+ * Exception handling is shown in this example. It could be simplified
+ * without the try/catch blocks, but since an insert will throw and exception
+ * and terminate your application if the exception is not handled, it's
+ * best to employ try/catch.
+ *
+ * @param $entry
+ *   an array containing all the fields of the database record.
+ *
+ * @ingroup database_examples
+ * @see db_insert()
+ */
+function dbtng_example_entry_insert($entry) {
+  try {
+    $return_value = db_insert('dbtng_example')
+                    ->fields($entry)
+                    ->execute();
+  }
+  catch (Exception $e) {
+    drupal_set_message(t('db_insert failed. Message = %message, query= %query',
+      array('%message' => $e->getMessage(), '%query' => $e->query_string)), 'error');
+  }
+}
+
+/**
+ * Update an entry in the database.
+ *
+ * The former, deprecated techniques used db_query() or db_write_record():
+ * @code
+ * db_query(
+ *   "UPDATE {dbtng_example}
+ *    SET name = '%s', surname = '%s', age = '%d'
+ *    WHERE pid = %d",
+ *    $entry['pid']
+ * );
+ * @endcode
+ *
+ * @param $entry
+ *   an array containing all the fields of the item to be updated.
+ *
+ * @ingroup database_examples
+ * @see db_update
+ */
+function dbtng_example_entry_update($entry) {
+  try {
+    $result = db_update('dbtng_example')
+              ->fields($entry)
+              ->condition('pid', $entry['pid'])
+              ->execute();
+  }
+  catch(Exception $e) {
+    drupal_set_message(t('db_update failed. Message = %message, query= %query',
+      array('%message' => $e->getMessage(), '%query' => $e->query_string)), 'error');
+  }
+}
+
+/**
+ * Delete an entry in the database.
+ *
+ * @param $entry
+ *   an array containing at least the person identifier 'pid' element.
+ *
+ * @ingroup database_examples
+ * @see db_delete()
+ */
+function dbtng_example_entry_delete($entry) {
+  // The usage of db_query is deprecated.
+  // Formerly, a deletion might have been accomplished like this:
+  // @code
+  //   db_query("DELETE FROM {dbtng_example} WHERE pid = %d", $entry['pid]);
+  // @endcode
+  //
+  // In Drupal 7:
+  db_delete('dbtng_example')
+    ->condition('pid', $entry['pid'])
+    ->execute();
+
+}
+
+
+/**
+ * Read from the database using a filter array.
+ *
+ * In Drupal 6, the standard function to perform reads was db_query().
+ *
+ * db_query() used an SQL query with placeholders and arguments as parameters.
+
+ * @code
+ *  // Old way
+ *  $query = "SELECT * FROM {dbtng_example} n WHERE n.uid = %d AND name = '%s'";
+ *  $result = db_query($query, $uid, $name);
+ * @endcode
+ *
+ * Drupal 7 DBTNG provides an abstracted interface that will work with a wide
+ * variety of database engines.
+ *
+ * db_query() is deprecated for selects, but can be used as here:
+ *
+ * @code
+ *   // SELECT * FROM {dbtng_example} WHERE uid = 0 AND name = 'John'
+ *   db_query(
+ *     "SELECT * FROM {dbtng_example} WHERE uid = :uid and name = :name",
+ *     array(':uid' => 0, ':name' => 'John')
+ *   )->execute();
+ * @endcode
+ *
+ * But for select statements, Drupal provides the db_select() API method. This
+ * end up in several ways to perform the same SQL query.
+ *
+ * @code
+ *   // SELECT * FROM {dbtng_example} WHERE uid = 0 AND name = 'John'
+ *   db_select('dbtng_example')
+ *     ->condition('uid', 0)
+ *     ->condition('name', 'John')
+ *     ->execute();
+ * @endcode
+ *
+ *
+ * Here is db_select with named placeholders:
+ * @code
+ *   // SELECT * FROM {dbtng_example} WHERE uid = 0 AND name = 'John'
+ *   $arguments = array(':name' => 'John', ':uid' => 0);
+ *   db_select('dbtng_example')
+ *     ->where('uid = :uid AND name = :name', $arguments)
+ *     ->execute();
+ * @endcode
+ *
+ * Conditions are stacked and evaluated as AND and OR depending on the type of
+ * query. For more information, read the conditional queries
+ * handbook page at: http://drupal.org/node/310086
+ *
+ * The condition argument is an 'equal' evaluation by default, but this can be
+ * altered:
+ * @code
+ *   // SELECT * FROM {dbtng_example} WHERE age > 18
+ *   db_select('dbtng_example')
+ *     ->condition('age', 18, '>')
+ *     ->execute();
+ * @endcode
+ *
+ * @param $entry
+ *   an array containing all the fields used to search the entries in the table.
+ * @return
+ *   an object containing the loaded entries if found.
+ *
+ * @ingroup database_examples
+ * @see db_select()
+ * @see db_query()
+ */
+function dbtng_example_entry_load($entry = array()) {
+  // Read from the dbtng_example table, read all fields of this table.
+  $select = db_select('dbtng_example', 'example');
+  $select->fields('example');
+
+  // Add each field and value as a condition to this query.
+  foreach ($entry as $field => $value) {
+    $select->condition($field, $value);
+  }
+  // Return the result in object format.
+  return $select->execute()->fetchAll();
+}
+
+
+/**
+ * Render a filtered list of entries in the database.
+ *
+ * DBTNG also helps processing queries returning several rows, providing the
+ * found objects in the same query execution call.
+ *
+ * This function queries the database using a JOIN between users table and the
+ * example entries, to provide the username that created the entry, and creates
+ * a table with the results, processing each row.
+ *
+ * SELECT
+ *  e.pid as pid, e.name as name, e.surname as surname, e.age as age
+ *  u.name as username
+ * FROM
+ *  {dbtng_example} e
+ * JOIN
+ *  users u ON e.uid = u.uid
+ * WHERE
+ *  e.name = 'John' AND e.age > 18
+ *
+ * @see db_select()
+ */
+function dbtng_example_advanced_list() {
+  $output = '';
+
+  $select = db_select('dbtng_example', 'e');
+  // Join the users table, so we can get the entry creator's username
+  $select->join('users', 'u', 'e.uid = u.uid');
+  // Select these specific fields for the output
+  $select->addField('e', 'pid');
+  $select->addField('u', 'name', 'username');
+  $select->addField('e', 'name');
+  $select->addField('e', 'surname');
+  $select->addField('e', 'age');
+  // Filter only persons named "John"
+  $select->condition('e.name', 'John');
+  // Filter only persons older than 18 years
+  $select->condition('e.age', 18, '>');
+
+  // Now, loop all these entries an show them in a table. Note that there is no
+  // db_fetch_* object or array function being called here.
+  $entries = $select->execute()->fetchAll();
+  if (!empty($entries)) {
+    $rows = array();
+    foreach ($entries as $entry) {
+      // Each entry is a row, forcing to be array.
+      $rows[] = (array) $entry;
+    }
+    // Make a table for them.
+    $header = array(t('Id'), t('Created by'), t('Name'), t('Surname'), t('Age'));
+    $output .= theme('table', array('header' => $header, 'rows' => $rows));
+  }
+  else {
+    drupal_set_message(t('No entries meet the filter criteria (Name = "John" and Age > 18).'));
+  }
+  return $output;
+}
+
+//// Helper functions ////
+
+/**
+ * Implements hook_help().
+ *
+ * Show some help on each form provided by this module.
+ */
+function dbtng_example_help($path) {
+  $output = '';
+  switch ($path) {
+    case 'examples/dbtng':
+      $output = t('Generate a list of all entries in the database. There is no filter in the query.');
+      break;
+    case 'examples/dbtng/advanced':
+      $output  = t('A more complex list of entries in the database. ');
+      $output .= t('Only the entries with name = "John" and older than 18 years are shown, and the username of the person who created the entry is also shown.');
+      break;
+    case 'examples/dbtng/update':
+      $output = t('Demonstrates an update operation.');
+      break;
+    case 'examples/dbtng/add':
+      $output = t('Add an entry to the dbtng_example table.');
+      break;
+  }
+  return $output;
+}
+
+
+/**
+ * Set up calls to drupal_get_form() for all our example cases.
+ *
+ * Implements hook_menu().
+ */
+function dbtng_example_menu() {
+  $items = array();
+
+  $items['examples/dbtng'] = array(
+    'title' => 'DBTNG Example',
+    'page callback' => 'dbtng_example_list',
+    'access callback' => TRUE,
+  );
+  $items['examples/dbtng/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['examples/dbtng/advanced'] = array(
+    'title' => 'Advanced list',
+    'page callback' => 'dbtng_example_advanced_list',
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['examples/dbtng/add'] = array(
+    'title' => 'Add entry',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('dbtng_example_form_add'),
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+    'weight' => -9,
+  );
+  $items['examples/dbtng/update'] = array(
+    'title' => 'Update entry',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('dbtng_example_form_update'),
+    'type' => MENU_LOCAL_TASK,
+    'access callback' => TRUE,
+    'weight' => -5,
+  );
+
+  return $items;
+}
+
+/**
+ * Render a list of entries in the database.
+ */
+function dbtng_example_list() {
+  $output = '';
+
+  // Get all entries in the dbtng_example table
+  if ($entries = dbtng_example_entry_load()) {
+    $rows = array();
+    foreach ($entries as $entry) {
+      // Each entry is a row, forcing to be array.
+      // TODO: Sanitize output. Look at how other places sanitize.
+      $rows[] = (array) $entry;
+    }
+    // Make a table for them.
+    $header = array(t('Id'), t('uid'), t('Name'), t('Surname'), t('Age'));
+    $output .= theme('table', array('header' => $header, 'rows' => $rows));
+  }
+  else {
+    drupal_set_message(t('No entries have been added yet.'));
+  }
+  return $output;
+}
+
+
+
+/**
+ * Prepare a simple form to add an entry, with all the interesting fields.
+ */
+function dbtng_example_form_add($form, &$form_state) {
+  $form = array();
+
+  $form['add'] = array(
+    '#type'  => 'fieldset',
+    '#title' => t('Add a person entry'),
+  );
+  $form['add']['name'] = array(
+    '#type'  => 'textfield',
+    '#title' => t('Name'),
+    '#size'  => 15,
+  );
+  $form['add']['surname'] = array(
+    '#type'  => 'textfield',
+    '#title' => t('Surname'),
+    '#size'  => 15,
+  );
+  $form['add']['age'] = array(
+    '#type'  => 'textfield',
+    '#title' => t('Age'),
+    '#size'  => 5,
+    '#description' => t("Values greater than 127 will cause an exception. Try it - it's a great example why exception handling is needed with DTBNG."),
+  );
+  $form['add']['submit'] = array(
+    '#type'  => 'submit',
+    '#value' => t('Add'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for 'add entry' form.
+ */
+function dbtng_example_form_add_submit($form, $form_state){
+global $user;
+
+  // Save the submitted entry.
+  $entry = array(
+    'name'    => $form_state['values']['name'],
+    'surname' => $form_state['values']['surname'],
+    'age'     => $form_state['values']['age'],
+    'uid'     => $user->uid,
+  );
+  dbtng_example_entry_insert($entry);
+}
+
+/**
+ * Sample UI to update a record.
+ */
+function dbtng_example_form_update($form, &$form_state) {
+  $form = array(
+    '#prefix' => '<div id="updateform">',
+    '#suffix' => '</div>',
+  );
+
+  $entries = dbtng_example_entry_load();
+  $keyed_entries = array();
+  if (empty($entries)) {
+    $form['no_values'] = array(
+      '#value' => t("No entries exist in the table dbtng_example table"),
+    );
+    return $form;
+  }
+
+  foreach ($entries as $entry) {
+    $options[$entry->pid] = t("@pid: @name @surname (@age)",
+      array('@pid' => $entry->pid, '@name' => $entry->name, '@surname' => $entry->surname,
+        '@age' => $entry->age));
+      $keyed_entries[$entry->pid] = $entry;
+  }
+  $default_entry = !empty($form_state['values']['pid']) ? $keyed_entries[$form_state['values']['pid']] : $entries[0];
+
+  $form['entry'] = array(
+    '#type' => 'value',
+    '#value' => $default_entry,
+ );
+
+ $form['pid'] = array(
+    '#type'  => 'select',
+    '#options' => $options,
+    '#title' => t('Choose entry to update'),
+    '#default_value' => $default_entry->pid,
+    '#ajax' => array(
+      'wrapper' => 'updateform',
+      'callback' => 'dbtng_example_form_update_callback',
+    ),
+  );
+
+  $form['name'] = array(
+    '#type'  => 'textfield',
+    '#title' => t('Updated first name'),
+    '#size'  => 15,
+    '#default_value' => $default_entry->name,
+  );
+
+  $form['surname'] = array(
+    '#type'  => 'textfield',
+    '#title' => t('Updated last name'),
+    '#size'  => 15,
+    '#default_value' => $default_entry->surname,
+  );
+  $form['age'] = array(
+    '#type'  => 'textfield',
+    '#title' => t('Updated age'),
+    '#size'  => 4,
+    '#default_value' => $default_entry->age,
+    '#description' => t("Values greater than 127 will cause an exception"),
+  );
+
+  $form['submit'] = array(
+    '#type'  => 'submit',
+    '#value' => t('Update'),
+  );
+  return $form;
+}
+
+/**
+ * AJAX callback handler for the pid select.
+ *
+ * When the pid changes, populates the defaults from the database in the form.
+ */
+function dbtng_example_form_update_callback($form, $form_state) {
+  $entry = $form_state['values']['entry'];
+  // Setting the #value of items is the only way I was able to figure out
+  // to get replaced defaults on these items. #default_value will not do it
+  // and shouldn't.
+  foreach (array('name', 'surname', 'age') as $item) {
+    $form[$item]['#value'] = $entry->$item;
+  }
+  return $form;
+}
+
+/**
+ * Submit handler for 'update entry' form.
+ */
+function dbtng_example_form_update_submit($form, $form_state){
+global $user;
+
+  // Save the submitted entry.
+  $entry = array(
+    'pid'     => $form_state['values']['pid'],
+    'name'    => $form_state['values']['name'],
+    'surname' => $form_state['values']['surname'],
+    'age'     => $form_state['values']['age'],
+    'uid'     => $user->uid,
+  );
+  dbtng_example_entry_update($entry);
+  drupal_set_message(t("Updated entry @entry", array('@entry' => print_r($entry, TRUE))));
+}
diff --git dbtng_example/dbtng_example.test dbtng_example/dbtng_example.test
new file mode 100644
index 0000000..83d5e86
--- /dev/null
+++ dbtng_example/dbtng_example.test
@@ -0,0 +1,182 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * test file for dbtng_example module.
+ */
+
+/**
+ * Default test case for the dbtng_example module.
+ */
+class DBTNGExampleUnitTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'DBTNG example unit and UI tests',
+      'description' => 'Various unit tests on the dbtng example module.' ,
+      'group' => 'Examples',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('dbtng_example');
+  }
+
+  /**
+   * Test default module installation, two entries in the database table.
+   */
+  function testInstall() {
+    $result = dbtng_example_entry_load();
+    $this->assertEqual(
+      count($result),
+      2,
+      t('Found two entries in the table after installing the module.')
+    );
+  }
+
+
+  /**
+   * Test the UI.
+   */
+  function testUI() {
+    // Test the basic list.
+    $this->drupalGet('examples/dbtng');
+    $this->assertPattern("/John[td\/<>\w]+Doe/", t("Text 'John Doe' found in table"));
+
+    //Test the add tab.
+    // Add the new entry.
+    $this->drupalPost('examples/dbtng/add',
+      array('name'  => 'Some', 'surname' => 'Anonymous', 'age' => 33), t('Add'));
+    // Now find the new entry.
+    $this->drupalGet('examples/dbtng');
+    $this->assertPattern("/Some[td\/<>\w]+Anonymous/", t("Text 'Some Anonymous' found in table"));
+
+
+    // Try the update tab.
+    // Find out the pid of our "anonymous" guy.
+    $result = dbtng_example_entry_load(array('surname' => 'Anonymous'));
+    $this->drupalGet("examples/dbtng");
+    $this->assertEqual(
+      count($result),
+      1,
+      t('Found one entry in the table with surname = "Anonymous".')
+    );
+    $entry = $result[0];
+    unset($entry->uid);
+    $entry->name = 'NewFirstName';
+    $this->drupalPost('examples/dbtng/update',
+      (array)$entry, t('Update'));
+    // Now find the new entry.
+    $this->drupalGet('examples/dbtng');
+    $this->assertPattern("/NewFirstName[td\/<>\w]+Anonymous/", t("Text 'NewFirstName Anonymous' found in table"));
+
+    // Try the advanced tab.
+    $this->drupalGet('examples/dbtng/advanced');
+    $rows = $this->xpath("//*[@id='block-system-main']/div/table[1]/tbody/tr");
+    $this->assertEqual(count($rows), 1, t("One row found in advanced view"));
+    $this->assertFieldByXPath("//*[@id='block-system-main']/div/table[1]/tbody/tr/td[4]", "Roe", "Name 'Roe' Exists in advanced list");
+  }
+
+  /**
+   * Test several combinations, adding entries, updating and deleting.
+   */
+  function testAPIExamples() {
+    // Create a new entry.
+    $entry = array(
+      'name' => 'James',
+      'surname' => 'Doe',
+      'age' => 23,
+    );
+    dbtng_example_entry_insert($entry);
+
+    // Save another entry
+    $entry = array(
+      'name' => 'Jane',
+      'surname' => 'NotDoe',
+      'age' => 19,
+    );
+    dbtng_example_entry_insert($entry);
+
+    // Verify that 4 records are found in the database
+    $result = dbtng_example_entry_load();
+    $this->assertEqual(
+      count($result),
+      4,
+      t('Found a total of four entries in the table after creating two additional entries.')
+    );
+
+    // Verify 2 of these records have 'Doe' as surname
+    $result = dbtng_example_entry_load(array('surname' => 'Doe'));
+    $this->assertEqual(
+      count($result),
+      2,
+      t('Found two entries in the table with surname = "Doe".')
+    );
+
+    // Now find our not-Doe entry.
+    $result = dbtng_example_entry_load(array('surname' => 'NotDoe'));
+    $this->assertEqual(
+      count($result),
+      1,
+      t('Found one entry in the table with surname "NotDoe'));
+    // Our NotDoe will be changed to "NowDoe".
+    $entry = $result[0];
+    $entry->surname = "NowDoe";
+    dbtng_example_entry_update((array)$entry);
+
+    $result = dbtng_example_entry_load(array('surname' => 'NowDoe'));
+    $this->assertEqual(
+      count($result),
+      1,
+      t("Found renamed 'NowDoe' surname"));
+
+    // Read only John Doe entry.
+    $result = dbtng_example_entry_load(array('name' => 'John', 'surname' => 'Doe'));
+    $this->assertEqual(
+      count($result),
+      1,
+      t('Found one entry for John Doe.')
+    );
+    // Get the entry
+    $entry = (array) end($result);
+    // Change age to 45
+    $entry['age'] = 45;
+    // Update entry in database
+    dbtng_example_entry_update((array)$entry);
+
+    // Find entries with age = 45
+    // Read only John Doe entry.
+    $result = dbtng_example_entry_load(array('surname' => 'NowDoe'));
+    $this->assertEqual(
+      count($result),
+      1,
+      t('Found one entry with surname = Nowdoe.')
+    );
+
+    // Verify it is Jane NowDoe.
+    $entry = (array) end($result);
+    $this->assertEqual(
+      $entry['name'],
+      'Jane',
+      t('The name Jane is found in the entry')
+    );
+    $this->assertEqual(
+      $entry['surname'],
+      'NowDoe',
+      t('The surname NowDoe is found in the entry')
+    );
+
+    // Delete the entry.
+    dbtng_example_entry_delete($entry);
+
+    // Verify that now there are only 3 records
+    $result = dbtng_example_entry_load();
+    $this->assertEqual(
+      count($result),
+      3,
+      t('Found only three records, a record was deleted.')
+    );
+  }
+}
+
