diff --git a/.isort.cfg b/.isort.cfg
index 6376f49ddf52272f5aceba10707df212ef4e9e0b..24b9a93dc4f5076e8fdf86f0067797f9d97cc640 100644
--- a/.isort.cfg
+++ b/.isort.cfg
@@ -4,4 +4,4 @@ line_length = 88
 multi_line_output = 3
 default_section = "THIRDPARTY"
 include_trailing_comma = true
-known_third_party = arrow,django,environ,faker,ics,markdown,modelcluster,pirates,pytest,pytz,requests,sentry_sdk,snapshottest,taggit,wagtail,wagtailmetadata
+known_third_party = arrow,captcha,django,environ,faker,ics,markdown,modelcluster,pirates,pytest,pytz,requests,sentry_sdk,snapshottest,taggit,wagtail,wagtailmetadata
diff --git a/majak/settings/base.py b/majak/settings/base.py
index 00ec6c44837fa0e64990ea93a2b17c11f7c7940b..262f55fa7b181df65e7df7c75e84289cce91ef50 100644
--- a/majak/settings/base.py
+++ b/majak/settings/base.py
@@ -52,6 +52,7 @@ INSTALLED_APPS = [
     "regulace_konopi",
     "green_deal",
     "widget_tweaks",
+    "captcha",
     "wagtail.contrib.forms",
     "wagtail.contrib.redirects",
     "wagtail.contrib.modeladmin",
@@ -232,6 +233,13 @@ MAJAK_ENV = env.str("MAJAK_ENV", default="prod")
 
 SETTINGS_EXPORT = ["MAJAK_ENV"]
 
+CAPTCHA_BACKGROUND_COLOR = "#fafafa"
+CAPTCHA_FOREGROUND_COLOR = "#303132"
+CAPTCHA_LETTER_ROTATION = (-20, 20)
+CAPTCHA_FONT_SIZE = 30
+CAPTCHA_IMAGE_SIZE = (120, 47)
+
+
 # CUSTOM APPS SETTINGS
 # ------------------------------------------------------------------------------
 DONATE_PORTAL_REDIRECT_URL = env.str("DONATE_PORTAL_REDIRECT_URL", default="")
diff --git a/majak/urls.py b/majak/urls.py
index b2aa7c7c8af664619e70a1bfa7fb83db13453dd6..44cf8412b128888e7618e0b7051e9d59a3355035 100644
--- a/majak/urls.py
+++ b/majak/urls.py
@@ -1,3 +1,4 @@
+import captcha.urls
 from django.conf import settings
 from django.conf.urls import include, url
 from django.contrib import admin
@@ -13,6 +14,7 @@ urlpatterns = [
     url(r"^admin/", include(wagtailadmin_urls)),
     url(r"^documents/", include(wagtaildocs_urls)),
     url(r"^search/$", search_views.search, name="search"),
+    url(r"^captcha/", include(captcha.urls)),
 ] + pirates_urlpatterns
 
 
diff --git a/requirements/base.in b/requirements/base.in
index 2c9d1c317ab892080e8d3f577affa6b7e4b6de48..76b21d69f435b64fc1ca293e3d035fe00ee95e3b 100644
--- a/requirements/base.in
+++ b/requirements/base.in
@@ -5,6 +5,7 @@ django-extensions
 django-redis
 django-settings-export
 django-widget-tweaks
+django-simple-captcha
 psycopg2-binary
 pirates<=0.6
 whitenoise
diff --git a/requirements/base.txt b/requirements/base.txt
index 8a1aec03efb254aca8115718bd21a05f99262dc8..06638dde30abb4548973a000190e27c732ded0f9 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -16,12 +16,14 @@ django-environ==0.4.5     # via -r base.in
 django-extensions==3.1.1  # via -r base.in
 django-filter==2.4.0      # via wagtail
 django-modelcluster==5.1  # via wagtail
+django-ranged-response==0.2.0  # via django-simple-captcha
 django-redis==4.12.1      # via -r base.in
 django-settings-export==1.2.1  # via -r base.in
+django-simple-captcha==0.5.14  # via -r base.in
 django-taggit==1.3.0      # via wagtail
 django-treebeard==4.5.1   # via wagtail
 django-widget-tweaks==1.4.8  # via -r base.in
-django==3.1.7             # via django-filter, django-redis, django-settings-export, django-taggit, django-treebeard, djangorestframework, mozilla-django-oidc, wagtail
+django==3.1.7             # via django-filter, django-ranged-response, django-redis, django-settings-export, django-simple-captcha, django-taggit, django-treebeard, djangorestframework, mozilla-django-oidc, wagtail
 djangorestframework==3.12.4  # via wagtail
 draftjs-exporter==2.1.7   # via wagtail
 et-xmlfile==1.0.1         # via openpyxl
@@ -35,7 +37,7 @@ mozilla-django-oidc==1.2.4  # via pirates
 numpy==1.20.2             # via opencv-python
 opencv-python==4.5.1.48   # via -r base.in
 openpyxl==3.0.7           # via tablib
-pillow==8.1.2             # via wagtail
+pillow==8.1.2             # via django-simple-captcha, wagtail
 pirates==0.5.0            # via -r base.in
 psycopg2-binary==2.8.6    # via -r base.in
 pycparser==2.20           # via cffi
@@ -45,7 +47,7 @@ pytz==2021.1              # via django, django-modelcluster, l18n
 redis==3.5.3              # via django-redis
 requests==2.25.1          # via -r base.in, mozilla-django-oidc, wagtail
 sentry-sdk==1.0.0         # via -r base.in
-six==1.15.0               # via html5lib, ics, l18n, mozilla-django-oidc, pyopenssl, python-dateutil
+six==1.15.0               # via django-simple-captcha, html5lib, ics, l18n, mozilla-django-oidc, pyopenssl, python-dateutil
 soupsieve==2.2.1          # via beautifulsoup4
 sqlparse==0.4.1           # via django
 tablib[xls,xlsx]==3.0.0   # via wagtail
diff --git a/uniweb/models.py b/uniweb/models.py
index b13707051020bb097241b06fa2f63fd1e6a29480..c3cd4f88242f9597262c91551185ebd4fb870d2a 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -1,3 +1,4 @@
+from captcha.fields import CaptchaField
 from django import forms
 from django.core.paginator import Paginator
 from django.db import models
@@ -489,7 +490,6 @@ class UniwebFormPage(AbstractForm, SubpageMixin, MetadataPageMixin):
     ### PANELS
 
     content_panels = AbstractForm.content_panels + [
-        FormSubmissionsPanel(),
         StreamFieldPanel("content_before"),
         InlinePanel("form_fields", label="formulář"),
         StreamFieldPanel("content_after"),
@@ -534,3 +534,8 @@ class UniwebFormPage(AbstractForm, SubpageMixin, MetadataPageMixin):
 
     class Meta:
         verbose_name = "Formulářová stránka"
+
+    def get_form_class(self):
+        form = super().get_form_class()
+        form.base_fields["captcha"] = CaptchaField(label="opište písmena z obrázku")
+        return form
diff --git a/uniweb/templates/uniweb/uniweb_form_page.html b/uniweb/templates/uniweb/uniweb_form_page.html
index a1b8c0947f9d0920f1ef7108c325f6eb26505cd4..848785247ab0088e0746c1031c2f8897ea37b6d9 100644
--- a/uniweb/templates/uniweb/uniweb_form_page.html
+++ b/uniweb/templates/uniweb/uniweb_form_page.html
@@ -58,8 +58,13 @@
                   <label class="form-field__label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                 </div>
               </div>
+            {% elif field.widget_type == "captchatext" %}
+              <label class="form-field__label" for="{{ field.id_for_label }}">{{ field.label }}</label>
+              <div class="form-field__wrapper form-field__wrapper--shadowed w-1/2">
+                {{ field|add_class:"text-input form-field__control" }}
+              </div>
             {% else %}
-              <label class="form-field__label" for="{{ field.id_for_label }}">{{ field.label }} ({{ field.widget_type }})</label>
+              <label class="form-field__label" for="{{ field.id_for_label }}">{{ field.label }}</label>
               <div class="form-field__wrapper form-field__wrapper--shadowed">
                 {{ field|add_class:"text-input form-field__control" }}
               </div>
@@ -77,7 +82,7 @@
         {% endfor %}
       </div>
 
-      <button class="btn text-lg mt-6 mb-4 btn--black-100">
+      <button class="btn text-lg mt-6 mb-4 btn--black-100 btn--hoveractive">
         <div class="btn__body ">odeslat</div>
       </button>
     </form>