diff --git a/include/contact_selectors.php b/include/contact_selectors.php
index 27bdb47570..05059e3358 100644
--- a/include/contact_selectors.php
+++ b/include/contact_selectors.php
@@ -101,12 +101,12 @@ function network_to_name($s, $profile = "") {
 	$networkname = str_replace($search, $replace, $s);
 
 	if ((in_array($s, array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) && ($profile != "")) {
-		$r = q("SELECT `gserver`.`platform` FROM `gcontact`
+		$r = dba::fetch_first("SELECT `gserver`.`platform` FROM `gcontact`
 				INNER JOIN `gserver` ON `gserver`.`nurl` = `gcontact`.`server_url`
-				WHERE `gcontact`.`nurl` = '%s' AND `platform` != ''",
-				dbesc(normalise_link($profile)));
+				WHERE `gcontact`.`nurl` = ? AND `platform` != ''", normalise_link($profile));
+
 		if (dbm::is_result($r)) {
-			$networkname = $r[0]["platform"];
+			$networkname = $r['platform'];
 		}
 	}
 
diff --git a/include/conversation.php b/include/conversation.php
index bd6e714654..a8ac83c1a2 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -921,10 +921,11 @@ function best_link_url($item, &$sparkle, $ssl_state = false) {
 	$clean_url = normalise_link($item['author-link']);
 
 	if (local_user()) {
-		$r = q("SELECT `id` FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `nurl` = '%s' AND NOT `pending` LIMIT 1",
-			dbesc(NETWORK_DFRN), intval(local_user()), dbesc(normalise_link($clean_url)));
+		$r = dba::select('contact', array('id'),
+			array('network' => NETWORK_DFRN, 'uid' => local_user(), 'nurl' => normalise_link($clean_url), 'pending' => false),
+			array('limit' => 1));
 		if (dbm::is_result($r)) {
-			$best_url = 'redir/' . $r[0]['id'];
+			$best_url = 'redir/' . $r['id'];
 			$sparkle = true;
 		}
 	}
@@ -940,7 +941,6 @@ function best_link_url($item, &$sparkle, $ssl_state = false) {
 }
 
 
-if (! function_exists('item_photo_menu')) {
 function item_photo_menu($item) {
 	$ssl_state = false;
 
@@ -970,12 +970,11 @@ function item_photo_menu($item) {
 	$cid = 0;
 	$network = '';
 	$rel = 0;
-	$r = q("SELECT `id`, `network`, `rel` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' LIMIT 1",
-		intval(local_user()), dbesc(normalise_link($item['author-link'])));
+	$r = dba::select('contact', array('id', 'network', 'rel'), array('uid' => local_user(), 'nurl' => normalise_link($item['author-link'])), array('limit' => 1));
 	if (dbm::is_result($r)) {
-		$cid = $r[0]['id'];
-		$network = $r[0]['network'];
-		$rel = $r[0]['rel'];
+		$cid = $r['id'];
+		$network = $r['network'];
+		$rel = $r['rel'];
 	}
 
 	if ($sparkle) {
@@ -1036,7 +1035,7 @@ function item_photo_menu($item) {
 		}
 	}
 	return $o;
-}}
+}
 
 if (! function_exists('builtin_activity_puller')) {
 /**
diff --git a/include/dba.php b/include/dba.php
index c2ae78c0f7..954d218c1a 100644
--- a/include/dba.php
+++ b/include/dba.php
@@ -891,12 +891,20 @@ class dba {
 	 *
 	 * @param string $table Table name
 	 * @param array $param parameter array
+	 * @param bool $on_duplicate_update Do an update on a duplicate entry
 	 *
 	 * @return boolean was the insert successfull?
 	 */
-	static public function insert($table, $param) {
+	static public function insert($table, $param, $on_duplicate_update = false) {
 		$sql = "INSERT INTO `".self::$dbo->escape($table)."` (`".implode("`, `", array_keys($param))."`) VALUES (".
-			substr(str_repeat("?, ", count($param)), 0, -2).");";
+			substr(str_repeat("?, ", count($param)), 0, -2).")";
+
+		if ($on_duplicate_update) {
+			$sql .= " ON DUPLICATE KEY UPDATE `".implode("` = ?, `", array_keys($param))."` = ?";
+
+			$values = array_values($param);
+			$param = array_merge_recursive($values, $values);
+		}
 
 		return self::e($sql, $param);
 	}
@@ -1160,34 +1168,27 @@ class dba {
 	 * @param string $table Table name
 	 * @param array $fields contains the fields that are updated
 	 * @param array $condition condition array with the key values
-	 * @param array|boolean $old_fields array with the old field values that are about to be replaced
+	 * @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate)
 	 *
 	 * @return boolean was the update successfull?
 	 */
 	static public function update($table, $fields, $condition, $old_fields = array()) {
 
-		/** @todo We may use MySQL specific functions here:
-		 * INSERT INTO `config` (`cat`, `k`, `v`) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'"
-		 * But I think that it doesn't make sense here.
-		*/
-
 		$table = self::$dbo->escape($table);
 
 		if (is_bool($old_fields)) {
 			$sql = "SELECT * FROM `".$table."` WHERE `".
 			implode("` = ? AND `", array_keys($condition))."` = ? LIMIT 1";
 
-			$params = array();
-			foreach ($condition AS $value) {
-				$params[] = $value;
-			}
+			$params = array_values($condition);
 
 			$do_insert = $old_fields;
 
 			$old_fields = self::fetch_first($sql, $params);
 			if (is_bool($old_fields)) {
 				if ($do_insert) {
-					return self::insert($table, $fields);
+					$values = array_merge($condition, $fields);
+					return self::insert($table, $values, $do_insert);
 				}
 				$old_fields = array();
 			}
@@ -1213,13 +1214,9 @@ class dba {
 			implode("` = ?, `", array_keys($fields))."` = ? WHERE `".
 			implode("` = ? AND `", array_keys($condition))."` = ?";
 
-		$params = array();
-		foreach ($fields AS $value) {
-			$params[] = $value;
-		}
-		foreach ($condition AS $value) {
-			$params[] = $value;
-		}
+		$params1 = array_values($fields);
+		$params2 = array_values($condition);
+		$params = array_merge_recursive($params1, $params2);
 
 		return self::e($sql, $params);
 	}
diff --git a/include/identity.php b/include/identity.php
index b24a5314a5..03a5416452 100644
--- a/include/identity.php
+++ b/include/identity.php
@@ -136,49 +136,47 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array()) {
  */
 function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0) {
 	if (remote_user() && count($_SESSION['remote'])) {
-			foreach ($_SESSION['remote'] as $visitor) {
-				if ($visitor['uid'] == $uid) {
-					$r = q("SELECT `profile-id` FROM `contact` WHERE `id` = %d LIMIT 1",
-						intval($visitor['cid'])
-					);
-					if (dbm::is_result($r))
-						$profile = $r[0]['profile-id'];
-					break;
+		foreach ($_SESSION['remote'] as $visitor) {
+			if ($visitor['uid'] == $uid) {
+				$r = dba::select('contact', array('profile-id'), array('id' => $visitor['cid']), array('limit' => 1));
+				if (dbm::is_result($r)) {
+					$profile = $r['profile-id'];
 				}
+				break;
 			}
 		}
+	}
 
 	$r = null;
 
 	if ($profile) {
 		$profile_int = intval($profile);
-		$r = q("SELECT `contact`.`id` AS `contact_id`, `contact`.`photo` AS `contact_photo`,
+		$r = dba::fetch_first("SELECT `contact`.`id` AS `contact_id`, `contact`.`photo` AS `contact_photo`,
 				`contact`.`thumb` AS `contact_thumb`, `contact`.`micro` AS `contact_micro`,
 				`profile`.`uid` AS `profile_uid`, `profile`.*,
 				`contact`.`avatar-date` AS picdate, `contact`.`addr`, `user`.*
 			FROM `profile`
 			INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` AND `contact`.`self`
 			INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
-			WHERE `user`.`nickname` = '%s' AND `profile`.`id` = %d LIMIT 1",
-				dbesc($nickname),
-				intval($profile_int)
+			WHERE `user`.`nickname` = ? AND `profile`.`id` = ? LIMIT 1",
+				$nickname,
+				$profile_int
 		);
 	}
 	if (!dbm::is_result($r)) {
-		$r = q("SELECT `contact`.`id` AS `contact_id`, `contact`.`photo` as `contact_photo`,
+		$r = dba::fetch_first("SELECT `contact`.`id` AS `contact_id`, `contact`.`photo` as `contact_photo`,
 				`contact`.`thumb` AS `contact_thumb`, `contact`.`micro` AS `contact_micro`,
 				`profile`.`uid` AS `profile_uid`, `profile`.*,
 				`contact`.`avatar-date` AS picdate, `contact`.`addr`, `user`.*
 			FROM `profile`
 			INNER JOIN `contact` ON `contact`.`uid` = `profile`.`uid` AND `contact`.`self`
 			INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
-			WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` LIMIT 1",
-				dbesc($nickname)
+			WHERE `user`.`nickname` = ? AND `profile`.`is-default` LIMIT 1",
+				$nickname
 		);
 	}
 
-	return $r[0];
-
+	return $r;
 }
 
 
diff --git a/include/items.php b/include/items.php
index 94401509b4..521298647f 100644
--- a/include/items.php
+++ b/include/items.php
@@ -446,15 +446,6 @@ function store_conversation($arr) {
 			$conversation['source'] = $arr['source'];
 		}
 
-		if (!Lock::set('store_conversation')) {
-			// When using semaphores, this case never can't happen
-			unset($arr['conversation-uri']);
-			unset($arr['conversation-href']);
-			unset($arr['protocol']);
-			unset($arr['source']);
-			return $arr;
-		}
-
 		$old_conv = dba::fetch_first("SELECT `item-uri`, `reply-to-uri`, `conversation-uri`, `conversation-href`, `protocol`, `source`
 				FROM `conversation` WHERE `item-uri` = ?", $conversation['item-uri']);
 		if (dbm::is_result($old_conv)) {
@@ -472,11 +463,10 @@ function store_conversation($arr) {
 				logger('Conversation: update for '.$conversation['item-uri'].' from '.$conv['protocol'].' to '.$conversation['protocol'].' failed', LOGGER_DEBUG);
 			}
 		} else {
-			if (!dba::insert('conversation', $conversation)) {
+			if (!dba::insert('conversation', $conversation, true)) {
 				logger('Conversation: insert for '.$conversation['item-uri'].' (protocol '.$conversation['protocol'].') failed', LOGGER_DEBUG);
 			}
 		}
-		Lock::remove('store_conversation');
 	}
 
 	unset($arr['conversation-uri']);
@@ -966,23 +956,10 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 		}
 	}
 
-	// Store the unescaped version
-	$unescaped = $arr;
-
-	dbm::esc_array($arr, true);
-
 	logger('item_store: ' . print_r($arr,true), LOGGER_DATA);
 
 	dba::transaction();
-
-	$r = dbq("INSERT INTO `item` (`"
-			. implode("`, `", array_keys($arr))
-			. "`) VALUES ("
-			. implode(", ", array_values($arr))
-			. ")");
-
-	// And restore it
-	$arr = $unescaped;
+	$r = dba::insert('item', $arr);
 
 	// When the item was successfully stored we fetch the ID of the item.
 	if (dbm::is_result($r)) {
diff --git a/include/plugin.php b/include/plugin.php
index f5f0bb2b29..60ef6138b9 100644
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -183,20 +183,18 @@ function unregister_hook($hook,$file,$function) {
 }}
 
 
-if (! function_exists('load_hooks')) {
 function load_hooks() {
 	$a = get_app();
 	$a->hooks = array();
-	$r = q("SELECT * FROM `hook` WHERE 1 ORDER BY `priority` DESC, `file`");
+	$r = dba::select('hook', array('hook', 'file', 'function'), array(), array('order' => array('priority' => 'desc', 'file')));
 
-	if (dbm::is_result($r)) {
-		foreach ($r as $rr) {
-			if (! array_key_exists($rr['hook'],$a->hooks))
-				$a->hooks[$rr['hook']] = array();
-			$a->hooks[$rr['hook']][] = array($rr['file'],$rr['function']);
+	while ($rr = dba::fetch($r)) {
+		if (! array_key_exists($rr['hook'],$a->hooks)) {
+			$a->hooks[$rr['hook']] = array();
 		}
+		$a->hooks[$rr['hook']][] = array($rr['file'],$rr['function']);
 	}
-}}
+}
 
 /**
  * @brief Calls a hook.
diff --git a/mod/display.php b/mod/display.php
index 0d347882e2..08b51bab48 100644
--- a/mod/display.php
+++ b/mod/display.php
@@ -423,9 +423,7 @@ function display_content(App $a, $update = 0) {
 					intval($r[0]['parent']));
 
 			if ($unseen) {
-				q("UPDATE `item` SET `unseen` = 0 WHERE `parent` = %d AND `unseen`",
-					intval($r[0]['parent'])
-				);
+				dba::update('item', array('unseen' => false), array('parent' => $r[0]['parent'], 'unseen' => true));
 			}
 		}
 
diff --git a/mod/network.php b/mod/network.php
index aad56bfd67..ebbd56dfbf 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -794,18 +794,12 @@ function network_content(App $a, $update = 0) {
 
 
 	if (!$group && !$cid && !$star) {
-
-		$unseen = q("SELECT `id` FROM `item` WHERE `unseen` AND `uid` = %d LIMIT 1",
-				intval(local_user()));
+		$unseen = dba::select('item', array('id'), array('unseen' => true, 'uid' => local_user()), array('limit' => 1));
 
 		if (dbm::is_result($unseen)) {
-			$r = q("UPDATE `item` SET `unseen` = 0
-				WHERE `unseen` = 1 AND `uid` = %d",
-				intval(local_user())
-			);
+			$r = dba::update('item', array('unseen' => false), array('uid' => local_user(), 'unseen' => true));
 		}
 	} elseif ($update_unseen) {
-
 		$unseen = q("SELECT `id` FROM `item` ".$update_unseen. " LIMIT 1");
 
 		if (dbm::is_result($unseen)) {
diff --git a/src/App.php b/src/App.php
index ec03829933..4cdaa94ccd 100644
--- a/src/App.php
+++ b/src/App.php
@@ -6,6 +6,7 @@ use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 
 use Cache;
+use dba;
 use dbm;
 
 use Detection\MobileDetect;
@@ -712,20 +713,20 @@ class App {
 
 		$this->remove_inactive_processes();
 
-		q('START TRANSACTION');
+		dba::transaction();
 
 		$r = q('SELECT `pid` FROM `process` WHERE `pid` = %d', intval(getmypid()));
 		if (!dbm::is_result($r)) {
 			q("INSERT INTO `process` (`pid`,`command`,`created`) VALUES (%d, '%s', '%s')", intval(getmypid()), dbesc($command), dbesc(datetime_convert()));
 		}
-		q('COMMIT');
+		dba::commit();
 	}
 
 	/**
 	 * @brief Remove inactive processes
 	 */
 	function remove_inactive_processes() {
-		q('START TRANSACTION');
+		dba::transaction();
 
 		$r = q('SELECT `pid` FROM `process`');
 		if (dbm::is_result($r)) {
@@ -735,7 +736,7 @@ class App {
 				}
 			}
 		}
-		q('COMMIT');
+		dba::commit();
 	}
 
 	/**
diff --git a/src/Core/Config.php b/src/Core/Config.php
index 71189bd0eb..0cdccb953a 100644
--- a/src/Core/Config.php
+++ b/src/Core/Config.php
@@ -164,19 +164,11 @@ class Config {
 		$dbvalue = (is_array($value) ? serialize($value) : $dbvalue);
 
 		if (is_null($stored) || !self::$in_db[$family][$key]) {
-			$ret = q("INSERT INTO `config` (`cat`, `k`, `v`) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'",
-				dbesc($family),
-				dbesc($key),
-				dbesc($dbvalue),
-				dbesc($dbvalue)
-			);
+                        dba::insert('config', array('cat' => $family, 'k' => $key, 'v' => $dbvalue), true);
 		} else {
-			$ret = q("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s'",
-				dbesc($dbvalue),
-				dbesc($family),
-				dbesc($key)
-			);
+                        dba::update('config', array('v' => $dbvalue), array('cat' => $family, 'k' => $key), true);
 		}
+
 		if ($ret) {
 			self::$in_db[$family][$key] = true;
 			return $value;
diff --git a/src/Core/PConfig.php b/src/Core/PConfig.php
index ab3d548c07..e5a852e403 100644
--- a/src/Core/PConfig.php
+++ b/src/Core/PConfig.php
@@ -142,20 +142,9 @@ class PConfig {
 		$dbvalue = (is_array($value) ? serialize($value) : $dbvalue);
 
 		if (is_null($stored) || !self::$in_db[$uid][$family][$key]) {
-			$ret = q("INSERT INTO `pconfig` (`uid`, `cat`, `k`, `v`) VALUES (%d, '%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'",
-				intval($uid),
-				dbesc($family),
-				dbesc($key),
-				dbesc($dbvalue),
-				dbesc($dbvalue)
-			);
+			dba::insert('pconfig', array('uid' => $uid, 'cat' => $family, 'k' => $key, 'v' => $dbvalue), true);
 		} else {
-			$ret = q("UPDATE `pconfig` SET `v` = '%s' WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s'",
-				dbesc($dbvalue),
-				intval($uid),
-				dbesc($family),
-				dbesc($key)
-			);
+			dba::update('pconfig', array('v' => $dbvalue), array('uid' => $uid, 'cat' => $family, 'k' => $key), true);
 		}
 
 		if ($ret) {