diff --git a/oioioi/problems/fixtures/test_problem_search.json b/oioioi/problems/fixtures/test_problem_search.json
index e5c35f4aa..05c8aed30 100644
--- a/oioioi/problems/fixtures/test_problem_search.json
+++ b/oioioi/problems/fixtures/test_problem_search.json
@@ -33,8 +33,8 @@
     "pk": 3,
     "model": "problems.problem",
     "fields": {
-      "legacy_name": "Znacznik",
-      "ascii_name": "Znacznik",
+      "legacy_name": "Znaczn1k",
+      "ascii_name": "Znaczn1k",
       "short_name": "zna1",
       "visibility": "PU"
     }
diff --git a/oioioi/problems/static/common/tag_selection.js b/oioioi/problems/static/common/tag_selection.js
index 928a117ba..5ade7751f 100644
--- a/oioioi/problems/static/common/tag_selection.js
+++ b/oioioi/problems/static/common/tag_selection.js
@@ -116,10 +116,10 @@ function init_search_selection(id) {
                 } else if (item.trigger !== 'problem') {
                     // At this point for anything other than a problem we
                     // want to create a search tag
-                    const value = item.value || item.name;
+                    const value = item.value;
 
                     // Only create new search tag if it doesn't exist yet
-                    const tag = $(".search-tag-text:contains('" + value + "')");
+                    const tag = $("input[name='" + item.prefix + "'][value='" + value + "']");
                     if (tag.length === 0) {
                         const tag = value.split('_')[0];
 
diff --git a/oioioi/problems/templates/problems/problemset/base.html b/oioioi/problems/templates/problems/problemset/base.html
index b9234971c..30784c843 100644
--- a/oioioi/problems/templates/problems/problemset/base.html
+++ b/oioioi/problems/templates/problems/problemset/base.html
@@ -62,25 +62,26 @@
                 </span>
             </div>
             <div id="tag-row">
+            {% if show_tags %}
             {% with delete_me="this.parentNode.parentNode.remove()" %}
 
                 {% include "problems/problemset/search-tag.html" with input_class="collapse" input_attr="disabled" %}
                 {% for tag in difficulty_tags %}
-                    {% include "problems/problemset/search-tag.html" with input_name="difficulty" input_text=tag.full_name input_attr="readonly" input_script=delete_me %}
+                    {% include "problems/problemset/search-tag.html" with input_name="difficulty" input_value=tag input_text=tag.full_name input_attr="readonly" input_script=delete_me %}
                 {% endfor %}
                 {% for tag in algorithm_tags %}
-                    {% include "problems/problemset/search-tag.html" with input_name="algorithm" input_text=tag input_attr="readonly" input_script=delete_me %}
+                    {% include "problems/problemset/search-tag.html" with input_name="algorithm" input_value=tag input_text=tag input_attr="readonly" input_script=delete_me %}
                 {% endfor %}
                 {% for tag, origininfo in origin_tags.items %}
                 <div id="origintag-group-{{ tag }}" class="origintag-group">
-                    {% include "problems/problemset/search-tag.html" with input_name="origin" input_text=tag input_attr="readonly" input_script="this.parentNode.parentNode.parentNode.remove()" %}
+                    {% include "problems/problemset/search-tag.html" with input_name="origin" input_value=tag input_text=tag input_attr="readonly" input_script="this.parentNode.parentNode.parentNode.remove()" %}
                     {% for info in origininfo %}
                         {% include "problems/problemset/search-tag.html" with input_name="origin" input_value=tag|add:"_"|add:info input_text=info input_attr="readonly" input_script=delete_me %}
                     {% endfor %}
                 </div>
                 {% endfor %}
-
             {% endwith %}
+            {% endif %}
             </div>
         </form>
         {% endif %}
diff --git a/oioioi/problems/tests/test_problem.py b/oioioi/problems/tests/test_problem.py
index a460d6060..6d0b59763 100644
--- a/oioioi/problems/tests/test_problem.py
+++ b/oioioi/problems/tests/test_problem.py
@@ -740,6 +740,7 @@ def test_search_permissions_all(self):
         self.assert_contains_only(response, self.task_names)
 
 
+@override_settings(PROBLEM_TAGS_VISIBLE=True)
 class TestProblemSearch(TestCase, AssertContainsOnlyMixin):
     fixtures = ['test_problem_search']
     url = reverse('problemset_main')
@@ -747,7 +748,7 @@ class TestProblemSearch(TestCase, AssertContainsOnlyMixin):
         'Prywatne',
         'Zadanko',
         'Żółć',
-        'Znacznik',
+        'Znaczn1k',
         'Algorytm',
         'Trudność',
         'Bajtocja',
@@ -797,7 +798,7 @@ def test_search_name_multiple(self):
         response = self.client.get(self.url, {'q': 'a'})
         self.assertEqual(response.status_code, 200)
         self.assert_contains_only(
-            response, ('Zadanko', 'Znacznik', 'Algorytm', 'Byteland')
+            response, ('Zadanko', 'Znaczn1k', 'Algorytm', 'Byteland')
         )
 
     def _test_search_name_localized(self, queries, exp_names):
@@ -833,7 +834,7 @@ def test_search_short_name_multiple(self):
         self.client.get('/c/c/')
         response = self.client.get(self.url, {'q': '1'})
         self.assertEqual(response.status_code, 200)
-        self.assert_contains_only(response, ('Zadanko', 'Żółć', 'Znacznik'))
+        self.assert_contains_only(response, ('Zadanko', 'Żółć', 'Znaczn1k'))
 
     def test_search_tags_basic(self):
         self.client.get('/c/c/')
diff --git a/oioioi/problems/tests/test_problem_statistics.py b/oioioi/problems/tests/test_problem_statistics.py
index 4db5442d4..136f1ae13 100644
--- a/oioioi/problems/tests/test_problem_statistics.py
+++ b/oioioi/problems/tests/test_problem_statistics.py
@@ -228,13 +228,25 @@ def test_statistics_imported(self):
         self.assertTrue(ps.avg_best_score == 100)
 
 
-@override_settings(PROBLEM_STATISTICS_AVAILABLE=True)
+@override_settings(
+    PROBLEM_STATISTICS_AVAILABLE=True,
+    PROBLEM_TAGS_VISIBLE=False,
+)
 class TestProblemStatisticsDisplay(TestCase):
     fixtures = ['test_users', 'test_statistics_display']
 
-    problem_columns = [
+    problem_columns_tags_invisible = [
+        'short_name',
+        'name',
+        'submitted',
+        'solved_pc',
+        'avg_best_score',
+        'user_score',
+    ]
+    problem_columns_tags_visible = [
         'short_name',
         'name',
+        'tags',
         'submitted',
         'solved_pc',
         'avg_best_score',
@@ -315,7 +327,7 @@ def test_statistics_problem_list(self):
     def test_statistics_sorting(self):
         self.assertTrue(self.client.login(username='test_user'))
 
-        for i, column in enumerate(self.problem_columns):
+        for i, column in enumerate(self.problem_columns_tags_invisible):
             url_main = reverse('problemset_main')
             response = self.client.get(url_main, {'order_by': column})
             self.assertEqual(response.status_code, 200)
@@ -344,7 +356,7 @@ def test_statistics_nulls(self):
 
         self.assertTrue(self.client.login(username='test_user'))
 
-        for column in self.problem_columns[2:]:
+        for column in self.problem_columns_tags_invisible[2:]:
             url_main = reverse('problemset_main')
             response = self.client.get(url_main, {'order_by': column})
             self.assertEqual(response.status_code, 200)
@@ -363,7 +375,7 @@ def test_statistics_sort_nulls(self):
 
         self.assertTrue(self.client.login(username='test_user'))
 
-        for i, column in enumerate(self.problem_columns):
+        for i, column in enumerate(self.problem_columns_tags_invisible):
             url_main = reverse('problemset_main')
             response = self.client.get(url_main, {'order_by': column})
             self.assertEqual(response.status_code, 200)
@@ -378,12 +390,13 @@ def test_statistics_sort_nulls(self):
             self._assert_rows_sorted(rows, order_by=i, desc=True)
 
     # Check that the query and the ordering are correctly preserved in links
+    @override_settings(PROBLEM_TAGS_VISIBLE=True)
     def test_statistics_sorting_with_query(self):
         self.assertTrue(self.client.login(username='test_user'))
 
-        col_no = 3
+        col_no = 4
         q = 'Bbbb'
-        order = self.problem_columns[col_no - 1]
+        order = self.problem_columns_tags_visible[col_no - 1]
         url_main = reverse('problemset_main')
 
         response = self.client.get(
diff --git a/oioioi/problems/tests/test_tags.py b/oioioi/problems/tests/test_tags.py
index 6b8e5569f..bac5d26cc 100644
--- a/oioioi/problems/tests/test_tags.py
+++ b/oioioi/problems/tests/test_tags.py
@@ -53,6 +53,7 @@ def test_algorithm_tag_label_view(self):
             self.assertEqual(response.status_code, 404)
 
 
+@override_settings(PROBLEM_TAGS_VISIBLE=True)
 class TestProblemSearchOrigin(TestCase, AssertContainsOnlyMixin):
     fixtures = ['test_problem_search_origin']
     url = reverse('problemset_main')
@@ -127,6 +128,7 @@ def test_search_origininfovalue_multiple(self):
         self.assert_contains_only(response, [])
 
 
+@override_settings(PROBLEM_TAGS_VISIBLE=True)
 class TestProblemSearchHintsTags(TestCase, AssertContainsOnlyMixin):
     fixtures = [
         'test_origin_tags',
@@ -159,6 +161,38 @@ class TestProblemSearchHintsTags(TestCase, AssertContainsOnlyMixin):
     def get_query_url(self, parameters):
         return self.url + '?' + urllib.parse.urlencode(parameters)
 
+    @override_settings(LANGUAGE_CODE="en", PROBLEM_TAGS_VISIBLE=False)
+    def test_search_no_hints_tags_basic(self):
+        self.client.get('/c/c/')
+
+        response = self.client.get(self.get_query_url({'q': 'najdłuższy'}))
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+        response = self.client.get(self.get_query_url({'q': 'easy'}))
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+        response = self.client.get(self.get_query_url({'q': 'Mediu'}))
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+        response = self.client.get(self.get_query_url({'q': 'PROGRA'}))
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+        response = self.client.get(self.get_query_url({'q': 'dYNAM'}))
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+        response = self.client.get(self.get_query_url({'q': 'dp'}))
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+        response = self.client.get(self.get_query_url({'q': 'increasing'}))
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
     @override_settings(LANGUAGE_CODE="en")
     def test_search_hints_tags_basic(self):
         self.client.get('/c/c/')
@@ -191,6 +225,26 @@ def test_search_hints_tags_basic(self):
         self.assertEqual(response.status_code, 200)
         self.assert_contains_only(response, ['lcis'])
 
+    @override_settings(LANGUAGE_CODE="en", PROBLEM_TAGS_VISIBLE=False)
+    def test_search_no_hints_origininfo(self):
+        self.client.get('/c/c/')
+        response = self.client.get(self.url, {'q': 'pa_'})
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+        response = self.client.get(self.url, {'q': '2011'})
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+        response = self.client.get(self.url, {'q': 'Round'})
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+        response = self.client.get(self.url, {'q': 'Potyczki Algorytmiczne'})
+        self.assertEqual(response.status_code, 200)
+        self.assert_contains_only(response, [])
+
+    @override_settings(LANGUAGE_CODE="en")
     def test_search_hints_origininfo(self):
         self.client.get('/c/c/')
         response = self.client.get(self.url, {'q': 'pa_'})
diff --git a/oioioi/problems/views.py b/oioioi/problems/views.py
index 8b8b60245..e30bd597a 100644
--- a/oioioi/problems/views.py
+++ b/oioioi/problems/views.py
@@ -305,7 +305,10 @@ def generate_problemset_tabs(request):
 
 
 def problemset_get_problems(request):
-    problems = search_problems_in_problemset(request.GET)
+    if settings.PROBLEM_TAGS_VISIBLE:
+        problems = search_problems_in_problemset(request.GET)
+    else:
+        problems = Problem.objects.all()
 
     if settings.PROBLEM_STATISTICS_AVAILABLE:
         # We annotate all of the statistics to assure that the display
@@ -1181,9 +1184,11 @@ def get_search_hints_view(request, view_type):
 
     result = []
     result.extend(list(get_problem_hints(query, view_type, request.user)))
-    result.extend(get_algorithm_and_difficulty_tag_hints(query))
-    result.extend(get_nonselected_origintag_hints(query))
-    result.extend(get_origininfovalue_hints(query))
+
+    if settings.PROBLEM_TAGS_VISIBLE:
+        result.extend(get_algorithm_and_difficulty_tag_hints(query))
+        result.extend(get_nonselected_origintag_hints(query))
+        result.extend(get_origininfovalue_hints(query))
 
     # Convert category names in results from lazy translation to strings,
     # since jsonify throws error if given lazy translation objects.