diff --git a/roles/neovim/files/after/plugin/dial.lua b/roles/neovim/files/after/plugin/dial.lua
new file mode 100644
index 00000000..0b4d1098
--- /dev/null
+++ b/roles/neovim/files/after/plugin/dial.lua
@@ -0,0 +1,52 @@
+local status_ok, dial_config = pcall(require, "dial.config")
+if not status_ok then
+  return
+end
+
+local augend = require "dial.augend"
+
+dial_config.augends:register_group {
+  visual = {
+    augend.integer.alias.decimal,
+    augend.integer.alias.hex,
+    augend.date.alias["%Y/%m/%d"],
+    augend.constant.alias.alpha,
+    augend.constant.alias.Alpha,
+  },
+
+  mygroup = {
+    augend.constant.new {
+      elements = { "TRUE", "FALSE" },
+      word = true,
+      cyclic = true,
+    },
+
+    augend.constant.new {
+      elements = { "public", "protected", "private" },
+      word = true,
+      cyclic = true,
+    },
+
+    augend.constant.new {
+      elements = { "&&", "||" },
+      word = false,
+      cyclic = true,
+    },
+
+    augend.date.alias["%d/%m/%Y"],
+    augend.constant.alias.bool, -- boolean value (true <-> false)
+    augend.integer.alias.decimal,
+    augend.integer.alias.hex,
+    augend.semver.alias.semver
+  },
+}
+
+local dial_map = require "dial.map"
+
+local nmap = require "opdavies.keymap".nmap
+local vmap = require "opdavies.keymap".vmap
+
+nmap({ "<C-a>", dial_map.inc_normal "mygroup" })
+nmap({ "<C-x>", dial_map.dec_normal "mygroup" })
+vmap({ "<C-a>", dial_map.inc_normal "visual" })
+vmap({ "<C-x>", dial_map.dec_normal "visual" })
diff --git a/roles/neovim/files/after/plugin/todo-comments.lua b/roles/neovim/files/after/plugin/todo-comments.lua
new file mode 100644
index 00000000..3de9789c
--- /dev/null
+++ b/roles/neovim/files/after/plugin/todo-comments.lua
@@ -0,0 +1,6 @@
+local status_ok, todo_comments = pcall(require, "todo-comments")
+if not status_ok then
+  return
+end
+
+todo_comments.setup {}
diff --git a/roles/neovim/files/after/plugin/treesitter.lua b/roles/neovim/files/after/plugin/treesitter.lua
index 1d5d8ea6..41eb8493 100644
--- a/roles/neovim/files/after/plugin/treesitter.lua
+++ b/roles/neovim/files/after/plugin/treesitter.lua
@@ -15,4 +15,7 @@ configs.setup {
     disable = { "yaml" },
     enable = true,
   },
+  matchup = {
+    enable = true,
+  }
 }
diff --git a/roles/neovim/files/init.lua b/roles/neovim/files/init.lua
index efa5e5c2..30da42cd 100644
--- a/roles/neovim/files/init.lua
+++ b/roles/neovim/files/init.lua
@@ -1,3 +1,5 @@
+require "impatient"
+
 require "opdavies.globals"
 
 require("opdavies.options").setup()
diff --git a/roles/neovim/files/lua/opdavies/plugins.lua b/roles/neovim/files/lua/opdavies/plugins.lua
index f36bc574..a48b9523 100644
--- a/roles/neovim/files/lua/opdavies/plugins.lua
+++ b/roles/neovim/files/lua/opdavies/plugins.lua
@@ -17,10 +17,12 @@ return packer.startup(function()
   use "wbthomason/packer.nvim"
 
   -- Utilities
+  use "andymass/vim-matchup"
   use "cakebaker/scss-syntax.vim"
   use "christoomey/vim-sort-motion"
   use "christoomey/vim-tmux-navigator"
   use "editorconfig/editorconfig-vim"
+  use "folke/todo-comments.nvim"
   use "folke/twilight.nvim"
   use "folke/zen-mode.nvim"
   use "icatalina/vim-case-change"
@@ -28,9 +30,11 @@ return packer.startup(function()
   use "kazhala/close-buffers.nvim"
   use "kyazdani42/nvim-web-devicons"
   use "lewis6991/gitsigns.nvim"
+  use "lewis6991/impatient.nvim"
   use "lukas-reineke/indent-blankline.nvim"
   use "machakann/vim-highlightedyank"
   use "miyakogi/seiya.vim"
+  use "monaqa/dial.nvim"
   use "norcalli/nvim-colorizer.lua"
   use "numToStr/Comment.nvim"
   use "nvim-lua/plenary.nvim"
@@ -39,6 +43,7 @@ return packer.startup(function()
   use "sheerun/vim-polyglot"
   use "theprimeagen/refactoring.nvim"
   use "tjdevries/express_line.nvim"
+  use "tpope/vim-repeat"
   use "tpope/vim-surround"
   use "vim-test/vim-test"
   use "voldikss/vim-floaterm"