diff --git a/docs/configuration.md b/docs/configuration.md
index 0b28c3763f70a098db3836fb716a441b82cdfff8..baaefc4fbaee5c08c1c1b614dbcbb7a665e48613 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -317,6 +317,22 @@ Obviously, you can't set repository or package file location with this method.
   <td></td>
   <td><td>
 </tr>
+<tr>
+  <td>`packageName`</td>
+  <td>A package name to match. Valid only within `packages` object</td>
+  <td>string</td>
+  <td><pre>null</pre></td>
+  <td></td>
+  <td><td>
+</tr>
+<tr>
+  <td>`packagePattern`</td>
+  <td>A package name pattern to match. Valid only within `packages` object.</td>
+  <td>string</td>
+  <td><pre>null</pre></td>
+  <td></td>
+  <td><td>
+</tr>
 <tr>
   <td>`pinVersions`</td>
   <td>Convert ranged versions in package.json to pinned versions</td>
@@ -385,7 +401,7 @@ Obviously, you can't set repository or package file location with this method.
   <td>`patch`</td>
   <td>Configuration to apply when an update type is patch. Only applies if `separatePatchReleases` is set to true</td>
   <td>json</td>
-  <td><pre>{"branchName": "renovate/{{depName}}-{{newVersionMajor}}.{newVersionMinor}}.x"}</pre></td>
+  <td><pre>{"branchName": "renovate/{{depName}}-{{newVersionMajor}}.{{newVersionMinor}}.x"}</pre></td>
   <td>`RENOVATE_PATCH`</td>
   <td><td>
 </tr>
diff --git a/lib/config/definitions.js b/lib/config/definitions.js
index 554240c8be50946b7f2cd987f257400af8804a0a..139e41bf983ab45bb2aba8b54573f49dc12879b9 100644
--- a/lib/config/definitions.js
+++ b/lib/config/definitions.js
@@ -170,6 +170,23 @@ const options = [
     cli: false,
     env: false,
   },
+  {
+    name: 'packageName',
+    description: 'A package name to match. Valid only within `packages` object',
+    type: 'string',
+    stage: 'depType',
+    cli: false,
+    env: false,
+  },
+  {
+    name: 'packagePattern',
+    description:
+      'A package name pattern to match. Valid only within `packages` object.',
+    type: 'string',
+    stage: 'depType',
+    cli: false,
+    env: false,
+  },
   // Version behaviour
   {
     name: 'pinVersions',
diff --git a/lib/config/validation.js b/lib/config/validation.js
index 4d4a38b635383b4ca2b83a20361b29fa017cdd4d..54063f1c114448b149036bf6266b6dc3b0035343 100644
--- a/lib/config/validation.js
+++ b/lib/config/validation.js
@@ -28,6 +28,10 @@ function validateConfig(config) {
     return Object.prototype.toString.call(obj) === '[object Object]';
   }
 
+  function isString(val) {
+    return typeof val === 'string' || val instanceof String;
+  }
+
   const foundDeprecated = [];
   for (const key of Object.keys(config)) {
     let val = config[key];
@@ -60,9 +64,18 @@ function validateConfig(config) {
               depName: 'Configuration Error',
               message: `Configuration option \`${key}\` should be a list (Array)`,
             });
+          } else {
+            // eslint-disable-next-line no-loop-func
+            val.forEach(subval => {
+              if (isObject(subval)) {
+                const subValidation = module.exports.validateConfig(subval);
+                warnings = warnings.concat(subValidation.warnings);
+                errors = errors.concat(subValidation.errors);
+              }
+            });
           }
         } else if (type === 'string') {
-          if (!(typeof val === 'string' || val instanceof String)) {
+          if (!isString(val)) {
             errors.push({
               depName: 'Configuration Error',
               message: `Configuration option \`${key}\` should be a string`,
diff --git a/test/config/__snapshots__/validation.spec.js.snap b/test/config/__snapshots__/validation.spec.js.snap
index e893793b75a4bae59b22d8eecf9054e57ebeeb18..17be67ac69b7fcb6f60172f5349128c05ab8cdf8 100644
--- a/test/config/__snapshots__/validation.spec.js.snap
+++ b/test/config/__snapshots__/validation.spec.js.snap
@@ -22,6 +22,10 @@ Array [
     "depName": "Configuration Error",
     "message": "Configuration option \`lockFileMaintenance\` should be a json object",
   },
+  Object {
+    "depName": "Configuration Error",
+    "message": "Invalid configuration option: \`foo\`",
+  },
 ]
 `;
 
diff --git a/test/config/validation.spec.js b/test/config/validation.spec.js
index 1c0db1422c2363b0df740e174a1e6e0b2a6ba2b0..2e99501e089587a7a380aa3582ad869102c340a1 100644
--- a/test/config/validation.spec.js
+++ b/test/config/validation.spec.js
@@ -23,10 +23,15 @@ describe('config/validation', () => {
         semanticPrefix: 7,
         githubAppId: 'none',
         lockFileMaintenance: false,
+        packages: [
+          {
+            foo: 1,
+          },
+        ],
       };
       const { warnings, errors } = configValidation.validateConfig(config);
       expect(warnings).toHaveLength(0);
-      expect(errors).toHaveLength(5);
+      expect(errors).toHaveLength(6);
       expect(errors).toMatchSnapshot();
     });
   });