diff --git a/CHANGELOG.md b/CHANGELOG.md
index b46553636e..aa1cda4163 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 * use `GIT_DIR` and `GIT_WORK_DIR` from environment if set ([#1191](https://github.com/extrawurst/gitui/pull/1191))
 * new [FAQ](./FAQ.md)s page
 * mention macports in install section [[@fs111](https://github.com/fs111)]([#1237](https://github.com/extrawurst/gitui/pull/1237))
+* support copy to clipboard on wayland ([#397](https://github.com/extrawurst/gitui/issues/397))
 
 ### Fixed
 * opening tags list without remotes ([#1111](https://github.com/extrawurst/gitui/issues/1111))
diff --git a/Cargo.toml b/Cargo.toml
index ad3f1c3d7e..7a20cf12d4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -50,8 +50,6 @@ tui = { version = "0.18", default-features = false, features = ['crossterm', 'se
 unicode-segmentation = "1.9"
 unicode-truncate = "0.2"
 unicode-width = "0.1"
-
-[target.'cfg(all(target_family="unix",not(target_os="macos")))'.dependencies]
 which = "4.2"
 
 # pprof is not available on windows
diff --git a/src/clipboard.rs b/src/clipboard.rs
index a7ab23fa09..fcb6af126f 100644
--- a/src/clipboard.rs
+++ b/src/clipboard.rs
@@ -1,14 +1,20 @@
 use anyhow::{anyhow, Result};
-#[cfg(target_family = "unix")]
-#[cfg(not(target_os = "macos"))]
-use std::ffi::OsStr;
 use std::io::Write;
+use std::path::PathBuf;
 use std::process::{Command, Stdio};
+use which::which;
 
-fn execute_copy_command(command: Command, text: &str) -> Result<()> {
-	let mut command = command;
+fn exec_copy_with_args(
+	command: &str,
+	args: &[&str],
+	text: &str,
+) -> Result<()> {
+	let binary = which(command)
+		.ok()
+		.unwrap_or_else(|| PathBuf::from(command));
 
-	let mut process = command
+	let mut process = Command::new(binary)
+		.args(args)
 		.stdin(Stdio::piped())
 		.stdout(Stdio::null())
 		.spawn()
@@ -28,47 +34,35 @@ fn execute_copy_command(command: Command, text: &str) -> Result<()> {
 	Ok(())
 }
 
-#[cfg(all(target_family = "unix", not(target_os = "macos")))]
-fn gen_command(
-	path: impl AsRef<OsStr>,
-	xclip_syntax: bool,
-) -> Command {
-	let mut c = Command::new(path);
-	if xclip_syntax {
-		c.arg("-selection");
-		c.arg("clipboard");
-	} else {
-		c.arg("--clipboard");
-	}
-	c
+fn exec_copy(command: &str, text: &str) -> Result<()> {
+	exec_copy_with_args(command, &[], text)
 }
 
 #[cfg(all(target_family = "unix", not(target_os = "macos")))]
-pub fn copy_string(string: &str) -> Result<()> {
-	use std::path::PathBuf;
-	use which::which;
-	let (path, xclip_syntax) = which("xclip").ok().map_or_else(
-		|| {
-			(
-				which("xsel")
-					.ok()
-					.unwrap_or_else(|| PathBuf::from("xsel")),
-				false,
-			)
-		},
-		|path| (path, true),
-	);
+pub fn copy_string(text: &str) -> Result<()> {
+	if std::env::var("WAYLAND_DISPLAY").is_ok() {
+		return exec_copy("wl-copy", text);
+	}
 
-	let cmd = gen_command(path, xclip_syntax);
-	execute_copy_command(cmd, string)
+	if exec_copy_with_args(
+		"xclip",
+		&["-selection", "clipboard"],
+		text,
+	)
+	.is_err()
+	{
+		return exec_copy_with_args("xsel", &["--clipboard"], text);
+	}
+
+	Ok(())
 }
 
 #[cfg(target_os = "macos")]
-pub fn copy_string(string: &str) -> Result<()> {
-	execute_copy_command(Command::new("pbcopy"), string)
+pub fn copy_string(text: &str) -> Result<()> {
+	exec_copy("pbcopy", text)
 }
 
 #[cfg(windows)]
-pub fn copy_string(string: &str) -> Result<()> {
-	execute_copy_command(Command::new("clip"), string)
+pub fn copy_string(text: &str) -> Result<()> {
+	exec_copy("clip", text)
 }