diff --git a/module/VuFindConsole/src/VuFindConsole/Controller/UtilController.php b/module/VuFindConsole/src/VuFindConsole/Controller/UtilController.php
deleted file mode 100644
index a8ec063a756655c4d05795b5f24a030f1ebf8271..0000000000000000000000000000000000000000
--- a/module/VuFindConsole/src/VuFindConsole/Controller/UtilController.php
+++ /dev/null
@@ -1,1088 +0,0 @@
-<?php
-/**
- * CLI Controller Module
- *
- * PHP version 7
- *
- * Copyright (C) Villanova University 2010.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- *
- * @category VuFind
- * @package  Controller
- * @author   Chris Hallberg <challber@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development:plugins:controllers Wiki
- */
-namespace VuFindConsole\Controller;
-
-use File_MARC;
-use File_MARCXML;
-use Laminas\Console\Console;
-use Laminas\Crypt\BlockCipher as BlockCipher;
-use Laminas\Crypt\Symmetric\Openssl;
-use VuFind\Config\Locator as ConfigLocator;
-use VuFind\Config\Writer as ConfigWriter;
-use VuFind\Sitemap\Generator as Sitemap;
-use VuFindSearch\Backend\Solr\Document\UpdateDocument;
-use VuFindSearch\Backend\Solr\Record\SerializableRecord;
-
-/**
- * This controller handles various command-line tools
- *
- * @category VuFind
- * @package  Controller
- * @author   Chris Hallberg <challber@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development:plugins:controllers Wiki
- */
-class UtilController extends AbstractBase
-{
-    /**
-     * Display help for the index reserves action.
-     *
-     * @param string $msg Extra message to display
-     *
-     * @return \Laminas\Console\Response
-     */
-    protected function indexReservesHelp($msg = '')
-    {
-        if (!empty($msg)) {
-            foreach (explode("\n", $msg) as $line) {
-                Console::writeLine($line);
-            }
-            Console::writeLine('');
-        }
-
-        Console::writeLine('Course reserves index builder');
-        Console::writeLine('');
-        Console::writeLine(
-            'If run with no options, this will attempt to load data from your ILS.'
-        );
-        Console::writeLine('');
-        Console::writeLine(
-            'Switches may be used to index from delimited files instead:'
-        );
-        Console::writeLine('');
-        Console::writeLine(
-            ' -f [filename] loads a file (may be repeated for multiple files)'
-        );
-        Console::writeLine(
-            ' -d [delimiter] specifies a delimiter (comma is default)'
-        );
-        Console::writeLine(
-            ' -t [template] provides a template showing where important values'
-        );
-        Console::writeLine(
-            '     can be found within the file.  The template is a comma-'
-        );
-        Console::writeLine('     separated list of values.  Choose from:');
-        Console::writeLine('          BIB_ID     - bibliographic ID');
-        Console::writeLine('          COURSE     - course name');
-        Console::writeLine('          DEPARTMENT - department name');
-        Console::writeLine('          INSTRUCTOR - instructor name');
-        Console::writeLine('          SKIP       - ignore data in this position');
-        Console::writeLine(
-            '     Default template is BIB_ID,COURSE,INSTRUCTOR,DEPARTMENT'
-        );
-        Console::writeLine(' -h or --help display this help information.');
-
-        return $this->getFailureResponse();
-    }
-
-    /**
-     * Build the Reserves index.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function indexreservesAction()
-    {
-        ini_set('memory_limit', '50M');
-        ini_set('max_execution_time', '3600');
-
-        $request = $this->getRequest();
-
-        if ($request->getParam('h') || $request->getParam('help')) {
-            return $this->indexReservesHelp();
-        } elseif ($file = $request->getParam('f')) {
-            try {
-                $delimiter = $request->getParam('d', ',');
-                $template = $request->getParam('t');
-                $reader = new \VuFind\Reserves\CsvReader(
-                    $file, $delimiter, $template
-                );
-                $instructors = $reader->getInstructors();
-                $courses = $reader->getCourses();
-                $departments = $reader->getDepartments();
-                $reserves = $reader->getReserves();
-            } catch (\Exception $e) {
-                return $this->indexReservesHelp($e->getMessage());
-            }
-        } elseif ($request->getParam('d')) {
-            return $this->indexReservesHelp('-d is meaningless without -f');
-        } elseif ($request->getParam('t')) {
-            return $this->indexReservesHelp('-t is meaningless without -f');
-        } else {
-            try {
-                // Connect to ILS and load data:
-                $catalog = $this->getILS();
-                $instructors = $catalog->getInstructors();
-                $courses = $catalog->getCourses();
-                $departments = $catalog->getDepartments();
-                $reserves = $catalog->findReserves('', '', '');
-            } catch (\Exception $e) {
-                return $this->indexReservesHelp($e->getMessage());
-            }
-        }
-
-        // Make sure we have reserves and at least one of: instructors, courses,
-        // departments:
-        if ((!empty($instructors) || !empty($courses) || !empty($departments))
-            && !empty($reserves)
-        ) {
-            // Setup Solr Connection
-            $solr = $this->serviceLocator->get(\VuFind\Solr\Writer::class);
-
-            // Delete existing records
-            $solr->deleteAll('SolrReserves');
-
-            // Build and Save the index
-            $index = $this->buildReservesIndex(
-                $instructors, $courses, $departments, $reserves
-            );
-            $solr->save('SolrReserves', $index);
-
-            // Commit and Optimize the Solr Index
-            $solr->commit('SolrReserves');
-            $solr->optimize('SolrReserves');
-
-            Console::writeLine('Successfully loaded ' . count($reserves) . ' rows.');
-            return $this->getSuccessResponse();
-        }
-        return $this->indexReservesHelp('Unable to load data.');
-    }
-
-    /**
-     * Build the reserves index from date returned by the ILS driver,
-     * specifically: getInstructors, getDepartments, getCourses, findReserves
-     *
-     * @param array $instructors Array of instructors $instructor_id => $instructor
-     * @param array $courses     Array of courses     $course_id => $course
-     * @param array $departments Array of department  $dept_id => $department
-     * @param array $reserves    Array of reserves records from driver's
-     * findReserves.
-     *
-     * @return UpdateDocument
-     */
-    protected function buildReservesIndex($instructors, $courses, $departments,
-        $reserves
-    ) {
-        $requiredKeys = ['INSTRUCTOR_ID', 'COURSE_ID', 'DEPARTMENT_ID'];
-        foreach ($reserves as $record) {
-            $requiredKeysFound
-                = count(array_intersect(array_keys($record), $requiredKeys));
-            if ($requiredKeysFound < count($requiredKeys)) {
-                throw new \Exception(
-                    implode(' and/or ', $requiredKeys) . ' fields ' .
-                    'not present in reserve records. Please update ILS driver.'
-                );
-            }
-            $instructor_id = $record['INSTRUCTOR_ID'];
-            $course_id = $record['COURSE_ID'];
-            $department_id = $record['DEPARTMENT_ID'];
-            $id = $course_id . '|' . $instructor_id . '|' . $department_id;
-
-            if (!isset($index[$id])) {
-                $index[$id] = [
-                    'id' => $id,
-                    'bib_id' => [],
-                    'instructor_id' => $instructor_id,
-                    'instructor' => $instructors[$instructor_id] ?? '',
-                    'course_id' => $course_id,
-                    'course' => $courses[$course_id] ?? '',
-                    'department_id' => $department_id,
-                    'department' => $departments[$department_id] ?? ''
-                ];
-            }
-            $index[$id]['bib_id'][] = $record['BIB_ID'];
-        }
-
-        $updates = new UpdateDocument();
-        foreach ($index as $id => $data) {
-            if (!empty($data['bib_id'])) {
-                $updates->addRecord(new SerializableRecord($data));
-            }
-        }
-        return $updates;
-    }
-
-    /**
-     * Commit the Solr index.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function commitAction()
-    {
-        return $this->performCommit();
-    }
-
-    /**
-     * Optimize the Solr index.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function optimizeAction()
-    {
-        return $this->performCommit(true);
-    }
-
-    /**
-     * Commit (and possibly optimize) the Solr index.
-     *
-     * @param bool $optimize Should we optimize?
-     *
-     * @return \Laminas\Console\Response
-     */
-    protected function performCommit($optimize = false)
-    {
-        ini_set('memory_limit', '50M');
-        ini_set('max_execution_time', '3600');
-
-        // Setup Solr Connection -- Allow core to be specified from command line.
-        $core = $this->getRequest()->getParam('core', 'Solr');
-
-        // Commit and Optimize the Solr Index
-        $solr = $this->serviceLocator->get(\VuFind\Solr\Writer::class);
-        $solr->commit($core);
-        if ($optimize) {
-            $solr->optimize($core);
-        }
-        return $this->getSuccessResponse();
-    }
-
-    /**
-     * Generate a Sitemap
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function sitemapAction()
-    {
-        $request = $this->getRequest();
-        if ($request->getParam('help') || $request->getParam('h')) {
-            Console::writeLine('Generate sitemap files.');
-            Console::writeLine('');
-            Console::writeLine(
-                'Optional parameters: [--verbose] [--baseurl=url]'
-                . ' [--basesitemapurl=url]'
-            );
-            Console::writeLine('');
-            Console::writeLine('  verbose: turn on detailed feedback');
-            Console::writeLine(
-                '  baseurl: define the base url (overrides the url setting in'
-                . ' Site section of config.ini)'
-            );
-            Console::writeLine(
-                '  basesitemapurl: define the base sitemap url (overrides the url'
-                . ' setting in Site section of config.ini, or baseSitemapUrl in'
-                . ' sitemap.ini)'
-            );
-            Console::writeLine('');
-            return $this->getFailureResponse();
-        }
-
-        // Build sitemap and display appropriate warnings if needed:
-        $generator = $this->serviceLocator->get(\VuFind\Sitemap\Generator::class);
-        $request = $this->getRequest();
-        $generator->setVerbose($request->getParam('verbose', false));
-        if ($url = $request->getParam('baseurl', false)) {
-            $generator->setBaseUrl($url);
-        }
-        if ($sitemapUrl = $request->getParam('basesitemapurl', false)) {
-            $generator->setBaseSitemapUrl($sitemapUrl);
-        }
-        $generator->generate();
-        foreach ($generator->getWarnings() as $warning) {
-            Console::writeLine("$warning");
-        }
-        return $this->getSuccessResponse();
-    }
-
-    /**
-     * Command-line tool to batch-delete records from the Solr index.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function deletesAction()
-    {
-        // Parse the command line parameters -- check verbosity, see if we are in
-        // "flat file" mode, find out what file we are reading in, and determine
-        // the index we are affecting!
-        $request = $this->getRequest();
-        $verbose = $request->getParam('verbose');
-        $filename = $request->getParam('filename');
-        $mode = $request->getParam('format', 'marc');
-        $index = $request->getParam('index', 'Solr');
-
-        // No filename specified?  Give usage guidelines:
-        if (empty($filename)) {
-            $scriptName = $this->getRequest()->getScriptName();
-            if (substr($scriptName, -9) === 'index.php') {
-                $scriptName .= ' util deletes';
-            }
-            Console::writeLine("Delete records from VuFind's index.");
-            Console::writeLine('');
-            Console::writeLine(
-                'Usage: ' . $scriptName . ' [--verbose] FILENAME FORMAT INDEX'
-            );
-            Console::writeLine('');
-            Console::writeLine(
-                'The optional --verbose switch turns on detailed feedback.'
-            );
-            Console::writeLine(
-                'FILENAME is the file containing records to delete.'
-            );
-            Console::writeLine(
-                'FORMAT is the format of the file -- '
-                . 'it may be one of the following:'
-            );
-            Console::writeLine(
-                "\tflat - flat text format "
-                . '(deletes all IDs in newline-delimited file)'
-            );
-            Console::writeLine(
-                "\tmarc - binary MARC format (delete all record IDs from 001 fields)"
-            );
-            Console::writeLine(
-                "\tmarcxml - MARC-XML format (delete all record IDs from 001 fields)"
-            );
-            Console::writeLine(
-                '"marc" is used by default if no format is specified.'
-            );
-            Console::writeLine('INDEX is the index to use (default = Solr)');
-            return $this->getFailureResponse();
-        }
-
-        // File doesn't exist?
-        if (!file_exists($filename)) {
-            Console::writeLine("Cannot find file: {$filename}");
-            return $this->getFailureResponse();
-        }
-
-        // Build list of records to delete:
-        $ids = [];
-
-        // Flat file mode:
-        if ($verbose) {
-            Console::writeLine("Loading IDs in {$mode} mode.");
-        }
-        if ($mode == 'flat') {
-            foreach (explode("\n", file_get_contents($filename)) as $id) {
-                $id = trim($id);
-                if (!empty($id)) {
-                    $ids[] = $id;
-                }
-            }
-        } else {
-            // MARC file mode...  We need to load the MARC record differently if it's
-            // XML or binary:
-            $collection = ($mode == 'marcxml')
-                ? new File_MARCXML($filename) : new File_MARC($filename);
-
-            // Once the records are loaded, the rest of the logic is always the same:
-            $missingIdCount = 0;
-            while ($record = $collection->next()) {
-                $idField = $record->getField('001');
-                if ($idField) {
-                    $ids[] = (string)$idField->getData();
-                } else {
-                    $missingIdCount++;
-                }
-            }
-            if ($verbose && $missingIdCount) {
-                Console::writeLine(
-                    "Encountered $missingIdCount record(s) without IDs."
-                );
-            }
-        }
-
-        // Delete, Commit and Optimize if necessary:
-        if (!empty($ids)) {
-            if ($verbose) {
-                Console::writeLine(
-                    'Attempting to delete ' . count($ids) . ' record(s): '
-                    . implode(', ', $ids)
-                );
-            }
-            $writer = $this->serviceLocator->get(\VuFind\Solr\Writer::class);
-            $writer->deleteRecords($index, $ids);
-            if ($verbose) {
-                Console::writeLine('Delete operation completed.');
-            }
-        } elseif ($verbose) {
-            Console::writeLine('Nothing to delete.');
-        }
-
-        return $this->getSuccessResponse();
-    }
-
-    /**
-     * Command-line tool to clear unwanted entries
-     * from record cache table.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function cleanuprecordcacheAction()
-    {
-        $request = $this->getRequest();
-        if ($request->getParam('help') || $request->getParam('h')) {
-            Console::writeLine('Clean up unused cached records from the database.');
-            return $this->getFailureResponse();
-        }
-
-        $recordTable = $this->serviceLocator
-            ->get(\VuFind\Db\Table\PluginManager::class)
-            ->get('Record');
-
-        $count = $recordTable->cleanup();
-
-        Console::writeLine("$count records deleted.");
-        return $this->getSuccessResponse();
-    }
-
-    /**
-     * Display help for the search or session expiration actions
-     *
-     * @param string $rows Plural name of records to delete
-     *
-     * @return \Laminas\Console\Response
-     */
-    protected function expirationHelp($rows)
-    {
-        Console::writeLine("Expire old $rows in the database.");
-        Console::writeLine('');
-        Console::writeLine(
-            'Optional parameters: [--batch=size] [--sleep=time] [age]'
-        );
-        Console::writeLine('');
-        Console::writeLine(
-            '  batch: number of records to delete in a single batch'
-            . ' (default 1000)'
-        );
-        Console::writeLine(
-            '  sleep: milliseconds to sleep between batches (default 100)'
-        );
-
-        Console::writeLine(
-            "  age: the age (in days) of $rows to expire (default 2)"
-        );
-        Console::writeLine('');
-        Console::writeLine(
-            "By default, $rows more than 2 days old will be removed."
-        );
-        return $this->getFailureResponse();
-    }
-
-    /**
-     * Command-line tool to clear unwanted entries
-     * from search history database table.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function expiresearchesAction()
-    {
-        $request = $this->getRequest();
-        if ($request->getParam('help') || $request->getParam('h')) {
-            return $this->expirationHelp('searches');
-        }
-
-        return $this->expire(
-            'Search',
-            '%%count%% expired searches deleted.',
-            'No expired searches to delete.'
-        );
-    }
-
-    /**
-     * Command-line tool to clear unwanted entries
-     * from session database table.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function expiresessionsAction()
-    {
-        $request = $this->getRequest();
-        if ($request->getParam('help') || $request->getParam('h')) {
-            return $this->expirationHelp('sessions');
-        }
-
-        return $this->expire(
-            'Session',
-            '%%count%% expired sessions deleted.',
-            'No expired sessions to delete.'
-        );
-    }
-
-    /**
-     * Command-line tool to clear unwanted entries
-     * from external_session database table.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function expireExternalSessionsAction()
-    {
-        $request = $this->getRequest();
-        if ($request->getParam('help') || $request->getParam('h')) {
-            return $this->expirationHelp('external sessions');
-        }
-
-        return $this->expire(
-            'ExternalSession',
-            '%%count%% expired external sessions deleted.',
-            'No expired external sessions to delete.'
-        );
-    }
-
-    /**
-     * Command-line tool to clear unwanted entries
-     * from auth_hash database table.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function expireauthhashesAction()
-    {
-        $request = $this->getRequest();
-        if ($request->getParam('help') || $request->getParam('h')) {
-            return $this->expirationHelp('authentication hashes');
-        }
-
-        return $this->expire(
-            \VuFind\Db\Table\AuthHash::class,
-            '%%count%% expired authentication hashes deleted.',
-            'No expired authentication hashes to delete.'
-        );
-    }
-
-    /**
-     * Command-line tool to delete suppressed records from the index.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function suppressedAction()
-    {
-        $request = $this->getRequest();
-        if ($request->getParam('help') || $request->getParam('h')) {
-            Console::writeLine('Available switches:');
-            Console::writeLine(
-                '--authorities =>'
-                . ' Delete authority records instead of bibliographic records'
-            );
-            Console::writeLine('--help or -h => Show this message');
-            Console::writeLine(
-                '--outfile=[/path/to/file] => Write the ID list to the specified'
-                . ' file instead of updating Solr (optional)'
-            );
-            return $this->getFailureResponse();
-        }
-
-        // Setup Solr Connection
-        $backend = $request->getParam('authorities') ? 'SolrAuth' : 'Solr';
-
-        // Make ILS Connection
-        try {
-            $catalog = $this->getILS();
-            $result = ($backend == 'SolrAuth')
-                ? $catalog->getSuppressedAuthorityRecords()
-                : $catalog->getSuppressedRecords();
-        } catch (\Exception $e) {
-            Console::writeLine("ILS error -- " . $e->getMessage());
-            return $this->getFailureResponse();
-        }
-
-        // Validate result:
-        if (!is_array($result)) {
-            Console::writeLine("Could not obtain suppressed record list from ILS.");
-            return $this->getFailureResponse();
-        } elseif (empty($result)) {
-            Console::writeLine("No suppressed records to delete.");
-            return $this->getSuccessResponse();
-        }
-
-        // If 'outfile' set, write the list
-        if ($file = $request->getParam('outfile')) {
-            if (!file_put_contents($file, implode("\n", $result))) {
-                Console::writeLine("Problem writing to $file");
-                return $this->getFailureResponse();
-            }
-        } else {
-            // Default behavior: Get Suppressed Records and Delete from index
-            $solr = $this->serviceLocator->get(\VuFind\Solr\Writer::class);
-            $solr->deleteRecords($backend, $result);
-            $solr->commit($backend);
-            $solr->optimize($backend);
-        }
-        return $this->getSuccessResponse();
-    }
-
-    /**
-     * Tool to synchronize language files
-     *
-     * @return \Zend\Console\Response
-     */
-    public function synclangfilesAction()
-    {
-        $this->checkLocalSetting();
-
-        $this->consoleOpts->addRules(
-            [
-                'h|help' => 'Get help',
-                'enable-comments' => 'Write output as ini comments',
-                'enable-fallback' => 'Enable fallback languages',
-                'ignore-local-dir' => 'ignore VUFIND_LOCAL_DIR',
-                'write-keys' => 'Write keys of language files as translation',
-                'write-to-ini' => 'Write missing lines directly to .ini files',
-            ]
-        );
-
-        if ($this->consoleOpts->getOption('h')
-            || $this->consoleOpts->getOption('help')
-        ) {
-            Console::writeLine('Synchronize language files.');
-            Console::writeLine('');
-            Console::writeLine(
-                'Options:'
-            );
-            Console::writeLine(
-                '--help             this output.'
-            );
-            Console::writeLine(
-                '--enable-comments  write output as ini comments (disabled by default).'
-            );
-            Console::writeLine(
-                '--enable-fallback  fallback languages are enabled (by default, fallback logic is overriden).'
-            );
-            Console::writeLine(
-                '--ignore-local-dir ignore VUFIND_LOCAL_DIR if set and only sync language files in VUFIND_HOME/languages.'
-            );
-            Console::writeLine(
-                '--write-keys       write language file keys as translation (write translation by default).'
-            );
-            Console::writeLine(
-                '--write-to-ini     write missing lines directly into .ini files (writes to stdout by default).'
-            );
-            return $this->getFailureResponse();
-        }
-
-        $config = $this->getServiceLocator()->get('VuFind\Config')->get('config');
-
-        $pathStack = [
-            APPLICATION_PATH  . '/languages'
-        ];
-        if (!$this->consoleOpts->getOption('ignore-local-dir') && LOCAL_OVERRIDE_DIR != '')
-            $pathStack[] = LOCAL_OVERRIDE_DIR . '/languages';
-
-        $fallbackLocales = $config->Site->language == 'en'
-            ? 'en'
-            : [$config->Site->language, 'en'];
-
-        $languageFile = new \VuFind\I18n\Translator\Loader\ExtendedIni(
-            $pathStack,
-            ($this->consoleOpts->getOption('enable-fallback')
-                ? $fallbackLocales : [])
-        );
-
-        $languages = $config->Languages->toArray();
-
-        $diffArray = [];
-
-        foreach ($languages as $lang => $value) {
-            if (is_array($fallbackLocales)) {
-                foreach ($fallbackLocales as $fallback) {
-                    if ($fallback != $lang) {
-                        $dataLang = $languageFile->load($lang, null);
-                        $dataFallback = $languageFile->load($fallback, null);
-                        $diffArray[$fallback][$lang] = array_diff_key($dataFallback->getArrayCopy(), $dataLang->getArrayCopy());
-                    }
-                }
-            } else {
-                if ($fallbackLocales != $lang) {
-                    $dataLang = $languageFile->load($lang, null);
-                    $dataFallback = $languageFile->load($fallbackLocales, null);
-                    $diffArray[$fallbackLocales][$lang] = array_diff_key($dataFallback->getArrayCopy(), $dataLang->getArrayCopy());
-                }
-            }
-        }
-
-        if (!empty ($diffArray)) {
-            foreach ($diffArray as $referenceLang => $targetLang) {
-                foreach ($targetLang as $lang => $messages) {
-                    if (count($messages)) {
-                        $counter = 0;
-
-                        if ($this->consoleOpts->getOption('write-to-ini')) {
-                            if ($this->consoleOpts->getOption('ignore-local-dir') &&
-                                file_exists($pathStack[0] . "/" . $lang . ".ini")) {
-                                $writerPath = "file://" . $pathStack[0] . "/" . $lang . ".ini";
-                            } elseif (!$this->consoleOpts->getOption('ignore-local-dir') &&
-                                file_exists($pathStack[1] . "/" . $lang . ".ini")) {
-                                $writerPath = "file://" . $pathStack[1] . "/" . $lang . ".ini";
-                            } else {
-                                $writerPath = "php://stdout";
-                            }
-                        } else {
-                            $writerPath = "php://stdout";
-                        }
-                        $writer = new \Zend\Log\Writer\Stream($writerPath);
-                        $writer->setFormatter(
-                            new \Zend\Log\Formatter\Simple('%message%')
-                        );
-
-                        $logger = new Logger();
-                        $logger->addWriter($writer);
-                        $logger->info(";------");
-                        $logger->info(";missing lines from " . $referenceLang . ".ini (compiled from files in " . implode(', ', $pathStack) . ")"
-                            . ($this->consoleOpts->getOption('write-to-ini') ? '' : ' in ' . $lang . '.ini'));
-                        $logger->info(";------");
-
-                        foreach($messages as $key => $message) {
-                            if ($key != "@parent_ini") {
-                                $counter++;
-                                if ($this->consoleOpts->getOption('write-keys')) {
-                                    $logger->info(
-                                        ($this->consoleOpts->getOption('enable-comments') ? ";" : "") .
-                                        $key. " = " . $key);
-                                } else {
-                                    $logger->info(
-                                        ($this->consoleOpts->getOption('enable-comments') ? ";" : "") .
-                                        $key. " = " . $message);
-                                }
-                            }
-                        }
-
-                        if ($this->consoleOpts->getOption('write-to-ini')) {
-                            Console::writeLine('Added ' . $counter . ' lines from ' . $referenceLang . '.ini (compiled from files in ' . implode(', ', $pathStack) . ') to ' . $writerPath);
-                        }
-                        unset($logger);
-                        unset($writer);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Tool to auto-fill hierarchy cache.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function createhierarchytreesAction()
-    {
-        $request = $this->getRequest();
-        if ($request->getParam('help') || $request->getParam('h')) {
-            $scriptName = $this->getRequest()->getScriptName();
-            if (substr($scriptName, -9) === 'index.php') {
-                $scriptName .= ' util createHierarchyTrees';
-            }
-            Console::writeLine(
-                'Usage: ' . $scriptName
-                . ' [<backend>] [--skip-xml or -sx] [--skip-json or -sj]'
-                . ' [--help or -h]'
-            );
-            Console::writeLine(
-                "\t<backend> => Search backend, e.g. " . DEFAULT_SEARCH_BACKEND
-                . " (default) or Search2"
-            );
-            Console::writeLine("\t--skip-xml or -sx => Skip the XML cache");
-            Console::writeLine("\t--skip-json or -sj => Skip the JSON cache");
-            Console::writeLine("\t--help or -h => Show this message");
-            return $this->getFailureResponse();
-        }
-        $skipJson = $request->getParam('skip-json') || $request->getParam('sj');
-        $skipXml = $request->getParam('skip-xml') || $request->getParam('sx');
-        $backendId = $request->getParam('backend') ?? DEFAULT_SEARCH_BACKEND;
-        $recordLoader = $this->serviceLocator->get(\VuFind\Record\Loader::class);
-        $hierarchies = $this->serviceLocator
-            ->get(\VuFind\Search\Results\PluginManager::class)->get($backendId)
-            ->getFullFieldFacets(['hierarchy_top_id']);
-        if (!isset($hierarchies['hierarchy_top_id']['data']['list'])) {
-            $hierarchies['hierarchy_top_id']['data']['list'] = [];
-        }
-        foreach ($hierarchies['hierarchy_top_id']['data']['list'] as $hierarchy) {
-            $recordid = $hierarchy['value'];
-            $count = $hierarchy['count'];
-            if (empty($recordid)) {
-                continue;
-            }
-            Console::writeLine(
-                "\tBuilding tree for " . $recordid . '... '
-                . number_format($count) . ' records'
-            );
-            try {
-                $driver = $recordLoader->load($recordid, $backendId);
-                // Only do this if the record is actually a hierarchy type record
-                if ($driver->getHierarchyType()) {
-                    // JSON
-                    if (!$skipJson) {
-                        Console::writeLine("\t\tJSON cache...");
-                        $driver->getHierarchyDriver()->getTreeSource()->getJSON(
-                            $recordid, ['refresh' => true]
-                        );
-                    } else {
-                        Console::writeLine("\t\tJSON skipped.");
-                    }
-                    // XML
-                    if (!$skipXml) {
-                        Console::writeLine("\t\tXML cache...");
-                        $driver->getHierarchyDriver()->getTreeSource()->getXML(
-                            $recordid, ['refresh' => true]
-                        );
-                    } else {
-                        Console::writeLine("\t\tXML skipped.");
-                    }
-                }
-            } catch (\VuFind\Exception\RecordMissing $e) {
-                Console::writeLine(
-                    'WARNING! - Caught exception: ' . $e->getMessage() . "\n"
-                );
-            }
-        }
-        Console::writeLine(
-            count($hierarchies['hierarchy_top_id']['data']['list']) . ' files'
-        );
-
-        return $this->getSuccessResponse();
-    }
-
-    /**
-     * Compile CSS files from LESS.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function cssbuilderAction()
-    {
-        $compiler = new \VuFindTheme\LessCompiler(true);
-        $cacheManager = $this->serviceLocator->get(\VuFind\Cache\Manager::class);
-        $cacheDir = $cacheManager->getCacheDir() . 'less/';
-        $compiler->setTempPath($cacheDir);
-        $compiler->compile(array_unique($this->getRequest()->getParam('themes')));
-        return $this->getSuccessResponse();
-    }
-
-    /**
-     * Abstract delete method.
-     *
-     * @param string    $tableName     Table to operate on.
-     * @param string    $successString String for reporting success.
-     * @param string    $failString    String for reporting failure.
-     * @param int|float $minAge        Minimum age allowed for expiration in days
-     * (also used as default value).
-     *
-     * @return mixed
-     */
-    protected function expire($tableName, $successString, $failString, $minAge = 2)
-    {
-        // Get command-line arguments
-        $request = $this->getRequest();
-
-        // Use command line value as expiration age, or default to $minAge.
-        $daysOld = floatval($request->getParam('daysOld', $minAge));
-
-        // Use command line values for batch size and sleep time if specified.
-        $batchSize = $request->getParam('batch', 1000);
-        $sleepTime = $request->getParam('sleep', 100);
-
-        // Abort if we have an invalid expiration age.
-        if ($daysOld < $minAge) {
-            Console::writeLine(
-                str_replace(
-                    '%%age%%', $minAge,
-                    'Expiration age must be at least %%age%% days.'
-                )
-            );
-            return $this->getFailureResponse();
-        }
-
-        // Delete the expired rows--this cleans up any junk left in the database
-        // e.g. from old searches or sessions that were not caught by the session
-        // garbage collector.
-        $table = $this->getTable($tableName);
-        if (!method_exists($table, 'getExpiredIdRange')) {
-            throw new \Exception("$tableName does not support getExpiredIdRange()");
-        }
-        if (!method_exists($table, 'deleteExpired')) {
-            throw new \Exception("$tableName does not support deleteExpired()");
-        }
-
-        $idRange = $table->getExpiredIdRange($daysOld);
-        if (false === $idRange) {
-            $this->timestampedMessage($failString);
-            return $this->getSuccessResponse();
-        }
-
-        // Delete records in batches
-        for ($batch = $idRange[0]; $batch <= $idRange[1]; $batch += $batchSize) {
-            $count = $table->deleteExpired(
-                $daysOld, $batch, $batch + $batchSize - 1
-            );
-            $this->timestampedMessage(
-                str_replace('%%count%%', $count, $successString)
-            );
-            // Be nice to others and wait between batches
-            if ($batch + $batchSize <= $idRange[1]) {
-                usleep($sleepTime * 1000);
-            }
-        }
-        return $this->getSuccessResponse();
-    }
-
-    /**
-     * Print a message with a time stamp to the console
-     *
-     * @param string $msg Message
-     *
-     * @return void
-     */
-    protected function timestampedMessage($msg)
-    {
-        Console::writeLine('[' . date('Y-m-d H:i:s') . '] ' . $msg);
-    }
-
-    /**
-     * Convert hash algorithms
-     * Expected parameters: oldmethod:oldkey (or none) newmethod:newkey
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function switchdbhashAction()
-    {
-        // Validate command line arguments:
-        $request = $this->getRequest();
-        $newhash = $request->getParam('newhash');
-        if (empty($newhash)) {
-            Console::writeLine(
-                'Expected parameters: newmethod [newkey]'
-            );
-            return $this->getFailureResponse();
-        }
-
-        // Pull existing encryption settings from the configuration:
-        $config = $this->getConfig();
-        if (!isset($config->Authentication->encrypt_ils_password)
-            || !isset($config->Authentication->ils_encryption_key)
-            || !$config->Authentication->encrypt_ils_password
-        ) {
-            $oldhash = 'none';
-            $oldkey = null;
-        } else {
-            $oldhash = isset($config->Authentication->ils_encryption_algo)
-                ? $config->Authentication->ils_encryption_algo : 'blowfish';
-            $oldkey = $config->Authentication->ils_encryption_key;
-        }
-
-        // Pull new encryption settings from arguments:
-        $newkey = $request->getParam('newkey', $oldkey);
-
-        // No key specified AND no key on file = fatal error:
-        if ($newkey === null) {
-            Console::writeLine('Please specify a key as the second parameter.');
-            return $this->getFailureResponse();
-        }
-
-        // If no changes were requested, abort early:
-        if ($oldkey == $newkey && $oldhash == $newhash) {
-            Console::writeLine('No changes requested -- no action needed.');
-            return $this->getSuccessResponse();
-        }
-
-        // Initialize Openssl first, so we can catch any illegal algorithms before
-        // making any changes:
-        try {
-            if ($oldhash != 'none') {
-                $oldCrypt = new Openssl(['algorithm' => $oldhash]);
-            }
-            $newCrypt = new Openssl(['algorithm' => $newhash]);
-        } catch (\Exception $e) {
-            Console::writeLine($e->getMessage());
-            return $this->getFailureResponse();
-        }
-
-        // Next update the config file, so if we are unable to write the file,
-        // we don't go ahead and make unwanted changes to the database:
-        $configPath = ConfigLocator::getLocalConfigPath('config.ini', null, true);
-        Console::writeLine("\tUpdating $configPath...");
-        $writer = new ConfigWriter($configPath);
-        $writer->set('Authentication', 'encrypt_ils_password', true);
-        $writer->set('Authentication', 'ils_encryption_algo', $newhash);
-        $writer->set('Authentication', 'ils_encryption_key', $newkey);
-        if (!$writer->save()) {
-            Console::writeLine("\tWrite failed!");
-            return $this->getFailureResponse();
-        }
-
-        // Now do the database rewrite:
-        $userTable = $this->serviceLocator
-            ->get(\VuFind\Db\Table\PluginManager::class)
-            ->get('User');
-        $users = $userTable->select(
-            function ($select) {
-                $select->where->isNotNull('cat_username');
-            }
-        );
-        Console::writeLine("\tConverting hashes for " . count($users) . ' user(s).');
-        foreach ($users as $row) {
-            $pass = null;
-            if ($oldhash != 'none' && isset($row['cat_pass_enc'])) {
-                $oldcipher = new BlockCipher($oldCrypt);
-                $oldcipher->setKey($oldkey);
-                $pass = $oldcipher->decrypt($row['cat_pass_enc']);
-            } else {
-                $pass = $row['cat_password'];
-            }
-            $newcipher = new BlockCipher($newCrypt);
-            $newcipher->setKey($newkey);
-            $row['cat_password'] = null;
-            $row['cat_pass_enc'] = $newcipher->encrypt($pass);
-            $row->save();
-        }
-
-        // If we got this far, all went well!
-        Console::writeLine("\tFinished.");
-        return $this->getSuccessResponse();
-    }
-
-    /**
-     * Lint a file of MARC records.
-     *
-     * @return \Laminas\Console\Response
-     */
-    public function lintmarcAction()
-    {
-        $request = $this->getRequest();
-        $filename = $request->getParam('filename');
-        $marc = substr($filename, -3) !== 'xml'
-            ? new File_MARC($filename) : new File_MARCXML($filename);
-        $linter = new \File_MARC_Lint();
-        $i = 0;
-        while ($record = $marc->next()) {
-            $i++;
-            $field001 = $record->getField('001');
-            $field001 = $field001 ? (string)$field001->getData() : 'undefined';
-            Console::writeLine("Checking record $i (001 = $field001)...");
-            $warnings = $linter->checkRecord($record);
-            if (count($warnings) > 0) {
-                Console::writeLine('Warnings: ' . implode("\n", $warnings));
-            }
-        }
-        return $this->getSuccessResponse();
-    }
-}
diff --git a/themes/root/templates/HelpTranslations/tr/advsearch.phtml b/themes/root/templates/HelpTranslations/tr/advsearch.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..b69f06fa5c807bff935eecff3bc8dedad7487ddb
--- /dev/null
+++ b/themes/root/templates/HelpTranslations/tr/advsearch.phtml
@@ -0,0 +1,33 @@
+<h1>Gelişmiş Arama İpuçları</h1>
+
+<ul class="HelpMenu">
+  <li><a href="#Search Fields">Arama Alanları</a></li>
+  <li><a href="#Search Groups">Arama Grupları</a></li>
+</ul>
+
+<dl class="Content">
+  <dt><a name="Search Fields"></a>Arama Alanları</dt>
+  <dd>
+    <p>Gelişmiş Arama sayfasını ilk ziyaret ettiğinizde, size birçok arama alanı sunulacak. Her bir alanda aramak istediğiniz anahtar kelimeleri girebilirsiniz. Arama işlerine izin verilmiştir.<a href="Home?topic=search">Arama operatörlerine</a> izin verilmiştir.</p>
+    <p>Her bir alanda aradığınız verinin (eser adı, yazar, vs.) türünü belirlemenize imkan veren bir açılır liste mevcuttur. Arama türlerini istediğiniz şekilde karıştırabilir ve eşleyebilirsiniz. </p>
+    <p>&quot;Eşleme&quot; ayarı çoklu arama alanlarının nasıl kullanılması gerektiğini belirlemenize imkan verir. </p>
+    <ul>
+      <li>TÜM Terimler – Sadece her arama alanıyla eşleşen kayıtları geri getirir. </li>
+      <li>HERHANGİ BİR Terim – En az bir arama alanıyla eşleşen her hangi bir kaydı geri getirir. </li>
+      <li>Terim YOK – Arama alanlarıyla eşleşenlerin HARİCİNDEKİ tüm kayıtları geri getirir.</li>
+    </ul>
+    <p>&quot;Arama Alanı Ekle&quot; butonu forma ek arama alanları eklemek için kullanılabilir. İstediğiniz kadar arama alanı kullanabilirsiniz. </p>
+  </dd>
+  
+  <dt><a name="Search Groups"></a>Arama Grupları</dt>
+  <dd>
+    <p>Belirli kompleks aramalar için, tek arama alanı yeterli olmayabilir. Örneğin, Çin ya da Hindistan tarihi hakkında kitaplar bulmak istiyorsunuz. Çin, Hindistan ve Tarihi için TÜM terimler araması yaparsanız,  arama sonuçlarında sadece Çin VE Hindistan ile ilgili kitaplar görürsünüz. HERHANGİ BİR terim araması yaparsanız, sonuçlarda Çin veya Hindistan tarihiyle ilgisi olmayan kitapları görürsünüz. </p>
+    <p>Arama Grupları çoklu arama alan gruplarından araştırmalar oluşturmak için bir yol sağlar. &quot;Arama Grubu Ekle&quot; butonuna her tıkladığınızda, yeni bir alan grubu eklenir. Çoklu arama gruplarınız olduğunda, &quot;Arama Grubunu Sil&quot; butonuyla istenmeyen grupları silebilirsiniz ve HERHANGİ BİR ya da TÜM arama gruplarını eşleştirmek isteyip istemediğinizi belirleyebilirsiniz. </p>
+    <p>Yukarıda ifade edilen Çin ya da Hindistan tarihi örneğinde, sorunu arama gruplarını kullanarak şu şekilde çözebilirsiniz: </p>
+    <ul>
+      <li>İlk arama grubunda, &quot;Hindistan&quot; ve &quot;Çin&quot;i giriniz ve &quot;Eşleme&quot; ayarının &quot;HERHANGİ BİR Terim&quot;de olduğundan emin olunuz.</li>
+      <li>Ä°kinci arama grubunu ekleyiniz ve &quot;tarihi&quot; giriniz.</li>
+      <li>Arama Grupları başlığının yanındaki eşleme ayarının &quot;TÜM Gruplara&quot; ayarlandığından emin olunuz. </li>
+    </ul>
+  </dd>
+</dl>
diff --git a/themes/root/templates/HelpTranslations/tr/search.phtml b/themes/root/templates/HelpTranslations/tr/search.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..a4f288455f3afc98a45909ed1a6c034961262ca6
--- /dev/null
+++ b/themes/root/templates/HelpTranslations/tr/search.phtml
@@ -0,0 +1,116 @@
+<h1>Faydalı Arama İpuçları</h1>
+
+<ul class="HelpMenu">
+  <li><a href="#Wildcard Searches">Joker Aramaları</a></li>
+  <li><a href="#Fuzzy Searches">Bulanık Aramalar</a></li>
+  <li><a href="#Proximity Searches">Yakınlık Aramaları</a></li>
+  <li><a href="#Range Searches">Aralık Aramaları</a></li>
+  <li><a href="#Boosting a Term">Bir Terimi Artırma</a></li>
+  <li><a href="#Boolean operators">Boolean Operatörleri</a>
+    <ul>
+      <li><a href="#AND">AND</a></li>
+      <li><a href="#+">+</a></li>
+      <li><a href="#OR">OR</a></li>
+      <li><a href="#NOT">NOT</a></li>
+      <li><a href="#-">-</a></li>
+    </ul>
+  </li>
+</ul>
+
+<dl class="Content">
+  <dt><a name="Wildcard Searches"></a>Joker Aramaları</dt>
+  <dd>
+    <p>Tek karakterli bir belirsiz arama gerçekleştirmek için,  ? sembolünü kullanınız.</p>
+    <p>Örneğin, &quot;text&quot; ya da &quot;test&quot; aramak için, şu aramayı kullanabilirsiniz: </p>
+    <pre class="code">te?t</pre>
+    <p>Çoklu karakter, 0 ya da daha fazla belgisiz arama gerçekleştirmek için * sembolünü kullanınız.</p>
+    <p>Örneğin, test, tests ya da tester aramak için, şu aramayı  kullanabilirsiniz: </p>
+<pre class="code">test*</pre>
+    <p>Bir terimin ortasında belgisiz aramaları kullanabilirsiniz. </p>
+    <pre class="code">te*t</pre>
+    <p>Not:   Aramanın ilk karakteri olarak * ya da ? sembolünü kullanamazsınız. </p>
+  </dd>
+  
+  <dt><a name="Fuzzy Searches"></a>Bulanık Aramalar</dt>
+  <dd>
+    <p>Tek kelimelik bir terimin sonunda  ~ (yaklaşık işareti) sembolünü kullanınız.  Örneğin, &quot;roam&quot;a yazım olarak benzer bir terimi aramak için, belgisiz aramayı kullanınız: </p>
+    <pre class="code">roam~</pre>
+    <p>Bu arama foam ve roams gibi terimler bulacaktır. .</p>
+    <p>Ek bir parametre gerekli benzerliği belirleyebilir. Değer sadece daha yüksek benzerliklerin eşleşeceği terimlerle 1'e yakın bir değerde olup 0 ile 1 arasındadır. Örneğin:</p>
+    <pre class="code">roam~0.8</pre>
+    <p>Parametre 0.5 olarak verilmezse, varsayılan kullanılır. </p>
+  </dd>
+  
+  <dt><a name="Proximity Searches"></a>Yakınlık Aramaları</dt>
+  <dd>
+    <p>
+      Çoklu bir kelime teriminin sonunda  ~ (yaklaşık işareti) sembolünü kullanınız.  Örneğin, yaklaşık 10 kelimelik economics ve keynesi aramak için:  
+    </p>
+    <pre class="code">"economics Keynes"~10</pre>
+  </dd>
+  
+  {literal}
+  <dt><a name="Range Searches"></a>Aralık Aramaları</dt>
+  <dd>
+    <p>
+      Aralık aramalarını gerçekleştirmek için,  { } karakterlerini kullanabilirsiniz. Örneğin, A, B, ya da C ile başlayan bir terimi aramak için: </p>
+    <pre class="code">{A TO C}</pre>
+    <p>
+      Aynısı Yıl olarak sayısal alanlarla yapılabilir: 
+    </p>
+    <pre class="code">[2002 TO 2003]</pre>
+  </dd>
+  {/literal}
+  
+  <dt><a name="Boosting a Term"></a>Bir Terimi Artırma</dt>
+  <dd>
+    <p>
+      Bir terime daha fazla değer uygularsanız,  ^ karakterini kullanabilirsiniz. Örneğin, aşağıdaki aramayı deneyebilirsiniz: </p>
+    <pre class="code">economics Keynes^5</pre>
+    <p>Hangisi &quot;Keynes&quot; terimine daha çok değer yükleyecek </p>
+  </dd>
+  
+  <dt><a name="Boolean operators"></a>Boolean Operatörleri</dt>
+  <dd>
+    <p>
+      Boolean terimlere, mantık işlemcileriyle birleşmesine imkan verir.  Aşağıdaki operatörlere imkan tanınmıştır:  <strong>AND</strong>, <strong>+</strong>, <strong>OR</strong>, <strong>NOT</strong> ve<strong>-</strong>.
+    </p>
+    <p>Not: Boolean işlemcilerinin HEPSİ BÜYÜK HARFLE olmalıdır.</p>
+    <dl>
+      <dt><a name="AND"></a>AND</dt>
+      <dd>
+        <p>AND operatörü varsayılan birleşme işlemcisidir. Bu, iki terim arasında Boolean operatörü yoksa AND operatörünün kullanılacağı anlamına gelir. AND operatörü her iki terimin kayıt alanının her hangi bir yerinde mevcut olan kayıtları eşler.</p>
+        <p>&quot;economics&quot; ve &quot;Keynes&quot; içeren kayıtları aramak için,  şu sorguyu kullanınız: </p>
+        <pre class="code">economics Keynes</pre>
+        <p>or</p>
+        <pre class="code">economics AND Keynes</pre>
+      </dd>
+      <dt><a name="+"></a>+</dt>
+      <dd>
+        <p>&quot;+&quot; ya da gerekli işlemci, &quot;+&quot; sembolünden sonraki terimin kayıt alanının her hangi bir yerinde mevcut olmasını gerektirir. </p>
+        <p>&quot;economics&quot; içermesi gereken kayıtları aramak için ve &quot;Keynes&quot; içerebilen kayıtları aramak için, şu sorguyu kullanınız: </p>
+        <pre class="code">+economics Keynes</pre>
+      </dd>
+      <dt><a name="OR"></a>OR</dt>
+      <dd>
+        <p>OR operatörü iki terimi birbirine bağlar ve her iki terimden biri kayıtta mevcutsa eşleme kaydını bulur.</p>
+        <p>&quot;economics Keynes&quot; ya da sadece &quot;Keynes&quot; içeren belgeleri aramak için, şu sorguyu kullanınız: </p>
+        <pre class="code">"economics Keynes" OR Keynes</pre>
+      </dd>
+      <dt><a name="NOT"></a>NOT</dt>
+      <dd>
+        <p>NOT operatörü NOT'dan sonra yazılan terimlerin kayıtlarını hariç tutar.</p>
+        <p>&quot;Keynes&quot;in dışında &quot;economics&quot; içeren belgeleri aramak için, şu sorguyu kullanınız: </p>
+        <pre class="code">economics NOT Keynes</pre>
+        <p>Not: NOT operatörü sadece bir terim olarak kullanılamaz. Örneğin, aşağıdaki aramada sonuç çıkmayacaktır: </p>
+        <pre class="code">NOT economics</pre>
+      </dd>
+      <dt><a name="-"></a>-</dt>
+      <dd>
+        <p>- ya da önleme işlemcisi , &quot;-&quot; sembolünden sonra yazılan terimlerin kayıtlarını hariç tutar.</p>
+        <p>&quot;Keynes&quot;in dışında &quot;economics&quot; içeren belgeleri aramak için, şu sorguyu kullanınız: </p>
+        <pre class="code">economics -Keynes</pre>
+      </dd>
+    </dl>
+  </dd>
+</dl>
diff --git a/themes/root/templates/HelpTranslations/tr/tag.phtml b/themes/root/templates/HelpTranslations/tr/tag.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..0bce36fbee0798621f8a86b310b82e18ce111acc
--- /dev/null
+++ b/themes/root/templates/HelpTranslations/tr/tag.phtml
@@ -0,0 +1,14 @@
+<h1>Etiketmele</h1>
+
+<p>
+Bir etiket, bir bilgi parçası (resim, yazı veya video klibi gibi) ile ilgili ya da atanmış olan, böylelikle materyali açıklayan ve uygulanan bilgilerin anahtar kelime tabanlı sınıflandırılmasını sağlayan ilişkili bir anahtar kelime ya da terimdir.
+</p>
+
+<p>
+Etiketler genellikle materyalin yazarı/oluşturucusu tarafından gayri resmi ve şahsen seçilir. Yani genellikle bazen biçimsel olarak tanımlanmış sınıflandırma düzeninin bir parçası olarak değil.  Etiketler genellikle bilgisayar dosyaları, web sayfaları, dijital görüntüler ve internet yer imleri (hem sosyal imleme servisleri hem de yeni nesil tarayıcılar içerisinde bkz. Flock) gibi çevrim içi kaynaklar için dinamik, esnek, otomatik olarak oluşturulan internet sınıflandırmalarında kullanılır. Bu nedenle etiketleme, Web 2.0 buzz ile ilişkili olmuştur.
+</p>
+
+<p>
+Genellikle, bir materyalin bazı sınıflandırma yazılımı veya sisteminin bir parçası olarak kendisi ile ilişkili birden fazla &quot;etiketlemeleri&quot; olacaktır. Yazılım, anahtar kelime etiketlerini paylaşan diğer materyallere hatta belirtilen bir etiket topluluğuna bağlantı sağlayacaktır. Bu, materyaller içerisinde koleksiyonun yöneticisi tarafından en az çaba ve planlama ile değiştirilmesi ve materyallerin birden fazla tarama yöntemi ile taranması imkânı vermesini sağlar. </p>
+
+<a href="http://en.wikipedia.org/wiki/Tag_%28metadata%29">Wikipedia'dan</a>
\ No newline at end of file
diff --git a/themes/sandal/scss/colors.scss b/themes/sandal/scss/colors.scss
index 6eb6c5f569d3cf1ec4551487b3317564e388c54d..97d43ff093cd9f119a1a466320e8f9b8f288af49 100644
--- a/themes/sandal/scss/colors.scss
+++ b/themes/sandal/scss/colors.scss
@@ -21,7 +21,7 @@ $search-row-selected-color: $white;
 
 $sidebar-title-bg: $white;
 $sidebar-title-color: $near-black;
-$sidebar-title-icon-color: $light-gray;
+$sidebar-title-icon-color: $light-silver;
 $sidebar-item-bg: $white;
 $sidebar-item-color: $black;
 $sidebar-item-hover-bg: $lightest-blue;