diff --git a/src/base_grid.cpp b/src/base_grid.cpp
index 669b91dda63472e6f3c245f0d5e0e2bd36fc6185..274ea6c6f7a0ea0ab0b2ddb056ac0dab514b0a1a 100644
--- a/src/base_grid.cpp
+++ b/src/base_grid.cpp
@@ -1020,11 +1020,11 @@ void BaseGrid::SetByFrame(bool state) {
 	Refresh(false);
 }
 
-void BaseGrid::SetSelectedSet(const Selection &new_selection) {
+void BaseGrid::SetSelectedSet(Selection new_selection) {
 	Selection inserted, removed;
 	set_difference(new_selection, selection, inserted);
 	set_difference(selection, new_selection, removed);
-	selection = new_selection;
+	selection = std::move(new_selection);
 	AnnounceSelectedSetChanged(inserted, removed);
 	Refresh(false);
 }
@@ -1042,9 +1042,9 @@ void BaseGrid::SetActiveLine(AssDialogue *new_line) {
 	extendRow = GetDialogueIndex(new_line);
 }
 
-void BaseGrid::SetSelectionAndActive(Selection const& new_selection, AssDialogue *new_line) {
+void BaseGrid::SetSelectionAndActive(Selection new_selection, AssDialogue *new_line) {
 	BeginBatch();
-	SetSelectedSet(new_selection);
+	SetSelectedSet(std::move(new_selection));
 	SetActiveLine(new_line);
 	EndBatch();
 }
diff --git a/src/base_grid.h b/src/base_grid.h
index 2d829fd04ee4f6a460b150bbaf0f45d5f8121b6a..d187f663a525f325bdd19aba115e5ce5a7e6cb14 100644
--- a/src/base_grid.h
+++ b/src/base_grid.h
@@ -130,10 +130,10 @@ public:
 	// SelectionController implementation
 	void SetActiveLine(AssDialogue *new_line) override;
 	AssDialogue * GetActiveLine() const override { return active_line; }
-	void SetSelectedSet(const Selection &new_selection) override;
+	void SetSelectedSet(Selection new_selection) override;
 	void GetSelectedSet(Selection &res) const override { res = selection; }
 	Selection const& GetSelectedSet() const override { return selection; }
-	void SetSelectionAndActive(Selection const& new_selection, AssDialogue *new_line) override;;
+	void SetSelectionAndActive(Selection new_selection, AssDialogue *new_line) override;;
 	void NextLine() override;
 	void PrevLine() override;
 
diff --git a/src/selection_controller.h b/src/selection_controller.h
index d08dc8c7cc8dda70510360a46811337c6e3adada..7cceaf7f671989a8fe7e2592722d2e525bea29c1 100644
--- a/src/selection_controller.h
+++ b/src/selection_controller.h
@@ -97,7 +97,7 @@ public:
 	/// If no change happens to the selected set, whether because it was refused or
 	/// because the new set was identical to the old set, no change notification may
 	/// be sent.
-	virtual void SetSelectedSet(const Selection &new_selection) = 0;
+	virtual void SetSelectedSet(Selection new_selection) = 0;
 
 	/// @brief Obtain the selected set
 	/// @param[out] selection Filled with the selected set on return
@@ -114,7 +114,7 @@ public:
 	/// This sets both the active line and selected set before announcing the
 	/// change to either of them, and is guaranteed to announce the active line
 	/// change before the selection change.
-	virtual void SetSelectionAndActive(Selection const& new_selection, ItemDataType new_line) = 0;
+	virtual void SetSelectionAndActive(Selection new_selection, ItemDataType new_line) = 0;
 
 	/// @brief Change the active line to the next in sequence
 	///