diff --git a/CHANGELOG.md b/CHANGELOG.md
index 48f24a95e..5345ecf3e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -80,6 +80,7 @@ This section is for changes merged to the `major` branch that are not also merge
- `git` (#4395, #4396, #4592)
- `npm`†
- `python`/`python2`/`python3`
+ - `service`
- `ssh` (#4344)
- `sudo` (see above)
- `yarn`∗†
diff --git a/share/completions/service.fish b/share/completions/service.fish
index 104acfc62..e6def7d54 100644
--- a/share/completions/service.fish
+++ b/share/completions/service.fish
@@ -1,6 +1,19 @@
+set -l service_commands
+
+# as found in __fish_print_service_names.fish
+if test -d /run/systemd/system # Systemd systems
+ set service_commands start stop restart status enable disable
+else if type -f rc-service 2>/dev/null # OpenRC (Gentoo)
+ set service_commands start stop restart
+else if test -d /etc/init.d # SysV on Debian and other linuxen
+ set service_commands start stop "--full-restart"
+else # FreeBSD
+ set service_commands start stop start_once stop_once
+end
+
# Fist argument is the names of the service, i.e. a file in /etc/init.d
-complete -c service -n "test (count (commandline -poc)) = 1" -xa "(__fish_print_service_names)" -d "Service name"
+complete -c service -n "__fish_is_first_token" -xa "(__fish_print_service_names)" -d "Service name"
#The second argument is what action to take with the service
-complete -c service -n "test (count (commandline -poc)) -gt 1" -xa '$__fish_service_commands'
+complete -c service -n "not __fish_is_first_token" -xa "$service_commands"