diff --git a/lib/config/definitions.js b/lib/config/definitions.js
index db7100df41c4989c530382fecb7fe57ce1ad1210..16e58610c9eebeb2e214b6533d0bf6026b7fc7ed 100644
--- a/lib/config/definitions.js
+++ b/lib/config/definitions.js
@@ -1005,6 +1005,29 @@ const options = [
     },
     mergeable: true,
   },
+  {
+    name: 'rust',
+    releaseStatus: 'unpublished',
+    description: 'Configuration option for Rust package management.',
+    stage: 'package',
+    type: 'json',
+    default: {},
+    mergeable: true,
+    cli: false,
+  },
+  {
+    name: 'cargo',
+    releaseStatus: 'unpublished',
+    description: 'Configuration object for Cargo crate renovation.',
+    stage: 'repository',
+    type: 'json',
+    default: {
+      enabled: false,
+      commitMessageTopic: 'Rust crate {{depName}}',
+      managerBranchPrefix: 'rust-',
+    },
+    mergeable: true,
+  },
   {
     name: 'supportPolicy',
     description:
diff --git a/lib/manager/cargo/artifacts.js b/lib/manager/cargo/artifacts.js
new file mode 100644
index 0000000000000000000000000000000000000000..60d8326a0efed233801f48a4b2ebb4c54d521986
--- /dev/null
+++ b/lib/manager/cargo/artifacts.js
@@ -0,0 +1,30 @@
+module.exports = {
+  getArtifacts,
+};
+
+async function getArtifacts(
+  cargoTomlFileName,
+  updatedDeps,
+  newCargoTomlContent,
+  config
+) {
+  await logger.debug({ config }, `cargo.getArtifacts(${cargoTomlFileName})`);
+  let cargoLockFileName;
+  try {
+    cargoLockFileName = cargoTomlFileName.replace(/\.toml$/, '.lock');
+    logger.debug('Updating ' + cargoLockFileName);
+    // TODO: Update cargo lock file
+    return null;
+  } catch (err) {
+    logger.warn(
+      { err, message: err.message },
+      'Failed to update Cargo lock file'
+    );
+    return {
+      lockFileError: {
+        lockFile: cargoLockFileName,
+        stderr: err.message,
+      },
+    };
+  }
+}
diff --git a/lib/manager/cargo/extract.js b/lib/manager/cargo/extract.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ec60ac244b57ee5260f5513f9e5fec5c8dbf0d7
--- /dev/null
+++ b/lib/manager/cargo/extract.js
@@ -0,0 +1,9 @@
+module.exports = {
+  extractPackageFile,
+};
+
+function extractPackageFile(content, fileName) {
+  logger.trace(`cargo.extractPackageFile(${fileName})`);
+  // TODO: Extract cargo.toml dependencies
+  return null;
+}
diff --git a/lib/manager/cargo/index.js b/lib/manager/cargo/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..161560073db1064c84828dcf4b9f8d1b089bc0d8
--- /dev/null
+++ b/lib/manager/cargo/index.js
@@ -0,0 +1,14 @@
+const { extractPackageFile } = require('./extract');
+const { updateDependency } = require('./update');
+const { getArtifacts } = require('./artifacts');
+
+const language = 'rust';
+
+module.exports = {
+  extractPackageFile,
+  getArtifacts,
+  language,
+  updateDependency,
+  // TODO: support this
+  // supportsLockFileMaintenance: true,
+};
diff --git a/lib/manager/cargo/update.js b/lib/manager/cargo/update.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c3fb715ae69ced06b4c4647491538d1bc967d34
--- /dev/null
+++ b/lib/manager/cargo/update.js
@@ -0,0 +1,9 @@
+module.exports = {
+  updateDependency,
+};
+
+function updateDependency(currentFileContent, upgrade) {
+  logger.debug({ config: upgrade }, 'cargo.updateDependency()');
+  // TODO
+  return currentFileContent;
+}
diff --git a/lib/manager/index.js b/lib/manager/index.js
index cecc51d10290b75be905c5f263ec5a9c8491b704..433e1ccf3cbb5e88d75a5db44c0e02eb31f21f0f 100644
--- a/lib/manager/index.js
+++ b/lib/manager/index.js
@@ -1,6 +1,7 @@
 const managerList = [
   'bazel',
   'buildkite',
+  'cargo',
   'circleci',
   'composer',
   'docker-compose',
@@ -23,7 +24,15 @@ for (const manager of managerList) {
   managers[manager] = require(`./${manager}`);
 }
 
-const languageList = ['docker', 'golang', 'js', 'node', 'php', 'python'];
+const languageList = [
+  'docker',
+  'golang',
+  'js',
+  'node',
+  'php',
+  'python',
+  'rust',
+];
 
 const get = (manager, name) => managers[manager][name];
 const getLanguageList = () => languageList;
diff --git a/test/manager/cargo/__snapshots__/artifacts.spec.js.snap b/test/manager/cargo/__snapshots__/artifacts.spec.js.snap
new file mode 100644
index 0000000000000000000000000000000000000000..9ab65d6d65bc49d07d5e3e3b923efa12cca392c9
--- /dev/null
+++ b/test/manager/cargo/__snapshots__/artifacts.spec.js.snap
@@ -0,0 +1,10 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`cargo.getArtifacts() catches errors 1`] = `
+Object {
+  "lockFileError": Object {
+    "lockFile": undefined,
+    "stderr": "Cannot read property 'replace' of undefined",
+  },
+}
+`;
diff --git a/test/manager/cargo/artifacts.spec.js b/test/manager/cargo/artifacts.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c3a9ef6fbe87dfce7ebde2c77837363cfb20659
--- /dev/null
+++ b/test/manager/cargo/artifacts.spec.js
@@ -0,0 +1,16 @@
+const cargo = require('../../../lib/manager/cargo/artifacts');
+
+let config;
+
+describe('cargo.getArtifacts()', () => {
+  beforeEach(() => {
+    jest.resetAllMocks();
+    config = {};
+  });
+  it('returns null by default', async () => {
+    expect(await cargo.getArtifacts('cargo.toml', [], '', config)).toBeNull();
+  });
+  it('catches errors', async () => {
+    expect(await cargo.getArtifacts()).toMatchSnapshot();
+  });
+});
diff --git a/test/manager/cargo/extract.spec.js b/test/manager/cargo/extract.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..a4d7baf917c941b30bbc193a434ff6e5d733399a
--- /dev/null
+++ b/test/manager/cargo/extract.spec.js
@@ -0,0 +1,13 @@
+const { extractPackageFile } = require('../../../lib/manager/cargo/extract');
+
+describe('lib/manager/cargo/extract', () => {
+  describe('extractPackageFile()', () => {
+    let config;
+    beforeEach(() => {
+      config = {};
+    });
+    it('returns null for empty', () => {
+      expect(extractPackageFile('nothing here', config)).toBe(null);
+    });
+  });
+});
diff --git a/test/manager/cargo/update.spec.js b/test/manager/cargo/update.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..148c2484103e777ed6fab25601743adc8189a428
--- /dev/null
+++ b/test/manager/cargo/update.spec.js
@@ -0,0 +1,13 @@
+const { updateDependency } = require('../../../lib/manager/cargo/update');
+
+describe('lib/manager/cargo/update', () => {
+  describe('updateDependency()', () => {
+    let config;
+    beforeEach(() => {
+      config = {};
+    });
+    it('returns same', () => {
+      expect(updateDependency('abc', config)).toEqual('abc');
+    });
+  });
+});
diff --git a/test/workers/repository/extract/__snapshots__/index.spec.js.snap b/test/workers/repository/extract/__snapshots__/index.spec.js.snap
index 47c8d589f6d7449b2a0522ef1a97cd36b6277eb7..81f621ea2c5475cbfc1ebad80bb0eddd06db1bbc 100644
--- a/test/workers/repository/extract/__snapshots__/index.spec.js.snap
+++ b/test/workers/repository/extract/__snapshots__/index.spec.js.snap
@@ -8,6 +8,9 @@ Object {
   "buildkite": Array [
     Object {},
   ],
+  "cargo": Array [
+    Object {},
+  ],
   "circleci": Array [
     Object {},
   ],