diff --git a/client/src/main/java/com/mirth/connect/client/ui/ChannelCloneDialog.java b/client/src/main/java/com/mirth/connect/client/ui/ChannelCloneDialog.java
new file mode 100644
index 0000000000..1a1bdbcecb
--- /dev/null
+++ b/client/src/main/java/com/mirth/connect/client/ui/ChannelCloneDialog.java
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) Mirth Corporation. All rights reserved.
+ *
+ * The software in this package is published under the terms of the MPL license.
+ */
+
+package com.mirth.connect.client.ui;
+
+import java.awt.Dimension;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.ListSelectionModel;
+
+import com.mirth.connect.model.Channel;
+import com.mirth.connect.model.ChannelDependency;
+import com.mirth.connect.model.ChannelGroup;
+import com.mirth.connect.model.ChannelTag;
+
+import net.miginfocom.swing.MigLayout;
+import org.apache.commons.lang3.StringUtils;
+
+/** Dialog for selecting which channel associations should be copied during a clone. */
+public class ChannelCloneDialog extends MirthDialog {
+
+ public interface ChannelNameValidator {
+ boolean isValid(String name);
+ }
+
+ public static class Option {
+ private final String id;
+ private final String name;
+
+ public Option(String id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return name == null ? id : name;
+ }
+ }
+
+ private final List