diff --git a/.gitignore b/.gitignore
index 8fad781dbcdb39aa8b8224833618dae2a58999bf..d290fb0dd6157adafa813f74319798438ce5164a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 /plugin
 log
+/lua/.luarc.json
diff --git a/init.lua b/init.lua
index 2219ddcbc583addc70df72c980f23bf20faf98eb..87c3acfd37adb5bec4912cfd1b98aac4a57b2aa7 100644
--- a/init.lua
+++ b/init.lua
@@ -31,6 +31,7 @@ require('codecraft.plugin.lsp.navic')
 require('codecraft.plugin.lsp.lsp')
 require('codecraft.plugin.lsp.completion')
 require('codecraft.plugin.lsp.null-ls')
+require('codecraft.plugin.lsp.rust-tools')
 
 -- DAP
 require('codecraft.plugin.dap.dap')
diff --git a/lua/codecraft/plugin-setup.lua b/lua/codecraft/plugin-setup.lua
index f38750e43fb799746cf246af4498c5ac12d8c2d8..3d0201e2db9daddacf057c477a5c341135f3e727 100644
--- a/lua/codecraft/plugin-setup.lua
+++ b/lua/codecraft/plugin-setup.lua
@@ -26,6 +26,8 @@ require('packer').startup(function(use)
     "SmiteshP/nvim-navic",
     requires = "neovim/nvim-lspconfig"
   }
+  -- Rust tools
+  use 'simrat39/rust-tools.nvim'
   -- Project manager
   use 'ahmedkhalf/project.nvim'
 
diff --git a/lua/codecraft/plugin/lsp/rust-tools.lua b/lua/codecraft/plugin/lsp/rust-tools.lua
new file mode 100644
index 0000000000000000000000000000000000000000..e8199d1dccf09ac3b72a9e2730e719184ab3899d
--- /dev/null
+++ b/lua/codecraft/plugin/lsp/rust-tools.lua
@@ -0,0 +1,68 @@
+local rt = require("rust-tools")
+local mason_registry = require("mason-registry")
+
+local codelldb = mason_registry.get_package("codelldb")
+local extension_path = codelldb:get_install_path() .. "/extension/"
+local codelldb_path = extension_path .. "adapter/codelldb"
+local liblldb_path = extension_path .. "lldb/lib/liblldb.so"
+
+rt.setup({
+    server = {
+    on_attach = function(_, bufnr)
+      -- Hover actions
+      vim.keymap.set("n", "<leader>h", rt.hover_actions.hover_actions, { buffer = bufnr })
+      -- Code action groups
+      vim.keymap.set("n", "<Leader>a", rt.code_action_group.code_action_group, { buffer = bufnr })
+
+
+    local nmap = function(keys, func, desc)
+      if desc then
+        desc = 'LSP: ' .. desc
+      end
+
+      vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
+    end
+
+    if _.server_capabilities.documentSymbolProvider then
+      require('nvim-navic').attach(_, bufnr)
+    end
+
+    nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
+    nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction')
+    nmap('<leader>di', vim.diagnostic.open_float, '[D]iagnostic [I]nfo')
+    nmap('<leader>dv', '<cmd>Telescope diagnostics<CR>', '[D]iagnostic [V]iew')
+
+    nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition')
+    nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
+    nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation')
+    nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
+    nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
+    nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
+
+    -- See `:help K` for why this keymap
+    nmap('<leader>K', vim.lsp.buf.hover, 'Hover Documentation')
+    nmap('<leader>k', vim.lsp.buf.signature_help, 'Signature Documentation')
+
+    -- Lesser used LSP functionality
+    nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
+    nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
+    nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
+    nmap('<leader>wl', function()
+      print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+    end, '[W]orkspace [L]ist Folders')
+
+    -- Create a command `:Format` local to the LSP buffer
+    vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
+        vim.lsp.buf.format()
+      end, { desc = 'Format current buffer with LSP' })
+    end,
+  },
+  tools = {
+    hover_actions = {
+      auto_focus = true,
+    }
+  },
+    dap = {
+    adapter = require("rust-tools.dap").get_codelldb_adapter(codelldb_path, liblldb_path),
+  },
+})