diff --git a/spec/integrations/client_zpty_spec.rb b/spec/integrations/client_zpty_spec.rb
index 8f1550e..e364759 100644
--- a/spec/integrations/client_zpty_spec.rb
+++ b/spec/integrations/client_zpty_spec.rb
@@ -1,10 +1,23 @@
 describe 'a running zpty command' do
   let(:before_sourcing) { -> { session.run_command('zmodload zsh/zpty && zpty -b kitty cat') } }
 
-  it 'is not affected by running zsh-autosuggestions' do
-    sleep 1 # Give a little time for precmd hooks to run
-    session.run_command('zpty -t kitty; echo $?')
+  context 'when sourcing the plugin' do
+    it 'is not affected' do
+      sleep 1 # Give a little time for precmd hooks to run
+      session.run_command('zpty -t kitty; echo $?')
 
-    wait_for { session.content }.to end_with("\n0")
+      wait_for { session.content }.to end_with("\n0")
+    end
+  end
+
+  context 'when using `completion` strategy' do
+    let(:options) { ["ZSH_AUTOSUGGEST_STRATEGY=completion"] }
+
+    it 'is not affected' do
+      session.send_keys('a').send_keys('C-h')
+      session.run_command('zpty -t kitty; echo $?')
+
+      wait_for { session.content }.to end_with("\n0")
+    end
   end
 end
diff --git a/src/strategies/completion.zsh b/src/strategies/completion.zsh
index e8aac6c..6517444 100644
--- a/src/strategies/completion.zsh
+++ b/src/strategies/completion.zsh
@@ -9,6 +9,16 @@
 _zsh_autosuggest_capture_setup() {
 	zmodload zsh/zutil # For `zparseopts`
 
+	# There is a bug in zpty module (fixed in zsh/master) by which a
+	# zpty that exits will kill all zpty processes that were forked
+	# before it. Here we set up a zsh exit hook to SIGKILL the zpty
+	# process immediately, before it has a chance to kill any other
+	# zpty processes.
+	zshexit() {
+		kill -KILL $$
+		sleep 1 # Block for long enough for the signal to come through
+	}
+
 	# Never group stuff!
 	zstyle ':completion:*' list-grouped false
 
diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh
index 40f6f66..644bacf 100644
--- a/zsh-autosuggestions.zsh
+++ b/zsh-autosuggestions.zsh
@@ -506,6 +506,16 @@ zle -N autosuggest-toggle _zsh_autosuggest_widget_toggle
 _zsh_autosuggest_capture_setup() {
 	zmodload zsh/zutil # For `zparseopts`
 
+	# There is a bug in zpty module (fixed in zsh/master) by which a
+	# zpty that exits will kill all zpty processes that were forked
+	# before it. Here we set up a zsh exit hook to SIGKILL the zpty
+	# process immediately, before it has a chance to kill any other
+	# zpty processes.
+	zshexit() {
+		kill -KILL $$
+		sleep 1 # Block for long enough for the signal to come through
+	}
+
 	# Never group stuff!
 	zstyle ':completion:*' list-grouped false