diff --git a/elementactions/TagManager_MergeElementAction.php b/elementactions/TagManager_MergeElementAction.php
new file mode 100644
index 0000000..58c8cb8
--- /dev/null
+++ b/elementactions/TagManager_MergeElementAction.php
@@ -0,0 +1,92 @@
+getClassHandle()).',
+ validateSelection: function($selectedElements){ return $selectedElements.length > 1; },
+ });
+
+ $("#TagManager_Merge-actiontrigger").on("click", function() {
+ var elements = Craft.elementIndex.getSelectedElements();
+ var list = $(".merge-tags-list");
+
+ list.empty();
+
+ $.each(elements, function(index, element) {
+ list.append("
" + element.innerText + "");
+ });
+
+ $(document).ready(function() {
+ Craft.initUiElements();
+ });
+
+ $(document).on("click", ".formsubmit", function(ev) {
+ // Code adapted from formsubmit function in craft.js:1411
+
+ var $btn = $(ev.currentTarget);
+ var $form = $("#TagManager_Merge-actiontrigger");
+
+ if ($btn.attr("data-param"))
+ {
+ $("")
+ .attr({
+ name: $btn.attr("data-param"),
+ value: $btn.attr("data-value")
+ })
+ .appendTo($form);
+ }
+
+ $form.submit();
+
+ $("#merge-tags-menu").hide();
+ });
+ });';
+
+ craft()->templates->includeJs($js);
+ craft()->templates->includeCss('h3.merge-tags-intro { padding-top: 14px; }');
+
+ return craft()->templates->render('tagmanager/_mergeTrigger');
+ }
+
+ public function isDestructive()
+ {
+ return true;
+ }
+
+ public function performAction(ElementCriteriaModel $criteria)
+ {
+ $mergeId = $this->getParams()->merge_id;
+ $elementIds = $criteria->ids();
+
+ foreach ($elementIds as $elementId)
+ {
+ if ($elementId != $mergeId) {
+ if (!craft()->elements->mergeElementsByIds($elementId, $mergeId)) {
+ $this->setMessage(Craft::t('An error occurred while merging tags.'));
+ return false;
+ }
+ }
+ }
+
+ // Success!
+ $this->setMessage(Craft::t('Tags merged successfully.'));
+ return true;
+ }
+
+ protected function defineParams()
+ {
+ return array(
+ 'merge_id' => array(AttributeType::Number, 'required' => true)
+ );
+ }
+}
diff --git a/elementtypes/TagManagerElementType.php b/elementtypes/TagManagerElementType.php
index aac2c89..8fb26fe 100644
--- a/elementtypes/TagManagerElementType.php
+++ b/elementtypes/TagManagerElementType.php
@@ -56,6 +56,10 @@ public function getAvailableActions($source = null)
));
$actions[] = $deleteAction;
+ // Merge
+ $mergeAction = craft()->elements->getAction('TagManager_Merge');
+ $actions[] = $mergeAction;
+
// Allow plugins to add additional actions
$allPluginActions = craft()->plugins->call('addTagManagerActions', array($source), true);
foreach ($allPluginActions as $pluginActions) {
diff --git a/templates/_mergeTrigger.twig b/templates/_mergeTrigger.twig
new file mode 100644
index 0000000..4f90677
--- /dev/null
+++ b/templates/_mergeTrigger.twig
@@ -0,0 +1,6 @@
+
+