diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php
index d4b4ed6fb6ae3b096d50786bd951ca8155d9f2b6..421db5668668d14dc0401d79f59363b830659aef 100644
--- a/lib/private/allconfig.php
+++ b/lib/private/allconfig.php
@@ -69,6 +69,16 @@ class AllConfig implements \OCP\IConfig {
 		}
 	}
 
+	/**
+	 * Sets and deletes system wide values
+	 *
+	 * @param array $configs Associative array with `key => value` pairs
+	 *                       If value is null, the config key will be deleted
+	 */
+	public function setSystemValues(array $configs) {
+		$this->systemConfig->setValues($configs);
+	}
+
 	/**
 	 * Sets a new system wide value
 	 *
diff --git a/lib/private/config.php b/lib/private/config.php
index 8544de34b720b904cd0ad1b165361ad1cd41ff62..586e8c20587d86679a6741bb1824533d6bb20353 100644
--- a/lib/private/config.php
+++ b/lib/private/config.php
@@ -41,10 +41,10 @@ class Config {
 
 	/**
 	 * Lists all available config keys
-	 * @return array an array of key names
 	 *
-	 * This function returns all keys saved in config.php. Please note that it
-	 * does not return the values.
+	 * Please note that it does not return the values.
+	 *
+	 * @return array an array of key names
 	 */
 	public function getKeys() {
 		return array_keys($this->cache);
@@ -52,12 +52,12 @@ class Config {
 
 	/**
 	 * Gets a value from config.php
+	 *
+	 * If it does not exist, $default will be returned.
+	 *
 	 * @param string $key key
 	 * @param mixed $default = null default value
 	 * @return mixed the value or $default
-	 *
-	 * This function gets the value from config.php. If it does not exist,
-	 * $default will be returned.
 	 */
 	public function getValue($key, $default = null) {
 		if (isset($this->cache[$key])) {
@@ -68,36 +68,81 @@ class Config {
 	}
 
 	/**
-	 * Sets a value
-	 * @param string $key key
-	 * @param mixed $value value
-	 *
-	 * This function sets the value and writes the config.php.
+	 * Sets and deletes values and writes the config.php
 	 *
+	 * @param array $configs Associative array with `key => value` pairs
+	 *                       If value is null, the config key will be deleted
 	 */
-	public function setValue($key, $value) {
-		// Add change
-		$this->cache[$key] = $value;
+	public function setValues(array $configs) {
+		$needsUpdate = false;
+		foreach ($configs as $key => $value) {
+			if ($value !== null) {
+				$needsUpdate |= $this->set($key, $value);
+			} else {
+				$needsUpdate |= $this->delete($key);
+			}
+		}
 
-		// Write changes
-		$this->writeData();
+		if ($needsUpdate) {
+			// Write changes
+			$this->writeData();
+		}
 	}
 
 	/**
-	 * Removes a key from the config
-	 * @param string $key key
+	 * Sets the value and writes it to config.php if required
 	 *
-	 * This function removes a key from the config.php.
+	 * @param string $key key
+	 * @param mixed $value value
+	 */
+	public function setValue($key, $value) {
+		if ($this->set($key, $value)) {
+			// Write changes
+			$this->writeData();
+		}
+	}
+
+	/**
+	 * This function sets the value
 	 *
+	 * @param string $key key
+	 * @param mixed $value value
+	 * @return bool True if the file needs to be updated, false otherwise
+	 */
+	protected function set($key, $value) {
+		if (!isset($this->cache[$key]) || $this->cache[$key] !== $value) {
+			// Add change
+			$this->cache[$key] = $value;
+			return true;
+		}
+
+		return false;
+	}
+
+	/**
+	 * Removes a key from the config and removes it from config.php if required
+	 * @param string $key
 	 */
 	public function deleteKey($key) {
+		if ($this->delete($key)) {
+			// Write changes
+			$this->writeData();
+		}
+	}
+
+	/**
+	 * This function removes a key from the config
+	 *
+	 * @param string $key
+	 * @return bool True if the file needs to be updated, false otherwise
+	 */
+	protected function delete($key) {
 		if (isset($this->cache[$key])) {
 			// Delete key from cache
 			unset($this->cache[$key]);
-
-			// Write changes
-			$this->writeData();
+			return true;
 		}
+		return false;
 	}
 
 	/**
diff --git a/lib/private/legacy/config.php b/lib/private/legacy/config.php
index 7b7112042563539610ea0bcb1a5c0e9a118feaf6..64d01434b1158aaa187321dd89cde24b225e0840 100644
--- a/lib/private/legacy/config.php
+++ b/lib/private/legacy/config.php
@@ -58,6 +58,16 @@ class OC_Config {
 		self::$object->setValue($key, $value);
 	}
 
+	/**
+	 * Sets and deletes values and writes the config.php
+	 *
+	 * @param array $configs Associative array with `key => value` pairs
+	 *                       If value is null, the config key will be deleted
+	 */
+	public static function setValues(array $configs) {
+		self::$object->setValues($configs);
+	}
+
 	/**
 	 * Removes a key from the config
 	 * @param string $key key
diff --git a/lib/private/systemconfig.php b/lib/private/systemconfig.php
index ce6883e5ab3e824e8c167e4a99f1a862148163f6..36cefdb849937e46f52c9c17daecbba8d5635a77 100644
--- a/lib/private/systemconfig.php
+++ b/lib/private/systemconfig.php
@@ -27,6 +27,16 @@ class SystemConfig {
 		\OC_Config::setValue($key, $value);
 	}
 
+	/**
+	 * Sets and deletes values and writes the config.php
+	 *
+	 * @param array $configs Associative array with `key => value` pairs
+	 *                       If value is null, the config key will be deleted
+	 */
+	public function setValues(array $configs) {
+		\OC_Config::setValues($configs);
+	}
+
 	/**
 	 * Looks up a system wide defined value
 	 *
diff --git a/lib/public/iconfig.php b/lib/public/iconfig.php
index a1952ef8f84eb497d7760f49f753efc0a2986186..868a4133d2e39de76392c6732dca8c2341605c80 100644
--- a/lib/public/iconfig.php
+++ b/lib/public/iconfig.php
@@ -34,6 +34,14 @@ namespace OCP;
  * Access to all the configuration options ownCloud offers
  */
 interface IConfig {
+	/**
+	 * Sets and deletes system wide values
+	 *
+	 * @param array $configs Associative array with `key => value` pairs
+	 *                       If value is null, the config key will be deleted
+	 */
+	public function setSystemValues(array $configs);
+
 	/**
 	 * Sets a new system wide value
 	 *
diff --git a/tests/lib/config.php b/tests/lib/config.php
index 6adba356a1c7cf12864f9061e6ded0fb5dfd1577..91154579ab59f7bf15dd475b3a934219d27eda49 100644
--- a/tests/lib/config.php
+++ b/tests/lib/config.php
@@ -71,6 +71,36 @@ class Test_Config extends \Test\TestCase {
 		$this->assertEquals($expected, $content);
 	}
 
+	public function testSetValues() {
+		$content = file_get_contents($this->configFile);
+		$this->assertEquals(self::TESTCONTENT, $content);
+
+		// Changing configs to existing values and deleting non-existing once
+		// should not rewrite the config.php
+		$this->config->setValues([
+			'foo'			=> 'bar',
+			'not_exists'	=> null,
+		]);
+
+		$this->assertAttributeEquals($this->initialConfig, 'cache', $this->config);
+		$content = file_get_contents($this->configFile);
+		$this->assertEquals(self::TESTCONTENT, $content);
+
+		$this->config->setValues([
+			'foo'			=> 'moo',
+			'alcohol_free'	=> null,
+		]);
+		$expectedConfig = $this->initialConfig;
+		$expectedConfig['foo'] = 'moo';
+		unset($expectedConfig['alcohol_free']);
+		$this->assertAttributeEquals($expectedConfig, 'cache', $this->config);
+
+		$content = file_get_contents($this->configFile);
+		$expected = "<?php\n\$CONFIG = array (\n  'foo' => 'moo',\n  'beers' => \n  array (\n    0 => 'Appenzeller',\n  " .
+			"  1 => 'Guinness',\n    2 => 'Kölsch',\n  ),\n);\n";
+		$this->assertEquals($expected, $content);
+	}
+
 	public function testDeleteKey() {
 		$this->config->deleteKey('foo');
 		$expectedConfig = $this->initialConfig;