diff --git a/lib/CF/Controller/Posts.pm b/lib/CF/Controller/Posts.pm
index 1745de58abea45758aea87cdab8b77b4951a54e1..384b0bfd4a018b4adacd789db8c1ea9bf0150993 100644
--- a/lib/CF/Controller/Posts.pm
+++ b/lib/CF/Controller/Posts.pm
@@ -5,6 +5,13 @@ use Mojo::Pg::PubSub;
 use feature 'signatures';
 no warnings qw{ experimental::signatures };
 
+# TODO: do modelu
+use constant STATUS_ANNOUNCEMENTS => {
+    1 => 1, # prijatelny n.p.
+    2 => 2, # schvaleny n.p.
+    3 => 0, # zamitnuty n.p.
+};
+
 sub create ($c) {
     $c->openapi->valid_input or return;
 
@@ -165,6 +172,33 @@ sub update ($c) {
     my $pubsub = Mojo::Pg::PubSub->new(pg => $c->pg);
     my $guard  = $c->schema->txn_scope_guard;
 
+    if ( $update->{state} && $post->state != $update->{state} ) {
+        my $announcement_type = STATUS_ANNOUNCEMENTS->{ $args->{state} };
+
+        #TODO: do modelu
+        my $msg = $c->schema->resultset('Announcement')->from_template(
+            $announcement_type,
+            $post->user->name,
+            $post->content,
+        );
+
+        my $announcement = $c->schema->resultset('Announcement')->create({
+            user_id  => $c->user->{id},
+            type     => $announcement_type,
+            content  => $msg,
+        });
+
+        # potrebujeme kvuli datumu
+        $announcement = $c->schema->resultset('Announcement')->find({
+            id => $announcement->id
+        });
+
+        $pubsub->json('notify')->notify( notify => {
+            event   => 'announcement_created',
+            payload => $announcement->format(),
+        });
+    }
+
     $post->add_to_history({
         user_id  => $c->user->{id},
         datetime => $post->changed // $post->datetime,
diff --git a/lib/CF/Controller/Users.pm b/lib/CF/Controller/Users.pm
index 96bb7e024a14244b2878757376381661da1bf9b0..fae7b064775519b3f69317d2eb49f01b91606a6c 100644
--- a/lib/CF/Controller/Users.pm
+++ b/lib/CF/Controller/Users.pm
@@ -32,7 +32,27 @@ sub ban ($c){
     my $guard  = $c->schema->txn_scope_guard;
 
     $user->update({ banned_until => \"now()+'8 hour'", });
-    #TODO: ANN
+
+    #TODO: do modelu
+    my $msg = $c->schema->resultset('Announcement')->from_template(
+        5, $user->name,
+    );
+
+    my $announcement = $c->schema->resultset('Announcement')->create({
+        user_id  => $c->user->{id},
+        type     => 5,
+        content  => $msg,
+    });
+
+    # potrebujeme kvuli datumu
+    $announcement = $c->schema->resultset('Announcement')->find({
+        id => $announcement->id,
+    });
+
+    $pubsub->json('notify')->notify( notify => {
+        event   => 'announcement_created',
+        payload => $announcement->format(),
+    });
 
     $pubsub->json('notify')->notify( notify => {
         event   => 'user_banned',
diff --git a/lib/CF/Schema/Result/Post.pm b/lib/CF/Schema/Result/Post.pm
index 5061d9bb694700a86ec832537347ae427018f84a..7881f698b18b969333d6e87d378763ed2e5985b8 100644
--- a/lib/CF/Schema/Result/Post.pm
+++ b/lib/CF/Schema/Result/Post.pm
@@ -36,7 +36,7 @@ __PACKAGE__->set_primary_key('id');
 __PACKAGE__->has_one( view => 'CF::Schema::Result::Post_view', 'id');
 
 __PACKAGE__->belongs_to(
-    user => 'Zircon::Schema::Result::User',
+    user => 'CF::Schema::Result::User',
     {
         'foreign.id' => 'self.user_id',
     },
diff --git a/lib/CF/Schema/ResultSet/Announcement.pm b/lib/CF/Schema/ResultSet/Announcement.pm
index 54c7b22889e5b1d048a6ec6b63221f6ca39c8157..58a45f568a11d5ee4f732627efa8cc9e82c77c75 100644
--- a/lib/CF/Schema/ResultSet/Announcement.pm
+++ b/lib/CF/Schema/ResultSet/Announcement.pm
@@ -2,6 +2,9 @@ package CF::Schema::ResultSet::Announcement;
 
 use strict;
 use warnings;
+use utf8;
+use feature 'signatures';
+no warnings qw{ experimental::signatures };
 
 use base 'DBIx::Class::ResultSet';
 
@@ -13,4 +16,21 @@ use constant PROTECTED_FIELDS => [qw(
     type
 )];
 
+use constant TEMPLATE => {
+    0 => 'Předsedající prohlásil návrh postupu předložený **%s** za nepřijatelný ' .
+         'a dál k němu nepřihlíží // **§4 (2) JdŘ CF**',
+    1 => 'Byl schválen návrh postupu, předložený **%s** ' .
+         'v následujícím znění: "*%s*"',
+    2 => 'Předsedající zaznamenal přijatelný návrh postupu, předložený **%s** ' .
+         'v následujícím znění: "*%s*". ' .
+         'O návrhu postupu se hlasuje bezodkladně // **§10 (2) JdŘ CF**',
+    5 => 'Předsedající, pořádkovým opatřením, vykázal z jednání **%s** // **§2 (1) JdŘ CF**',
+};
+
+sub from_template ( $class, $id, @args ) {
+    my $template = TEMPLATE->{$id} // return '';
+
+    return sprintf($template, @args);
+}
+
 1;