diff --git a/lib/base.php b/lib/base.php
index 53aa7b09fd5b7c847596470057623cc6a4506bec..1ff462819db4b5a1901cff0aeb213be6748f8bda 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -124,10 +124,9 @@ class OC {
 			OC::$THIRDPARTYWEBROOT = rtrim(dirname(OC::$WEBROOT), '/');
 			OC::$THIRDPARTYROOT = rtrim(dirname(OC::$SERVERROOT), '/');
 		} else {
-			echo('3rdparty directory not found! Please put the ownCloud 3rdparty'
+			throw new Exception('3rdparty directory not found! Please put the ownCloud 3rdparty'
 				.' folder in the ownCloud folder or the folder above.'
 				.' You can also configure the location in the config.php file.');
-			exit;
 		}
 		// search the apps folder
 		$config_paths = OC_Config::getValue('apps_paths', array());
@@ -150,9 +149,8 @@ class OC {
 		}
 
 		if (empty(OC::$APPSROOTS)) {
-			echo('apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
+			throw new Exception('apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
 				.' or the folder above. You can also configure the location in the config.php file.');
-			exit;
 		}
 		$paths = array();
 		foreach (OC::$APPSROOTS as $path) {
@@ -174,14 +172,11 @@ class OC {
 		if (file_exists(OC::$SERVERROOT . "/config/config.php")
 			and !is_writable(OC::$SERVERROOT . "/config/config.php")) {
 			$defaults = new OC_Defaults();
-			$tmpl = new OC_Template('', 'error', 'guest');
-			$tmpl->assign('errors', array(1 => array(
-				'error' => "Can't write into config directory 'config'",
-				'hint' => 'This can usually be fixed by '
+			OC_Template::printErrorPage(
+				"Can't write into config directory 'config'",
+				'This can usually be fixed by '
 					.'<a href="' . $defaults->getDocBaseUrl() . '/server/5.0/admin_manual/installation/installation_source.html#set-the-directory-permissions" target="_blank">giving the webserver write access to the config directory</a>.'
-			)));
-			$tmpl->printPage();
-			exit();
+			);
 		}
 	}
 
@@ -223,10 +218,7 @@ class OC {
 			header('Retry-After: 120');
 
 			// render error page
-			$tmpl = new OC_Template('', 'error', 'guest');
-			$tmpl->assign('errors', array(1 => array('error' => 'ownCloud is in maintenance mode')));
-			$tmpl->printPage();
-			exit();
+			OC_Template::printErrorPage('ownCloud is in maintenance mode');
 		}
 	}
 
@@ -305,11 +297,7 @@ class OC {
 			$error = 'Session could not be initialized. Please contact your ';
 			$error .= 'system administrator';
 
-			$tmpl = new OC_Template('', 'error', 'guest');
-			$tmpl->assign('errors', array(1 => array('error' => $error)));
-			$tmpl->printPage();
-
-			exit();
+			OC_Template::printErrorPage($error);
 		}
 
 		$sessionLifeTime = self::getSessionLifeTime();
@@ -370,6 +358,7 @@ class OC {
 		self::$loader->registerPrefix('Symfony\\Component\\Routing', 'symfony/routing');
 		self::$loader->registerPrefix('Sabre\\VObject', '3rdparty');
 		self::$loader->registerPrefix('Sabre_', '3rdparty');
+		self::$loader->registerPrefix('Patchwork', '3rdparty');
 		spl_autoload_register(array(self::$loader, 'load'));
 
 		// set some stuff
diff --git a/lib/template.php b/lib/template.php
index 08df168afc604300382d856b46574576c514ccd5..d48e3b36821c4ea67b7f83eff37b5f0a342df288 100644
--- a/lib/template.php
+++ b/lib/template.php
@@ -163,7 +163,7 @@ class OC_Template{
 		$this->renderas = $renderas;
 		$this->application = $app;
 		$this->vars = array();
-		$this->vars['requesttoken'] = OC_Util::callRegister();
+		$this->vars['requesttoken'] = OC::$session ? OC_Util::callRegister() : '';
 		$parts = explode('/', $app); // fix translation when app is something like core/lostpassword
 		$this->l10n = OC_L10N::get($parts[0]);
 
@@ -225,6 +225,9 @@ class OC_Template{
 	 */
 	static public function getFormFactorExtension()
 	{
+		if (!\OC::$session) {
+			return '';
+		}
 		// if the formfactor is not yet autodetected do the
 		// autodetection now. For possible formfactors check the
 		// detectFormfactor documentation
@@ -529,6 +532,9 @@ class OC_Template{
 			$error_msg = '['.$exception->getCode().'] '.$error_msg;
 		}
 		$hint = $exception->getTraceAsString();
+		if (!empty($hint)) {
+			$hint = '<pre>'.$hint.'</pre>';
+		}
 		while (method_exists($exception,'previous') && $exception = $exception->previous()) {
 			$error_msg .= '<br/>Caused by: ';
 			if ($exception->getCode()) {
diff --git a/lib/user.php b/lib/user.php
index 830f13bb8df6900304eb60d042d410ac844b54ef..d93ab1a5f73802ec650bd4dc04a497061632a610 100644
--- a/lib/user.php
+++ b/lib/user.php
@@ -316,7 +316,7 @@ class OC_User {
 	 * @return string uid or false
 	 */
 	public static function getUser() {
-		$uid = OC::$session->get('user_id');
+		$uid = OC::$session ? OC::$session->get('user_id') : null;
 		if (!is_null($uid)) {
 			return $uid;
 		} else {
diff --git a/lib/util.php b/lib/util.php
index 981b05b2b46130a60318203705059da1c9e5fc88..2586ad28320eaefc06174fd41ba8bba3b58d34bc 100755
--- a/lib/util.php
+++ b/lib/util.php
@@ -1,7 +1,5 @@
 <?php
 
-require_once 'Patchwork/PHP/Shim/Normalizer.php';
-
 /**
  * Class for utility functions
  *