diff --git a/android/assets/text/screen/createuser/form/resource_cs.properties b/android/assets/text/screen/createuser/form/resource_cs.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/android/assets/text/screen/createuser/form/resource_sk.properties b/android/assets/text/screen/createuser/form/resource_sk.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/android/assets/text/screen/createuser/panorama/resource_cs.properties b/android/assets/text/screen/createuser/panorama/resource_cs.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c5625f3f7e1d57237348075bd4fa7c6a0a1aa0f2
--- /dev/null
+++ b/android/assets/text/screen/createuser/panorama/resource_cs.properties
@@ -0,0 +1,4 @@
+createuser_detective_1=Dialog 1
+createuser_detective_2=Dialog 2
+createuser_detective_3=Dialog 3
+createuser_detective_4=Dialog 4
diff --git a/android/assets/text/screen/createuser/panorama/resource_sk.properties b/android/assets/text/screen/createuser/panorama/resource_sk.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1bd67ca1ca8e6292f03b20f70325ab52136fadd4
--- /dev/null
+++ b/android/assets/text/screen/createuser/panorama/resource_sk.properties
@@ -0,0 +1,4 @@
+createuser_detective_1=Dialog 1 SK
+createuser_detective_2=Dialog 2 SK
+createuser_detective_3=Dialog 3 SK
+createuser_detective_4=Dialog 4 SK
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/0.jpg b/core/assets/common/screen/createuser/form/gfx/avatar/0.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..75da7bcf703c1e58f178a7de987cf643a78903fe
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/0.jpg differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/1.jpg b/core/assets/common/screen/createuser/form/gfx/avatar/1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3409e14994c0fc23a51d4a6d4af4cede4356d5fc
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/1.jpg differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/2.jpg b/core/assets/common/screen/createuser/form/gfx/avatar/2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3cdfe5698f3f90d7bc7bd466b06eff664b46dce3
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/2.jpg differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/3.jpg b/core/assets/common/screen/createuser/form/gfx/avatar/3.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e68c84ab3231d758071a8b61a98bfa8af020c4de
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/3.jpg differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/4.jpg b/core/assets/common/screen/createuser/form/gfx/avatar/4.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..df34c7f0eb54c1d7b60e70253025371638b47fe4
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/4.jpg differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/5.jpg b/core/assets/common/screen/createuser/form/gfx/avatar/5.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..11d27fdf3da7466a3292dae323a1d62c115c1516
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/5.jpg differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/6.jpg b/core/assets/common/screen/createuser/form/gfx/avatar/6.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..49fd4ee5d7b9e473370a55b1907340245c0e931a
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/6.jpg differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/7.jpg b/core/assets/common/screen/createuser/form/gfx/avatar/7.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..92780b09bae2bab38edff11674a9cf45701be676
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/7.jpg differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/8.jpg b/core/assets/common/screen/createuser/form/gfx/avatar/8.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3ab38fc4261a91c08124e19571bbc35a36998e79
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/8.jpg differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/film_inside.png b/core/assets/common/screen/createuser/form/gfx/avatar/film_inside.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9b8702977168618df9f05a03f081e1716a8941b
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/film_inside.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/film_outerline.png b/core/assets/common/screen/createuser/form/gfx/avatar/film_outerline.png
new file mode 100644
index 0000000000000000000000000000000000000000..59c1eeb589275f299c5c44fc03102503206d284c
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/film_outerline.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/avatar/overlay.png b/core/assets/common/screen/createuser/form/gfx/avatar/overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8fc30a3129c1ed8bf6f5c1ffb25a031c3e894ea
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/avatar/overlay.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/background.png b/core/assets/common/screen/createuser/form/gfx/background.png
new file mode 100644
index 0000000000000000000000000000000000000000..739d3949bf7550fa62fad0619a5eec42dd55e930
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/background.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/badge.png b/core/assets/common/screen/createuser/form/gfx/badge.png
new file mode 100644
index 0000000000000000000000000000000000000000..45ad4492f63ba38d376310487e4469c7d08f4c20
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/badge.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/border.png b/core/assets/common/screen/createuser/form/gfx/border.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c5b7d9ba407faf4c3b125aff5adc186131df15b
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/border.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/button_minus.png b/core/assets/common/screen/createuser/form/gfx/button_minus.png
new file mode 100644
index 0000000000000000000000000000000000000000..11fb998c172a3a96480fa7c6106e64e9fd0d6cbe
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/button_minus.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/button_minus_pressed.png b/core/assets/common/screen/createuser/form/gfx/button_minus_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..d923eb65e5ae538561aa0c9b0a868cd00ad3d3d5
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/button_minus_pressed.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/button_plus.png b/core/assets/common/screen/createuser/form/gfx/button_plus.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cd5b655566e9e165a5778eca4f1f301a9ccf41d
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/button_plus.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/button_plus_pressed.png b/core/assets/common/screen/createuser/form/gfx/button_plus_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..669037737c89272010be6a9f50707b04b14b623b
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/button_plus_pressed.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/dialog_background.9.png b/core/assets/common/screen/createuser/form/gfx/dialog_background.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..4dd5f9881af1d77adf6af2b9ba0211f8aaf5888d
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/dialog_background.9.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/error.png b/core/assets/common/screen/createuser/form/gfx/error.png
new file mode 100644
index 0000000000000000000000000000000000000000..9006e9ba813182e8074a6362a6fbf689802eb006
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/error.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/helpbubble_left.9.png b/core/assets/common/screen/createuser/form/gfx/helpbubble_left.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..c45eaeabca3ff4f6f3e114b16f2852e83e9f7079
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/helpbubble_left.9.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/helpbubble_straight.9.png b/core/assets/common/screen/createuser/form/gfx/helpbubble_straight.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab0f4e1cfe93736a032385ffa0fd756a485decbb
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/helpbubble_straight.9.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/ink.png b/core/assets/common/screen/createuser/form/gfx/ink.png
new file mode 100644
index 0000000000000000000000000000000000000000..13ce5d7757043e0e53be948d94a2123ecccc1dec
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/ink.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/inkpad.png b/core/assets/common/screen/createuser/form/gfx/inkpad.png
new file mode 100644
index 0000000000000000000000000000000000000000..eed2a9a6bcb632ada3c70a7a6cead0a4b0f33963
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/inkpad.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/mugshotframe.png b/core/assets/common/screen/createuser/form/gfx/mugshotframe.png
new file mode 100644
index 0000000000000000000000000000000000000000..525b4cac6a429886d170ab197bdd2f18515f4c22
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/mugshotframe.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/pencil.png b/core/assets/common/screen/createuser/form/gfx/pencil.png
new file mode 100644
index 0000000000000000000000000000000000000000..5460327ad85d9900e87cedb4e658964106d5e1ee
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/pencil.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/pencil_dropped.png b/core/assets/common/screen/createuser/form/gfx/pencil_dropped.png
new file mode 100644
index 0000000000000000000000000000000000000000..cab6f998fe0687c7f04f48cf6a42a42356ac7eee
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/pencil_dropped.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/pencil_dropped_selected.png b/core/assets/common/screen/createuser/form/gfx/pencil_dropped_selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..88b505ad15afada3ad5f464bf1b2f993c952d25c
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/pencil_dropped_selected.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/pencil_grabbed.png b/core/assets/common/screen/createuser/form/gfx/pencil_grabbed.png
new file mode 100644
index 0000000000000000000000000000000000000000..67167e89250334ac98f4fc4baa679a56ae84d220
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/pencil_grabbed.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/sex_female.png b/core/assets/common/screen/createuser/form/gfx/sex_female.png
new file mode 100644
index 0000000000000000000000000000000000000000..40ed86d45c1ccdeb53068afffc147b10d4fefb14
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/sex_female.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/sex_male.png b/core/assets/common/screen/createuser/form/gfx/sex_male.png
new file mode 100644
index 0000000000000000000000000000000000000000..2640eb2ac943b163fef8e8f70fe1a2f221d5f9a7
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/sex_male.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/signature_background.9.png b/core/assets/common/screen/createuser/form/gfx/signature_background.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..34a8684782808b80af8fd556e3b6dd0b8eb73a19
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/signature_background.9.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/stamp_left_dropped.png b/core/assets/common/screen/createuser/form/gfx/stamp_left_dropped.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a9f24702ed6332c89da92348496173dec561bc0
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/stamp_left_dropped.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/stamp_left_grabbed.png b/core/assets/common/screen/createuser/form/gfx/stamp_left_grabbed.png
new file mode 100644
index 0000000000000000000000000000000000000000..6dc7f8c326d1341c5c9e811c3d1a68fa70616c95
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/stamp_left_grabbed.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/stamp_left_selected.png b/core/assets/common/screen/createuser/form/gfx/stamp_left_selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e285f93da545c703e1d12011c0970726d07af6a
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/stamp_left_selected.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/stamp_middle_dropped.png b/core/assets/common/screen/createuser/form/gfx/stamp_middle_dropped.png
new file mode 100644
index 0000000000000000000000000000000000000000..39a6962e70210e5228dfe9d518467695af0f3a4c
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/stamp_middle_dropped.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/stamp_middle_grabbed.png b/core/assets/common/screen/createuser/form/gfx/stamp_middle_grabbed.png
new file mode 100644
index 0000000000000000000000000000000000000000..765902e61bd12e4af761d0094ce80c49596f0533
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/stamp_middle_grabbed.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/stamp_right_dropped.png b/core/assets/common/screen/createuser/form/gfx/stamp_right_dropped.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f28651c6f40775a56b7af8e7f5cd2aa8b883896
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/stamp_right_dropped.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/stamp_right_grabbed.png b/core/assets/common/screen/createuser/form/gfx/stamp_right_grabbed.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c90a45d977d7e251bc528af91e635da0e180706
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/stamp_right_grabbed.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/switch_background.png b/core/assets/common/screen/createuser/form/gfx/switch_background.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdabc002a724e552c2f4589a48cb427d324291da
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/switch_background.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/switch_center.png b/core/assets/common/screen/createuser/form/gfx/switch_center.png
new file mode 100644
index 0000000000000000000000000000000000000000..256fbadf858b3ff75d89f613a999690097da942e
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/switch_center.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/switch_left.png b/core/assets/common/screen/createuser/form/gfx/switch_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..8216aa6e7239296e511c20368cd417e86bb9a7df
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/switch_left.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/switch_right.png b/core/assets/common/screen/createuser/form/gfx/switch_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4277b77893113429fb7c0fb9c073d0c8cb2241a
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/switch_right.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/table.png b/core/assets/common/screen/createuser/form/gfx/table.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2b0e26c037723806231dc09d8b571f64648f0c9
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/table.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/texfield_signature.png b/core/assets/common/screen/createuser/form/gfx/texfield_signature.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1f3db7e0973c2588a89a6fbfbde0511adeea54a
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/texfield_signature.png differ
diff --git a/core/assets/common/screen/createuser/form/gfx/textfield_covername.png b/core/assets/common/screen/createuser/form/gfx/textfield_covername.png
new file mode 100644
index 0000000000000000000000000000000000000000..f67dfed4c1dba619ba2dfcbb296147f9e3f0e287
Binary files /dev/null and b/core/assets/common/screen/createuser/form/gfx/textfield_covername.png differ
diff --git a/core/assets/common/screen/createuser/form/mfx/profil_foto.mp3 b/core/assets/common/screen/createuser/form/mfx/profil_foto.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..5b965b8577412471de14be3cf37c66b7862abe43
Binary files /dev/null and b/core/assets/common/screen/createuser/form/mfx/profil_foto.mp3 differ
diff --git a/core/assets/common/screen/createuser/form/mfx/profil_jmeno.mp3 b/core/assets/common/screen/createuser/form/mfx/profil_jmeno.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..d5231dd5e8af6c032e83dd989c42d63703864b47
Binary files /dev/null and b/core/assets/common/screen/createuser/form/mfx/profil_jmeno.mp3 differ
diff --git a/core/assets/common/screen/createuser/form/mfx/profil_klukholka.mp3 b/core/assets/common/screen/createuser/form/mfx/profil_klukholka.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..819eb8ac56603007ee460e5d24a38bc5f0231b48
Binary files /dev/null and b/core/assets/common/screen/createuser/form/mfx/profil_klukholka.mp3 differ
diff --git a/core/assets/common/screen/createuser/form/mfx/profil_podpis_pero.mp3 b/core/assets/common/screen/createuser/form/mfx/profil_podpis_pero.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..d0a6e84a17af4bd866abfd8ea3a645acae261bc6
Binary files /dev/null and b/core/assets/common/screen/createuser/form/mfx/profil_podpis_pero.mp3 differ
diff --git a/core/assets/common/screen/createuser/form/mfx/profil_podpis_prst.mp3 b/core/assets/common/screen/createuser/form/mfx/profil_podpis_prst.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..754ca5a15f908d1db0b45082c6faebcc70b68cf4
Binary files /dev/null and b/core/assets/common/screen/createuser/form/mfx/profil_podpis_prst.mp3 differ
diff --git a/core/assets/common/screen/createuser/form/mfx/profil_razitko.mp3 b/core/assets/common/screen/createuser/form/mfx/profil_razitko.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..fdebe5c86e2437b6cb1408a9a94e381472ff14f6
Binary files /dev/null and b/core/assets/common/screen/createuser/form/mfx/profil_razitko.mp3 differ
diff --git a/core/assets/common/screen/createuser/form/mfx/profil_vek.mp3 b/core/assets/common/screen/createuser/form/mfx/profil_vek.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..e206f076e0c54095b2f30e39c47fc0914e610d5d
Binary files /dev/null and b/core/assets/common/screen/createuser/form/mfx/profil_vek.mp3 differ
diff --git a/core/assets/common/screen/createuser/form/sfx/cesta_do_kancelare.mp3 b/core/assets/common/screen/createuser/form/sfx/cesta_do_kancelare.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..c74d01aa68cf5381662878db1a1307fa3b89868f
Binary files /dev/null and b/core/assets/common/screen/createuser/form/sfx/cesta_do_kancelare.mp3 differ
diff --git a/core/assets/common/screen/createuser/panorama/balcony.png b/core/assets/common/screen/createuser/panorama/gfx/balcony.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/balcony.png
rename to core/assets/common/screen/createuser/panorama/gfx/balcony.png
diff --git a/core/assets/common/screen/createuser/panorama/balcony_blur.png b/core/assets/common/screen/createuser/panorama/gfx/balcony_blur.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/balcony_blur.png
rename to core/assets/common/screen/createuser/panorama/gfx/balcony_blur.png
diff --git a/core/assets/common/screen/createuser/panorama/balcony_blur_winter.png b/core/assets/common/screen/createuser/panorama/gfx/balcony_blur_winter.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/balcony_blur_winter.png
rename to core/assets/common/screen/createuser/panorama/gfx/balcony_blur_winter.png
diff --git a/core/assets/common/screen/createuser/panorama/balcony_winter.png b/core/assets/common/screen/createuser/panorama/gfx/balcony_winter.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/balcony_winter.png
rename to core/assets/common/screen/createuser/panorama/gfx/balcony_winter.png
diff --git a/core/assets/common/screen/createuser/panorama/detectiveoffice.png b/core/assets/common/screen/createuser/panorama/gfx/detectiveoffice.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/detectiveoffice.png
rename to core/assets/common/screen/createuser/panorama/gfx/detectiveoffice.png
diff --git a/core/assets/common/screen/createuser/panorama/gfx/newspaper/clickmap.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/clickmap.png
new file mode 100644
index 0000000000000000000000000000000000000000..70725cf98732e3f1fb505acadd281bbbf5d6de4f
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/gfx/newspaper/clickmap.png differ
diff --git a/core/assets/cs/screen/createuser/panorama/newspaper/detail01.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/detail01.png
similarity index 100%
rename from core/assets/cs/screen/createuser/panorama/newspaper/detail01.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/detail01.png
diff --git a/core/assets/cs/screen/createuser/panorama/newspaper/detail02.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/detail02.png
similarity index 100%
rename from core/assets/cs/screen/createuser/panorama/newspaper/detail02.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/detail02.png
diff --git a/core/assets/cs/screen/createuser/panorama/newspaper/detail03.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/detail03.png
similarity index 100%
rename from core/assets/cs/screen/createuser/panorama/newspaper/detail03.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/detail03.png
diff --git a/core/assets/cs/screen/createuser/panorama/newspaper/detail04.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/detail04.png
similarity index 100%
rename from core/assets/cs/screen/createuser/panorama/newspaper/detail04.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/detail04.png
diff --git a/core/assets/cs/screen/createuser/panorama/newspaper/detail05.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/detail05.png
similarity index 100%
rename from core/assets/cs/screen/createuser/panorama/newspaper/detail05.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/detail05.png
diff --git a/core/assets/common/screen/createuser/panorama/gfx/newspaper/left_finger.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/left_finger.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8431dbbe719145e6fb60de67d497509ba356117
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/gfx/newspaper/left_finger.png differ
diff --git a/core/assets/common/screen/createuser/panorama/newspaper/open1.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/open1.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/newspaper/open1.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/open1.png
diff --git a/core/assets/common/screen/createuser/panorama/newspaper/open2.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/open2.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/newspaper/open2.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/open2.png
diff --git a/core/assets/common/screen/createuser/panorama/newspaper/open3.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/open3.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/newspaper/open3.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/open3.png
diff --git a/core/assets/common/screen/createuser/panorama/newspaper/open4.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/open4.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/newspaper/open4.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/open4.png
diff --git a/core/assets/common/screen/createuser/panorama/newspaper/open5.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/open5.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/newspaper/open5.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/open5.png
diff --git a/core/assets/common/screen/createuser/panorama/gfx/newspaper/overlay.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8fc30a3129c1ed8bf6f5c1ffb25a031c3e894ea
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/gfx/newspaper/overlay.png differ
diff --git a/core/assets/common/screen/createuser/panorama/gfx/newspaper/right_finger.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/right_finger.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f996ffb9571729c7dfa386b66b2fe4d0669089b
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/gfx/newspaper/right_finger.png differ
diff --git a/core/assets/common/screen/createuser/panorama/newspaper/newspaper.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/spinner.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/newspaper/newspaper.png
rename to core/assets/common/screen/createuser/panorama/gfx/newspaper/spinner.png
diff --git a/core/assets/common/screen/createuser/panorama/gfx/newspaper/stretchhint.png b/core/assets/common/screen/createuser/panorama/gfx/newspaper/stretchhint.png
new file mode 100644
index 0000000000000000000000000000000000000000..949faea19c87d8a12fcf7700d1ac63cbe798c108
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/gfx/newspaper/stretchhint.png differ
diff --git a/core/assets/common/screen/createuser/panorama/gfx/swipe/knock.png b/core/assets/common/screen/createuser/panorama/gfx/swipe/knock.png
new file mode 100644
index 0000000000000000000000000000000000000000..04affd8dac3740e31c9c80a71da29278110c4273
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/gfx/swipe/knock.png differ
diff --git a/core/assets/common/screen/createuser/panorama/swipe/tile0.png b/core/assets/common/screen/createuser/panorama/gfx/swipe/tile0.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/swipe/tile0.png
rename to core/assets/common/screen/createuser/panorama/gfx/swipe/tile0.png
diff --git a/core/assets/common/screen/createuser/panorama/swipe/tile1.png b/core/assets/common/screen/createuser/panorama/gfx/swipe/tile1.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/swipe/tile1.png
rename to core/assets/common/screen/createuser/panorama/gfx/swipe/tile1.png
diff --git a/core/assets/common/screen/createuser/panorama/swipe/tile2.png b/core/assets/common/screen/createuser/panorama/gfx/swipe/tile2.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/swipe/tile2.png
rename to core/assets/common/screen/createuser/panorama/gfx/swipe/tile2.png
diff --git a/core/assets/common/screen/createuser/panorama/swipe/tile3.png b/core/assets/common/screen/createuser/panorama/gfx/swipe/tile3.png
similarity index 100%
rename from core/assets/common/screen/createuser/panorama/swipe/tile3.png
rename to core/assets/common/screen/createuser/panorama/gfx/swipe/tile3.png
diff --git a/core/assets/common/screen/createuser/panorama/sfx/noviny_prilet.mp3 b/core/assets/common/screen/createuser/panorama/sfx/noviny_prilet.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..34931ae84939d54691fd91cc8daa5380de6d40a1
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/sfx/noviny_prilet.mp3 differ
diff --git a/core/assets/common/screen/createuser/panorama/sfx/noviny_rozbaleni.mp3 b/core/assets/common/screen/createuser/panorama/sfx/noviny_rozbaleni.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..07417998ccd96e7afdaa00dee6e4de4c5d6c09a1
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/sfx/noviny_rozbaleni.mp3 differ
diff --git a/core/assets/common/screen/createuser/panorama/sfx/tuk_1.mp3 b/core/assets/common/screen/createuser/panorama/sfx/tuk_1.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..210305a705ae5d4676934e96dfdf65a9ccce0449
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/sfx/tuk_1.mp3 differ
diff --git a/core/assets/common/screen/createuser/panorama/sfx/tuk_2.mp3 b/core/assets/common/screen/createuser/panorama/sfx/tuk_2.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..9f99b26d5206ae12e04502cc78a425a0905cf269
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/sfx/tuk_2.mp3 differ
diff --git a/core/assets/common/screen/createuser/panorama/sfx/tuk_3.mp3 b/core/assets/common/screen/createuser/panorama/sfx/tuk_3.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..9c546e954b77aab22a85fe0c31b1bb9e4cd55088
Binary files /dev/null and b/core/assets/common/screen/createuser/panorama/sfx/tuk_3.mp3 differ
diff --git a/core/assets/cs/screen/createuser/form/gfx/stamp.png b/core/assets/cs/screen/createuser/form/gfx/stamp.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e80db058bac023e45e67c2a7f06663bb1c0509c
Binary files /dev/null and b/core/assets/cs/screen/createuser/form/gfx/stamp.png differ
diff --git a/core/assets/cs/screen/createuser/form/gfx/stampplaceholder.png b/core/assets/cs/screen/createuser/form/gfx/stampplaceholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..1412e8205cf2bb95a4d4d75a8045848a74f22925
Binary files /dev/null and b/core/assets/cs/screen/createuser/form/gfx/stampplaceholder.png differ
diff --git a/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail01.png b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail01.png
new file mode 100644
index 0000000000000000000000000000000000000000..55d7c9e036690dc887f7725e1bec551d2f32d066
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail01.png differ
diff --git a/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail02.png b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail02.png
new file mode 100644
index 0000000000000000000000000000000000000000..a957ccb0eaaf65a07de48d910d068a2d37541826
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail02.png differ
diff --git a/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail03.png b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail03.png
new file mode 100644
index 0000000000000000000000000000000000000000..f991753da10e867e23da437f1e6b99b65d4eb2f0
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail03.png differ
diff --git a/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail04.png b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail04.png
new file mode 100644
index 0000000000000000000000000000000000000000..887737f2dbe3bfd44f855e8066d90ff066bd74af
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail04.png differ
diff --git a/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail05.png b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail05.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d5480a69ce336ed74a02742c563140d75739020
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/detail05.png differ
diff --git a/core/assets/cs/screen/createuser/panorama/newspaper/opened.png b/core/assets/cs/screen/createuser/panorama/gfx/newspaper/opened.png
similarity index 100%
rename from core/assets/cs/screen/createuser/panorama/newspaper/opened.png
rename to core/assets/cs/screen/createuser/panorama/gfx/newspaper/opened.png
diff --git a/core/assets/cs/screen/createuser/panorama/swipe/door.png b/core/assets/cs/screen/createuser/panorama/gfx/swipe/door.png
similarity index 100%
rename from core/assets/cs/screen/createuser/panorama/swipe/door.png
rename to core/assets/cs/screen/createuser/panorama/gfx/swipe/door.png
diff --git a/core/assets/cs/screen/createuser/panorama/mfx/detective/1.mp3 b/core/assets/cs/screen/createuser/panorama/mfx/detective/1.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..7fccdea0b2361bdb5b1dd9f7d3948091716d6f85
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/mfx/detective/1.mp3 differ
diff --git a/core/assets/cs/screen/createuser/panorama/mfx/detective/2.mp3 b/core/assets/cs/screen/createuser/panorama/mfx/detective/2.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..c6586352a630a888517f1accdb345d1d575f2a7b
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/mfx/detective/2.mp3 differ
diff --git a/core/assets/cs/screen/createuser/panorama/mfx/detective/3.mp3 b/core/assets/cs/screen/createuser/panorama/mfx/detective/3.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..1b14801a029b7168c2412d36deeb6d7613ac7c51
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/mfx/detective/3.mp3 differ
diff --git a/core/assets/cs/screen/createuser/panorama/mfx/detective/4.mp3 b/core/assets/cs/screen/createuser/panorama/mfx/detective/4.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..1b8fde371a3727154bf2ccecbb1a06b7769c996b
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/mfx/detective/4.mp3 differ
diff --git a/core/assets/cs/screen/createuser/panorama/mfx/newspaper/1.mp3 b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/1.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..fdcb51732b091e768b1812626897da8095664ed4
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/1.mp3 differ
diff --git a/core/assets/cs/screen/createuser/panorama/mfx/newspaper/2.mp3 b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/2.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..cecdaedb1d903b2492038d64e953ebe19a0f89a7
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/2.mp3 differ
diff --git a/core/assets/cs/screen/createuser/panorama/mfx/newspaper/3.mp3 b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/3.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..eb8c1ad4274c1b506f85f091a87adcb82a86279d
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/3.mp3 differ
diff --git a/core/assets/cs/screen/createuser/panorama/mfx/newspaper/4.mp3 b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/4.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..95d57558a336bb74d8f5b1286b68b1f0e64ab6d3
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/4.mp3 differ
diff --git a/core/assets/cs/screen/createuser/panorama/mfx/newspaper/5.mp3 b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/5.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..5e1ea85e795ed9a94b399221d36a6c35531779e4
Binary files /dev/null and b/core/assets/cs/screen/createuser/panorama/mfx/newspaper/5.mp3 differ
diff --git a/core/src/cz/nic/tablexia/TablexiaSettings.java b/core/src/cz/nic/tablexia/TablexiaSettings.java
index 15fc8f78e94d347d70917325a322d64c457fa8ec..c7d61812a581e7f447e63a48c148ad41b7710796 100644
--- a/core/src/cz/nic/tablexia/TablexiaSettings.java
+++ b/core/src/cz/nic/tablexia/TablexiaSettings.java
@@ -13,7 +13,7 @@ import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.loader.application.ApplicationTextManager;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
-import cz.nic.tablexia.screen.gamemenu.GameMenuScreen;
+import cz.nic.tablexia.screen.createuser.FormScreen;
 import cz.nic.tablexia.util.Log;
 import cz.nic.tablexia.util.Utility;
 
@@ -24,7 +24,8 @@ public class TablexiaSettings {
     private static final int     MIN_SCREEN_HEIGHT         = (int) (DEFAULT_SCREEN_WIDTH * MAXIMUM_RATIO);
     private static final boolean DEBUG_SHOW_BOUNDING_BOXES = true;
 
-    public static final Class<? extends AbstractTablexiaScreen<?>> INITIAL_SCREEN = GameMenuScreen.class;
+    public static final Class<? extends AbstractTablexiaScreen<?>> INITIAL_SCREEN = FormScreen.class;
+    public static final int                                        AVATAR_COUNT   = 8;
 
     private static final String PREFERENCES_KEY    = "cz.nic.tablexia.";
     public static final  String LOCALE_KEY         = "locale";
@@ -32,6 +33,7 @@ public class TablexiaSettings {
 
     private static final String IDE_BUILD_VERSION_NAME = "DEVEL";
 
+
     private final BuildType BUILD_TYPE;
     private final String    VERSION_NAME;
 
@@ -188,9 +190,9 @@ public class TablexiaSettings {
 
 //////////////////////////// SETTINGS ACCESS
 
-	public boolean isDebug() {
-		return BUILD_TYPE.isDebug();
-	}
+    public boolean isDebug() {
+        return BUILD_TYPE.isDebug();
+    }
 
     public String getVersionName() {
         return VERSION_NAME;
diff --git a/core/src/cz/nic/tablexia/model/User.java b/core/src/cz/nic/tablexia/model/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..4067b4a1f2620113076c7f5ce84a1547b8a5301c
--- /dev/null
+++ b/core/src/cz/nic/tablexia/model/User.java
@@ -0,0 +1,20 @@
+package cz.nic.tablexia.model;
+
+/**
+ * Created by lhoracek on 4/16/15.
+ */
+public class User {
+    private Gender gender;
+
+    public Gender getGender() {
+        return gender;
+    }
+
+    public void setGender(Gender gender) {
+        this.gender = gender;
+    }
+
+    public static enum Gender {
+        MALE,FEMALE;
+    }
+}
diff --git a/core/src/cz/nic/tablexia/screen/AbstractAutoloadTablexiaScreen.java b/core/src/cz/nic/tablexia/screen/AbstractAutoloadTablexiaScreen.java
new file mode 100644
index 0000000000000000000000000000000000000000..d1fb37fcad54e915783ab702bb4f5822732b8feb
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/AbstractAutoloadTablexiaScreen.java
@@ -0,0 +1,75 @@
+package cz.nic.tablexia.screen;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.audio.Music;
+import com.badlogic.gdx.audio.Sound;
+import com.badlogic.gdx.graphics.Texture;
+
+import java.util.List;
+
+import cz.nic.tablexia.loader.TablexiaAssetManager;
+import cz.nic.tablexia.util.assetmanager.DirectoryAsset;
+
+/**
+ * Created by lhoracek on 4/9/15.
+ */
+public class AbstractAutoloadTablexiaScreen<T> extends AbstractLinearTextureTablexiaScreen<T> {
+    public static final String TEXTURE_ASSET_PATH_SUFFIX = "/gfx";
+    public static final String SOUND_ASSET_PATH_SUFFIX = "/sfx";
+    public static final String MUSIC_ASSET_PATH_SUFFIX = "/mfx";
+    public static final String TEXT_ASSET_PATH_SUFFIX = "/resource";
+    public static final String TEXT_ASSET_PATH_PREFIX = "text/";
+
+
+    private DirectoryAsset textureAssets;
+    private DirectoryAsset soundAssets;
+    private DirectoryAsset musicAssets;
+    private String basePath;
+
+    public AbstractAutoloadTablexiaScreen(String basePath) {
+        initAssets(basePath);
+    }
+
+    public AbstractAutoloadTablexiaScreen(boolean hasState, boolean loadAsync, TablexiaAssetManager.StorageType storageType, String basePath) {
+        super(hasState, loadAsync, storageType);
+        initAssets(basePath);
+    }
+
+    private void initAssets(String basePath) {
+        textureAssets = new DirectoryAsset(basePath + TEXTURE_ASSET_PATH_SUFFIX);
+        soundAssets = new DirectoryAsset(basePath + SOUND_ASSET_PATH_SUFFIX);
+        musicAssets = new DirectoryAsset(basePath + MUSIC_ASSET_PATH_SUFFIX);
+        this.basePath = basePath;
+    }
+
+    @Override
+    protected void prepareScreenTextureAssetNames(List<String> textureFileNames) {
+        super.prepareScreenTextureAssetNames(textureFileNames);
+        textureFileNames.addAll(textureAssets.values());
+    }
+
+    @Override
+    protected void prepareScreenSoundAssetNames(List<String> soundsFileNames) {
+        super.prepareScreenSoundAssetNames(soundsFileNames);
+        soundsFileNames.addAll(soundAssets.values());
+    }
+
+    @Override
+    protected String prepareScreenTextResourcesAssetName() {
+        return TEXT_ASSET_PATH_PREFIX + basePath + TEXT_ASSET_PATH_SUFFIX;
+    }
+
+    @Override
+    public Texture getTexture(String textureName) {
+        return super.getTexture(textureAssets.get(textureName));
+    }
+
+    @Override
+    public Sound getSound(String soundName) {
+        return super.getSound(soundAssets.get(soundName));
+    }
+
+    public Music getMusic(String musicName) {
+        return Gdx.audio.newMusic(Gdx.files.external(TablexiaAssetManager.StorageType.EXTERNAL.getStoragePath() + musicAssets.get(musicName)));
+    }
+}
diff --git a/core/src/cz/nic/tablexia/screen/AbstractLinearTextureTablexiaScreen.java b/core/src/cz/nic/tablexia/screen/AbstractLinearTextureTablexiaScreen.java
new file mode 100644
index 0000000000000000000000000000000000000000..10de67bb0cb3964996a45d1e2acf3ff48cd42b48
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/AbstractLinearTextureTablexiaScreen.java
@@ -0,0 +1,24 @@
+package cz.nic.tablexia.screen;
+
+import com.badlogic.gdx.graphics.Texture;
+
+import cz.nic.tablexia.loader.TablexiaAssetManager;
+
+/**
+ * Created by lhoracek on 4/8/15.
+ */
+public class AbstractLinearTextureTablexiaScreen<T> extends AbstractTablexiaScreen<T> {
+    public AbstractLinearTextureTablexiaScreen() {
+    }
+
+    public AbstractLinearTextureTablexiaScreen(boolean hasState, boolean loadAsync, TablexiaAssetManager.StorageType storageType) {
+        super(hasState, loadAsync, storageType);
+    }
+
+    @Override
+    public Texture getTexture(String textureName) {
+        Texture texture = super.getTexture(textureName);
+        texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
+        return texture;
+    }
+}
diff --git a/core/src/cz/nic/tablexia/screen/createuser/FormScreen.java b/core/src/cz/nic/tablexia/screen/createuser/FormScreen.java
index 3ee1a3225fa9c511176b74abe7007d474087bb86..e188d2e4ef52b6420fe061c859fb2142c4b3bb85 100644
--- a/core/src/cz/nic/tablexia/screen/createuser/FormScreen.java
+++ b/core/src/cz/nic/tablexia/screen/createuser/FormScreen.java
@@ -1,21 +1,290 @@
 package cz.nic.tablexia.screen.createuser;
 
+import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.graphics.Color;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.TextureRegion;
+import com.badlogic.gdx.scenes.scene2d.Actor;
+import com.badlogic.gdx.scenes.scene2d.Group;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
+import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
 import com.badlogic.gdx.scenes.scene2d.ui.Label;
-import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
-import com.badlogic.gdx.scenes.scene2d.ui.Table;
+import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
+import com.badlogic.gdx.scenes.scene2d.ui.Stack;
+import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup;
+import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
+import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
+import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
 
-import cz.nic.tablexia.screen.AbstractTablexiaScreen;
+import cz.nic.tablexia.TablexiaSettings;
+import cz.nic.tablexia.loader.application.ApplicationFontManager;
+import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.screen.AbstractAutoloadTablexiaScreen;
+import cz.nic.tablexia.screen.createuser.form.FormInputListener;
+import cz.nic.tablexia.screen.createuser.form.SignatureDialog;
+import cz.nic.tablexia.util.Log;
+import cz.nic.tablexia.util.ScaleUtil;
+import cz.nic.tablexia.util.listener.DragActorListener;
+import cz.nic.tablexia.util.listener.DragSwitchListener;
 
-public class FormScreen extends AbstractTablexiaScreen<Void> {
+public class FormScreen extends AbstractAutoloadTablexiaScreen<Void> {
+    public static final  String BASET_ASSET_PATH = "screen/createuser/form";
+    private static final int    MUGSHOT_HEIGHT   = 250;
+
+    private Actor pen, mugshotFrame, stamp;
+    private Image stampPlaceholder, mugshotImage;
+    private Actor buttonPlus, buttonMinus;
+    private Label ageLabel, nameLabel;
+    private int    age;
+    private String name;
+    private String mugshot;
+    private User user = new User();
+
+
+    public FormScreen() {
+        super(BASET_ASSET_PATH);
+    }
 
     @Override
     protected void screenLoaded() {
-        Label label = new Label(getClass().getSimpleName(), new LabelStyle(getDefaultRegularFont(), Color.WHITE));
-        Table table = new Table();
-        table.add(label);
-        label.setPosition(getStage().getWidth() / 2, getStage().getHeight() / 2);
-        getStage().addActor(label);
+        getStage().setDebugAll(TablexiaSettings.getInstance().isShowBoundingBoxes());
+        Group group = new Group();
+
+        Image background = new Image(getTexture("table"));
+        ScaleUtil.setBackgroundSize(background);
+        group.addActor(background);
+
+        group.addActor(ScaleUtil.createImageWidthPosition(getTexture("inkpad"), getStage().getWidth() * 0.3f, getStage().getWidth() * -0.1f, getStage().getWidth() * 0.3f));
+        group.addActor(ScaleUtil.createImageSizePosition(getTexture("background"), getStage().getWidth() * 0.75f, TablexiaSettings.getMinWorldHeight() * 0.98f, getStage().getWidth() * 0.13f, 0));
+        group.addActor(ScaleUtil.createImageWidthPosition(getTexture("badge"), getStage().getWidth() * 0.3f, getStage().getWidth() * 0.18f, getStage().getWidth() * 0.15f));
+        group.addActor(mugshotImage = ScaleUtil.createImageWidthPosition(getTexture("avatar/0"), getStage().getWidth() * 0.13f, getStage().getWidth() * 0.6f, getStage().getWidth() * 0.34f)); // size for all mugshots
+        group.addActor(mugshotFrame = ScaleUtil.createImageWidthPosition(getTexture("mugshotframe"), getStage().getWidth() * 0.17f, getStage().getWidth() * 0.58f, getStage().getWidth() * 0.32f));
+        group.addActor(ScaleUtil.createImageWidthPosition(getTexture("textfield_covername"), getStage().getWidth() * 0.2f, getStage().getWidth() * 0.57f, getStage().getWidth() * 0.27f));
+        group.addActor(stampPlaceholder = ScaleUtil.createImageWidthPosition(getTexture("stampplaceholder"), getStage().getWidth() * 0.1f, getStage().getWidth() * 0.73f, getStage().getWidth() * 0.04f));
+        group.addActor(ScaleUtil.createImageWidthPosition(getTexture("texfield_signature"), getStage().getWidth() * 0.15f, getStage().getWidth() * 0.55f, getStage().getWidth() * 0.07f));
+        // TODO pens and stamps variant
+        mugshotFrame.addListener(new ClickListener() {
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                showMugshotDialog();
+            }
+        });
+
+        this.age = 10;
+        Label age = new Label("Vek", getLabelStyle());
+        ageLabel = new Label(String.valueOf(this.age), getLabelStyle());
+        Label gender = new Label("Pohlavi", getLabelStyle());
+        nameLabel = new Label("", getLabelStyle());
+
+        age.setFontScale(0.7f);
+        gender.setFontScale(0.7f);
+        nameLabel.setSize(getStage().getWidth() * 0.2f, getStage().getWidth() * 0.05f);
+        nameLabel.setPosition(getStage().getWidth() * 0.57f, getStage().getWidth() * 0.27f);
+        age.setPosition(getStage().getWidth() * 0.58f, getStage().getWidth() * 0.225f);
+        ageLabel.setPosition(getStage().getWidth() * 0.58f, getStage().getWidth() * 0.185f);
+        age.setPosition(getStage().getWidth() * 0.58f, getStage().getWidth() * 0.225f);
+        gender.setPosition(getStage().getWidth() * 0.73f, getStage().getWidth() * 0.225f);
+        nameLabel.addListener(new FormInputListener(nameLabel));
+        nameLabel.addListener(new ClickListener() {
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                Gdx.input.setOnscreenKeyboardVisible(true);
+                getStage().setKeyboardFocus(nameLabel);
+
+            }
+        });
+
+        group.addActor(nameLabel);
+        group.addActor(ageLabel);
+        group.addActor(age);
+        group.addActor(gender);
+        group.addActor(ScaleUtil.createImageWidthPosition(getTexture("sex_female"), getStage().getWidth() * 0.015f, getStage().getWidth() * 0.69f, getStage().getWidth() * 0.18f));
+        group.addActor(ScaleUtil.createImageWidthPosition(getTexture("sex_male"), getStage().getWidth() * 0.015f, getStage().getWidth() * 0.80f, getStage().getWidth() * 0.18f));
+        group.addActor(buttonMinus = ScaleUtil.createImageWidthPosition(getTexture("button_minus"), getStage().getWidth() * 0.035f, getStage().getWidth() * 0.535f, getStage().getWidth() * 0.18f)); // size for all mugshots
+        group.addActor(buttonPlus = ScaleUtil.createImageWidthPosition(getTexture("button_plus"), getStage().getWidth() * 0.035f, getStage().getWidth() * 0.615f, getStage().getWidth() * 0.18f)); // size for all mugshots
+        buttonPlus.addListener(new ClickListener() {
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                setAge(Math.min(FormScreen.this.age + 1, 99));
+            }
+        });
+        buttonMinus.addListener(new ClickListener() {
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                setAge(Math.max(FormScreen.this.age - 1, 1));
+            }
+        });
+
+        group.addActor(ScaleUtil.createImageWidthPosition(getTexture("switch_background"), getStage().getWidth() * 0.07f, getStage().getWidth() * 0.715f, getStage().getWidth() * 0.18f));
+        Group selector = new Group();
+        final Image[] steps = new Image[3];
+        selector.addActor(steps[0] = ScaleUtil.createImageWidthPosition(getTexture("switch_left"), getStage().getWidth() * 0.035f, 0, 0));
+        selector.addActor(steps[1] = ScaleUtil.createImageWidthPosition(getTexture("switch_center"), getStage().getWidth() * 0.035f, 0, 0));
+        selector.addActor(steps[2] = ScaleUtil.createImageWidthPosition(getTexture("switch_right"), getStage().getWidth() * 0.035f, 0, 0));
+        selector.setPosition(getStage().getWidth() * 0.735f, getStage().getWidth() * 0.169f);
+        group.addActor(selector);
+        float middle = getStage().getWidth() * 0.71f + getStage().getWidth() * 0.027f;
+        DragSwitchListener sl = new DragSwitchListener(selector, getStage().getWidth() * 0.71f, getStage().getWidth() * 0.71f + getStage().getWidth() * 0.055f, middle);
+        selector.addListener(sl);
+        sl.setSwitchMovedListener(new DragSwitchListener.SwitchMovedListener() {
+            @Override
+            public void movedToStep(int step) {
+                for (Image im : steps) {
+                    im.setVisible(false);
+                }
+                steps[step].setVisible(true);
+            }
+        });
+        sl.setSwitchSelectedListener(new DragSwitchListener.SwitchSelectedListener() {
+            @Override
+            public void stepSelected(int step) {
+                user.setGender(step == 0 ? User.Gender.FEMALE : User.Gender.MALE);
+            }
+        });
+        sl.switchToStep(1);
+        sl.setDisabledPoint(middle);
+
+        // TODO pencil and stamp layers
+        group.addActor(pen = ScaleUtil.createImageWidthPosition(getTexture("pencil_dropped"), getStage().getWidth() * 0.2f, getStage().getWidth() * 0.85f, getStage().getWidth() * -0.13f));
+        group.addActor(stamp = ScaleUtil.createImageWidthPosition(getTexture("stamp_left_dropped"), getStage().getWidth() * 0.2f, getStage().getWidth() * -0.01f, getStage().getWidth() * -0.05f));
+        pen.addListener(new DragActorListener(pen, true, new DragActorListener.DragDropListener() {
+            @Override
+            public void dropped(float x, float y) {
+                if ((x > 526 && x < 700) && (y > -300 && y < -190)) {
+                    showSubscribeDialog();
+                }
+            }
+        }));
+        stamp.addListener(new DragActorListener(stamp, true, new DragActorListener.DragDropListener() {
+            @Override
+            public void dropped(float x, float y) {
+                if ((x > 636 && x < 775) && (y > -130 && y < 50)) {
+                    Drawable d = new TextureRegionDrawable(new TextureRegion(getTexture("stamp")));
+                    stampPlaceholder.setDrawable(d);
+                }
+            }
+        }));
+
+        getStage().addActor(group);
+    }
+
+
+    private void showMugshotDialog() {
+        final Group mugshots = new Group();
+
+        // grey translucent overlay
+        Image overlay = new Image(getTexture("avatar/overlay"));
+        overlay.getColor().a = 0.5f;
+        mugshots.addActor(ScaleUtil.setBackgroundSize(overlay));
+        overlay.addListener(new InputListener() {
+            @Override
+            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+                event.stop();
+                mugshots.remove();
+                return false;
+            }
+        });
+
+
+        // avatar pictures
+        HorizontalGroup hg = new HorizontalGroup();
+        for (int i = 0; i < TablexiaSettings.AVATAR_COUNT; i++) {
+            final Actor avatar = prepareAvatarPicture(i + 1);
+            avatar.setName(String.valueOf(i + 1));
+            avatar.addListener(new ClickListener() {
+                @Override
+                public void clicked(InputEvent event, float x, float y) {
+                    event.stop();
+                    mugshots.remove();
+                    Drawable d = new TextureRegionDrawable(new TextureRegion(getTexture("avatar/" + avatar.getName())));
+                    mugshotImage.setDrawable(d);
+                    // TODO set avatar!
+                }
+            });
+            hg.addActor(avatar);
+            hg.setHeight(avatar.getHeight());
+        }
+
+
+        ScrollPane sp = new ScrollPane(hg);
+        sp.setScrollingDisabled(false, true);
+        sp.setSize(1000, hg.getHeight());
+        sp.setPosition(0, 156);
+        mugshots.addActor(sp);
+        getStage().addActor(mugshots);
+    }
+
+    private Actor prepareAvatarPicture(int num) {
+        Texture texture = getTexture("avatar/" + num);
+        float mugshotWidth = ScaleUtil.getWidth(texture.getWidth(), texture.getHeight(), MUGSHOT_HEIGHT);
+
+        Image avatar = ScaleUtil.createImageToHeight(getTexture("avatar/" + num), MUGSHOT_HEIGHT);
+        avatar.getDrawable().setMinHeight(MUGSHOT_HEIGHT);
+        avatar.getDrawable().setMinWidth(mugshotWidth);
+        Image film = ScaleUtil.createImageToHeight(getTexture("avatar/film_inside"), MUGSHOT_HEIGHT);
+        film.getDrawable().setMinHeight(MUGSHOT_HEIGHT);
+        film.getDrawable().setMinWidth(mugshotWidth);
+
+        VerticalGroup vg = new VerticalGroup();
+        Image frameTop = ScaleUtil.createImageToWidth(getTexture("avatar/film_outerline"), mugshotWidth);
+        frameTop.getDrawable().setMinWidth(mugshotWidth);
+        frameTop.getDrawable().setMinHeight(frameTop.getHeight());
+        Image frameBottom = ScaleUtil.createImageToWidth(getTexture("avatar/film_outerline"), mugshotWidth);
+        frameBottom.getDrawable().setMinWidth(mugshotWidth);
+        frameBottom.getDrawable().setMinHeight(frameTop.getHeight());
+
+        Stack stack = new Stack();
+        stack.setSize(mugshotWidth, MUGSHOT_HEIGHT);
+        stack.addActor(avatar);
+        stack.addActor(film);
+
+        vg.addActor(frameTop);
+        vg.addActor(stack);
+        vg.addActor(frameBottom);
+
+        vg.setHeight(MUGSHOT_HEIGHT + frameBottom.getHeight() + frameTop.getHeight());
+        vg.setWidth(mugshotWidth);
+
+        Log.info(((Object) this).getClass().getName(), "Vertical size " + vg.getWidth() + "x" + vg.getHeight());
+
+        return vg;
+
+    }
+
+
+    private Label.LabelStyle getLabelStyle() {
+        return new Label.LabelStyle(ApplicationFontManager.getInstance().getFont(ApplicationFontManager.APPLICATION_DEFAULT_FONT_REGULAR), Color.BLACK);
+    }
+
+    public void setAge(int age) {
+        ageLabel.setText(String.valueOf(this.age = age));
+    }
+
+
+    private void showSubscribeDialog() {
+        final Group signature = new Group();
+
+        // grey translucent overlay
+        Image overlay = new Image(getTexture("avatar/overlay"));
+        overlay.getColor().a = 0.5f;
+        signature.addActor(ScaleUtil.setBackgroundSize(overlay));
+        overlay.addListener(new InputListener() {
+            @Override
+            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+                event.stop();
+                signature.remove();
+                return false;
+            }
+        });
+        // TODO show sign dialog
+
+
+        getStage().addActor(signature);
+        Dialog dialog = new SignatureDialog(getStage().getWidth() * 0.1f, getStage().getWidth() * 0.1f - (getStage().getCamera().position.y - getStage().getHeight() / 2) / 2, getStage().getWidth() * 0.8f, getStage().getHeight() * 0.8f).show(getStage());
     }
 
 }
+
diff --git a/core/src/cz/nic/tablexia/screen/createuser/PanoramaAssets.java b/core/src/cz/nic/tablexia/screen/createuser/PanoramaAssets.java
deleted file mode 100644
index f8bec1625adce2e0c7e8afd6c3a8bb90314ee579..0000000000000000000000000000000000000000
--- a/core/src/cz/nic/tablexia/screen/createuser/PanoramaAssets.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package cz.nic.tablexia.screen.createuser;
-
-import cz.nic.tablexia.util.assetmanager.DirectoryAsset;
-
-/**
- * Created by lhoracek on 4/2/15.
- */
-public class PanoramaAssets extends DirectoryAsset {
-    public static final String PATH = "screen/createuser/panorama";
-
-    @Override
-    public String getPath() {
-        return PATH;
-    }
-}
diff --git a/core/src/cz/nic/tablexia/screen/createuser/PanoramaScreen.java b/core/src/cz/nic/tablexia/screen/createuser/PanoramaScreen.java
index 8d6692c23866863841169a927a0fb50353a22ca3..e36e606fa5e99c510e092b7dc4eed4789446e1a9 100644
--- a/core/src/cz/nic/tablexia/screen/createuser/PanoramaScreen.java
+++ b/core/src/cz/nic/tablexia/screen/createuser/PanoramaScreen.java
@@ -1,79 +1,453 @@
 package cz.nic.tablexia.screen.createuser;
 
+import com.badlogic.gdx.audio.Music;
+import com.badlogic.gdx.audio.Sound;
+import com.badlogic.gdx.graphics.Color;
+import com.badlogic.gdx.graphics.Pixmap;
+import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.Group;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.Touchable;
+import com.badlogic.gdx.scenes.scene2d.actions.Actions;
+import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
+import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
+import com.badlogic.gdx.scenes.scene2d.ui.Stack;
+import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 
-import java.util.List;
-
-import cz.nic.tablexia.screen.AbstractTablexiaScreen;
+import cz.nic.tablexia.Tablexia;
+import cz.nic.tablexia.TablexiaApplication;
+import cz.nic.tablexia.bus.ApplicationBus;
+import cz.nic.tablexia.screen.AbstractAutoloadTablexiaScreen;
+import cz.nic.tablexia.util.ScaleUtil;
+import cz.nic.tablexia.util.ui.dialog.TablexiaDialog;
+import cz.nic.tablexia.util.ui.dialog.TextDialog;
+import cz.nic.tablexia.util.ui.dialog.text.DialogTextContent;
 
 /**
  * Screen showing street animation and office before user create form
  */
-public class PanoramaScreen extends AbstractTablexiaScreen<Void> {
-    private PanoramaAssets assets = new PanoramaAssets();
-
-    private Actor balconyBlur, newspaper, newspaperOpen;
+public class PanoramaScreen extends AbstractAutoloadTablexiaScreen<Void> {
+    public static final String BASET_ASSET_PATH = "screen/createuser/panorama";
 
-    @Override
-    protected void prepareScreenTextureAssetNames(List<String> textureFileNames) {
-        super.prepareScreenTextureAssetNames(textureFileNames);
-        textureFileNames.addAll(assets.values());
+    public PanoramaScreen() {
+        super(BASET_ASSET_PATH);
     }
 
     @Override
     protected void screenLoaded() {
-        switchScreen(prepareBalcony());
+        switchSubscreen(prepareBalcony());
     }
 
-    private void switchScreen(Actor actor) {
+    private void switchSubscreen(Actor actor) {
         getStage().clear();
         getStage().addActor(actor);
     }
 
+    /**
+     * Create balcony view waiting for click
+     * Shows winter image based on current time
+     *
+     * @return
+     */
     private Actor prepareBalcony() {
-        Group group = new Group();
-
+        final Group group = new Group();
+        ScaleUtil.setFullScreen(group, getStage());
         boolean isWinter = true;
 
-        Image balcony = new Image(getTexture(assets.get("balcony" + (isWinter ? "_winter" : ""))));
-        setFullScreen(balcony);
+        Image balcony = new Image(getTexture("balcony" + (isWinter ? "_winter" : "")));
+        ScaleUtil.setFullScreen(balcony, getStage());
         group.addActor(balcony);
 
-        balconyBlur = new Image(getTexture(assets.get("balcony_blur" + (isWinter ? "_winter" : ""))));
-        setFullScreen(balconyBlur);
+        final Image balconyBlur = new Image(getTexture("balcony_blur" + (isWinter ? "_winter" : "")));
+        ScaleUtil.setFullScreen(balconyBlur, getStage());
+        balconyBlur.setVisible(false);
         group.addActor(balconyBlur);
 
-        // TODO newspaper spin
-        // TODO newspaper detail
+        balcony.addListener(new ClickListener() {
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                if ((x > getStage().getWidth() * 0.2f && x < getStage().getWidth() * 0.6f) && (y > getStage().getWidth() * 0.1f && y < getStage().getWidth() * 0.3f)) {
+                    balconyBlur.addAction(Actions.fadeIn(0.1f));
+                    balconyBlur.setVisible(true);
+
+                    final Sound spinSound = getSound("noviny_prilet");
+                    spinSound.play();
 
-        setFullScreen(group);
+                    Image spin = new Image(getTexture("newspaper/spinner"));
+                    spin.setOrigin(spin.getWidth() / 2, spin.getHeight() / 2);
+                    spin.setPosition(group.getWidth() / 2 - spin.getWidth() / 2, group.getHeight() / 2 - spin.getHeight() / 2);
+                    spin.setScale(0.1f);
+                    spin.addAction(Actions.sequence(Actions.parallel(Actions.rotateBy(3600, 1.5f), Actions.scaleTo(2f, 2f, 1.5f)), Actions.parallel(Actions.sequence(Actions.fadeOut(0.5f), Actions.hide()), Actions.run(new Runnable() {
+                        @Override
+                        public void run() {
+                            group.addActor(prepareOpenAction());
+                            spinSound.stop();
+                        }
+                    }))));
+                    group.addActor(spin);
+                }
+            }
+        });
         return group;
     }
 
+    /**
+     * Prepare closed newspaper with hint to open
+     *
+     * @return
+     */
+    private Actor prepareOpenAction() {
+        final Group openAction = new Group();
+        ScaleUtil.setFullScreen(openAction, getStage());
+
+        Stack newspaperStages = new Stack();
+        ScaleUtil.setFullScreen(newspaperStages, getStage());
+        final Image[] stages = new Image[5];
+        for (int i = 1; i <= 5; i++) {
+            Image stage = new Image(getTexture("newspaper/open" + i));
+            newspaperStages.addActor(stage);
+            stages[i - 1] = stage;
+            stage.setVisible(false);
+        }
+        stages[0].setVisible(true);
+        openAction.addActor(newspaperStages);
+
+        Image leftFinger = ScaleUtil.createImageWidthPosition(getTexture("newspaper/left_finger"), getStage().getWidth() * 0.2f, getStage().getWidth() * 0.2f - getStage().getWidth() * 0.2f / 2, 0);
+        Image rightFinger = ScaleUtil.createImageWidthPosition(getTexture("newspaper/right_finger"), getStage().getWidth() * 0.2f, getStage().getWidth() * 0.8f - getStage().getWidth() * 0.2f / 2, 0);
+        Image hint = ScaleUtil.createImageWidthPosition(getTexture("newspaper/stretchhint"), getStage().getWidth() * 0.5f, getStage().getWidth() / 2 - getStage().getWidth() * 0.5f / 2, getStage().getHeight() * 0.1f);
+
+        leftFinger.addAction(Actions.sequence(Actions.fadeIn(0.5f), Actions.forever(Actions.sequence(Actions.moveTo(getStage().getWidth() * 0.4f - leftFinger.getWidth() / 2, leftFinger.getY(), 0.5f), Actions.scaleTo(0.8f, 0.8f, 0.2f), Actions.moveTo(-leftFinger.getWidth(), leftFinger.getY(), 0.5f), Actions.scaleTo(1f, 1f, 0.1f)))));
+        rightFinger.addAction(Actions.sequence(Actions.fadeIn(0.5f), Actions.forever(Actions.sequence(Actions.moveTo(getStage().getWidth() * 0.6f - rightFinger.getWidth() / 2, rightFinger.getY(), 0.5f), Actions.scaleTo(0.8f, 0.8f, 0.2f), Actions.moveTo(getStage().getWidth() + rightFinger.getWidth(), rightFinger.getY(), 0.5f), Actions.scaleTo(1f, 1f, 0.1f)))));
+
+        openAction.addActor(hint);
+        openAction.addActor(leftFinger);
+        openAction.addActor(rightFinger);
+
+        openAction.addListener(new InputListener() {
+            private boolean dragging, mouse;
+            private Sound sound;
+            private float x1start, x2start, x1, x2;
+
+            @Override
+            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+                super.touchDown(event, x, y, pointer, button);
+                // desktop mouse button workaround
+                if (button == 1) {
+                    mouse = true;
+                } else {
+                    mouse = false;
+                }
+                if (pointer == 0) {
+                    x1start = x1 = x;
+                }
+                if (pointer == 1) {
+                    x2start = x2 = x;
+                    dragging = true;
+                }
+                return true;
+            }
+
+            private void showStage(int i) {
+                for (Image image : stages) {
+                    image.setVisible(false);
+                }
+                stages[i].setVisible(true);
+            }
+
+            @Override
+            public void touchDragged(InputEvent event, float x, float y, int pointer) {
+                super.touchDragged(event, x, y, pointer);
+                if (pointer == 0) {
+                    x1 = x;
+                } else if (pointer == 1) {
+                    x2 = x;
+                }
+
+                if (getDiff() > getStage().getWidth() * 0.25f) {
+                    onScaled();
+                } else if (getDiff() > getStage().getWidth() * 0.2f) {
+                    showStage(4);
+                } else if (getDiff() > getStage().getWidth() * 0.15f) {
+                    showStage(3);
+                } else if (getDiff() > getStage().getWidth() * 0.1f) {
+                    showStage(2);
+                } else if (getDiff() > getStage().getWidth() * 0.05f) {
+                    showStage(1);
+                    if (sound == null) {
+                        sound = getSound("noviny_rozbaleni");
+                        sound.play();
+                    }
+                } else {
+                    stopSound();
+                    showStage(0);
+                }
+            }
+
+            private void stopSound() {
+                if (sound != null) {
+                    sound.stop();
+                    sound = null;
+                }
+            }
+
+            @Override
+            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
+                super.touchUp(event, x, y, pointer, button);
+                showStage(0);
+                stopSound();
+                if (pointer == 1) {
+                    dragging = false;
+                }
+            }
+
+            private float getDiff() {
+                if (mouse) {
+                    return Math.abs(x1start - x1);
+                } else if (dragging) {
+                    return Math.abs(Math.abs(x1 - x2) - Math.abs(x1start - x2start));
+                }
+                return 0;
+            }
+
+            public void onScaled() {
+                sound = null;
+                openAction.getParent().addActor(prepareOpenedNewspaper());
+                openAction.remove();
+            }
+        });
+
+        return openAction;
+    }
+
+    /**
+     * Prepare opened newspaper with topic details and playback of comments
+     *
+     * @return
+     */
+    private Actor prepareOpenedNewspaper() {
+        final Group newspaper = new Group();
+        ScaleUtil.setFullScreen(newspaper, getStage());
+        Image opened = new Image(getTexture("newspaper/opened"));
+        ScaleUtil.setFullScreen(opened, getStage());
+        newspaper.addActor(opened);
+
+        final Group help = new Group();
+        ScaleUtil.setFullScreen(help, getStage());
+        newspaper.addActor(help);
+
+        Image overlay = new Image(getTexture("newspaper/overlay"));
+        overlay.getColor().a = 0.5f;
+        ScaleUtil.setFullScreen(overlay, getStage());
+        help.addActor(overlay);
+
+        final Image[] details = new Image[5];
+        for (int i = 0; i < 5; i++) {
+            details[i] = ScaleUtil.createImageFitInto(getTexture("newspaper/detail0" + (i + 1)), getStage().getWidth() * 0.8f, getStage().getHeight() * 0.8f);
+            details[i].setPosition(getStage().getWidth() / 2 - details[i].getWidth() / 2, getStage().getHeight() / 2 - details[i].getHeight() / 2);
+            help.addActor(details[i]);
+            if (i == 4) {
+                details[i].addListener(new ClickListener() {
+                    @Override
+                    public void clicked(InputEvent event, float x, float y) {
+                        super.clicked(event, x, y);
+                        for (Actor a : newspaper.getParent().getChildren()) {
+                            a.addAction(Actions.sequence(Actions.moveBy(-getStage().getWidth(), 0, 0.5f), Actions.removeActor()));
+                        }
+                        Actor street = prepareSwipeStreet();
+                        newspaper.getParent().addActor(street);
+                        street.setPosition(getStage().getWidth(), 0);
+                        street.addAction(Actions.moveTo(0, 0, 0.5f));
+                    }
+                });
+            }
+        }
+
+        help.setVisible(false);
+        help.addListener(new ClickListener() {
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                super.clicked(event, x, y);
+                help.addAction(Actions.sequence(Actions.fadeOut(0.25f), Actions.hide()));
+                stopMusic();
+                event.stop();
+            }
+        });
+
+        opened.addListener(new ClickListener() {
+            private final Color DETECTIVE_COLOR = Color.BLACK;
+            private final Color SWIMSUIT_COLOR = Color.YELLOW;
+            private final Color MOTOBIKE_COLOR = Color.BLUE;
+            private final Color BEARD_COLOR = Color.RED;
+            private final Color BALOON_COLOR = Color.GREEN;
+
+            private Music music;
+
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                super.clicked(event, x, y);
+
+                for (int i = 0; i < 5; i++) {
+                    details[i].setVisible(false);
+                }
+                Color color = getTouchedColor(x, y);
+                if (color.equals(DETECTIVE_COLOR)) {
+                    details[4].setVisible(true);
+                    playMusic("newspaper/5");
+                } else if (color.equals(SWIMSUIT_COLOR)) {
+                    details[3].setVisible(true);
+                    playMusic("newspaper/1");
+                } else if (color.equals(MOTOBIKE_COLOR)) {
+                    playMusic("newspaper/2");
+                    details[2].setVisible(true);
+                } else if (color.equals(BEARD_COLOR)) {
+                    playMusic("newspaper/3");
+                    details[0].setVisible(true);
+                } else if (color.equals(BALOON_COLOR)) {
+                    details[1].setVisible(true);
+                    playMusic("newspaper/4");
+                } else {
+                    return;
+                }
+                help.addAction(Actions.sequence(Actions.alpha(0), Actions.parallel(Actions.show(), Actions.fadeIn(0.25f))));
+                if (music != null && !music.isPlaying()) {
+                    music.play();
+                }
+            }
+
+
+            private Color getTouchedColor(float x, float y) {
+                Texture clickmap = getTexture("newspaper/clickmap");
+                if (!clickmap.getTextureData().isPrepared()) {
+                    clickmap.getTextureData().prepare();
+                }
+
+                Pixmap pixmap = clickmap.getTextureData().consumePixmap();
+                int clickX = (int) (x / newspaper.getWidth() * clickmap.getWidth());
+                int clickY = clickmap.getHeight() - (int) (y / newspaper.getHeight() * clickmap.getHeight());
+                return new Color(pixmap.getPixel(clickX, clickY));
+            }
+        });
+
+        return newspaper;
+    }
+
+    private Music playingMusic;
+
+    private void playMusic(String key) {
+        stopMusic();
+        playingMusic = getMusic(key);
+        playingMusic.play();
+    }
+
+    private void stopMusic() {
+        if (playingMusic != null && playingMusic.isPlaying()) {
+            playingMusic.stop();
+        }
+    }
+
+    /**
+     * Prepare street view with swipe and door knock
+     *
+     * @return
+     */
     private Actor prepareSwipeStreet() {
-        Group group = new Group();
-        // TODO tiles in horizontal panel
-        // TODO active door
+        final Group panel = new Group();
+        ScaleUtil.setFullScreen(panel, getStage());
 
-        setFullScreen(group);
-        return group;
+        Group group = new HorizontalGroup();
+        group.setHeight(getStage().getHeight());
+
+        ScrollPane pane = new ScrollPane(group);
+        ScaleUtil.setFullScreen(pane, getStage());
+        pane.setScrollingDisabled(false, true);
+        panel.addActor(pane);
+
+
+        Image leftFinger = ScaleUtil.createImageWidthPosition(getTexture("newspaper/left_finger"), getStage().getWidth() * 0.2f, getStage().getWidth() * 0.2f - getStage().getWidth() * 0.2f / 2, 0);
+        leftFinger.addAction(Actions.sequence(Actions.fadeIn(0.5f), Actions.forever(Actions.sequence(Actions.moveTo(getStage().getWidth() * 0.4f - leftFinger.getWidth() / 2, leftFinger.getY(), 0.5f), Actions.scaleTo(0.8f, 0.8f, 0.2f), Actions.moveTo(-leftFinger.getWidth(), leftFinger.getY(), 0.5f), Actions.scaleTo(1f, 1f, 0.1f)))));
+        panel.addActor(leftFinger);
+
+        // TODO delay finger hint
+        // TODO hide finger if scrolled over 0.7
+
+        for (int i = 0; i < 4; i++) {
+            final Image image = ScaleUtil.createImageToHeight(getTexture("swipe/tile" + i), getStage().getHeight());
+
+            if (i == 3) {
+                final Group detectiveDoor = new Group();
+                image.addListener(new ClickListener() {
+                    private int knockCount = 0;
+
+                    @Override
+                    public void clicked(InputEvent event, float x, float y) {
+                        super.clicked(event, x, y);
+                        if (x > image.getWidth() * 0.3f) {
+                            knockCount++;
+                            Image knock = ScaleUtil.createImageWidthPosition(getTexture("swipe/knock"), getStage().getWidth() * 0.2f, x, y);
+                            detectiveDoor.addActor(knock);
+                            knock.addAction(Actions.sequence(Actions.delay(0.25f), Actions.fadeOut(0.2f), Actions.removeActor()));
+                            knock.setTouchable(Touchable.disabled);
+                            getSound("tuk_" + knockCount).play();
+                            if (knockCount > 2) {
+                                Actor office = prepareOffice();
+                                panel.addAction(Actions.sequence(Actions.moveBy(-getStage().getWidth(), 0, 0.5f), Actions.removeActor()));
+                                panel.getParent().addActor(office);
+                                office.setPosition(getStage().getWidth(), 0);
+                                office.addAction(Actions.moveTo(0, 0, 0.5f));
+                            }
+                        }
+                    }
+                });
+                detectiveDoor.addActor(image);
+                detectiveDoor.setSize(image.getWidth(), image.getHeight());
+                group.addActor(detectiveDoor);
+            } else {
+                group.addActor(image);
+            }
+        }
+        return panel;
     }
 
+    /**
+     * Prapare detective office with dialogs and playing voice
+     *
+     * @return
+     */
     private Actor prepareOffice() {
         Group group = new Group();
-
-        Image background = new Image(getTexture(assets.get("detectiveoffice")));
-        setFullScreen(background);
+        Image background = new Image(getTexture("detectiveoffice"));
+        ScaleUtil.setFullScreen(background, getStage());
         group.addActor(background);
-
-        setFullScreen(group);
+        showDialog(1);
+        ScaleUtil.setFullScreen(group, getStage());
         return group;
     }
 
-    private void setFullScreen(Actor actor) {
-        actor.setPosition(0, 0);
-        actor.setSize(getStage().getWidth(), getStage().getHeight());
+    /**
+     * Show detective dialog with text and play sound. If last dialog, go to FormScreen
+     *
+     * @param num
+     */
+    private void showDialog(final int num) {
+        String text = getText("createuser_detective_" + num);
+        final Dialog dialog = new TextDialog(getStage().getWidth() * 0.3f, getStage().getWidth() * 0.26f, getStage().getWidth() * 0.3f, getStage().getWidth() * 0.2f, TablexiaDialog.BackGroundType.BUBBLE_CLASSIC_CONTINUE_BUTTON, new DialogTextContent("", text)).show(getStage());
+        playMusic("detective/" + num);
+        dialog.addListener(new ClickListener() {
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                super.clicked(event, x, y);
+                dialog.hide();
+                stopMusic();
+                if (num == 4) {
+                    ApplicationBus.getInstance().publishAsync(new Tablexia.ChangeScreenEvent(FormScreen.class, TablexiaApplication.ScreenTransaction.FADE));
+                } else {
+                    showDialog(num + 1);
+                }
+            }
+        });
     }
 }
diff --git a/core/src/cz/nic/tablexia/screen/createuser/form/FormInputListener.java b/core/src/cz/nic/tablexia/screen/createuser/form/FormInputListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..c198f21f973f698afc727aab4ba8c4e01cda4c52
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/createuser/form/FormInputListener.java
@@ -0,0 +1,30 @@
+package cz.nic.tablexia.screen.createuser.form;
+
+import com.badlogic.gdx.Input;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.ui.Label;
+
+/**
+ * Created by lhoracek on 4/16/15.
+ */
+public class FormInputListener extends InputListener {
+
+    private final Label label;
+
+
+    public FormInputListener(Label label) {
+        this.label = label;
+    }
+
+    @Override
+    public boolean keyTyped(InputEvent event, char character) {
+        if (character == Input.Keys.ENTER || character == Input.Keys.TAB) {
+            label.getStage().unfocus(label);
+            return false;
+        }
+        label.getText().append(character);
+        label.invalidateHierarchy();
+        return true;
+    }
+}
diff --git a/core/src/cz/nic/tablexia/screen/createuser/form/SignatureDialog.java b/core/src/cz/nic/tablexia/screen/createuser/form/SignatureDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..97cbd9372e7260e2988952fcab7a12527118742a
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/createuser/form/SignatureDialog.java
@@ -0,0 +1,21 @@
+package cz.nic.tablexia.screen.createuser.form;
+
+import cz.nic.tablexia.util.ui.dialog.TablexiaDialog;
+
+/**
+ * Created by lhoracek on 4/24/15.
+ */
+public class SignatureDialog extends TablexiaDialog {
+    public SignatureDialog(float x, float y, float width, float height) {
+        super(x, y, width, height, BackGroundType.DIALOG_RECTANGLE);
+    }
+
+    @Override
+    public void prepareContent() {
+        super.prepareContent();
+        SignaturePane pane = new SignaturePane();
+        pane.setSize(getWidth(), getHeight());
+        pane.setPosition(0,0);
+        addActor(pane);
+    }
+}
diff --git a/core/src/cz/nic/tablexia/screen/createuser/form/SignaturePane.java b/core/src/cz/nic/tablexia/screen/createuser/form/SignaturePane.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5eb988f91d20bacf9f02b89b97b12e13895e62a
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/createuser/form/SignaturePane.java
@@ -0,0 +1,40 @@
+package cz.nic.tablexia.screen.createuser.form;
+
+import com.badlogic.gdx.graphics.Color;
+import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.scenes.scene2d.Actor;
+
+import cz.nic.tablexia.screen.createuser.form.swipehandler.SwipeHandler;
+
+/**
+ * Created by lhoracek on 4/24/15.
+ */
+public class SignaturePane extends Actor {
+
+    SwipeHandler  swipeHandler  = new SwipeHandler(1000);
+    ShapeRenderer shapeRenderer = new ShapeRenderer();
+
+    public SignaturePane() {
+        addListener(swipeHandler);
+    }
+
+    @Override
+    public void draw(Batch batch, float parentAlpha) {
+        super.draw(batch, parentAlpha);
+        if (swipeHandler.path().size > 1) {
+            float[] vert = new float[swipeHandler.path().size * 2];
+            for (int i = 0; i < swipeHandler.path().size; i++) {
+                Vector2 proj = getStage().getViewport().project(swipeHandler.path().get(i).cpy());
+                Vector2 sc = localToStageCoordinates(proj);
+                vert[i * 2] = sc.x;
+                vert[i * 2 + 1] = sc.y;
+            }
+            shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
+            shapeRenderer.setColor(Color.BLUE);
+            shapeRenderer.polyline(vert);
+            shapeRenderer.end();
+        }
+    }
+}
diff --git a/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/FixedList.java b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/FixedList.java
new file mode 100755
index 0000000000000000000000000000000000000000..48a0ca7acebabf9124f31d36c87510a5f53826fd
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/FixedList.java
@@ -0,0 +1,49 @@
+package cz.nic.tablexia.screen.createuser.form.swipehandler;
+
+import com.badlogic.gdx.utils.Array;
+
+/**
+ * A simple extension of Array that allows inserting an element
+ * at the head (index 0) without ever growing the backing array.
+ * Elements are shifted right and eventually discarded to make
+ * way for new additions.
+ *
+ * @param <T> generic type
+ * @author mattdesl
+ */
+public class FixedList<T> extends Array<T> {
+
+    /**
+     * Safely creates a list that is backed by an array which
+     * can be directly accessed.
+     *
+     * @param capacity the fixed-size capacity of this list
+     * @param type     the class type of the elements in this list
+     */
+    public FixedList(int capacity, Class<T> type) {
+        super(false, capacity, type);
+    }
+
+    /**
+     * Inserts the item into index zero, shifting all items to the right,
+     * but without increasing the list's size past its array capacity.
+     *
+     * @param t the element to insert
+     */
+    public void insert(T t) {
+        T[] items = this.items;
+
+        // increase size if we have a new point
+        size = Math.min(size + 1, items.length);
+
+        // shift elements right
+        for (int i = size - 1; i > 0; i--) {
+            items[i] = items[i - 1];
+        }
+
+        // insert new item at first index
+        items[0] = t;
+    }
+
+
+}
diff --git a/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/ResolverCopy.java b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/ResolverCopy.java
new file mode 100644
index 0000000000000000000000000000000000000000..c1359f8afb5fd85577ef11fbdda41b408c7a55ac
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/ResolverCopy.java
@@ -0,0 +1,14 @@
+package cz.nic.tablexia.screen.createuser.form.swipehandler;
+
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.utils.Array;
+
+public class ResolverCopy implements SwipeResolver {
+	
+	@Override
+	public void resolve(Array<Vector2> input, Array<Vector2> output) {
+		output.clear(); 
+		output.addAll(input);
+	}
+
+}
diff --git a/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/ResolverRadialChaikin.java b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/ResolverRadialChaikin.java
new file mode 100755
index 0000000000000000000000000000000000000000..b36564729dbb84e9b0aaf21f37799a8089bc294f
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/ResolverRadialChaikin.java
@@ -0,0 +1,101 @@
+package cz.nic.tablexia.screen.createuser.form.swipehandler;
+
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.utils.Array;
+
+
+//Events that trigger a "slash"
+//- Reached max number of points; slash stops and fades out
+//- Delay from touchDown is too long
+
+public class ResolverRadialChaikin implements SwipeResolver {
+	
+	private Array<Vector2> tmp = new Array<Vector2>(Vector2.class);
+	
+	public static int iterations = 2;
+	public static float simplifyTolerance = 35f;
+	
+	public void resolve(Array<Vector2> input, Array<Vector2> output) {
+		output.clear();
+		if (input.size<=2) { //simple copy
+			output.addAll(input);
+			return;
+		}
+
+		//simplify with squared tolerance
+		if (simplifyTolerance>0 && input.size>3) {
+			simplify(input, simplifyTolerance * simplifyTolerance, tmp);
+			input = tmp;
+		}
+		
+		//perform smooth operations
+		if (iterations<=0) { //no smooth, just copy input to output
+			output.addAll(input);
+		} else if (iterations==1) { //1 iteration, smooth to output
+			smooth(input, output);
+		} else { //multiple iterations.. ping-pong between arrays
+			int iters = iterations;
+			//subsequent iterations
+			do {
+				smooth(input, output);
+				tmp.clear();
+				tmp.addAll(output);
+				Array<Vector2> old = output;
+				input = tmp;
+				output = old;
+			} while (--iters > 0);
+		}
+	}
+	
+	public static void smooth(Array<Vector2> input, Array<Vector2> output) {
+		//expected size
+		output.clear();
+		output.ensureCapacity(input.size*2);
+		
+		//first element
+		output.add(input.get(0));
+		//average elements
+		for (int i=0; i<input.size-1; i++) {
+			Vector2 p0 = input.get(i);
+			Vector2 p1 = input.get(i+1);
+	
+			Vector2 Q = new Vector2(0.75f * p0.x + 0.25f * p1.x, 0.75f * p0.y + 0.25f * p1.y);
+			Vector2 R = new Vector2(0.25f * p0.x + 0.75f * p1.x, 0.25f * p0.y + 0.75f * p1.y);
+	        output.add(Q);
+	        output.add(R);
+		}
+		
+		//last element
+		output.add(input.get(input.size-1));
+	}
+	
+	//simple distance-based simplification
+	//adapted from simplify.js
+	public static void simplify(Array<Vector2> points, float sqTolerance, Array<Vector2> out) {
+		int len = points.size;
+
+		Vector2 point = new Vector2();
+		Vector2 prevPoint = points.get(0);
+		
+		out.clear();
+		out.add(prevPoint);
+		
+		for (int i = 1; i < len; i++) {
+			point = points.get(i);
+			if (distSq(point, prevPoint) > sqTolerance) {
+				out.add(point);
+				prevPoint = point;
+			}
+		}
+		if (!prevPoint.equals(point)) {
+			out.add(point);
+		}
+	}
+	
+	public static float distSq(Vector2 p1, Vector2 p2) {
+		float dx = p1.x - p2.x, dy = p1.y - p2.y;
+		return dx * dx + dy * dy;
+	}
+
+}
+
diff --git a/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/SwipeDebugScreen.java b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/SwipeDebugScreen.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa99f0fecfb134c3e0d1adcd3a385477c62fa91f
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/SwipeDebugScreen.java
@@ -0,0 +1,22 @@
+package cz.nic.tablexia.screen.createuser.form.swipehandler;
+
+import com.badlogic.gdx.scenes.scene2d.Actor;
+
+import cz.nic.tablexia.TablexiaSettings;
+import cz.nic.tablexia.screen.AbstractTablexiaScreen;
+import cz.nic.tablexia.screen.createuser.form.SignaturePane;
+
+/**
+ * Created by lhoracek on 4/24/15.
+ */
+public class SwipeDebugScreen extends AbstractTablexiaScreen<Void> {
+    @Override
+    protected void screenLoaded() {
+        super.screenLoaded();
+        getStage().setDebugAll(true);
+        Actor swiper = new SignaturePane();
+        swiper.setSize(TablexiaSettings.getWorldWidth(), TablexiaSettings.getMinWorldHeight());
+        swiper.setPosition(0, 0);
+        getStage().addActor(swiper);
+    }
+}
diff --git a/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/SwipeHandler.java b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/SwipeHandler.java
new file mode 100755
index 0000000000000000000000000000000000000000..6851804a9f1a82812597c761c5ad73d49f31966f
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/SwipeHandler.java
@@ -0,0 +1,117 @@
+package cz.nic.tablexia.screen.createuser.form.swipehandler;
+
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.utils.Array;
+
+import cz.nic.tablexia.util.Log;
+
+public class SwipeHandler extends InputListener {
+
+    private FixedList<Vector2> inputPoints;
+
+    /**
+     * The pointer associated with this swipe event.
+     */
+    private int inputPointer = 0;
+
+    /**
+     * The minimum distance between the first and second point in a drawn line.
+     */
+    public int initialDistance = 5;
+
+    /**
+     * The minimum distance between two points in a drawn line (starting at the second point).
+     */
+    public int minDistance = 5;
+
+    private Vector2 lastPoint = new Vector2();
+
+    private SwipeResolver simplifier = new ResolverRadialChaikin();
+    private Array<Vector2> simplified;
+
+    public SwipeHandler(int maxInputPoints) {
+        this.inputPoints = new FixedList<Vector2>(maxInputPoints, Vector2.class);
+        simplified = new Array<Vector2>(true, maxInputPoints, Vector2.class);
+        resolve(); //copy initial empty list
+    }
+
+    /**
+     * Returns the fixed list of input points (not simplified).
+     *
+     * @return the list of input points
+     */
+    public Array<Vector2> input() {
+        return this.inputPoints;
+    }
+
+    /**
+     * Returns the simplified list of points representing this swipe.
+     *
+     * @return
+     */
+    public Array<Vector2> path() {
+        return simplified;
+    }
+
+    /**
+     * If the points are dirty, the line is simplified.
+     */
+    public void resolve() {
+        simplifier.resolve(inputPoints, simplified);
+    }
+
+    @Override
+    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+        Log.debug("Swiper", "Touch down begin");
+        if (pointer != inputPointer || button != inputPointer) {
+            return false;
+        }
+
+        //clear points
+        inputPoints.clear();
+
+        //starting point
+        lastPoint = new Vector2(x, y);
+        inputPoints.insert(lastPoint);
+
+        resolve();
+        Log.debug("Swiper", "Touch down");
+        return true;
+    }
+
+
+    @Override
+    public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
+        //on release, the line is simplified
+        resolve();
+        Log.debug("Swiper", "Touch up");
+    }
+
+
+    @Override
+    public void touchDragged(InputEvent event, float x, float y, int pointer) {
+        if (pointer != inputPointer)
+            return;
+        Vector2 v = new Vector2(x, y);
+
+        //calc length
+        float dx = v.x - lastPoint.x;
+        float dy = v.y - lastPoint.y;
+        float len = (float) Math.sqrt(dx * dx + dy * dy);
+        //TODO: use minDistanceSq
+
+        //if we are under required distance
+        if (len < minDistance && (inputPoints.size > 1 || len < initialDistance))
+            return;
+
+        //add new point
+        inputPoints.insert(v);
+        Log.debug("Swiper", "Points count: " + inputPoints.size);
+        lastPoint = v;
+
+        //simplify our new line
+        resolve();
+    }
+}
diff --git a/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/SwipeResolver.java b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/SwipeResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8e56cfdbaf604f0847ee7ee363fe2e046450922
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/createuser/form/swipehandler/SwipeResolver.java
@@ -0,0 +1,15 @@
+package cz.nic.tablexia.screen.createuser.form.swipehandler;
+
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.utils.Array;
+
+public interface SwipeResolver {
+	
+	/**
+	 * Simplifies and smoothes the input.
+	 * 
+	 * @param input the input of the swipe event
+	 * @param output the output instance
+	 */
+	public void resolve(Array<Vector2> input, Array<Vector2> output);
+}
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
index 6edb7edaea7d2567b3d391e182b7728291c929ae..2ad1c39d40e2eb257e4b63140ab626427198b936 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
@@ -1,6 +1,5 @@
 package cz.nic.tablexia.screen.gamemenu;
 
-import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.scenes.scene2d.Touchable;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
 
@@ -11,12 +10,12 @@ import java.util.List;
 import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.game.GameDefinition;
-import cz.nic.tablexia.screen.AbstractTablexiaScreen;
+import cz.nic.tablexia.screen.AbstractLinearTextureTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.pages.GameMenuPage;
 import cz.nic.tablexia.screen.gamemenu.pages.OfficeMenuPage;
 import cz.nic.tablexia.util.ui.ViewPager;
 
-public class GameMenuScreen extends AbstractTablexiaScreen<Void> {
+public class GameMenuScreen extends AbstractLinearTextureTablexiaScreen<Void> {
 
     private ViewPager vp;
 
@@ -52,10 +51,4 @@ public class GameMenuScreen extends AbstractTablexiaScreen<Void> {
         vp.scrollToPage(1);
     }
 
-    @Override
-    public Texture getTexture(String textureName) {
-        Texture texture = super.getTexture(textureName);
-        texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
-        return texture;
-    }
 }
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
index d0712ead42a2306fe1ba37e340415584b9ceae85..6c51ba47b5e84fbf5a71ac02bc541f9bd36c7dea 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
@@ -6,9 +6,7 @@ import com.badlogic.gdx.graphics.g2d.Batch;
 import com.badlogic.gdx.graphics.g2d.BitmapFont;
 import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
-import com.badlogic.gdx.scenes.scene2d.InputListener;
 import com.badlogic.gdx.scenes.scene2d.actions.AlphaAction;
-import com.badlogic.gdx.scenes.scene2d.actions.MoveToAction;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
 import com.badlogic.gdx.scenes.scene2d.ui.Label;
 import com.badlogic.gdx.scenes.scene2d.ui.Stack;
@@ -19,6 +17,8 @@ import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.GameMenuAssets;
+import cz.nic.tablexia.util.Log;
+import cz.nic.tablexia.util.listener.DragSwitchListener;
 import cz.nic.tablexia.util.ui.ViewPager;
 
 /**
@@ -32,6 +32,7 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
     private Actor diffEasy, diffMedium, diffHard;
     private Stack diffStack;
     private GameDifficulty gameDifficulty = GameDifficulty.EASY;
+    private DragSwitchListener dragSwitchListener;
 
     private float scrollOffset = TablexiaSettings.getWorldWidth(); // hack to keep paralax layers out of picture before scrolled for first time
 
@@ -148,43 +149,18 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
         diffStack.setSize(diffWidth, diffHeight);
         diffStack.setPosition(diffX, diffY);
         addActor(diffStack);
-        setDifficulty(gameDifficulty);
-
-        diffStack.addListener(new InputListener() {
-            float lastX;
-
+        diffStack.addListener(dragSwitchListener = new DragSwitchListener(diffStack, diffEasyX, diffHardX, diffMediumX));
+        dragSwitchListener.setSwitchMovedListener(new DragSwitchListener.SwitchMovedListener() {
             @Override
-            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
-                super.touchDown(event, x, y, pointer, button);
-                lastX = x;
-                event.stop();
-                return true;
-            }
-
-            @Override
-            public void touchDragged(InputEvent event, float x, float y, int pointer) {
-                super.touchDragged(event, x, y, pointer);
-                float bx = diffStack.getX() + (x - lastX);
-                if (bx >= diffEasyX && bx <= diffHardX) {
-                    diffStack.setPosition(bx, diffStack.getY());
+            public void movedToStep(int step) {
+                Log.info(((Object) this).getClass().getName(), "moved to step: " + step);
+                for(int i = 0 ; i< diffStack.getChildren().size; i++){
+                    diffStack.getChildren().get(i).setVisible(i==step);
                 }
-                showDifficulty(getDifficulty());
-                event.stop();
-            }
-
-            @Override
-            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
-                super.touchUp(event, x, y, pointer, button);
-                float bx = diffStack.getX() + (x - lastX);
-
-                GameDifficulty newDiff = getDifficulty();
-                setDifficulty(newDiff);
-                if (gameDifficulty != newDiff) {
-                    difficultyChanged(newDiff);
-                }
-                event.stop();
             }
         });
+        setDifficulty(gameDifficulty); // TODO
+
     }
 
     /**
@@ -193,20 +169,7 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
      * @param difficulty
      */
     public void setDifficulty(GameDifficulty difficulty) {
-        showDifficulty(difficulty);
-        MoveToAction ma = new MoveToAction();
-        switch (difficulty) {
-            case EASY:
-                ma.setPosition(diffEasyX, diffStack.getY());
-                break;
-            case MEDIUM:
-                ma.setPosition(diffMediumX, diffStack.getY());
-                break;
-            case HARD:
-                ma.setPosition(diffHardX, diffStack.getY());
-                break;
-        }
-        diffStack.addAction(ma);
+        dragSwitchListener.switchToStep(difficulty.ordinal());
         if (gameDifficulty != difficulty) {
             difficultyChanged(difficulty);
         }
@@ -222,51 +185,6 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
         TablexiaSettings.getInstance().setGameDifficulty(game, difficulty);
     }
 
-    /**
-     * Get nearest difficulty from current slider position
-     *
-     * @return
-     */
-    private GameDifficulty getDifficulty() {
-        float bx = diffStack.getX();
-        if (bx < diffMediumX) {
-            if ((diffEasyX + ((diffMediumX - diffEasyX) / 2)) > bx) {
-                return GameDifficulty.EASY;
-            } else {
-                return GameDifficulty.MEDIUM;
-            }
-        } else {
-            if ((diffMediumX + ((diffHardX - diffMediumX) / 2)) > bx) {
-                return GameDifficulty.MEDIUM;
-            } else {
-                return GameDifficulty.HARD;
-            }
-        }
-    }
-
-    /**
-     * Check difficulty image and display corresponding image
-     *
-     * @param diff
-     */
-    private void showDifficulty(GameDifficulty diff) {
-        diffEasy.setVisible(false);
-        diffMedium.setVisible(false);
-        diffHard.setVisible(false);
-
-        switch (diff) {
-            case EASY:
-                diffEasy.setVisible(true);
-                break;
-            case MEDIUM:
-                diffMedium.setVisible(true);
-                break;
-            case HARD:
-                diffHard.setVisible(true);
-                break;
-        }
-    }
-
     @Override
     public void draw(Batch batch, float parentAlpha) {
         // Paralax layers
diff --git a/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java b/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java
index ab4540de92b5599693c68da84ce0edc1ee5a8680..72b1cbfce05aee4930abfb758ca609327bb51967 100644
--- a/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java
+++ b/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java
@@ -6,10 +6,11 @@ import com.badlogic.gdx.scenes.scene2d.ui.Image;
 
 import java.util.List;
 
+import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.loader.TablexiaAssetManager;
-import cz.nic.tablexia.screen.AbstractTablexiaScreen;
+import cz.nic.tablexia.screen.AbstractLinearTextureTablexiaScreen;
 
-public class LoaderScreen extends AbstractTablexiaScreen<Void> {
+public class LoaderScreen extends AbstractLinearTextureTablexiaScreen<Void> {
 
     private static final String LOADER_BACKGROUND = "gfx/screen_loader_background.jpg";
     private static final String LOADER_SMALL_HAND = "gfx/screen_loader_smallhand.png";
@@ -28,23 +29,24 @@ public class LoaderScreen extends AbstractTablexiaScreen<Void> {
 
     @Override
     protected void screenLoaded() {
+        // TODO fix screen size
         Image background = new Image(getTexture(LOADER_BACKGROUND));
         background.setPosition(0, 0);
-        background.setSize(getStage().getWidth(), getStage().getHeight());
+        background.setSize(getStage().getWidth(), TablexiaSettings.getMinWorldHeight());
         getStage().addActor(background);
 
         Image smallhand = new Image(getTexture(LOADER_SMALL_HAND));
-        smallhand.setPosition(getStage().getWidth() * 0.22f, getStage().getHeight() * 0.64f);
-        smallhand.setSize(getStage().getWidth() * 0.01f, getStage().getHeight() * 0.06f);
+        smallhand.setPosition(220, 355);
+        smallhand.setSize(10, 40);
         getStage().addActor(smallhand);
-        smallhand.setOrigin(smallhand.getWidth() / 2, 0);
+        smallhand.setOrigin(smallhand.getWidth() / 2, 5);
         smallhand.addAction(Actions.forever(Actions.rotateBy(-360, 6)));
 
         Image bighand = new Image(getTexture(LOADER_BIG_HAND));
-        bighand.setPosition(getStage().getWidth() * 0.22f, getStage().getHeight() * 0.64f);
-        bighand.setSize(getStage().getWidth() * 0.01f, getStage().getHeight() * 0.06f);
+        bighand.setPosition(220, 355);
+        bighand.setSize(10, 40);
         getStage().addActor(bighand);
-        bighand.setOrigin(bighand.getWidth() / 2, 0);
+        bighand.setOrigin(bighand.getWidth() / 2, 5);
         bighand.addAction(Actions.forever(Actions.rotateBy(-360, 0.5f)));
     }
 
diff --git a/core/src/cz/nic/tablexia/util/ScaleUtil.java b/core/src/cz/nic/tablexia/util/ScaleUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..4dc65214df95ee1999f63af6b0b404a484c92c5f
--- /dev/null
+++ b/core/src/cz/nic/tablexia/util/ScaleUtil.java
@@ -0,0 +1,85 @@
+package cz.nic.tablexia.util;
+
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.scenes.scene2d.Actor;
+import com.badlogic.gdx.scenes.scene2d.Stage;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
+
+import cz.nic.tablexia.TablexiaSettings;
+
+/**
+ * Created by lhoracek on 4/7/15.
+ */
+public class ScaleUtil {
+
+    public static Image createImageSizePosition(Texture texture, float width, float height, float x, float y) {
+        Image image = createImageSize(texture, width, height);
+        image.setPosition(x, y);
+        return image;
+    }
+
+    public static Image createImageWidthPosition(Texture texture, float width, float x, float y) {
+        Image image = createImageToWidth(texture, width);
+        image.setPosition(x, y);
+        return image;
+    }
+
+    public static Image createImageHeightPosition(Texture texture, float height, float x, float y) {
+        Image image = createImageToHeight(texture, height);
+        image.setPosition(x, y);
+        return image;
+    }
+
+    public static Image createImageFitInto(Texture texture, float width, float height) {
+        Image image = new Image(texture);
+        if (getWidth(texture.getWidth(), texture.getHeight(), height) > width) {
+            image.setSize(width, getHeight(texture.getWidth(), texture.getHeight(), width));
+        } else {
+            image.setSize(getWidth(texture.getWidth(), texture.getHeight(), height), height);
+        }
+        return image;
+    }
+
+    public static Image createImageSize(Texture texture, float width, float height) {
+        Image image = new Image(texture);
+        image.setSize(width, height);
+        return image;
+    }
+
+    public static Image createImageToWidth(Texture texture, float width) {
+        Image image = new Image(texture);
+        image.setSize(width, getHeight(texture.getWidth(), texture.getHeight(), width));
+        return image;
+    }
+
+    public static Image createImageToHeight(Texture texture, float height) {
+        Image image = new Image(texture);
+        image.setSize(getWidth(texture.getWidth(), texture.getHeight(), height), height);
+        return image;
+    }
+
+    public static float getHeight(float origWidth, float origHeight, float targetWidth) {
+        return targetWidth / (origWidth / origHeight);
+    }
+
+    public static float getWidth(float origWidth, float origHeight, float targetHeight) {
+        return targetHeight * (origWidth / origHeight);
+    }
+
+    public static Actor setFullScreen(Actor actor, Stage stage) {
+        setPosition(actor, 0, 0);
+        actor.setSize(stage.getWidth(), stage.getHeight());
+        return actor;
+    }
+
+    public static Actor setBackgroundSize(Actor actor) {
+        setPosition(actor, 0, -TablexiaSettings.getMinWorldHeight()/2);
+        actor.setSize(TablexiaSettings.getWorldWidth(), TablexiaSettings.getMinWorldHeight()*2);
+        return actor;
+    }
+
+    public static Actor setPosition(Actor actor, float x, float y) {
+        actor.setPosition(x, y);
+        return actor;
+    }
+}
diff --git a/core/src/cz/nic/tablexia/util/assetmanager/DirectoryAsset.java b/core/src/cz/nic/tablexia/util/assetmanager/DirectoryAsset.java
index 15136168250072e1231f4a139be8a78b946d12dd..c837dcb06c4dfb47d76c0706426d67dc8d662f5b 100644
--- a/core/src/cz/nic/tablexia/util/assetmanager/DirectoryAsset.java
+++ b/core/src/cz/nic/tablexia/util/assetmanager/DirectoryAsset.java
@@ -11,11 +11,12 @@ import cz.nic.tablexia.util.Log;
 /**
  * Created by lhoracek on 4/3/15.
  */
-public abstract class DirectoryAsset extends HashMap<String, String> {
-    public abstract String getPath();
+public class DirectoryAsset extends HashMap<String, String> {
+    private final String basePath;
 
-    public DirectoryAsset() {
-        loadFilesInDir(getPath());
+    public DirectoryAsset(String path){
+        basePath = path;
+        loadFilesInDir(basePath);
     }
 
     private void loadFilesInDir(String path) {
@@ -42,9 +43,19 @@ public abstract class DirectoryAsset extends HashMap<String, String> {
     }
 
     public String add(String path, FileHandle fh) {
-        String fullPath = getPath() + "/" + path + fh.name();
+        String fullPath = basePath + "/" + path + fh.name();
         String key = path + fh.nameWithoutExtension();
         Log.info(getClass().getName(), "Adding asset: " + key + " : " + fullPath);
         return super.put(key, fullPath);
     }
+
+    @Override
+    public String get(Object key) {
+        String value = super.get(key);
+        if(value == null){
+            Log.info(getClass().getName(), "Asset not prepared: " + key);
+            throw new IllegalArgumentException("Asset not prepared: " + key);
+        }
+        return value;
+    }
 }
diff --git a/core/src/cz/nic/tablexia/util/listener/DragActorListener.java b/core/src/cz/nic/tablexia/util/listener/DragActorListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce5f515f65e400f5a6c4fbb921e3bda891c47753
--- /dev/null
+++ b/core/src/cz/nic/tablexia/util/listener/DragActorListener.java
@@ -0,0 +1,88 @@
+package cz.nic.tablexia.util.listener;
+
+import com.badlogic.gdx.math.Interpolation;
+import com.badlogic.gdx.scenes.scene2d.Actor;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.actions.Actions;
+
+import cz.nic.tablexia.util.Log;
+
+/**
+ * Created by lhoracek on 4/10/15.
+ */
+public class DragActorListener extends InputListener {
+    private float grabX, grabY, startX, startY;
+    private final Actor actor;
+    private boolean bounceBack;
+    private DragDropListener dragDropListener;
+
+    public DragActorListener(Actor actor) {
+        this.actor = actor;
+    }
+
+    public DragActorListener(Actor actor, boolean bounceBack) {
+        this.actor = actor;
+        this.bounceBack = bounceBack;
+    }
+
+    public DragActorListener(Actor actor, boolean bounceBack, DragDropListener dragDropListener) {
+        this(actor,bounceBack);
+        this.dragDropListener = dragDropListener;
+    }
+
+    public void setDragDropListener(DragDropListener dragDropListener) {
+        this.dragDropListener = dragDropListener;
+    }
+
+    // TODO add callback method
+    private void moveBack() {
+        actor.addAction(Actions.moveTo(startX, startY, 0.5f, Interpolation.elasticOut));
+    }
+
+    @Override
+    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+        super.touchDown(event, x, y, pointer, button);
+        if (pointer == 0 && button == 0) {
+            grabX = x;
+            grabY = y;
+            startX = actor.getX();
+            startY = actor.getY();
+            event.stop();
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void touchDragged(InputEvent event, float x, float y, int pointer) {
+        super.touchDragged(event, x, y, pointer);
+        if (pointer == 0) {
+            float bx = actor.getX() + (x - grabX);
+            float by = actor.getY() + (y - grabY);
+            actor.setPosition(bx, by);
+            if (actor.getDebug()) {
+                Log.info(((Object) this).getClass().getName(), "Position " + bx + "x" + by);
+            }
+            event.stop();
+        }
+    }
+
+    @Override
+    public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
+        if (pointer == 0 && button == 0) {
+            super.touchUp(event, x, y, pointer, button);
+            if (bounceBack) {
+                moveBack();
+            }
+            if(dragDropListener != null){
+                dragDropListener.dropped(actor.getX(),actor.getY());
+            }
+            event.stop();
+        }
+    }
+
+    public static interface DragDropListener {
+        public void dropped(float x, float y);
+    }
+}
diff --git a/core/src/cz/nic/tablexia/util/listener/DragSwitchListener.java b/core/src/cz/nic/tablexia/util/listener/DragSwitchListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..5d90c72d8fe05e351bfacd28a06ca35dfe22e36e
--- /dev/null
+++ b/core/src/cz/nic/tablexia/util/listener/DragSwitchListener.java
@@ -0,0 +1,145 @@
+package cz.nic.tablexia.util.listener;
+
+import com.badlogic.gdx.math.Interpolation;
+import com.badlogic.gdx.scenes.scene2d.Actor;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.actions.Actions;
+
+/**
+ * Created by lhoracek on 4/10/15.
+ */
+public class DragSwitchListener extends InputListener {
+    private float grabX, startX;
+
+    private final float maxX, minX;
+    private final float[] snadPoints;
+    private final Actor actor;
+    private SwitchMovedListener switchMovedListener;
+    private SwitchSelectedListener switchSelectedListener;
+    private Float disabledPoint;
+
+    public DragSwitchListener(Actor actor, float minX, float maxX, float... snapPoints) {
+        this.actor = actor;
+        this.minX = minX;
+        this.maxX = maxX;
+        this.snadPoints = snapPoints == null ? new float[0] : snapPoints;
+    }
+
+    // TODO add callback method
+    private void moveBack() {
+        actor.addAction(Actions.moveTo(startX, actor.getY(), 0.5f, Interpolation.pow2));
+    }
+
+    @Override
+    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+        super.touchDown(event, x, y, pointer, button);
+        grabX = x;
+        startX = actor.getX();
+        event.stop();
+        return true;
+    }
+
+    @Override
+    public void touchDragged(InputEvent event, float x, float y, int pointer) {
+        super.touchDragged(event, x, y, pointer);
+        float bx = actor.getX() + (x - grabX);
+        if (bx > minX && bx < maxX) {
+            actor.setPosition(bx, actor.getY());
+            if (switchMovedListener != null) {
+                switchMovedListener.movedToStep(getStep(true));
+            }
+        }
+        event.stop();
+    }
+
+    @Override
+    public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
+        super.touchUp(event, x, y, pointer, button);
+        actor.addAction(Actions.moveTo(getClosestValue(false), actor.getY()));
+        if (switchMovedListener != null) {
+            switchMovedListener.movedToStep(getStep(false));
+        }
+        if (switchSelectedListener != null) {
+            switchSelectedListener.stepSelected(getStep(false));
+        }
+        event.stop();
+    }
+
+    private int getStep(boolean useDisabled) {
+        float closest = getClosestValue(useDisabled);
+
+        for (int i = 0; i < snadPoints.length; i++) {
+            if (snadPoints[i] == closest) {
+                return i + 1;
+            }
+        }
+        return closest == minX ? 0 : snadPoints.length + 1;
+    }
+
+    private float getX(int step) {
+        if (step == 0) {
+            return minX;
+        } else if (step <= snadPoints.length) {
+            return snadPoints[step - 1];
+        }
+        return maxX;
+    }
+
+    public void switchToStep(int step) {
+        actor.setX(getX(step));
+        if (switchMovedListener != null) {
+            switchMovedListener.movedToStep(getStep(true));
+        }
+        if (switchSelectedListener != null) {
+            switchSelectedListener.stepSelected(getStep(true));
+        }
+    }
+
+    private float getClosestValue(boolean useDisabled) {
+        float left = minX;
+        float right = maxX;
+
+        // find closest snap points
+        for (float snap : snadPoints) {
+            if (!useDisabled && disabledPoint != null && snap == disabledPoint.floatValue()) {
+                continue;
+            }
+            if (snap > actor.getX() && ((snap - actor.getX()) < (right - actor.getX()))) {
+                right = snap;
+            } else if (snap <= actor.getX() && ((actor.getX() - snap) < (actor.getX() - left))) {
+                left = snap;
+            }
+        }
+        float middle = left + ((right - left) / 2);
+        return actor.getX() > middle ? right : left;
+    }
+
+    public SwitchMovedListener getSwitchMovedListener() {
+        return switchMovedListener;
+    }
+
+    public void setDisabledPoint(Float disabledPoint) {
+        this.disabledPoint = disabledPoint;
+    }
+
+    public void setSwitchMovedListener(SwitchMovedListener switchMovedListener) {
+        this.switchMovedListener = switchMovedListener;
+    }
+
+    public SwitchSelectedListener getSwitchSelectedListener() {
+        return switchSelectedListener;
+    }
+
+    public void setSwitchSelectedListener(SwitchSelectedListener switchSelectedListener) {
+        this.switchSelectedListener = switchSelectedListener;
+    }
+
+    public static interface SwitchMovedListener {
+        public void movedToStep(int step);
+    }
+
+    public static interface SwitchSelectedListener {
+        public void stepSelected(int step);
+    }
+}