Index: /branches/release-33/lib/MT/CMS/Template.pm
===================================================================
--- /branches/release-33/lib/MT/CMS/Template.pm (revision 1743)
+++ /branches/release-33/lib/MT/CMS/Template.pm (revision 1770)
@@ -573,4 +573,5 @@
     $params->{refreshed} = $app->param('refreshed');
     $params->{published} = $app->param('published');
+    $params->{saved_copied} = $app->param('saved_copied');
 
     # determine list of system template types:
@@ -1773,4 +1774,48 @@
 }
 
+sub clone_templates {
+    my ($app) = @_;
+
+    my $user = $app->user;
+    my $perms = $app->permissions;
+    return $app->error(
+        $app->translate(
+            "Permission denied.")
+      )
+      #TODO: system level-designer permission
+      unless $user->is_superuser() || $user->can_edit_templates()
+      || ( $perms
+        && ( $perms->can_edit_templates()
+          || $perms->can_administer_blog ) );
+
+    my @id = $app->param('id');
+    require MT::Template;
+    foreach my $tmpl_id (@id) {
+        my $tmpl = MT::Template->load($tmpl_id);
+        next unless $tmpl;
+
+        my $new_tmpl = $tmpl->clone({
+            Except => {
+                id => 1,
+                name => 1,
+                identifier => 1,
+            },
+        });
+
+        my $new_basename = $app->translate("Copy of [_1]", $tmpl->name);
+        my $new_name = $new_basename;
+        my $i = 0;
+        while (MT::Template->count({ name => $new_name, blog_id => $tmpl->blog_id })) {
+            $new_name = $new_basename . ' (' . ++$i . ')';
+        }
+
+        $new_tmpl->name($new_name);
+        $new_tmpl->save;
+    }
+
+    $app->add_return_arg( 'saved_copied' => 1 );
+    $app->call_return;
+}
+
 sub publish_index_templates {
     my $app = shift;
Index: /branches/release-33/lib/MT/App/CMS.pm
===================================================================
--- /branches/release-33/lib/MT/App/CMS.pm (revision 1715)
+++ /branches/release-33/lib/MT/App/CMS.pm (revision 1770)
@@ -623,10 +623,10 @@
             refresh_tmpl_templates => {
                 label => "Refresh Template(s)",
-                handler => '$Core::MT::CMS::Template::refresh_individual_templates',
+                code => "${pkg}Template::refresh_individual_templateE",
                 permission => 'edit_templates',
             },
             publish_index_templates => {
                 label => "Publish Template(s)",
-                handler => '$Core::MT::CMS::Blog::publish_index_templates',
+                code => "${pkg}Blog::publish_index_templates",
                 permission => 'rebuild',
                 condition => sub {
@@ -640,4 +640,9 @@
                          ;
                 },
+            },
+            copy_templates => {
+                label => "Clone Template(s)",
+                code => "${pkg}Template::clone_templates",
+                permission => 'edit_templates',
             },
         },
Index: /branches/release-33/tmpl/cms/list_template.tmpl
===================================================================
--- /branches/release-33/tmpl/cms/list_template.tmpl (revision 1632)
+++ /branches/release-33/tmpl/cms/list_template.tmpl (revision 1770)
@@ -91,4 +91,11 @@
         </mtapp:statusmsg>
     </mt:if>
+    <mt:if name="saved_copied">
+        <mtapp:statusmsg
+            id="saved-copied"
+            class="success">
+            <__trans phrase="Selected template(s) has been copied.">
+        </mtapp:statusmsg>
+    </mt:if>
 </mt:setvarblock>
 
