diff --git a/lib/app.php b/lib/app.php
index 55b4543ec9f874b0085a9118eb7334748c1f06c0..c6f6e92e60e255d67ece010cf26e432788f70da2 100644
--- a/lib/app.php
+++ b/lib/app.php
@@ -172,9 +172,17 @@ class OC_App{
 			return array();
 		}
 		$apps=array('files');
-		$query = OC_DB::prepare( 'SELECT `appid` FROM `*PREFIX*appconfig`'
-			.' WHERE `configkey` = \'enabled\' AND `configvalue`=\'yes\'' );
+		$sql = 'SELECT `appid` FROM `*PREFIX*appconfig`'
+			.' WHERE `configkey` = \'enabled\' AND `configvalue`=\'yes\'';
+		if (OC_Config::getValue( 'dbtype', 'sqlite' ) === 'oci') { //FIXME oracle hack
+			$sql = 'SELECT `appid` FROM `*PREFIX*appconfig`'
+			.' WHERE `configkey` = \'enabled\' AND to_char(`configvalue`)=\'yes\'';
+		}
+		$query = OC_DB::prepare( $sql );
 		$result=$query->execute();
+		if( \OC_DB::isError($result)) {
+			throw new DatabaseException($result->getMessage(), $query);
+		}
 		while($row=$result->fetchRow()) {
 			if(array_search($row['appid'], $apps)===false) {
 				$apps[]=$row['appid'];
diff --git a/lib/db.php b/lib/db.php
index 8f6f50bda6e3c51738586b55e4f6512d48a164c2..618365518331c20798c805352eb92c0e4e1a9801 100644
--- a/lib/db.php
+++ b/lib/db.php
@@ -273,18 +273,13 @@ class OC_DB {
 					break;
 				case 'oci':
 					$dsn = array(
-							'phptype'  => 'oci8',
-							'username' => $user,
-							'password' => $pass,
-							'charset' => 'AL32UTF8',
+						'phptype'  => 'oci8',
+						'username' => $user,
+						'password' => $pass,
+						'service'  => $name,
+						'hostspec' => $host,
+						'charset' => 'AL32UTF8',
 					);
-					if ($host != '') {
-						$dsn['hostspec'] = $host;
-						$dsn['database'] = $name;
-					} else { // use dbname for hostspec
-						$dsn['hostspec'] = $name;
-						$dsn['database'] = $user;
-					}
 					break;
 				case 'mssql':
 					$dsn = array(
diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php
index 0617471079b789fe53cfdfa380c70ac8b4a73ea8..3341fe50525991fbb9f7af757407c1edee4ff629 100644
--- a/lib/files/cache/cache.php
+++ b/lib/files/cache/cache.php
@@ -145,8 +145,11 @@ class Cache {
 		if ($fileId > -1) {
 			$query = \OC_DB::prepare(
 				'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `storage_mtime`, `encrypted`, `etag`
-			 	 FROM `*PREFIX*filecache` WHERE parent = ? ORDER BY `name` ASC');
+				 FROM `*PREFIX*filecache` WHERE `parent` = ? ORDER BY `name` ASC');
 			$result = $query->execute(array($fileId));
+			if (\OC_DB::isError($result)) {
+				\OCP\Util::writeLog('cache', 'getFolderContents failed: ' . $result->getMessage(), \OCP\Util::ERROR);
+			}
 			$files = $result->fetchAll();
 			foreach ($files as &$file) {
 				$file['mimetype'] = $this->getMimetype($file['mimetype']);
@@ -201,7 +204,7 @@ class Cache {
 				. ' VALUES(' . implode(', ', $valuesPlaceholder) . ')');
 			$result = $query->execute($params);
 			if (\OC_DB::isError($result)) {
-				\OCP\Util::writeLog('cache', 'Insert to cache failed: ' . $result, \OCP\Util::ERROR);
+				\OCP\Util::writeLog('cache', 'Insert to cache failed: ' . $result->getMessage(), \OCP\Util::ERROR);
 			}
 
 			return (int)\OC_DB::insertid('*PREFIX*filecache');
@@ -372,6 +375,9 @@ class Cache {
 		$pathHash = md5($file);
 		$query = \OC_DB::prepare('SELECT `size` FROM `*PREFIX*filecache` WHERE `storage` = ? AND `path_hash` = ?');
 		$result = $query->execute(array($this->getNumericStorageId(), $pathHash));
+		if( \OC_DB::isError($result)) {
+			\OCP\Util::writeLog('cache', 'get status failed: ' . $result->getMessage(), \OCP\Util::ERROR);
+		}
 		if ($row = $result->fetchRow()) {
 			if ((int)$row['size'] === -1) {
 				return self::SHALLOW;
@@ -509,8 +515,11 @@ class Cache {
 	 */
 	public function getIncomplete() {
 		$query = \OC_DB::prepare('SELECT `path` FROM `*PREFIX*filecache`'
-			. ' WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC LIMIT 1');
+			. ' WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC',1);
 		$result = $query->execute(array($this->getNumericStorageId()));
+		if (\OC_DB::isError($result)) {
+			\OCP\Util::writeLog('cache', 'getIncomplete failed: ' . $result->getMessage(), \OCP\Util::ERROR);
+		}
 		if ($row = $result->fetchRow()) {
 			return $row['path'];
 		} else {
diff --git a/lib/setup.php b/lib/setup.php
index f1ac6b8b2b81c610d4135427d7cdccbfaec93d45..a63cc664dbcabebb7ed0ec3fb18e4e3956228700 100644
--- a/lib/setup.php
+++ b/lib/setup.php
@@ -152,8 +152,12 @@ class OC_Setup {
 					self::setupOCIDatabase($dbhost, $dbuser, $dbpass, $dbname, $dbtableprefix, $dbtablespace, $username);
 				} catch (Exception $e) {
 					$error[] = array(
-						'error' => $l->t('Oracle username and/or password not valid'),
-						'hint' => $l->t('You need to enter either an existing account or the administrator.')
+						'error' => $l->t('Oracle connection could not be established'),
+						'hint' => $e->getMessage().' Check environment: ORACLE_HOME='.getenv('ORACLE_HOME')
+							.' ORACLE_SID='.getenv('ORACLE_SID')
+							.' LD_LIBRARY_PATH='.getenv('LD_LIBRARY_PATH')
+							.' NLS_LANG='.getenv('NLS_LANG')
+							.' tnsnames.ora is '.(is_readable(getenv('ORACLE_HOME').'/network/admin/tnsnames.ora')?'':'not ').'readable'
 					);
 					return $error;
 				}
@@ -452,9 +456,13 @@ class OC_Setup {
 		} else {
 			$easy_connect_string = '//'.$e_host.'/'.$e_dbname;
 		}
+		\OC_Log::write('setup oracle', 'connect string: ' . $easy_connect_string, \OC_Log::DEBUG);
 		$connection = @oci_connect($dbuser, $dbpass, $easy_connect_string);
 		if(!$connection) {
 			$e = oci_error();
+			if (is_array ($e) && isset ($e['message'])) {
+				throw new Exception($e['message']);
+			}
 			throw new Exception($l->t('Oracle username and/or password not valid'));
 		}
 		//check for roles creation rights in oracle
diff --git a/lib/user.php b/lib/user.php
index b607874afafc2b699effc31d545fca28a2822f98..32b91c35efcd36f870342175173af69f349bb89d 100644
--- a/lib/user.php
+++ b/lib/user.php
@@ -610,6 +610,10 @@ class OC_User {
 	public static function isEnabled($userid) {
 		$sql = 'SELECT `userid` FROM `*PREFIX*preferences`'
 			.' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? AND `configvalue` = ?';
+		if (OC_Config::getValue( 'dbtype', 'sqlite' ) === 'oci') { //FIXME oracle hack
+			$sql = 'SELECT `userid` FROM `*PREFIX*preferences`'
+				.' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? AND to_char(`configvalue`) = ?';
+		}
 		$stmt = OC_DB::prepare($sql);
 		if ( ! OC_DB::isError($stmt) ) {
 			$result = $stmt->execute(array($userid, 'core', 'enabled', 'false'));
diff --git a/lib/user/database.php b/lib/user/database.php
index 63c64ed43d393157ff2abb6635d3bdc5b2b26f03..d70b620f2abf055d9fd102fd36930bdce474f16f 100644
--- a/lib/user/database.php
+++ b/lib/user/database.php
@@ -136,7 +136,7 @@ class OC_User_Database extends OC_User_Backend {
 	 */
 	public function getDisplayName($uid) {
 		if( $this->userExists($uid) ) {
-			$query = OC_DB::prepare( 'SELECT displayname FROM `*PREFIX*users` WHERE `uid` = ?' );
+			$query = OC_DB::prepare( 'SELECT `displayname` FROM `*PREFIX*users` WHERE `uid` = ?' );
 			$result = $query->execute( array( $uid ))->fetchAll();
 			$displayName = trim($result[0]['displayname'], ' ');
 			if ( !empty($displayName) ) {
diff --git a/lib/util.php b/lib/util.php
index 48c224a3034b27c4ec84c23d64df495850a8b2f5..01e2df7bfc41539567d6608b69c83746a96b2c9d 100755
--- a/lib/util.php
+++ b/lib/util.php
@@ -173,7 +173,8 @@ class OC_Util {
 		//check for database drivers
 		if(!(is_callable('sqlite_open') or class_exists('SQLite3'))
 			and !is_callable('mysql_connect')
-			and !is_callable('pg_connect')) {
+			and !is_callable('pg_connect')
+			and !is_callable('oci_connect')) {
 			$errors[]=array('error'=>'No database drivers (sqlite, mysql, or postgresql) installed.',
 				'hint'=>'');//TODO: sane hint
 			$web_server_restart= true;