diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index 689a999d3efcf40f36f0bfc3931a3707f8ddf569..12e9cf481e1cde5e5280e09796b6adeba68a57bd 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -716,7 +716,7 @@ By default, Renovate will use group names in Pull Request titles only when the P
 
 ## lockFileMaintenance
 
-This feature can be used to refresh lock files and keep them up-to-date. "Maintaining" a lock file means recreating it so that every dependency version within it is updated to the latest. Supported lock files are `package-lock.json`, `yarn.lock` and `composer.lock`. Others may be added via feature request.
+This feature can be used to refresh lock files and keep them up-to-date. "Maintaining" a lock file means recreating it so that every dependency version within it is updated to the latest. Supported lock files are `package-lock.json`, `yarn.lock`, `composer.lock` and `poetry.lock`. Others may be added via feature request.
 
 This feature is disabled by default. If you wish to enable this feature then you could add this to your configuration:
 
diff --git a/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap b/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap
index 4bedb2d680c751243d3ce653006bb290936eb671..00eef48ef4fe7147534d7200cc498454f1ba16d9 100644
--- a/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap
@@ -80,3 +80,24 @@ Array [
   },
 ]
 `;
+
+exports[`.updateArtifacts() returns updated poetry.lock when doing lockfile maintenance 1`] = `
+Array [
+  Object {
+    "cmd": "poetry update --lock --no-interaction",
+    "options": Object {
+      "cwd": "/tmp/github/some/repo",
+      "encoding": "utf-8",
+      "env": Object {
+        "HOME": "/home/user",
+        "HTTPS_PROXY": "https://example.com",
+        "HTTP_PROXY": "http://example.com",
+        "LANG": "en_US.UTF-8",
+        "LC_ALL": "en_US",
+        "NO_PROXY": "localhost",
+        "PATH": "/tmp/path",
+      },
+    },
+  },
+]
+`;
diff --git a/lib/manager/poetry/artifacts.spec.ts b/lib/manager/poetry/artifacts.spec.ts
index 4f287b2e83369b44d4480d1042d54415e629d742..196c99fbd0396867ea983d39ace271ce7f3c80bb 100644
--- a/lib/manager/poetry/artifacts.spec.ts
+++ b/lib/manager/poetry/artifacts.spec.ts
@@ -116,4 +116,21 @@ describe('.updateArtifacts()', () => {
       })
     ).toMatchSnapshot();
   });
+  it('returns updated poetry.lock when doing lockfile maintenance', async () => {
+    fs.readFile.mockResolvedValueOnce('Old poetry.lock' as any);
+    const execSnapshots = mockExecAll(exec);
+    fs.readFile.mockReturnValueOnce('New poetry.lock' as any);
+    expect(
+      await updateArtifacts({
+        packageFileName: 'pyproject.toml',
+        updatedDeps: [],
+        newPackageFileContent: '{}',
+        config: {
+          ...config,
+          isLockFileMaintenance: true,
+        },
+      })
+    ).not.toBeNull();
+    expect(execSnapshots).toMatchSnapshot();
+  });
 });
diff --git a/lib/manager/poetry/artifacts.ts b/lib/manager/poetry/artifacts.ts
index 7e46960ccba077d53c1cfed62ea7301eed2b4dc3..cbc475c8a7ed29916a6db89d2d16379f02e6cc9d 100644
--- a/lib/manager/poetry/artifacts.ts
+++ b/lib/manager/poetry/artifacts.ts
@@ -1,4 +1,5 @@
 import is from '@sindresorhus/is';
+import fs from 'fs-extra';
 import { exec, ExecOptions } from '../../util/exec';
 import { logger } from '../../logger';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
@@ -13,9 +14,10 @@ export async function updateArtifacts({
   packageFileName,
   updatedDeps,
   newPackageFileContent,
+  config,
 }: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {
   logger.debug(`poetry.updateArtifacts(${packageFileName})`);
-  if (!is.nonEmptyArray(updatedDeps)) {
+  if (!is.nonEmptyArray(updatedDeps) && !config.isLockFileMaintenance) {
     logger.debug('No updated poetry deps - returning null');
     return null;
   }
@@ -36,9 +38,14 @@ export async function updateArtifacts({
   try {
     await writeLocalFile(packageFileName, newPackageFileContent);
     const cmd: string[] = [];
-    for (let i = 0; i < updatedDeps.length; i += 1) {
-      const dep = updatedDeps[i];
-      cmd.push(`poetry update --lock --no-interaction ${dep}`);
+    if (config.isLockFileMaintenance) {
+      await fs.remove(lockFileName);
+      cmd.push('poetry update --lock --no-interaction');
+    } else {
+      for (let i = 0; i < updatedDeps.length; i += 1) {
+        const dep = updatedDeps[i];
+        cmd.push(`poetry update --lock --no-interaction ${dep}`);
+      }
     }
     const execOptions: ExecOptions = {
       subDirectory,
diff --git a/lib/manager/poetry/index.ts b/lib/manager/poetry/index.ts
index d5d3b9c9a8c6ff020de4d6ace8cc5c5593ff3e6c..c7622cab76f8fcd136274e9d58ad0a1e2abbb7e8 100644
--- a/lib/manager/poetry/index.ts
+++ b/lib/manager/poetry/index.ts
@@ -5,4 +5,4 @@ export { updateDependency } from './update';
 export { updateArtifacts } from './artifacts';
 
 export const language = LANGUAGE_PYTHON;
-export const supportsLockFileMaintenance = false;
+export const supportsLockFileMaintenance = true;