diff --git a/lib/config/index.js b/lib/config/index.js
index 9e946a6a5c8e2da67eb49b2b1508620a95e54559..a165b3b440c05d814d72b3ec985913a819ddac07 100644
--- a/lib/config/index.js
+++ b/lib/config/index.js
@@ -27,13 +27,12 @@ async function parseConfigs(env, argv) {
   const cliConfig = cliParser.getConfig(argv);
   const envConfig = envParser.getConfig(env);
 
-  const config = Object.assign(
-    {},
-    defaultConfig,
-    fileConfig,
-    envConfig,
-    cliConfig
-  );
+  const config = {
+    ...defaultConfig,
+    ...fileConfig,
+    ...envConfig,
+    ...cliConfig,
+  };
 
   // Set log level
   logger.levels('stdout', config.logLevel);
@@ -115,15 +114,14 @@ async function parseConfigs(env, argv) {
 
 function mergeChildConfig(parentConfig, childConfig) {
   logger.trace({ parentConfig, childConfig }, `mergeChildConfig`);
-  const config = Object.assign({}, parentConfig, childConfig);
+  const config = { ...parentConfig, ...childConfig };
   for (const option of definitions.getOptions()) {
     if (option.mergeable && childConfig[option.name]) {
       logger.debug(`mergeable option: ${option.name}`);
-      config[option.name] = Object.assign(
-        {},
-        parentConfig[option.name],
-        childConfig[option.name]
-      );
+      config[option.name] = {
+        ...parentConfig[option.name],
+        ...childConfig[option.name],
+      };
       logger.debug({ option: config[option.name] }, `config.${option.name}`);
     }
   }
@@ -132,7 +130,7 @@ function mergeChildConfig(parentConfig, childConfig) {
 
 function filterConfig(inputConfig, targetStage) {
   logger.trace({ config: inputConfig }, `filterConfig('${targetStage}')`);
-  const outputConfig = Object.assign({}, inputConfig);
+  const outputConfig = { ...inputConfig };
   const stages = [
     'global',
     'repository',
diff --git a/lib/config/migration.js b/lib/config/migration.js
index 7dec6805d7ec566b31a1f73ab4892509197549dd..cbbd4c805b4aabd00a553f4c728d5d555d8d173c 100644
--- a/lib/config/migration.js
+++ b/lib/config/migration.js
@@ -18,7 +18,7 @@ const removedOptions = [
 // Returns a migrated config
 function migrateConfig(config) {
   let isMigrated = false;
-  const migratedConfig = Object.assign({}, config);
+  const migratedConfig = { ...config };
   for (const key of Object.keys(config)) {
     const val = config[key];
     if (removedOptions.includes(key)) {
@@ -44,7 +44,7 @@ function migrateConfig(config) {
         if (isObject(depType)) {
           const depTypeName = depType.depType;
           if (depTypeName) {
-            migratedConfig[depTypeName] = Object.assign({}, depType);
+            migratedConfig[depTypeName] = { ...depType };
             delete migratedConfig[depTypeName].depType;
           }
         }
diff --git a/lib/logger/pretty-stdout.js b/lib/logger/pretty-stdout.js
index 8948ac68d3ec18c03d9c556230bfb3a0bb443418..40b98665a5f59d3fb4b1d70bd6c9e34b643da2a8 100644
--- a/lib/logger/pretty-stdout.js
+++ b/lib/logger/pretty-stdout.js
@@ -56,7 +56,7 @@ function getDetails(rec) {
   if (!rec) {
     return '';
   }
-  const recFiltered = Object.assign({}, rec);
+  const recFiltered = { ...rec };
   Object.keys(recFiltered).forEach(key => {
     if (bunyanFields.indexOf(key) !== -1 || metaFields.indexOf(key) !== -1) {
       delete recFiltered[key];
diff --git a/lib/workers/branch/index.js b/lib/workers/branch/index.js
index be71bfab21bf8cbd03da251911197cbf507a6164..0a37e6e53a89d5449a0e8fb7f5edcdc13e18dd22 100644
--- a/lib/workers/branch/index.js
+++ b/lib/workers/branch/index.js
@@ -214,7 +214,7 @@ async function ensureBranch(config) {
 async function processBranchUpgrades(branchUpgrades, errors, warnings) {
   logger = branchUpgrades.logger || logger;
   logger.trace({ config: branchUpgrades }, 'processBranchUpgrades');
-  const config = Object.assign({}, branchUpgrades);
+  const config = { ...branchUpgrades };
   // Check schedule
   if (
     config.schedule &&
diff --git a/lib/workers/branch/npm.js b/lib/workers/branch/npm.js
index 164996e8f935bf8e107b7a2b6cca38fa796aac0d..0601b827fccbbabd7b9bc17ee75a503d9441abb0 100644
--- a/lib/workers/branch/npm.js
+++ b/lib/workers/branch/npm.js
@@ -24,7 +24,7 @@ async function generateLockFile(newPackageJson, npmrcContent) {
     const result = cp.spawnSync('npm', ['install', '--ignore-scripts'], {
       cwd: tmpDir.name,
       shell: true,
-      env: Object.assign({}, process.env, { NODE_ENV: 'dev' }),
+      env: { ...process.env, ...{ NODE_ENV: 'dev' } },
     });
     logger.debug(
       { stdout: String(result.stdout), stderr: String(result.stderr) },
diff --git a/lib/workers/branch/yarn.js b/lib/workers/branch/yarn.js
index 90fa2bfcf45e3fdf79f3b1d412932a485f6ae6a5..231d0806a6fb1a73ff6c8ee2644d6e98e28a3908 100644
--- a/lib/workers/branch/yarn.js
+++ b/lib/workers/branch/yarn.js
@@ -48,7 +48,7 @@ async function generateLockFile(
     const result = cp.spawnSync('node', yarnOptions, {
       cwd: tmpDir.name,
       shell: true,
-      env: Object.assign({}, process.env, { NODE_ENV: 'dev' }),
+      env: { ...process.env, ...{ NODE_ENV: 'dev' } },
     });
     logger.debug(String(result.stdout));
     logger.debug(String(result.stderr));
diff --git a/lib/workers/package-file/index.js b/lib/workers/package-file/index.js
index c0c570e7cfc978263fabc4bb0b675c5c62c783b2..21db67eda6f6befd489ddc3765d24ec3746bc2a2 100644
--- a/lib/workers/package-file/index.js
+++ b/lib/workers/package-file/index.js
@@ -11,7 +11,7 @@ module.exports = {
 };
 
 async function renovatePackageFile(packageFileConfig) {
-  let config = Object.assign({}, packageFileConfig);
+  let config = { ...packageFileConfig };
   let upgrades = [];
   logger = config.logger;
   logger.info(`Processing package file`);
@@ -64,7 +64,7 @@ async function renovatePackageFile(packageFileConfig) {
       /* TODO #556
       errors.forEach(error => {
         upgrades.push(
-          Object.assign({}, error, {
+          { ...error, {
             depName: `${config.packageFile}(renovate)`,
             type: 'error',
           })
@@ -90,10 +90,9 @@ async function renovatePackageFile(packageFileConfig) {
     'peerDependencies',
   ];
   const depTypeConfigs = depTypes.map(depType => {
-    const depTypeConfig = configParser.mergeChildConfig(
-      config,
-      Object.assign({}, config[depType])
-    );
+    const depTypeConfig = configParser.mergeChildConfig(config, {
+      ...config[depType],
+    });
     depTypeConfig.depType = depType;
     depTypeConfig.logger = logger.child({
       repository: depTypeConfig.repository,
diff --git a/lib/workers/package/versions.js b/lib/workers/package/versions.js
index bd7dae0f44320f66909501ee5d83053b7bcefa2b..498b221da81e8644146e00bd84fcdd7aa080c4ae 100644
--- a/lib/workers/package/versions.js
+++ b/lib/workers/package/versions.js
@@ -160,7 +160,7 @@ function determineUpgrades(npmDep, config) {
   // Loop through all upgrades and convert to ranges
   const rangedUpgrades = _(upgrades)
     .reject(upgrade => upgrade.type === 'pin')
-    .map(upgrade => Object.assign(upgrade, { isRange: true }))
+    .map(upgrade => ({ ...upgrade, ...{ isRange: true } }))
     .map(upgrade => {
       const { major, minor } = semverUtils.parse(upgrade.newVersion);
       if (currentSemver.operator === '~') {
@@ -170,36 +170,42 @@ function determineUpgrades(npmDep, config) {
           `${major}.${minor}`
         );
         // Add a tilde before that version number
-        return Object.assign(upgrade, { newVersion: `~${minSatisfying}` });
+        return { ...upgrade, ...{ newVersion: `~${minSatisfying}` } };
       } else if (currentSemver.operator === '^') {
         // Special case where major and minor are 0
         if (major === '0' && minor === '0') {
-          return Object.assign(upgrade, {
-            newVersion: `^${upgrade.newVersion}`,
-          });
+          return {
+            ...upgrade,
+            ...{
+              newVersion: `^${upgrade.newVersion}`,
+            },
+          };
         }
         // If version is < 1, then semver treats ^ same as ~
         const newRange = major === '0' ? `${major}.${minor}` : `${major}`;
         const minSatisfying = semver.minSatisfying(versionList, newRange);
         // Add in the caret
-        return Object.assign(upgrade, { newVersion: `^${minSatisfying}` });
+        return { ...upgrade, ...{ newVersion: `^${minSatisfying}` } };
       } else if (currentSemver.operator === '<=') {
         // Example: <= 1.2.0
-        return Object.assign(upgrade, {
-          newVersion: `<= ${upgrade.newVersion}`,
-        });
+        return {
+          ...upgrade,
+          ...{
+            newVersion: `<= ${upgrade.newVersion}`,
+          },
+        };
       } else if (currentSemver.minor === undefined) {
         // Example: 1
-        return Object.assign(upgrade, { newVersion: `${major}` });
+        return { ...upgrade, ...{ newVersion: `${major}` } };
       } else if (currentSemver.minor === 'x') {
         // Example: 1.x
-        return Object.assign(upgrade, { newVersion: `${major}.x` });
+        return { ...upgrade, ...{ newVersion: `${major}.x` } };
       } else if (currentSemver.patch === undefined) {
         // Example: 1.2
-        return Object.assign(upgrade, { newVersion: `${major}.${minor}` });
+        return { ...upgrade, ...{ newVersion: `${major}.${minor}` } };
       } else if (currentSemver.patch === 'x') {
         // Example: 1.2.x
-        return Object.assign(upgrade, { newVersion: `${major}.${minor}.x` });
+        return { ...upgrade, ...{ newVersion: `${major}.${minor}.x` } };
       }
       result.message = `The current semver range "${currentVersion}" is not supported so won't ever be upgraded`;
       logger.warn(result.message);
diff --git a/lib/workers/pr/index.js b/lib/workers/pr/index.js
index b34a1a4fdee458d71d07eeedcc8a20f4f4b8ddb6..1ce40986fe3ec0924c9308af041d5270156b9268 100644
--- a/lib/workers/pr/index.js
+++ b/lib/workers/pr/index.js
@@ -14,7 +14,7 @@ module.exports = {
 async function ensurePr(inputConfig, logger, errors, warnings) {
   logger.trace({ config: inputConfig }, 'ensurePr');
   // If there is a group, it will use the config of the first upgrade in the array
-  const config = Object.assign({}, inputConfig);
+  const config = { ...inputConfig };
   const upgrades = config.upgrades;
   config.upgrades = [];
   const branchName = config.branchName;
@@ -71,12 +71,12 @@ async function ensurePr(inputConfig, logger, errors, warnings) {
       upgrade.githubName = logJSON.project.github;
       upgrade.releases = [];
       logJSON.versions.forEach(version => {
-        const release = Object.assign({}, version);
+        const release = { ...version };
         release.date = version.date.toISOString().slice(0, 10);
         release.commits = [];
         if (release.changes) {
           release.changes.forEach(change => {
-            const commit = Object.assign({}, change);
+            const commit = { ...change };
             delete commit.date;
             commit.shortSha = change.sha.slice(0, 7);
             commit.url = `${logJSON.project.repository}/commit/${change.sha}`;
diff --git a/lib/workers/repository/apis.js b/lib/workers/repository/apis.js
index a95bf979bb53bd6a9c6342ac2493f71aa567699e..fffc3f5a54a984133a58cab45eefb78f6d673fef 100644
--- a/lib/workers/repository/apis.js
+++ b/lib/workers/repository/apis.js
@@ -60,7 +60,7 @@ async function initApis(inputConfig, token) {
     throw new Error(`Unknown platform: ${platform}`);
   }
 
-  const config = Object.assign({}, inputConfig);
+  const config = { ...inputConfig };
   config.api = getPlatformApi(config.platform);
   const platformConfig = await config.api.initRepo(
     config.repository,
@@ -78,7 +78,7 @@ async function initApis(inputConfig, token) {
 
 // Check for config in `renovate.json`
 async function mergeRenovateJson(config, branchName) {
-  let returnConfig = Object.assign({}, config);
+  let returnConfig = { ...config };
   const renovateJsonContent = await config.api.getFileContent(
     'renovate.json',
     branchName
@@ -142,7 +142,7 @@ async function mergeRenovateJson(config, branchName) {
       /* TODO #556
       renovateJsonErrors.forEach(error => {
         config.errors.push(
-          Object.assign({}, error, { depName: 'renovate.json' })
+          { ...error, ...{ depName: 'renovate.json' } }
         );
       }); */
     }
@@ -161,7 +161,7 @@ async function mergeRenovateJson(config, branchName) {
 }
 
 async function detectPackageFiles(input) {
-  const config = Object.assign({}, input);
+  const config = { ...input };
   config.logger.trace({ config }, 'detectPackageFiles');
   config.packageFiles = await config.api.findFilePaths('package.json');
   config.logger.debug(
diff --git a/lib/workers/repository/index.js b/lib/workers/repository/index.js
index f50cb263dc888e8a02da426be57ef9a5e910c0ad..c0132831838f519f244088e5bd4e56705da5ea49 100644
--- a/lib/workers/repository/index.js
+++ b/lib/workers/repository/index.js
@@ -11,7 +11,7 @@ module.exports = {
 };
 
 async function renovateRepository(repoConfig, token) {
-  let config = Object.assign({}, repoConfig);
+  let config = { ...repoConfig };
   config.errors = [];
   config.warnings = [];
   config.logger.trace({ config }, 'renovateRepository');
diff --git a/lib/workers/repository/upgrades.js b/lib/workers/repository/upgrades.js
index 6f2bfe7a99a18d37463d0c48a01fb00badb52536..4c41a46ce929d366e154f1f5384d6f5c62dc5e78 100644
--- a/lib/workers/repository/upgrades.js
+++ b/lib/workers/repository/upgrades.js
@@ -44,7 +44,7 @@ function generateConfig(branchUpgrades) {
   const useGroupSettings = hasGroupName && groupEligible;
   logger.debug(`useGroupSettings: ${useGroupSettings}`);
   for (const branchUpgrade of branchUpgrades) {
-    const upgrade = Object.assign({}, branchUpgrade);
+    const upgrade = { ...branchUpgrade };
     if (useGroupSettings) {
       // Now overwrite original config with group config
       Object.assign(upgrade, upgrade.group);
@@ -69,7 +69,7 @@ function generateConfig(branchUpgrades) {
     config.upgrades.push(upgrade);
   }
   // Now assign first upgrade's config as branch config
-  return Object.assign(config, config.upgrades[0]);
+  return { ...config, ...config.upgrades[0] };
 }
 
 function groupByBranch(upgrades) {
@@ -81,7 +81,7 @@ function groupByBranch(upgrades) {
     branchUpgrades: {},
   };
   for (const upg of upgrades) {
-    const upgrade = Object.assign({}, upg);
+    const upgrade = { ...upg };
     // Split out errors and wrnings first
     if (upgrade.type === 'error') {
       result.errors.push(upgrade);
diff --git a/package.json b/package.json
index 3d7b8db5c43d591bd80440efe7173486f9a508cc..f19b92bf8d50a9b464465babb41359fe7a22d3d9 100644
--- a/package.json
+++ b/package.json
@@ -72,6 +72,7 @@
     "babel-cli": "6.24.1",
     "babel-jest": "20.0.3",
     "babel-plugin-transform-async-to-generator": "6.24.1",
+    "babel-plugin-transform-object-rest-spread": "6.23.0",
     "chai": "4.1.0",
     "condition-circle": "1.5.0",
     "eslint": "4.3.0",
@@ -89,7 +90,8 @@
   },
   "babel": {
     "plugins": [
-      "transform-async-to-generator"
+      "transform-async-to-generator",
+      "transform-object-rest-spread"
     ]
   },
   "jest": {
diff --git a/test/api/npm.spec.js b/test/api/npm.spec.js
index 99a1c41008c30e06b2e3be99601df9d59a189af3..10a39cbcca87a516c8f6324dc5a12fbe4842ff88 100644
--- a/test/api/npm.spec.js
+++ b/test/api/npm.spec.js
@@ -38,7 +38,7 @@ describe('api/npm', () => {
   });
   it('should use homepage', async () => {
     registryUrl.mockImplementation(() => 'https://npm.mycustomregistry.com/');
-    const npmResponseHomepage = Object.assign({}, npmResponse);
+    const npmResponseHomepage = { ...npmResponse };
     npmResponseHomepage.body.repository.url = '';
     npmResponseHomepage.body.homepage = 'https://google.com';
     got.mockImplementationOnce(() => Promise.resolve(npmResponseHomepage));
diff --git a/test/config/index.spec.js b/test/config/index.spec.js
index 2f0bb4ccbe117a28c02ad1f84d70290acc4a8dcf..315b08575bf40e563544ccc29b6e7d0b1f4e1d1f 100644
--- a/test/config/index.spec.js
+++ b/test/config/index.spec.js
@@ -147,7 +147,7 @@ describe('config/index', () => {
   });
   describe('mergeChildConfig(parentConfig, childConfig)', () => {
     it('merges', () => {
-      const parentConfig = Object.assign({}, defaultConfig);
+      const parentConfig = { ...defaultConfig };
       const childConfig = {
         foo: 'bar',
         pinVersions: false,
@@ -163,7 +163,7 @@ describe('config/index', () => {
       expect(config.lockFileMaintenance).toMatchSnapshot();
     });
     it('merges depTypes', () => {
-      const parentConfig = Object.assign({}, defaultConfig);
+      const parentConfig = { ...defaultConfig };
       const childConfig = {
         dependencies: {},
         devDependencies: { foo: 1 },
diff --git a/test/workers/branch/index.spec.js b/test/workers/branch/index.spec.js
index 53c1fa7f35711495cf43ebb17600229749559731..f8fab47842e16c85cd7e6a8e07d8580a57991079 100644
--- a/test/workers/branch/index.spec.js
+++ b/test/workers/branch/index.spec.js
@@ -112,7 +112,7 @@ describe('workers/branch', () => {
       npm.maintainLockFile = jest.fn();
       yarn.getLockFile = jest.fn();
       yarn.maintainLockFile = jest.fn();
-      config = Object.assign({}, defaultConfig);
+      config = { ...defaultConfig };
       config.api = {};
       config.api.getFileContent = jest.fn();
       config.api.branchExists = jest.fn();
@@ -124,7 +124,7 @@ describe('workers/branch', () => {
       config.newVersion = '1.1.0';
       config.newVersionMajor = 1;
       config.versions = {};
-      config.upgrades = [Object.assign({}, config)];
+      config.upgrades = [{ ...config }];
     });
     it('returns if new content matches old', async () => {
       branchWorker.getParentBranch.mockReturnValueOnce('dummy branch');
@@ -346,7 +346,7 @@ describe('workers/branch', () => {
   describe('processBranchUpgrades(upgrades)', () => {
     let config;
     beforeEach(() => {
-      config = Object.assign({}, defaultConfig);
+      config = { ...defaultConfig };
       config.api = {
         checkForClosedPr: jest.fn(),
       };
diff --git a/test/workers/package-file/index.spec.js b/test/workers/package-file/index.spec.js
index 859b0b8452f5a2912be7809d66d3ccf4998f77a1..7498da517a7a0177111a9d35762a30bc80371222 100644
--- a/test/workers/package-file/index.spec.js
+++ b/test/workers/package-file/index.spec.js
@@ -11,15 +11,18 @@ describe('packageFileWorker', () => {
   describe('renovatePackageFile(config)', () => {
     let config;
     beforeEach(() => {
-      config = Object.assign({}, defaultConfig, {
-        packageFile: 'package.json',
-        repoIsOnboarded: true,
-        api: {
-          getFileContent: jest.fn(),
-          getFileJson: jest.fn(),
+      config = {
+        ...defaultConfig,
+        ...{
+          packageFile: 'package.json',
+          repoIsOnboarded: true,
+          api: {
+            getFileContent: jest.fn(),
+            getFileJson: jest.fn(),
+          },
+          logger,
         },
-        logger,
-      });
+      };
     });
     it('handles renovate config warnings and errors', async () => {
       config.enabled = false;
diff --git a/test/workers/pr/__snapshots__/index.spec.js.snap b/test/workers/pr/__snapshots__/index.spec.js.snap
index 347b9e6eca80e6f4e2f2b38b9c3833259923b91e..a66b8350bd3f87fef3102e2b7244ff435c57480c 100644
--- a/test/workers/pr/__snapshots__/index.spec.js.snap
+++ b/test/workers/pr/__snapshots__/index.spec.js.snap
@@ -24,4 +24,22 @@ Array [
 ]
 `;
 
+exports[`workers/pr ensurePr(upgrades, logger) should return modified existing PR 1`] = `
+Object {
+  "body": "<p>This Pull Request updates dependency <a href=\\"https://github.com/renovateapp/dummy\\">dummy</a> from version <code>1.0.0</code> to <code>1.1.0</code></p>
+<h3 id=\\"commits\\">Commits</h3>
+<p><details><br />
+<summary>renovateapp/dummy</summary></p>
+<h4 id=\\"110\\">1.1.0</h4>
+<ul>
+<li><a href=\\"https://github.com/renovateapp/dummy/commit/abcdefghijklmnopqrstuvwxyz\\"><code>abcdefg</code></a> foo <a href=\\"https://github.com/renovateapp/dummy/issues/3\\">#3</a></li>
+</ul>
+<p></details></p>
+<hr />
+<p>This PR has been generated by <a href=\\"https://renovateapp.com\\">Renovate Bot</a>.</p>",
+  "displayNumber": "Existing PR",
+  "title": "Update dependency dummy to version 1.1.0",
+}
+`;
+
 exports[`workers/pr ensurePr(upgrades, logger) should return unmodified existing PR 1`] = `Array []`;
diff --git a/test/workers/pr/index.spec.js b/test/workers/pr/index.spec.js
index cc21b7656c2a22c3a578847e58d34e04d42f3d33..6c63be31b1349fc67f9d4cd14a83ef66dce4211a 100644
--- a/test/workers/pr/index.spec.js
+++ b/test/workers/pr/index.spec.js
@@ -33,7 +33,7 @@ describe('workers/pr', () => {
     let config;
     let pr;
     beforeEach(() => {
-      config = Object.assign({}, defaultConfig);
+      config = { ...defaultConfig };
       pr = {
         head: {
           ref: 'somebranch',
@@ -80,7 +80,7 @@ describe('workers/pr', () => {
     let config;
     let existingPr;
     beforeEach(() => {
-      config = Object.assign({}, defaultConfig);
+      config = { ...defaultConfig };
       config.api = {
         createPr: jest.fn(() => ({ displayNumber: 'New Pull Request' })),
         getBranchStatus: jest.fn(),
@@ -221,11 +221,7 @@ describe('workers/pr', () => {
       config.api.getBranchPr = jest.fn(() => existingPr);
       config.api.updatePr = jest.fn();
       const pr = await prWorker.ensurePr(config, logger);
-      const updatedPr = Object.assign(existingPr, {
-        body:
-          'This Pull Request updates dependency dummy from version `1.0.0` to `1.2.0`\n\nNo changelog available',
-      });
-      expect(pr).toMatchObject(updatedPr);
+      expect(pr).toMatchSnapshot();
     });
     it('should create PR if branch automerging failed', async () => {
       config.automergeEnabled = true;
diff --git a/test/workers/repository/cleanup.spec.js b/test/workers/repository/cleanup.spec.js
index a29d9660c41c3f8a8e81c1e813167dc835ac0023..ca38b2759b9cecf1eac61663b457035bc30dd72f 100644
--- a/test/workers/repository/cleanup.spec.js
+++ b/test/workers/repository/cleanup.spec.js
@@ -8,7 +8,7 @@ describe('workers/repository/cleanup', () => {
     let config;
     beforeEach(() => {
       branchNames = [];
-      config = Object.assign({}, defaultConfig);
+      config = { ...defaultConfig };
       config.api = {
         getAllRenovateBranches: jest.fn(),
         getAllPrs: jest.fn(),
diff --git a/test/workers/repository/index.spec.js b/test/workers/repository/index.spec.js
index 1c5d73be5cc6b544c507b9c3d701a2a0ef21b941..b43f32c73c712fcc03b9ee39230dfb766db7f5a0 100644
--- a/test/workers/repository/index.spec.js
+++ b/test/workers/repository/index.spec.js
@@ -45,40 +45,46 @@ describe('workers/repository', () => {
     it('sets custom base branch', async () => {
       config.baseBranch = 'some-branch';
       config.api.branchExists.mockReturnValueOnce(true);
-      apis.detectPackageFiles.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
+      apis.detectPackageFiles.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
       await repositoryWorker.renovateRepository(config);
       expect(config.api.setBaseBranch.mock.calls).toHaveLength(1);
     });
     it('errors when missing custom base branch', async () => {
       config.baseBranch = 'some-branch';
       config.api.branchExists.mockReturnValueOnce(false);
-      apis.detectPackageFiles.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
+      apis.detectPackageFiles.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
       await repositoryWorker.renovateRepository(config);
       expect(config.api.setBaseBranch.mock.calls).toHaveLength(0);
     });
     it('skips repository if no package.json', async () => {
-      apis.detectPackageFiles.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
+      apis.detectPackageFiles.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
       await repositoryWorker.renovateRepository(config);
       expect(onboarding.getOnboardingStatus.mock.calls.length).toBe(0);
       expect(config.logger.error.mock.calls.length).toBe(0);
     });
     it('does not skip repository if package.json', async () => {
-      apis.detectPackageFiles.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
+      apis.detectPackageFiles.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
       config.api.getFileJson = jest.fn(() => ({ a: 1 }));
-      apis.mergeRenovateJson.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
-      apis.mergeRenovateJson.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
+      apis.mergeRenovateJson.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
+      apis.mergeRenovateJson.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
       upgrades.branchifyUpgrades.mockReturnValueOnce({
         upgrades: [{}, {}, {}],
       });
@@ -89,16 +95,19 @@ describe('workers/repository', () => {
       expect(config.logger.error.mock.calls.length).toBe(0);
     });
     it('uses onboarding custom baseBranch', async () => {
-      apis.detectPackageFiles.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
+      apis.detectPackageFiles.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
       config.api.getFileJson = jest.fn(() => ({ a: 1 }));
-      apis.mergeRenovateJson.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
-      apis.mergeRenovateJson.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [], baseBranch: 'next' })
-      );
+      apis.mergeRenovateJson.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
+      apis.mergeRenovateJson.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [], baseBranch: 'next' },
+      }));
       config.api.branchExists.mockReturnValueOnce(true);
       upgrades.branchifyUpgrades.mockReturnValueOnce({
         upgrades: [{}, {}, {}],
@@ -110,16 +119,19 @@ describe('workers/repository', () => {
       expect(config.logger.error.mock.calls.length).toBe(0);
     });
     it('errors onboarding custom baseBranch', async () => {
-      apis.detectPackageFiles.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
+      apis.detectPackageFiles.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
       config.api.getFileJson = jest.fn(() => ({ a: 1 }));
-      apis.mergeRenovateJson.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [] })
-      );
-      apis.mergeRenovateJson.mockImplementationOnce(input =>
-        Object.assign(input, { packageFiles: [], baseBranch: 'next' })
-      );
+      apis.mergeRenovateJson.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [] },
+      }));
+      apis.mergeRenovateJson.mockImplementationOnce(input => ({
+        ...input,
+        ...{ packageFiles: [], baseBranch: 'next' },
+      }));
       upgrades.branchifyUpgrades.mockReturnValueOnce({
         upgrades: [{}, {}, {}],
       });
diff --git a/test/workers/repository/onboarding.spec.js b/test/workers/repository/onboarding.spec.js
index 3e6cd815ecb0e1ee8ad6c22145ce9b52d22887f1..30361e06344fa8652c3f31d501d608b11a04271a 100644
--- a/test/workers/repository/onboarding.spec.js
+++ b/test/workers/repository/onboarding.spec.js
@@ -197,7 +197,7 @@ describe('lib/workers/repository/onboarding', () => {
   describe('getOnboardingStatus(config)', () => {
     let config;
     beforeEach(() => {
-      config = Object.assign({}, defaultConfig);
+      config = { ...defaultConfig };
       jest.resetAllMocks();
       config.api = {
         commitFilesToBranch: jest.fn(),
diff --git a/yarn.lock b/yarn.lock
index c72d244fa46ba55cff9fc2f086052c220dfb8830..a3dcf73146e3d9500ae799b2e987a93cb6fbcf83 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -385,6 +385,10 @@ babel-plugin-syntax-async-functions@^6.8.0:
   version "6.13.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
 
+babel-plugin-syntax-object-rest-spread@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
 babel-plugin-transform-async-to-generator@6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
@@ -393,6 +397,13 @@ babel-plugin-transform-async-to-generator@6.24.1:
     babel-plugin-syntax-async-functions "^6.8.0"
     babel-runtime "^6.22.0"
 
+babel-plugin-transform-object-rest-spread@6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921"
+  dependencies:
+    babel-plugin-syntax-object-rest-spread "^6.8.0"
+    babel-runtime "^6.22.0"
+
 babel-polyfill@^6.16.0, babel-polyfill@^6.23.0:
   version "6.23.0"
   resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"