diff --git a/django_apps/settings.py b/django_apps/settings.py
index c5b608fc0a989561180a7a5cbb885246faf20551..c6f73421b8889f06518f460efe03d7ba7818f9f8 100644
--- a/django_apps/settings.py
+++ b/django_apps/settings.py
@@ -40,6 +40,7 @@ INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'tinymce',
 ]
 
 MIDDLEWARE = [
@@ -133,6 +134,40 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
 LOGIN_REDIRECT_URL = 'home'
 LOGOUT_REDIRECT_URL = 'index'
 
+# Custom settings STATIC
+STATIC_URL = "/static/"
+STATIC_ROOT = BASE_DIR / 'static'
+#STATICFILES_DIRS = BASE_DIR / 'static'
+
 # Custom settings MEDIA
 MEDIA_URL = "/media/"
 MEDIA_ROOT = BASE_DIR / 'media'
+
+# TinyMCE settings
+TINYMCE_DEFAULT_CONFIG = {
+    'cleanup_on_startup': True,
+    'custom_undo_redo_levels': 20,
+    'selector': 'textarea',
+    'theme': 'silver',
+    'plugins': '''
+            textcolor save link image media preview codesample contextmenu
+            table code lists fullscreen  insertdatetime  nonbreaking
+            contextmenu directionality searchreplace wordcount visualblocks
+            visualchars code fullscreen autolink lists  charmap print  hr
+            anchor pagebreak
+            ''',
+    'toolbar1': '''
+            fullscreen preview bold italic underline | fontselect,
+            fontsizeselect  | forecolor backcolor | alignleft alignright |
+            aligncenter alignjustify | indent outdent | bullist numlist table |
+            | link image media | codesample |
+            ''',
+    'toolbar2': '''
+            visualblocks visualchars |
+            charmap hr pagebreak nonbreaking anchor |  code |
+            ''',
+    'contextmenu': 'formats | link image',
+    'menubar': True,
+    'statusbar': True,
+}
+
diff --git a/django_apps/urls.py b/django_apps/urls.py
index d3c3f95b70ce0af72b597b482f4b954fee07497e..e70575b2d97e698d00ed7a0c6639d4d030e509a0 100644
--- a/django_apps/urls.py
+++ b/django_apps/urls.py
@@ -15,9 +15,15 @@ Including another URLconf
 """
 from django.contrib import admin
 from django.urls import path, include
+from django.conf.urls.static import static
+from django.conf import settings
+
 
 urlpatterns = [
 #    path('polls/', include('polls.urls')),
     path('sifrovacka/', include('sifrovacka.urls')),
     path('admin/', admin.site.urls),
 ]
+if settings.DEBUG:
+    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
diff --git a/requirements.txt_ b/requirements.txt_
new file mode 100644
index 0000000000000000000000000000000000000000..53b86ebcfdf52b4057d8c7d9c5126d9b5fea0478
--- /dev/null
+++ b/requirements.txt_
@@ -0,0 +1,55 @@
+appdirs==1.4.4
+asgiref==3.3.4
+asn1crypto==1.4.0
+backcall==0.2.0
+certifi==2021.5.30
+cffi==1.14.6
+charset-normalizer==2.0.4
+confusable-homoglyphs==3.2.0
+cryptography==3.3.2
+dbus-python==1.2.16
+decorator==5.0.9
+distlib==0.3.1
+Django==3.2.3
+django-registration==3.2
+entrypoints==0.3
+filelock==3.0.12
+idna==3.2
+importlib-metadata==1.6.0
+ipython==7.27.0
+ipython-genutils==0.2.0
+jedi==0.18.0
+jeepney==0.6.0
+keyring==22.0.1
+keyrings.alt==4.0.2
+Mako==1.1.3
+Markdown==3.3.4
+MarkupSafe==1.1.1
+matplotlib-inline==0.1.2
+more-itertools==4.2.0
+parso==0.8.2
+pexpect==4.8.0
+pickleshare==0.7.5
+Pillow==8.3.2
+prompt-toolkit==3.0.20
+ptyprocess==0.7.0
+pycairo==1.20.1
+pycparser==2.20
+pycrypto==2.6.1
+pycryptodomex==3.9.7
+Pygments==2.7.1
+PyGObject==3.38.0
+pytz==2021.1
+pyxdg==0.27
+PyYAML==5.3.1
+requests==2.26.0
+SecretStorage==3.3.1
+six==1.16.0
+sqlparse==0.4.1
+traitlets==5.0.5
+typing-extensions==3.10.0.0
+urllib3==1.26.6
+virtualenv==20.4.0+ds
+wcwidth==0.2.5
+xdg==5
+zipp==1.0.0
diff --git a/sifrovacka/forms.py b/sifrovacka/forms.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..363bbdc5b232a9481be1e6c289f2aa807fb73e28 100644
--- a/sifrovacka/forms.py
+++ b/sifrovacka/forms.py
@@ -0,0 +1,23 @@
+from django import forms
+#from .models import Sifrovacka, Stages, Participants
+
+class PassphraseForm(forms.Form):
+    passphrase = forms.CharField(label='Vloz heslo k dalsi fazi', max_length=30)
+    stage_current_urlhash = forms.CharField()
+
+#    def clean(self)
+#        cleaned_data = super(PassphraseForm, self).clean()
+#        passphrase = cleaned_data.get('passphrase')
+
+#        if request.user.is_authenticated:
+#            sifrovacka_current_stage_urlhash = Participants.objects.get(id = \
+#                                                tmp_stage_id)
+#                    if (sifrovacka_current_stage_urlhash.at_stage == stage_urlhash):
+#                        print('hehe')
+#                        stage_current_id = Stages.objects.get(stage_urlhash =
+#                                            sifrovacka_current_stage_urlhash.at_stage)
+#                        #sifrovacka_current = Participants.objects.get(id = \
+#                        #                      tmp_stage_id)
+#                    else:
+#                        print('not same')
+#  
diff --git a/sifrovacka/migrations/0027_auto_20210906_0919.py b/sifrovacka/migrations/0027_auto_20210906_0919.py
new file mode 100644
index 0000000000000000000000000000000000000000..f0297dabd03cebdead156c1b6f114d09cb5e4acd
--- /dev/null
+++ b/sifrovacka/migrations/0027_auto_20210906_0919.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.2.3 on 2021-09-06 09:19
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0026_alter_stages_stage_urlhash'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='stages',
+            name='stage_help',
+            field=models.CharField(blank=True, max_length=200),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='7aa966760ef311eca0fc2016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0028_auto_20210906_1357.py b/sifrovacka/migrations/0028_auto_20210906_1357.py
new file mode 100644
index 0000000000000000000000000000000000000000..b48c729c86233c8d8e9037fe849926ca4decc495
--- /dev/null
+++ b/sifrovacka/migrations/0028_auto_20210906_1357.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.2.3 on 2021-09-06 13:57
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0027_auto_20210906_0919'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='participants',
+            name='finished',
+            field=models.BooleanField(default=False),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='5b00798c0f1a11ec936e2016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/models.py b/sifrovacka/models.py
index dbd2b2acf7e753b8149503d0d08f75e6fda277f1..a62780ce10386704e4d9ec81068449637e189ff0 100644
--- a/sifrovacka/models.py
+++ b/sifrovacka/models.py
@@ -45,6 +45,7 @@ class Stages(models.Model):
     stage_number = models.IntegerField()
     stage_name = models.CharField(max_length=80)
     stage_description = HTMLField()
+    stage_help = models.CharField(max_length=200, blank=True)
     #sifrovacka_description = models.CharField(max_length=2000)
     stage_passphrase = models.CharField(max_length=30,
                        default='hesl0Sifrovacka')
@@ -67,6 +68,7 @@ class Participants(models.Model):
     #at_stage = models.IntegerField(default=1)
     at_stage = models.CharField(max_length=32,default='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
     inactive = models.BooleanField(default = False)
+    finished = models.BooleanField(default = False)
 
     def __str__(self):
         return str(self.user) + " - " + str(self.sifrovacka)
diff --git a/sifrovacka/templates/base.html b/sifrovacka/templates/base.html
index 58a9f665ff9bac18b4c20e78822b55c3a2e0d32e..457cbb470dc07e181d957d1470eef3411d81eb53 100644
--- a/sifrovacka/templates/base.html
+++ b/sifrovacka/templates/base.html
@@ -1,5 +1,5 @@
-{% load static %}
 <!doctype html>
+{% load static %}
 <html lang="cs">
 <head>
   <!-- Meta -->
@@ -31,6 +31,29 @@
       text-decoration: none !important;
     }
   </style>
+  <style type="text/css">
+  .collapsible {
+    cursor: pointer;
+    padding: 18px;
+    width: 100%;
+    border: none;
+    text-align: center;
+    outline: none;
+    font-size: 15px;
+  }
+  
+  .active, .collapsible:hover {
+    background-color: #555;
+  }
+  
+  .content {
+    padding: 0 18px;
+    overflow: hidden;
+    background-color: #f0f0f0;
+    max-height: 0;
+    transition: max-height 0.2s ease-out;
+  }
+  </style>  
 
   {% if settings.SIFROVACKA_ENV == "prod" and settings.ONBOARDING_MATOMO_ID %}
     {% include "shared/matomo_snippet.html" with matomo_id=settings.ONBOARDING_MATOMO_ID %}
diff --git a/sifrovacka/templates/sifrovacka.html b/sifrovacka/templates/sifrovacka.html
index 237f4902893d42a4a804756f3203cd085ffa6611..1dded661cf0589a77bdcce8aba48514b2cb1a276 100644
--- a/sifrovacka/templates/sifrovacka.html
+++ b/sifrovacka/templates/sifrovacka.html
@@ -5,8 +5,10 @@
 <p> Toto je detail sifrovacky se jmenem: <b>{{sifrovacka_detail}} </b> a id: {{sifrovacka_id}}. </p>
 </br>
 <p> Pocet ukolu: <b> {{ sifrovacka_stage_count }} </b> </br>
+<!--
     Obtiznost: NONE</br>
     Casova narocnost: NONE</p>
+-->
 
 </br>
 {{ sifrovacka_detail.sifrovacka_description | safe }}
diff --git a/sifrovacka/templates/stage.html b/sifrovacka/templates/stage.html
index bcb15c870fdd424fc720db5c90407f695c82d381..061d085020a6fcd99e21a1f77ddb6ce80a58962c 100644
--- a/sifrovacka/templates/stage.html
+++ b/sifrovacka/templates/stage.html
@@ -1,13 +1,12 @@
 {% extends "sifrovacka.html" %}
 {% load static %}
-
 {% comment %}
 
    {{ sifrovacka_current_id }} - {{ sifrovacka_current_stage_url_hash.at_stage }}
 
 {% endcomment %}
 {% block content %}
- {% if sifrovacka_current_stage_urlhash %}
+ {% if stage_current_id %}
   {% if request.user.is_authenticated %}
 
    <p> <b>{{ sifrovacka_current_stage_urlhash }} </b> - krok cislo {{ stage_current_id.stage_number }} z {{ sifrovacka_stage_count }}. </p>
@@ -19,8 +18,73 @@
        Autor: Junius Koolen CC-BY-SA
      </figcaption>
     </figure>
-    {{ sifrovacka_detail.sifrovacka_img }}
+   {% endif %}
+   {% if not last_stage %}
+    {{ stage_current_id.stage_img }}
+    {{ stage_current_id.stage_urlhash }}
+    <form action="{% url 'stage' sifrovacka_id stage_current_id.stage_urlhash %}" method="post">
+     {% csrf_token %}
+      {{ form.non_field_errors }}
+     </br>
+     </br>
+<!--     <div class="inline-flex flex-col sm:flex-row space-y-8 sm:space-y-0 sm:space-x-8"> -->
+<button class="collapsible btn btn--fullwidth btn--grey-700 ">
+      <div class="btn__body "> Klikni pro napovedu</div>
+</button>
+<!--     </div> -->
+<!--     <button type="button" class="collapsible">Klikni pro napovedu</button> -->
+     <div class="content">
+       <p>{{ stage_current_id.stage_help }}</p>
+     </div>
+<script>
+var coll = document.getElementsByClassName("collapsible");
+var i;
+
+for (i = 0; i < coll.length; i++) {
+  coll[i].addEventListener("click", function() {
+    this.classList.toggle("active");
+    var content = this.nextElementSibling;
+    if (content.style.maxHeight){
+      content.style.maxHeight = null;
+    } else {
+      content.style.maxHeight = content.scrollHeight + "px";
+    }
+  });
+}
+</script>
+     </br>
+       <div class="form-field  ">
+        <div class="form-field__wrapper form-field__wrapper--shadowed">
+         {{ passphrase_form.passphrase.errors }}
+         <label for="{{ passphrase_form.passphrase.id_for_label }}">Zadejte heslo pro pristup do dalsi urovne: </label>
+         {{ passphrase_form.passphrase }}
+        </div>
+       </div>
+       <div class="form-field  ">
+        <div class="form-field__wrapper form-field__wrapper--shadowed">
+        {{ passphrase_form.stage_current_urlhash.errors }}
+{% comment %}
+	    <label for="{{ passphrase_form.stage_current_urlhash.id_for_label }}">URLHASH: </label>
+{% endcomment %}
+	    <input id="id_stage_current_urlhash" type="hidden" name="stage_current_urlhash" required="" value="{{stage_current_id.stage_urlhash}}">
+       </div>
+       </div>
+{% comment %}
+     {{ passphrase_form.passphrase }}</br>
+     {{ passphrase_form.stage_current_urlhash }}
+{% endcomment %}
+
+
+    <button class="btn btn--autowidth {{ classes }}">
+     <div class="btn__body">Odeslat</div>
+    </button>
+<!--     <input type="submit" value= 'Odeslat' name='passphrase_form'>  -->
+    </form>
+   {% else %}
+    nejaky else
    {% endif%}
+	{% comment %}
+   {% endcomment %}
   {% endif %}
  {% else %}
   <div class="alert alert--red-600">
diff --git a/sifrovacka/urls.py b/sifrovacka/urls.py
index f1d65ad9378bd3f6b1ae4d2932e1f0a2f36c4bbf..1183f0824c287c68e3c0a1a91aec0c1a3b532aef 100644
--- a/sifrovacka/urls.py
+++ b/sifrovacka/urls.py
@@ -19,8 +19,4 @@ urlpatterns = [
     path('', views.index, name='index'),
     ]
 #    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
-if settings.DEBUG:
-    print("XXXXXX")
-    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
-    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 
diff --git a/sifrovacka/views.py b/sifrovacka/views.py
index a011d658e639c6d6477c6aa04067d89ca1ca61d1..63ad7287cdde013c90098795e2c58348f3712324 100644
--- a/sifrovacka/views.py
+++ b/sifrovacka/views.py
@@ -1,4 +1,4 @@
-from django.shortcuts import get_object_or_404, render
+from django.shortcuts import get_object_or_404, render, redirect
 
 # Create your views here.
 from django.db import IntegrityError
@@ -8,25 +8,30 @@ from django.template import loader
 from django.contrib.auth import login,logout
 from .models import Sifrovacka, Stages, Participants
 
+# forms
+from .forms import PassphraseForm
 
 def stage(request, sifrovacka_id, stage_urlhash):
 #    print(dir(request.user.participants_set.values))
 #    print(stage_urlhash)
 #    print(request.user.participants_set.values())
 #    sifrovacka_current_stage = request.user.participants_set.values_list('id')
+    passphrase_form = None
+    sifrovacka_next_stage = None
     sifrovacka_current_stage_urlhash = None
-    sifrovacka_current_id = None
     sifrovacka_detail = Sifrovacka.objects.get(id = sifrovacka_id)
     sifrovacka_stages = Stages.objects.filter(sifrovacka__sifrovacka_name = sifrovacka_detail)
     sifrovacka_stage_count = sifrovacka_stages.count()
+    stage_current_id = None
+    last_stage = False
     if request.user.is_authenticated:
         sifrovacka_all_user_current_stages= Participants.objects.filter(user = \
                                              request.user).filter(sifrovacka_id = \
                                              sifrovacka_id).values('sifrovacka_id','id')
         for s in sifrovacka_all_user_current_stages:
             if s['sifrovacka_id'] == sifrovacka_id:
-                print("---AA---")
-    #            print(s['at_stage'])
+                print("---SIFROVACKA---")
+#                print(s['id'])
                 tmp_stage_id = s['id']
                 sifrovacka_current_stage_urlhash = Participants.objects.get(id = \
                                                     tmp_stage_id)
@@ -36,18 +41,62 @@ def stage(request, sifrovacka_id, stage_urlhash):
                                         sifrovacka_current_stage_urlhash.at_stage)
                     #sifrovacka_current = Participants.objects.get(id = \
                     #                      tmp_stage_id)
+                    print(stage_current_id)
                 else:
                     print('not same')
-#    else:
-#        sifrovacka_current = None
 
-    print(sifrovacka_current_id)
+                if stage_current_id.stage_number < sifrovacka_stage_count:
+                    if request.method == 'POST':
+                        print("---POST---")
+                        passphrase_form = PassphraseForm(request.POST)
+
+                        if passphrase_form.is_valid():
+                            print(request.path)
+                            print(dir(request))
+                            print("----BETWEEN STAGES----")
+                            tmp_next_stage_number = stage_current_id.stage_number + 1
+                            print(tmp_next_stage_number)
+                            sifrovacka_current = sifrovacka_stages.filter(stage_number = tmp_next_stage_number)
+                            print(sifrovacka_current)
+                            sifrovacka_next_stage = sifrovacka_current.get(stage_number = tmp_next_stage_number)
+                            print(sifrovacka_next_stage)
+                            tmp_stage_next_urlhash = sifrovacka_next_stage.stage_urlhash
+                            tmp_stage_next_passphrase = sifrovacka_next_stage.stage_passphrase
+                            print(tmp_next_stage_number)
+                            print(tmp_stage_next_urlhash)
+                            print(tmp_stage_next_passphrase)
+
+                            if tmp_stage_next_passphrase == request.POST['passphrase']:
+                                print('correct passphrase')
+                                setattr(sifrovacka_current_stage_urlhash, 'at_stage', tmp_stage_next_urlhash)
+                                sifrovacka_current_stage_urlhash.save()
+                                tmp_stage_url = request.path.split('/')
+                                tmp_stage_url[3] = tmp_stage_next_urlhash
+                                tmp_stage_next_url = "/".join(tmp_stage_url)
+                                print(tmp_stage_next_url)
+                                return redirect(tmp_stage_next_url)
+        
+                            passphrase_form = PassphraseForm()
+                            print("ENDHASH")
+    
+                    else:
+                        print("---GET---")
+                        passphrase_form = PassphraseForm()
+
+                else:
+                    print("VETSI")
+                    last_stage = True
+    
+
+    print(last_stage)
     context = {"sifrovacka_id": sifrovacka_id,
                "sifrovacka_detail": sifrovacka_detail,
                "sifrovacka_stages": sifrovacka_stages,
                "sifrovacka_stage_count": sifrovacka_stage_count,
+               "sifrovacka_current_stage_urlhash": sifrovacka_current_stage_urlhash,
                "stage_current_id": stage_current_id,
-               "sifrovacka_current_stage_urlhash": sifrovacka_current_stage_urlhash
+               "last_stage": last_stage,
+               'passphrase_form': passphrase_form
               }
     return render(request, 'stage.html', context)
 
@@ -64,7 +113,7 @@ def detail(request, sifrovacka_id):
                                              sifrovacka_id).values('sifrovacka_id','id')
         for s in sifrovacka_all_user_current_stages:
             if s['sifrovacka_id'] == sifrovacka_id:
-                print("---AA---")
+                print("---SIFROVACKA---")
     #            print(s['at_stage'])
                 tmp_stage_id = s['id']
                 sifrovacka_current_stage_urlhash = Participants.objects.get(id = \