diff --git a/docs/configuration.md b/docs/configuration.md
index f0c978a5e3ecb3f1aa328936beecf45a7a2bf194..117e2e13cb89733a4ac0026522085aad9db1b6ed 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -39,11 +39,24 @@ module.exports = {
     },
     {
       repository: 'singapore/repo2',
-      depTypes: ['dependencies', 'devDependencies', 'optionalDependencies'],
+      depTypes: [
+        'dependencies',
+        'devDependencies',
+        {
+          depType: 'optionalDependencies',
+          labels: ['renovate', 'optional'],
+        },
+      ],
       labels: ['renovate'],
     },
     'singapore/repo3',
-  ]
+  ],
+  packages: [
+    {
+      package: 'jquery',
+      labels: ['jquery', 'uhoh'],
+    },
+  ],
 }
 ```
 
diff --git a/lib/worker.js b/lib/worker.js
index 318176e11a6167f991d624f74d43674309f84a77..b11fb73452660d91bfd851b0b29de984373defdd 100644
--- a/lib/worker.js
+++ b/lib/worker.js
@@ -78,6 +78,22 @@ function assignDepConfigs(inputConfig, deps) {
     const returnDep = Object.assign({}, dep);
     returnDep.config =
       Object.assign({}, inputConfig, getDepTypeConfig(inputConfig.depTypes, dep.depType));
+    let packageRuleApplied = false;
+    if (returnDep.config.packages) {
+      // Loop through list looking for match
+      // Exit after first match
+      returnDep.config.packages.forEach((packageConfig) => {
+        if (!packageRuleApplied) {
+          const packageRegex = new RegExp(packageConfig.packageName);
+          if (dep.depName.match(packageRegex)) {
+            packageRuleApplied = true;
+            Object.assign(returnDep.config, packageConfig);
+            delete returnDep.config.packageName;
+          }
+        }
+      });
+    }
+    delete returnDep.config.depType;
     delete returnDep.config.depTypes;
     delete returnDep.config.enabled;
     delete returnDep.config.onboarding;
@@ -86,6 +102,7 @@ function assignDepConfigs(inputConfig, deps) {
     delete returnDep.config.logLevel;
     delete returnDep.config.repoConfigured;
     delete returnDep.config.ignoreDeps;
+    delete returnDep.config.packages;
     delete returnDep.config.maintainYarnLock;
     delete returnDep.config.yarnMaintenanceBranchName;
     delete returnDep.config.yarnMaintenanceCommitMessage;
diff --git a/test/__snapshots__/worker.spec.js.snap b/test/__snapshots__/worker.spec.js.snap
index 50e6f885d4e22382cb191bdc70220c0609b94a33..225e196e1b96dd10c6f4e325cbe93d9dca486141 100644
--- a/test/__snapshots__/worker.spec.js.snap
+++ b/test/__snapshots__/worker.spec.js.snap
@@ -4,7 +4,6 @@ exports[`worker assignDepConfigs(inputConfig, deps) handles depType config with
 Array [
   Object {
     "config": Object {
-      "depType": "dependencies",
       "foo": "beta",
     },
     "depName": "a",
@@ -18,7 +17,6 @@ Array [
   Object {
     "config": Object {
       "alpha": "beta",
-      "depType": "dependencies",
       "foo": "bar",
     },
     "depName": "a",
@@ -44,6 +42,58 @@ Array [
 ]
 `;
 
+exports[`worker assignDepConfigs(inputConfig, deps) handles package config 1`] = `
+Array [
+  Object {
+    "config": Object {
+      "foo": "bar",
+      "labels": Array [
+        "renovate",
+      ],
+    },
+    "depName": "a",
+  },
+]
+`;
+
+exports[`worker assignDepConfigs(inputConfig, deps) handles regex package config 1`] = `
+Array [
+  Object {
+    "config": Object {
+      "foo": "bar",
+      "labels": Array [
+        "eslint",
+      ],
+    },
+    "depName": "eslint",
+  },
+  Object {
+    "config": Object {
+      "foo": "bar",
+      "labels": Array [
+        "eslint",
+      ],
+    },
+    "depName": "eslint-foo",
+  },
+  Object {
+    "config": Object {
+      "foo": "bar",
+    },
+    "depName": "a",
+  },
+  Object {
+    "config": Object {
+      "foo": "bar",
+      "labels": Array [
+        "eslint",
+      ],
+    },
+    "depName": "also-eslint",
+  },
+]
+`;
+
 exports[`worker assignDepConfigs(inputConfig, deps) handles string deps 1`] = `
 Array [
   Object {
@@ -54,3 +104,27 @@ Array [
   },
 ]
 `;
+
+exports[`worker assignDepConfigs(inputConfig, deps) nested package config overrides depType and general config 1`] = `
+Array [
+  Object {
+    "config": Object {
+      "foo": "gamma",
+    },
+    "depName": "a",
+    "depType": "dependencies",
+  },
+]
+`;
+
+exports[`worker assignDepConfigs(inputConfig, deps) package config overrides depType and general config 1`] = `
+Array [
+  Object {
+    "config": Object {
+      "foo": "gamma",
+    },
+    "depName": "a",
+    "depType": "dependencies",
+  },
+]
+`;
diff --git a/test/worker.spec.js b/test/worker.spec.js
index 93efa892c7e4061f6e4b1267aeab743a29f46872..a5405a573452331a0ec697fb0e4aae1a5ac0cbba 100644
--- a/test/worker.spec.js
+++ b/test/worker.spec.js
@@ -160,6 +160,73 @@ describe('worker', () => {
       const updatedDeps = worker.assignDepConfigs(config, deps);
       expect(updatedDeps).toMatchSnapshot();
     });
+    it('handles package config', () => {
+      config.foo = 'bar';
+      config.packages = [{
+        packageName: 'a',
+        labels: ['renovate'],
+      }];
+      deps.push({
+        depName: 'a',
+      });
+      const updatedDeps = worker.assignDepConfigs(config, deps);
+      expect(updatedDeps).toMatchSnapshot();
+    });
+    it('package config overrides depType and general config', () => {
+      config.foo = 'bar';
+      config.depTypes = [{
+        depType: 'dependencies',
+        foo: 'beta',
+      }];
+      config.packages = [{
+        packageName: 'a',
+        foo: 'gamma',
+      }];
+      deps.push({
+        depName: 'a',
+        depType: 'dependencies',
+      });
+      const updatedDeps = worker.assignDepConfigs(config, deps);
+      expect(updatedDeps).toMatchSnapshot();
+    });
+    it('nested package config overrides depType and general config', () => {
+      config.foo = 'bar';
+      config.depTypes = [{
+        depType: 'dependencies',
+        foo: 'beta',
+        packages: [{
+          packageName: 'a',
+          foo: 'gamma',
+        }],
+      }];
+      deps.push({
+        depName: 'a',
+        depType: 'dependencies',
+      });
+      const updatedDeps = worker.assignDepConfigs(config, deps);
+      expect(updatedDeps).toMatchSnapshot();
+    });
+    it('handles regex package config', () => {
+      config.foo = 'bar';
+      config.packages = [{
+        packageName: 'eslint.*',
+        labels: ['eslint'],
+      }];
+      deps.push({
+        depName: 'eslint',
+      });
+      deps.push({
+        depName: 'eslint-foo',
+      });
+      deps.push({
+        depName: 'a',
+      });
+      deps.push({
+        depName: 'also-eslint',
+      });
+      const updatedDeps = worker.assignDepConfigs(config, deps);
+      expect(updatedDeps).toMatchSnapshot();
+    });
   });
   describe('getDepTypeConfig(depTypes, depTypeName)', () => {
     it('handles empty depTypes', () => {