return {
	{
		"akinsho/git-conflict.nvim",
		event = { "InsertEnter", "CursorHold" },
		config = function()
			require("git-conflict").setup({
				default_mappings = false,
				disable_diagnostics = true,
			})
			if require("core.util").is_available("which-key") then
				require("which-key").add({ "<localleader>h", group = "git" })
			end
			local map = vim.keymap.set
			map("n", "<localleader>ho", "<Plug>(git-conflict-ours)", { desc = "Conflict use ours" })
			map("n", "<localleader>hO", "<Plug>(git-conflict-theirs)", { desc = "Conflict use theirs" })
			map("n", "<localleader>hm", "<Plug>(git-conflict-both)", { desc = "Conflict use both" })
			map("n", "<localleader>hM", "<Plug>(git-conflict-none)", { desc = "Conflict use none" })
			map("n", "[H", "<Plug>(git-conflict-prev-conflict)", { desc = "Prev git conflict" })
			map("n", "]H", "<Plug>(git-conflict-next-conflict)", { desc = "Next git conflict" })
		end,
		lazy = false, -- TODO needs to be force refreshed in lazy loaded mode unfortunately
	},
	{
		"lewis6991/gitsigns.nvim", -- show vcs changes on left-hand gutter
		event = { "InsertEnter", "CursorHold" },
		cmd = "Gitsigns",
		config = function()
			require("gitsigns").setup({
				numhl = true,
				signcolumn = false,
				on_attach = function(bufnr)
					local gs = package.loaded.gitsigns

					local function map(mode, l, r, opts)
						opts = opts or {}
						opts.buffer = bufnr
						vim.keymap.set(mode, l, r, opts)
					end

					-- Navigation
					map("n", "]h", function()
						if vim.wo.diff then
							return "]h"
						end
						vim.schedule(function()
							gs.next_hunk()
						end)
						return "<Ignore>"
					end, { expr = true, desc = "Next git hunk" })

					map("n", "[h", function()
						if vim.wo.diff then
							return "[h"
						end
						vim.schedule(function()
							gs.prev_hunk()
						end)
						return "<Ignore>"
					end, { expr = true, desc = "Previous git hunk" })

					-- Actions
					if require("core.util").is_available("which-key") then
						require("which-key").add({ "<localleader>h", group = "git" })
					end
					map({ "n", "v" }, "<localleader>hs", ":Gitsigns stage_hunk<CR>", { desc = "stage hunk" })
					map({ "n", "v" }, "<localleader>hr", ":Gitsigns reset_hunk<CR>", { desc = "reset hunk" })
					map("n", "<localleader>hS", gs.stage_buffer, { desc = "stage buffer" })
					map("n", "<localleader>hu", gs.undo_stage_hunk, { desc = "undo stage hunk" })
					map("n", "<localleader>hR", gs.reset_buffer, { desc = "reset buffer" })
					map("n", "<localleader>hp", gs.preview_hunk, { desc = "preview hunk" })
					map("n", "<localleader>hb", function()
						gs.blame_line({ full = true })
					end, { desc = "blame line" })
					map("n", "<localleader>hB", gs.toggle_current_line_blame, { desc = "toggle blame" })
					map("n", "<localleader>hd", gs.diffthis, { desc = "diffthis" })
					map("n", "<localleader>hD", function()
						gs.diffthis("~")
					end, { desc = "diffbase" })
					map("n", "<localleader>ht", gs.toggle_deleted, { desc = "toggle deleted" })

					-- Text object
					map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>")
					map({ "o", "x" }, "ah", ":<C-U>Gitsigns select_hunk<CR>")
				end,
			})
		end,
	},
}
