diff --git a/app/code/Magento/Backend/Model/Search/Config.php b/app/code/Magento/Backend/Model/Search/Config.php
new file mode 100644
index 0000000000000..4272e24b2f084
--- /dev/null
+++ b/app/code/Magento/Backend/Model/Search/Config.php
@@ -0,0 +1,116 @@
+configStructure = $configStructure;
+ $this->resultBuilder = $resultBuilder;
+ }
+
+ /**
+ * @param string $query
+ * @return $this
+ */
+ public function setQuery($query)
+ {
+ $this->setData('query', $query);
+ return $this;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getQuery()
+ {
+ return $this->getData('query');
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasQuery()
+ {
+ return $this->hasData('query');
+ }
+
+ /**
+ * @param array $results
+ * @return $this
+ */
+ public function setResults(array $results)
+ {
+ $this->setData('results', $results);
+ return $this;
+ }
+
+ /**
+ * @return array|null
+ */
+ public function getResults()
+ {
+ return $this->getData('results');
+ }
+
+ /**
+ * Load search results
+ *
+ * @return $this
+ */
+ public function load()
+ {
+ $this->findInStructure($this->configStructure->getTabs(), $this->getQuery());
+ $this->setResults($this->resultBuilder->getAll());
+ return $this;
+ }
+
+ /**
+ * @param ElementIterator $structureElementIterator
+ * @param string $searchTerm
+ * @param string $pathLabel
+ * @return void
+ * @SuppressWarnings(PHPMD.LongVariable)
+ */
+ private function findInStructure(ElementIterator $structureElementIterator, $searchTerm, $pathLabel = '')
+ {
+ if (empty($searchTerm)) {
+ return;
+ }
+ foreach ($structureElementIterator as $structureElement) {
+ if (mb_stripos((string)$structureElement->getLabel(), $searchTerm) !== false) {
+ $this->resultBuilder->add($structureElement, $pathLabel);
+ }
+ $elementPathLabel = $pathLabel . ' / ' . $structureElement->getLabel();
+ if ($structureElement instanceof AbstractComposite && $structureElement->hasChildren()) {
+ $this->findInStructure($structureElement->getChildren(), $searchTerm, $elementPathLabel);
+ }
+ }
+ }
+}
diff --git a/app/code/Magento/Backend/Model/Search/Config/Result/Builder.php b/app/code/Magento/Backend/Model/Search/Config/Result/Builder.php
new file mode 100644
index 0000000000000..fd01e19119d54
--- /dev/null
+++ b/app/code/Magento/Backend/Model/Search/Config/Result/Builder.php
@@ -0,0 +1,78 @@
+urlBuilder = $urlBuilder;
+ $this->structureElementTypes = $structureElementTypes;
+ }
+
+ /**
+ * @return array
+ */
+ public function getAll()
+ {
+ return $this->results;
+ }
+
+ /**
+ * @param StructureElementInterface $structureElement
+ * @param string $elementPathLabel
+ * @return void
+ */
+ public function add(StructureElementInterface $structureElement, $elementPathLabel)
+ {
+ $urlParams = [];
+ $elementData = $structureElement->getData();
+
+ if (!in_array($elementData['_elementType'], array_keys($this->structureElementTypes))) {
+ return;
+ }
+
+ if (isset($this->structureElementTypes[$elementData['_elementType']])) {
+ $urlParamsBuilder = $this->structureElementTypes[$elementData['_elementType']];
+ $urlParams = $urlParamsBuilder->build($structureElement);
+ }
+
+ $this->results[] = [
+ 'id' => $structureElement->getPath(),
+ 'type' => null,
+ 'name' => (string)$structureElement->getLabel(),
+ 'description' => $elementPathLabel,
+ 'url' => $this->urlBuilder->getUrl('*/system_config/edit', $urlParams),
+ ];
+ }
+}
diff --git a/app/code/Magento/Backend/Model/Search/Config/Structure/Element/Builder/Field.php b/app/code/Magento/Backend/Model/Search/Config/Structure/Element/Builder/Field.php
new file mode 100644
index 0000000000000..96cde2a4ff4db
--- /dev/null
+++ b/app/code/Magento/Backend/Model/Search/Config/Structure/Element/Builder/Field.php
@@ -0,0 +1,25 @@
+getPath());
+ return [
+ 'section' => $elementPathParts[0],
+ 'group' => $elementPathParts[1],
+ 'field' => $structureElement->getId(),
+ ];
+ }
+}
diff --git a/app/code/Magento/Backend/Model/Search/Config/Structure/Element/Builder/Group.php b/app/code/Magento/Backend/Model/Search/Config/Structure/Element/Builder/Group.php
new file mode 100644
index 0000000000000..f6a6e35463aa8
--- /dev/null
+++ b/app/code/Magento/Backend/Model/Search/Config/Structure/Element/Builder/Group.php
@@ -0,0 +1,24 @@
+getPath());
+ return [
+ 'section' => $elementPathParts[0],
+ 'group' => $elementPathParts[1],
+ ];
+ }
+}
diff --git a/app/code/Magento/Backend/Model/Search/Config/Structure/Element/Builder/Section.php b/app/code/Magento/Backend/Model/Search/Config/Structure/Element/Builder/Section.php
new file mode 100644
index 0000000000000..0d67f13c931bd
--- /dev/null
+++ b/app/code/Magento/Backend/Model/Search/Config/Structure/Element/Builder/Section.php
@@ -0,0 +1,21 @@
+getPath());
+ return ['section' => $elementPathParts[1]];
+ }
+}
diff --git a/app/code/Magento/Backend/Model/Search/Config/Structure/ElementBuilderInterface.php b/app/code/Magento/Backend/Model/Search/Config/Structure/ElementBuilderInterface.php
new file mode 100644
index 0000000000000..86b796355946d
--- /dev/null
+++ b/app/code/Magento/Backend/Model/Search/Config/Structure/ElementBuilderInterface.php
@@ -0,0 +1,17 @@
+urlBuilderMock = $this->getMockForAbstractClass(UrlInterface::class);
+ $this->structureElementMock = $this->getMockForAbstractClass(StructureElementInterface::class);
+ $this->structureElementUrlParamsBuilderMock = $this->getMockForAbstractClass(ElementBuilderInterface::class);
+ $this->model = new Builder($this->urlBuilderMock, ['section' => $this->structureElementUrlParamsBuilderMock]);
+ }
+
+ public function testAddWithNotSupportedStructureElementReturnsNothing()
+ {
+ $this->structureElementMock
+ ->expects($this->once())
+ ->method('getData')
+ ->will($this->returnValue(['_elementType' => 'not_declared_structure_element_type']));
+ $this->model->add($this->structureElementMock, '');
+ $this->assertEquals([], $this->model->getAll());
+ }
+
+ public function testAddWithSupportedStructureElements()
+ {
+ $structureElementPath = '/section_code';
+ $structureElementLabel = 'Section Label';
+ $buildUrlParams = ['param_key' => 'param_value'];
+ $generatedUrl = 'http://example.com';
+
+ $expectedSearchResult = [
+ [
+ 'id' => $structureElementPath,
+ 'type' => null,
+ 'name' => 'Section Label',
+ 'description' => 'Section Label',
+ 'url' => 'http://example.com',
+ ],
+ ];
+
+ $this->structureElementMock
+ ->expects($this->once())
+ ->method('getData')
+ ->willReturn(['_elementType' => 'section']);
+ $this->structureElementMock
+ ->expects($this->once())
+ ->method('getPath')
+ ->willReturn($structureElementPath);
+ $this->structureElementMock
+ ->expects($this->once())
+ ->method('getLabel')
+ ->willReturn($structureElementLabel);
+
+ $this->structureElementUrlParamsBuilderMock->expects($this->once())
+ ->method('build')
+ ->willReturn($buildUrlParams);
+
+ $this->urlBuilderMock
+ ->expects($this->once())
+ ->method('getUrl')
+ ->with('*/system_config/edit', $buildUrlParams)
+ ->will($this->returnValue($generatedUrl));
+
+ $this->model->add($this->structureElementMock, $structureElementLabel);
+ $this->assertEquals($expectedSearchResult, $this->model->getAll());
+ }
+}
diff --git a/app/code/Magento/Backend/Test/Unit/Model/Search/Config/Structure/Element/Builder/FieldTest.php b/app/code/Magento/Backend/Test/Unit/Model/Search/Config/Structure/Element/Builder/FieldTest.php
new file mode 100644
index 0000000000000..2e712ff867887
--- /dev/null
+++ b/app/code/Magento/Backend/Test/Unit/Model/Search/Config/Structure/Element/Builder/FieldTest.php
@@ -0,0 +1,51 @@
+structureElementMock = $this->getMockForAbstractClass(StructureElementInterface::class);
+ $this->model = new Field();
+ }
+
+ public function testBuild()
+ {
+ $structureElementId = 42;
+ $structureElementPath = 'path_part_1/path_part_2';
+
+ $this->structureElementMock->expects($this->once())
+ ->method('getId')
+ ->willReturn($structureElementId);
+ $this->structureElementMock->expects($this->once())
+ ->method('getPath')
+ ->willReturn($structureElementPath);
+ $this->assertEquals(
+ [
+ 'section' => 'path_part_1',
+ 'group' => 'path_part_2',
+ 'field' => $structureElementId,
+ ],
+ $this->model->build($this->structureElementMock)
+ );
+ }
+}
diff --git a/app/code/Magento/Backend/Test/Unit/Model/Search/Config/Structure/Element/Builder/GroupTest.php b/app/code/Magento/Backend/Test/Unit/Model/Search/Config/Structure/Element/Builder/GroupTest.php
new file mode 100644
index 0000000000000..1640588678f4e
--- /dev/null
+++ b/app/code/Magento/Backend/Test/Unit/Model/Search/Config/Structure/Element/Builder/GroupTest.php
@@ -0,0 +1,48 @@
+structureElementMock = $this->getMockForAbstractClass(StructureElementInterface::class);
+ $this->model = new Group();
+ }
+
+ public function testBuild()
+ {
+ $structureElementPath = 'path_part_1/path_part_2';
+
+ $this->structureElementMock->expects($this->never())
+ ->method('getId');
+ $this->structureElementMock->expects($this->once())
+ ->method('getPath')
+ ->willReturn($structureElementPath);
+ $this->assertEquals(
+ [
+ 'section' => 'path_part_1',
+ 'group' => 'path_part_2',
+ ],
+ $this->model->build($this->structureElementMock)
+ );
+ }
+}
diff --git a/app/code/Magento/Backend/Test/Unit/Model/Search/Config/Structure/Element/Builder/SectionTest.php b/app/code/Magento/Backend/Test/Unit/Model/Search/Config/Structure/Element/Builder/SectionTest.php
new file mode 100644
index 0000000000000..68365ff7f0c93
--- /dev/null
+++ b/app/code/Magento/Backend/Test/Unit/Model/Search/Config/Structure/Element/Builder/SectionTest.php
@@ -0,0 +1,42 @@
+structureElementMock = $this->getMockForAbstractClass(StructureElementInterface::class);
+ $this->model = new Section();
+ }
+
+ public function testBuild()
+ {
+ $structureElementPath = '/path_part_1';
+
+ $this->structureElementMock->expects($this->never())
+ ->method('getId');
+ $this->structureElementMock->expects($this->once())
+ ->method('getPath')
+ ->willReturn($structureElementPath);
+ $this->assertEquals(['section' => 'path_part_1'], $this->model->build($this->structureElementMock));
+ }
+}
diff --git a/app/code/Magento/Backend/etc/adminhtml/di.xml b/app/code/Magento/Backend/etc/adminhtml/di.xml
index 5154c4eb56c91..050115087c26e 100644
--- a/app/code/Magento/Backend/etc/adminhtml/di.xml
+++ b/app/code/Magento/Backend/etc/adminhtml/di.xml
@@ -147,4 +147,13 @@
+