diff --git a/include/class.orm.php b/include/class.orm.php
index 63510fade1d3bfc26953d8f5633dceb3a65fe62c..3e8f9830c55f53d446278a6b7a6709f96e43189f 100644
--- a/include/class.orm.php
+++ b/include/class.orm.php
@@ -727,6 +727,21 @@ class VerySimpleModel {
     function getDbFields() {
         return $this->ht;
     }
+
+    /**
+     * Create a new clone of this model. The primary key will be unset and the
+     * object will be set as __new__. The __clone() magic method is reserved
+     * by the buildModel() system, because it clone's a single instance when
+     * hydrating objects from the database.
+     */
+    function copy() {
+        // Drop the PK and set as unsaved
+        $dup = clone $this;
+        foreach ($dup::getMeta('pk') as $f)
+            $dup->__unset($f);
+        $dup->__new__ = true;
+        return $dup;
+    }
 }
 
 /**
@@ -814,7 +829,7 @@ trait WriteableAnnotatedModelTrait {
     }
 
     function __isset($what) {
-        if ($this->__overlay__->__isset($what))
+        if (isset($this->__overlay__) && $this->__overlay__->__isset($what))
             return true;
         return parent::__isset($what);
     }
diff --git a/include/class.queue.php b/include/class.queue.php
index 92ad23ae55f88659acdb2865a3ee57db2dbe3b79..f0994e7b7ff97b68e73e2fb911716425af879b33 100644
--- a/include/class.queue.php
+++ b/include/class.queue.php
@@ -60,6 +60,8 @@ class CustomQueue extends VerySimpleModel {
     const FLAG_INHERIT_SORTING =  0x0020; // Inherit advanced sorting from parent
     const FLAG_INHERIT_DEF_SORT = 0x0040; // Inherit default selected sort
 
+    const FLAG_INHERIT_EVERYTHING = 0x78; // Maskf or all INHERIT flags
+
     var $criteria;
 
     static function queues() {
diff --git a/include/staff/queue.inc.php b/include/staff/queue.inc.php
index 53afb43d5efbbcbdbd8754c2a9ddfde70e497b0e..25ef7faa9876883997381b57d18c0a5a54da44a5 100644
--- a/include/staff/queue.inc.php
+++ b/include/staff/queue.inc.php
@@ -9,6 +9,8 @@ if (!$queue) {
     $queue = CustomQueue::create(array(
         'flags' => CustomQueue::FLAG_QUEUE,
     ));
+}
+if ($queue->__new__) {
     $title=__('Add New Queue');
     $action='create';
     $submit_text=__('Create');
diff --git a/include/staff/templates/queue-tickets.tmpl.php b/include/staff/templates/queue-tickets.tmpl.php
index 69189caf3b0c9c89626277c322cf61daca3f5bd2..f87afe61e18d926b2865a348adee13cc067a0f57 100644
--- a/include/staff/templates/queue-tickets.tmpl.php
+++ b/include/staff/templates/queue-tickets.tmpl.php
@@ -175,6 +175,20 @@ else {
                         </li>
 <?php
 }
+if ($thisstaff->isAdmin()) { ?>
+                        <li>
+                            <a class="no-pjax"
+                            href="queues.php?a=sub&amp;id=<?php echo $queue->id; ?>"><i
+                            class="icon-fixed-width icon-level-down"></i>
+                            <?php echo __('Add Sub Queue'); ?></a>
+                        </li>
+                        <li>
+                            <a class="no-pjax"
+                            href="queues.php?a=clone&amp;id=<?php echo $queue->id; ?>"><i
+                            class="icon-fixed-width icon-copy"></i>
+                            <?php echo __('Clone'); ?></a>
+                        </li>
+<?php }
 if (
     ($thisstaff->isAdmin() && $queue->parent_id)
     || $queue->isPrivate()
diff --git a/scp/queues.php b/scp/queues.php
index 5c41f79d43b166f700c05bbcbf134284e6551f88..c2a641614e47116bcd2cd9efb0ebc38b331d20eb 100644
--- a/scp/queues.php
+++ b/scp/queues.php
@@ -90,6 +90,25 @@ if ($_POST) {
         Http::redirect('settings.php?t=tickets#queues');
     }
 }
+elseif (isset($_GET['a'])
+    && isset($queue) && $queue instanceof CustomQueue
+) {
+    switch (strtolower($_GET['a'])) {
+    case 'clone':
+        $queue = $queue->copy();
+        // Require a new name for the queue
+        unset($queue->title);
+        break;
+    case 'sub':
+        $q = new CustomQueue([
+            'parent' => $queue,
+            'flags' => CustomQueue::FLAG_QUEUE
+                     | CustomQueue::FLAG_INHERIT_EVERYTHING,
+        ]);
+        $queue = $q;
+        break;
+    }
+}
 
 require_once(STAFFINC_DIR.'header.inc.php');
 include_once(STAFFINC_DIR."queue.inc.php");