diff --git a/config/config.sample.php b/config/config.sample.php
index 9f47ee32940aa5d9a6ce1a1af2d2721ea8e52a70..356843200b1e5427a7281b1205f9a039294661d7 100755
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -264,6 +264,9 @@ $CONFIG = array(
 /* whether usage of the instance should be restricted to admin users only */
 'singleuser' => false,
 
+/* all css and js files will be served by the web server statically in one js file and ons css file*/
+'asset-pipeline.enabled' => false,
+
  /* where mount.json file should be stored, defaults to data/mount.json */
  'mount_file' => '',
 );
diff --git a/core/js/tags.js b/core/js/tags.js
index 16dd3d4bf977dfccdb5aa9556fef0b82f8dd5621..bc6d7b4e0710936ea7a560d9ee7dcc8506c99876 100644
--- a/core/js/tags.js
+++ b/core/js/tags.js
@@ -25,11 +25,11 @@ OC.Tags= {
 				});
 				self.deleteButton = {
 					text: t('core', 'Delete'),
-					click: function() {self._deleteTags(self, type, self._selectedIds())},
+					click: function() {self._deleteTags(self, type, self._selectedIds())}
 				};
 				self.addButton = {
 					text: t('core', 'Add'),
-					click: function() {self._addTag(self, type, self.$taginput.val())},
+					click: function() {self._addTag(self, type, self.$taginput.val())}
 				};
 
 				self._fillTagList(type, self.$taglist);
@@ -349,5 +349,5 @@ OC.Tags= {
 			console.warn(response);
 		});
 	}
-}
+};
 
diff --git a/core/minimizer.php b/core/minimizer.php
deleted file mode 100644
index eeeddf86a814be9aa10528daf1b7b64b13b4e3e5..0000000000000000000000000000000000000000
--- a/core/minimizer.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-session_write_close();
-
-OC_App::loadApps();
-
-if ($service == 'core.css') {
-	$minimizer = new OC_Minimizer_CSS();
-	$files = OC_TemplateLayout::findStylesheetFiles(OC_Util::$coreStyles);
-	$minimizer->output($files, $service);
-}
-else if ($service == 'core.js') {
-	$minimizer = new OC_Minimizer_JS();
-	$files = OC_TemplateLayout::findJavascriptFiles(OC_Util::$coreScripts);
-	$minimizer->output($files, $service);
-}
diff --git a/core/routes.php b/core/routes.php
index f8454877e034dbe4b3a44bdac5b912c44cbef0cf..aea788bdc6b1788c0262601c0698dc8534aa4ec7 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -100,9 +100,6 @@ $this->create('core_avatar_post_cropped', '/avatar/cropped')
 	->action('OC\Core\Avatar\Controller', 'postCroppedAvatar');
 
 // Not specifically routed
-$this->create('app_css', '/apps/{app}/{file}')
-	->requirements(array('file' => '.*.css'))
-	->action('OC', 'loadCSSFile');
 $this->create('app_index_script', '/apps/{app}/')
 	->defaults(array('file' => 'index.php'))
 	//->requirements(array('file' => '.*.php'))
diff --git a/lib/base.php b/lib/base.php
index 84177c7ba6c2635afd2d3a6b03c6d19afc006a77..525d290931f42714cc44c6006367c26b7bfca236 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -284,10 +284,6 @@ class OC {
 		if (self::needUpgrade()) {
 			if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
 				OC_Config::setValue('theme', '');
-				$minimizerCSS = new OC_Minimizer_CSS();
-				$minimizerCSS->clearCache();
-				$minimizerJS = new OC_Minimizer_JS();
-				$minimizerJS->clearCache();
 				OC_Util::addScript('config'); // needed for web root
 				OC_Util::addScript('update');
 				$tmpl = new OC_Template('', 'update.admin', 'guest');
@@ -725,11 +721,6 @@ class OC {
 		$app = OC::$REQUESTEDAPP;
 		$file = OC::$REQUESTEDFILE;
 		$param = array('app' => $app, 'file' => $file);
-		// Handle app css files
-		if (substr($file, -3) == 'css') {
-			self::loadCSSFile($param);
-			return;
-		}
 
 		// Handle redirect URL for logged in users
 		if (isset($_REQUEST['redirect_url']) && OC_User::isLoggedIn()) {
@@ -796,19 +787,6 @@ class OC {
 		return false;
 	}
 
-	public static function loadCSSFile($param) {
-		$app = $param['app'];
-		$file = $param['file'];
-		$app_path = OC_App::getAppPath($app);
-		if (file_exists($app_path . '/' . $file)) {
-			$app_web_path = OC_App::getAppWebPath($app);
-			$filepath = $app_web_path . '/' . $file;
-			$minimizer = new OC_Minimizer_CSS();
-			$info = array($app_path, $app_web_path, $file);
-			$minimizer->output(array($info), $filepath);
-		}
-	}
-
 	protected static function handleLogin() {
 		OC_App::loadApps(array('prelogin'));
 		$error = array();
diff --git a/lib/private/app.php b/lib/private/app.php
index 47f983cce35caac6dbe8f4d317335da48c30ddcb..048d4d4aeb1b6519ae08bcb1091f965cb3b84159 100644
--- a/lib/private/app.php
+++ b/lib/private/app.php
@@ -69,17 +69,6 @@ class OC_App{
 		}
 		ob_end_clean();
 
-		if (!defined('DEBUG') || !DEBUG) {
-			if (is_null($types)
-				&& empty(OC_Util::$coreScripts)
-				&& empty(OC_Util::$coreStyles)) {
-				OC_Util::$coreScripts = OC_Util::$scripts;
-				OC_Util::$scripts = array();
-				OC_Util::$coreStyles = OC_Util::$styles;
-				OC_Util::$styles = array();
-			}
-		}
-		// return
 		return true;
 	}
 
diff --git a/lib/private/minimizer.php b/lib/private/minimizer.php
deleted file mode 100644
index db522de74dc162ebf01b86c682b4b552b746c618..0000000000000000000000000000000000000000
--- a/lib/private/minimizer.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-abstract class OC_Minimizer {
-	public function generateETag($files) {
-		$fullpath_files = array();
-		foreach($files as $file_info) {
-			$fullpath_files[] = $file_info[0] . '/' . $file_info[2];
-		}
-		return OC_Cache::generateCacheKeyFromFiles($fullpath_files);
-	}
-
-	abstract public function minimizeFiles($files);
-
-	public function output($files, $cache_key) {
-		header('Content-Type: '.$this->contentType);
-		OC_Response::enableCaching();
-		$etag = $this->generateETag($files);
-		$cache_key .= '-'.$etag;
-
-		$gzout = false;
-		$cache = OC_Cache::getGlobalCache();
-		if (!OC_Request::isNoCache() && (!defined('DEBUG') || !DEBUG)) {
-			OC_Response::setETagHeader($etag);
-			$gzout = $cache->get($cache_key.'.gz');
-		}
-
-		if (!$gzout) {
-			$out = $this->minimizeFiles($files);
-			$gzout = gzencode($out);
-			$cache->set($cache_key.'.gz', $gzout);
-			OC_Response::setETagHeader($etag);
-		}
-		// on some systems (e.g. SLES 11, but not Ubuntu) mod_deflate and zlib compression will compress the output twice.
-		// This results in broken core.css and  core.js. To avoid it, we switch off zlib compression.
-		// Since mod_deflate is still active, Apache will compress what needs to be compressed, i.e. no disadvantage.
-		if(function_exists('apache_get_modules') && ini_get('zlib.output_compression') && in_array('mod_deflate', apache_get_modules())) {
-			ini_set('zlib.output_compression', 'Off');
-		}
-		if ($encoding = OC_Request::acceptGZip()) {
-			header('Content-Encoding: '.$encoding);
-			$out = $gzout;
-		} else {
-			$out = gzdecode($gzout);
-		}
-		header('Content-Length: '.strlen($out));
-		echo $out;
-	}
-
-	public function clearCache() {
-		$cache = OC_Cache::getGlobalCache();
-		$cache->clear('core.css');
-		$cache->clear('core.js');
-	}
-}
-
-if (!function_exists('gzdecode')) {
-	function gzdecode($data, $maxlength=null, &$filename='', &$error='')
-	{
-		if (strcmp(substr($data, 0, 9),"\x1f\x8b\x8\0\0\0\0\0\0")) {
-			return null;  // Not the GZIP format we expect (See RFC 1952)
-		}
-		return gzinflate(substr($data, 10, -8));
-	}
-}
diff --git a/lib/private/minimizer/css.php b/lib/private/minimizer/css.php
deleted file mode 100644
index 8d130572e2b4c114492f8712dc7ae4f569569e86..0000000000000000000000000000000000000000
--- a/lib/private/minimizer/css.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-require_once 'mediawiki/CSSMin.php';
-
-class OC_Minimizer_CSS extends OC_Minimizer
-{
-	protected $contentType = 'text/css';
-
-	public function minimizeFiles($files) {
-		$css_out = '';
-		$webroot = (string) OC::$WEBROOT;
-		foreach($files as $file_info) {
-			$file = $file_info[0] . '/' . $file_info[2];
-			$css_out .= '/* ' . $file . ' */' . "\n";
-			$css = file_get_contents($file);
-
-			$in_root = false;
-			foreach(OC::$APPSROOTS as $app_root) {
-				if(strpos($file, $app_root['path'].'/') === 0) {
-					$in_root = rtrim($webroot.$app_root['url'], '/');
-					break;
-				}
-			}
-			if ($in_root !== false) {
-				$css = str_replace('%appswebroot%', $in_root, $css);
-				$css = str_replace('%webroot%', $webroot, $css);
-			}
-			$remote = $file_info[1];
-			$remote .= '/';
-			$remote .= dirname($file_info[2]);
-			$css_out .= CSSMin::remap($css, dirname($file), $remote, true);
-		}
-		if (!defined('DEBUG') || !DEBUG) {
-			$css_out = CSSMin::minify($css_out);
-		}
-		return $css_out;
-	}
-}
diff --git a/lib/private/minimizer/js.php b/lib/private/minimizer/js.php
deleted file mode 100644
index bd2d836deb084b4466c2de36f49723159216d4ce..0000000000000000000000000000000000000000
--- a/lib/private/minimizer/js.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-require_once 'mediawiki/JavaScriptMinifier.php';
-
-class OC_Minimizer_JS extends OC_Minimizer
-{
-	protected $contentType = 'application/javascript';
-
-	public function minimizeFiles($files) {
-		$js_out = '';
-		foreach($files as $file_info) {
-			$file = $file_info[0] . '/' . $file_info[2];
-			$js_out .= '/* ' . $file . ' */' . "\n";
-			$js_out .= file_get_contents($file);
-		}
-		if (!defined('DEBUG') || !DEBUG) {
-			$js_out = JavaScriptMinifier::minify($js_out);
-		}
-		return $js_out;
-	}
-}
diff --git a/lib/private/request.php b/lib/private/request.php
index 0fd20b3cc1fb7f302cb8a8c71c2c7ec9dc69c616..d0128f95d96ae43352371119f2d9eb8df469cab9 100755
--- a/lib/private/request.php
+++ b/lib/private/request.php
@@ -179,33 +179,6 @@ class OC_Request {
 		}
 	}
 
-	/**
-	 * @brief Check if this is a no-cache request
-	 * @return boolean true for no-cache
-	 */
-	static public function isNoCache() {
-		if (!isset($_SERVER['HTTP_CACHE_CONTROL'])) {
-			return false;
-		}
-		return $_SERVER['HTTP_CACHE_CONTROL'] == 'no-cache';
-	}
-
-	/**
-	 * @brief Check if the requestor understands gzip
-	 * @return false|string true for gzip encoding supported
-	 */
-	static public function acceptGZip() {
-		if (!isset($_SERVER['HTTP_ACCEPT_ENCODING'])) {
-			return false;
-		}
-		$HTTP_ACCEPT_ENCODING = $_SERVER["HTTP_ACCEPT_ENCODING"];
-		if( strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false )
-			return 'x-gzip';
-		else if( strpos($HTTP_ACCEPT_ENCODING, 'gzip') !== false )
-			return 'gzip';
-		return false;
-	}
-
 	/**
 	 * @brief Check if the requester sent along an mtime
 	 * @return false or an mtime
diff --git a/lib/private/setup.php b/lib/private/setup.php
index 17ef75bc7b539f6d3363fd3cec21e0d9657fc151..7bf75be016519725594cdafc033c8f697843dd58 100644
--- a/lib/private/setup.php
+++ b/lib/private/setup.php
@@ -97,8 +97,6 @@ class OC_Setup {
 			$appConfig = \OC::$server->getAppConfig();
 			$appConfig->setValue('core', 'installedat', microtime(true));
 			$appConfig->setValue('core', 'lastupdatedat', microtime(true));
-			$appConfig->setValue('core', 'remote_core.css', '/core/minimizer.php');
-			$appConfig->setValue('core', 'remote_core.js', '/core/minimizer.php');
 
 			OC_Group::createGroup('admin');
 			OC_Group::addToGroup($username, 'admin');
diff --git a/lib/private/template/cssresourcelocator.php b/lib/private/template/cssresourcelocator.php
index 8e7831ca549fa615d87cbb4176d27a813d058d55..e26daa258278aa9dfb3a43035cced0363ca20cfd 100644
--- a/lib/private/template/cssresourcelocator.php
+++ b/lib/private/template/cssresourcelocator.php
@@ -22,7 +22,7 @@ class CSSResourceLocator extends ResourceLocator {
 		$app = substr($style, 0, strpos($style, '/'));
 		$style = substr($style, strpos($style, '/')+1);
 		$app_path = \OC_App::getAppPath($app);
-		$app_url = $this->webroot . '/index.php/apps/' . $app;
+		$app_url = \OC_App::getAppWebPath($app);
 		if ($this->appendIfExist($app_path, $style.$this->form_factor.'.css', $app_url)
 			|| $this->appendIfExist($app_path, $style.'.css', $app_url)
 		) {
diff --git a/lib/private/templatelayout.php b/lib/private/templatelayout.php
index 7bca5bc4836a47f93af2538591dc2f1dda97d51a..af17adb11c6864085551c6ecc98b37eae5012d7a 100644
--- a/lib/private/templatelayout.php
+++ b/lib/private/templatelayout.php
@@ -1,4 +1,11 @@
 <?php
+use Assetic\Asset\AssetCollection;
+use Assetic\Asset\FileAsset;
+use Assetic\Asset\GlobAsset;
+use Assetic\AssetManager;
+use Assetic\AssetWriter;
+use Assetic\Filter\CssRewriteFilter;
+
 /**
  * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
  * This file is licensed under the Affero General Public License version 3 or
@@ -57,35 +64,38 @@ class OC_TemplateLayout extends OC_Template {
 		} else {
 			parent::__construct('core', 'layout.base');
 		}
+
 		$versionParameter = '?v=' . md5(implode(OC_Util::getVersion()));
-		// Add the js files
-		$jsfiles = self::findJavascriptFiles(OC_Util::$scripts);
-		$this->assign('jsfiles', array(), false);
-		if (OC_Config::getValue('installed', false) && $renderas!='error') {
+		$useAssetPipeline = OC_Config::getValue('asset-pipeline.enabled', false);
+		if ($useAssetPipeline) {
+
 			$this->append( 'jsfiles', OC_Helper::linkToRoute('js_config') . $versionParameter);
-		}
-		if (!empty(OC_Util::$coreScripts)) {
-			$this->append( 'jsfiles', OC_Helper::linkToRemoteBase('core.js', false) . $versionParameter);
-		}
-		foreach($jsfiles as $info) {
-			$root = $info[0];
-			$web = $info[1];
-			$file = $info[2];
-			$this->append( 'jsfiles', $web.'/'.$file . $versionParameter);
-		}
 
-		// Add the css files
-		$cssfiles = self::findStylesheetFiles(OC_Util::$styles);
-		$this->assign('cssfiles', array());
-		if (!empty(OC_Util::$coreStyles)) {
-			$this->append( 'cssfiles', OC_Helper::linkToRemoteBase('core.css', false) . $versionParameter);
-		}
-		foreach($cssfiles as $info) {
-			$root = $info[0];
-			$web = $info[1];
-			$file = $info[2];
+			$this->generateAssets();
 
-			$this->append( 'cssfiles', $web.'/'.$file . $versionParameter);
+		} else {
+
+			// Add the js files
+			$jsfiles = self::findJavascriptFiles(OC_Util::$scripts);
+			$this->assign('jsfiles', array(), false);
+			if (OC_Config::getValue('installed', false) && $renderas!='error') {
+				$this->append( 'jsfiles', OC_Helper::linkToRoute('js_config') . $versionParameter);
+			}
+			foreach($jsfiles as $info) {
+				$web = $info[1];
+				$file = $info[2];
+				$this->append( 'jsfiles', $web.'/'.$file . $versionParameter);
+			}
+
+			// Add the css files
+			$cssfiles = self::findStylesheetFiles(OC_Util::$styles);
+			$this->assign('cssfiles', array());
+			foreach($cssfiles as $info) {
+				$web = $info[1];
+				$file = $info[2];
+
+				$this->append( 'cssfiles', $web.'/'.$file . $versionParameter);
+			}
 		}
 	}
 
@@ -116,4 +126,57 @@ class OC_TemplateLayout extends OC_Template {
 		$locator->find($scripts);
 		return $locator->getResources();
 	}
+
+	public function generateAssets()
+	{
+		$jsFiles = self::findJavascriptFiles(OC_Util::$scripts);
+		$jsHash = self::hashScriptNames($jsFiles);
+
+		if (!file_exists("assets/$jsHash.js")) {
+			$jsFiles = array_map(function ($item) {
+				$root = $item[0];
+				$file = $item[2];
+				return new FileAsset($root . '/' . $file, array(), $root, $file);
+			}, $jsFiles);
+			$jsCollection = new AssetCollection($jsFiles);
+			$jsCollection->setTargetPath("assets/$jsHash.js");
+
+			$writer = new AssetWriter(\OC::$SERVERROOT);
+			$writer->writeAsset($jsCollection);
+		}
+
+		$cssFiles = self::findStylesheetFiles(OC_Util::$styles);
+		$cssHash = self::hashScriptNames($cssFiles);
+
+		if (!file_exists("assets/$cssHash.css")) {
+			$cssFiles = array_map(function ($item) {
+				$root = $item[0];
+				$file = $item[2];
+				$assetPath = $root . '/' . $file;
+				$sourceRoot =  \OC::$SERVERROOT;
+				$sourcePath = substr($assetPath, strlen(\OC::$SERVERROOT));
+				return new FileAsset($assetPath, array(new CssRewriteFilter()), $sourceRoot, $sourcePath);
+			}, $cssFiles);
+			$cssCollection = new AssetCollection($cssFiles);
+			$cssCollection->setTargetPath("assets/$cssHash.css");
+
+			$writer = new AssetWriter(\OC::$SERVERROOT);
+			$writer->writeAsset($cssCollection);
+		}
+
+		$this->append('jsfiles', OC_Helper::linkTo('assets', "$jsHash.js"));
+		$this->append('cssfiles', OC_Helper::linkTo('assets', "$cssHash.css"));
+	}
+
+	private static function hashScriptNames($files)
+	{
+		$files = array_map(function ($item) {
+			$root = $item[0];
+			$file = $item[2];
+			return $root . '/' . $file;
+		}, $files);
+
+		sort($files);
+		return hash('md5', implode('', $files));
+	}
 }
diff --git a/lib/private/util.php b/lib/private/util.php
index d3b682daa5c2c83dca20cad5e6f6ff5b37117ea8..920161949ae417752a013ed20a157cc910e47704 100755
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -11,8 +11,6 @@ class OC_Util {
 	public static $headers=array();
 	private static $rootMounted=false;
 	private static $fsSetup=false;
-	public static $coreStyles=array();
-	public static $coreScripts=array();
 
 	/**
 	 * @brief Can be set up