diff --git a/WHATSNEW.md b/WHATSNEW.md
index 33eeb6cd2180877f5e080dc19c8cb3c05cfec8fe..4812a8892ca4cfa988bb47fe87d3a42362463f16 100644
--- a/WHATSNEW.md
+++ b/WHATSNEW.md
@@ -185,6 +185,22 @@ database engines other than MySQL. The ORM was originally introduced in
 osTicket v1.8.0, but has seen the greatest boost in capability in this release.
 About 47% of the SQL queries are removed between v1.9.7 and v1.10
 
+osTicket v1.9.12
+================
+### Improvements
+  * Fix missing search box adding user to organization (#2431)
+  * Fix incorrect update time on FAQ view in staff portal (194f890)
+  * Fix incorrect parsing of some multi-part MIME messages (fe62226)
+  * Fix auto-claim for new ticket by staff if a filter added a canned response
+    (eca531f)
+  * Fix malformed results on remote user search when adding users (#2335)
+  * Fix search by ticket number on client portal (#2294)
+  * Fix association of user email without a domain to an organization without
+    an email domain setting (#2293)
+
+### Performance and Security
+  * Revert poor performing ticket stats query (#2318)
+
 osTicket v1.9.11
 ================
 *We skipped v1.9.10 to avoid confusion with v1.10 (the major release coming out at the same time)*
diff --git a/account.php b/account.php
index 81f542eb2b46ebf8d953d196ddbb083aa3a54aac..b6f1d04ff144dc256b554d19e3d9eb4b25200960 100644
--- a/account.php
+++ b/account.php
@@ -29,10 +29,12 @@ if (!$cfg || !$cfg->isClientRegistrationEnabled()) {
 elseif ($thisclient) {
     // Guest registering for an account
     if ($thisclient->isGuest()) {
-        foreach ($thisclient->getForms() as $f)
-            if ($f->get('type') == 'U')
+        foreach ($thisclient->getForms() as $f) {
+            if ($f->get('type') == 'U') {
                 $user_form = $f;
-        $user_form->getField('email')->configure('disabled', true);
+                $user_form->getField('email')->configure('disabled', true);
+            }
+        }    
     }
     // Existing client (with an account) updating profile
     else {
diff --git a/include/ajax.orgs.php b/include/ajax.orgs.php
index 0cc098a50ea44a9bb3863b243c2617690cdbdee4..041678c0b1166374afc8715030029cf838695a1c 100644
--- a/include/ajax.orgs.php
+++ b/include/ajax.orgs.php
@@ -138,9 +138,8 @@ class OrgsAjaxAPI extends AjaxController {
         $info['action'] = '#orgs/'.$org->getId().'/add-user';
         $info['onselect'] = 'ajax.php/orgs/'.$org->getId().'/add-user/';
 
-        $info['lookup'] = false;
-        if (AuthenticationBackend::getSearchDirectories())
-            $info['lookup'] = 'remote';
+        if (!AuthenticationBackend::getSearchDirectories())
+            $info['lookup'] = 'local';
 
         if ($_POST) {
             if ($_POST['id']) { //Existing useer
diff --git a/include/class.file.php b/include/class.file.php
index d921d22dd96f61a87833b81d2b2fd60ff42e1fa7..e502ff80507e89c91040de4f099c8e46caddc327 100644
--- a/include/class.file.php
+++ b/include/class.file.php
@@ -835,15 +835,14 @@ class AttachmentChunkedData extends FileStorageBackend {
 
     function write($what, $chunk_size=CHUNK_SIZE) {
         $offset=0;
-        $what = bin2hex($what);
         for (;;) {
-            $block = substr($what, $offset, $chunk_size*2);
+            $block = bin2hex(substr($what, $offset, $chunk_size));
             if (!$block) break;
             if (!db_query('REPLACE INTO '.FILE_CHUNK_TABLE
                     .' SET filedata=0x'.$block.', file_id='
                     .db_input($this->file->getId()).', chunk_id='.db_input($this->_chunk++)))
                 return false;
-            $offset += strlen($block);
+            $offset += strlen($block)/2;
         }
 
         return $this->_chunk;
diff --git a/include/staff/helptopics.inc.php b/include/staff/helptopics.inc.php
index 632716ca1c9703ad252f94750ba85d7d20d53b1d..3116e5016be5744958619a0e3240fcc80c0c3a8c 100644
--- a/include/staff/helptopics.inc.php
+++ b/include/staff/helptopics.inc.php
@@ -94,10 +94,19 @@ $order_by = 'sort';
                 ->limit($pageNav->getLimit())
                 ->offset($pageNav->getStart());
 
+            $T = $topics;
+            $names = $topics = array();
+            foreach ($T as $topic) {
+                $names[$topic->getId()] = $topic->getFullName();
+                $topics[$topic->getId()] = $topic;
+            }
+            $names = Internationalization::sortKeyedList($names);
+
             $defaultDept = $cfg->getDefaultDept();
             $defaultPriority = $cfg->getDefaultPriority();
             $sort = 0;
-            foreach($topics as $topic) {
+            foreach($names as $topic_id=>$name) {
+                $topic = $topics[$topic_id];
                 $id = $topic->getId();
                 $sort++; // Track initial order for transition
                 $sel=false;