diff --git a/seminar/models.py b/seminar/models.py
index c53c7048..c045b658 100644
--- a/seminar/models.py
+++ b/seminar/models.py
@@ -826,9 +826,7 @@ class Text(SeminarModelBase):
 			tn.save()
 
 	def __str__(self):
-		parser = FirstTagParser()		
-		parser.feed(str(self.na_web))
-		return parser.firstTag
+		return str(self.na_web)[:20]
 		
 class Uloha(Problem):
 	class Meta:
diff --git a/seminar/templates/seminar/treenode_recursive.html b/seminar/templates/seminar/treenode_recursive.html
index 62beed10..a95568df 100644
--- a/seminar/templates/seminar/treenode_recursive.html
+++ b/seminar/templates/seminar/treenode_recursive.html
@@ -10,10 +10,10 @@
 		<button type="submit" formaction="{%url 'treenode_odvesit' obj.node.id%}">Odvěsit na úroveň {{obj.parent.node}}</button>
 	{% endif %}
 	{% if obj|canPodvesitPred %}
-		<button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'predchozi'%}">Podvěsit pod předchozí</button> - nejsou testovací data
+		<button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'pred'%}">Podvěsit pod předchozí</button> - nejsou testovací data
 	{% endif %}
 	{% if obj|canPodvesitZa %}
-		<button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'nasledujíci'%}">Podvěsit pod následující</button> - nejsou testovací data
+		<button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'za'%}">Podvěsit pod následující</button> - nejsou testovací data
 	{% endif %}
 
 
diff --git a/seminar/templatetags/treenodes.py b/seminar/templatetags/treenodes.py
index d9bb668e..2aa914e4 100644
--- a/seminar/templatetags/treenodes.py
+++ b/seminar/templatetags/treenodes.py
@@ -181,7 +181,7 @@ def appendableChildren(value):
 		return (NodeTypes.CAST.value,
 			NodeTypes.TEXT.value,
 			)
-	if isCast(value):
+	if isCast(value.node):
 		return appendableChildren(value.parent)
 	return None
 
diff --git a/seminar/treelib.py b/seminar/treelib.py
index ba08e07a..8653e599 100644
--- a/seminar/treelib.py
+++ b/seminar/treelib.py
@@ -1,4 +1,5 @@
 from django.core.exceptions import ObjectDoesNotExist
+from django.db import transaction
 # NOTE: node.prev a node.succ jsou implementovány přímo v models.TreeNode
 # TODO: Všechny tyto funkce se naivně spoléhají na to, že jako parametr dostanou nějaký TreeNode (některé možná zvládnou i None)
 # TODO: Chceme, aby všechno nějak zvládlo None jako parametr.
@@ -239,6 +240,7 @@ def swap(node, other):
 class TreeLibError(RuntimeError):
 	pass
 
+@transaction.atomic
 def swap_pred(node):
 	if node is None:
 		raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.")
@@ -248,14 +250,19 @@ def swap_pred(node):
 	pre_pred = safe_pred(pred)
 	succ = node.succ
 
+	#TODO zkontrolovaz, ze toto poradi nerozbiji db a neskonci s unique constraint violation
 	if pre_pred is not None:
-		pre_pred.succ = node
+		pre_pred.succ = None
 		pre_pred.save()
 	node.succ = pred
 	node.save()
 	pred.succ = succ
 	pred.save()
+	if pre_pred is not None:
+		pre_pred.succ = node
+		pre_pred.save()
 
+@transaction.atomic
 def swap_succ(node):
 	if node is None:
 		raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.")
@@ -266,12 +273,15 @@ def swap_succ(node):
 	post_succ = succ.succ
 
 	if pred is not None:
-		pred.succ = succ
+		pred.succ = None
 		pred.save()
 	succ.succ = node
 	succ.save()
 	node.succ = post_succ
 	node.save()
+	if pred is not None:
+		pred.succ = succ
+		pred.save()
 
 # Rotace stromu
 # Dokumentace viz wiki:
diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py
index 8bad8c03..46297dba 100644
--- a/seminar/views/views_all.py
+++ b/seminar/views/views_all.py
@@ -159,51 +159,60 @@ class TreeNodePridatView(generic.View):
 		}
 
 	def post(self, request, *args, **kwargs):
-		kam = self.kwargs['kam']
 		node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
+		kam = self.kwargs['kam']
 
 		if kam not in ('syn','za'):
 			raise ValidationError('Přidat lze pouze před nebo za node')
 		if kam == 'syn':
 			strtyp = request.POST.get('pridat-typ-{}-syn'.format(node.id))
 			typ = self.type_from_str[strtyp]
-			node = treelib.create_child(node,typ)
+			if typ == m.TextNode:
+				text_obj = m.Text()
+				text_obj.save()
+				node = treelib.create_child(node,typ,text=text_obj)
+			else:
+				node = treelib.create_child(node,typ)
 		if kam == 'za':
 			strtyp = request.POST.get('pridat-typ-{}-za'.format(node.id))
 			typ = self.type_from_str[strtyp]
-			node = treelib.create_node_after(node,typ)
+			if typ == m.TextNode:
+				text_obj = m.Text()
+				text_obj.save()
+				node = treelib.create_node_after(node,typ,text=text_obj)
+			else:
+				node = treelib.create_node_after(node,typ)
 
 		return redirect(node.get_admin_url())
 		
 
-		
-
-
-
-
-
-
-		
-
 class TreeNodeSmazatView(generic.base.View):
 	def post(self, request, *args, **kwargs):
-		pass
-	pass
+		node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
+		if node.first_child:
+			raise NotImplemented('Mazání TreeNode se syny není zatím podporováno!')
+		node.delete()
 
 class TreeNodeOdvesitView(generic.base.View):
 	def post(self, request, *args, **kwargs):
+		node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
 		pass
 	pass
 
 class TreeNodePodvesitView(generic.base.View):
 	def post(self, request, *args, **kwargs):
-		pass
-	pass
+		node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
+		kam = self.kwargs['kam']
+		if kam == 'pred':
+			lower_node(node)	
+		elif kam == 'za':
+			raise NotImplemented('Podvěsit za není zatím podporováno')
 
 class TreeNodeProhoditView(generic.base.View):
 	def post(self, request, *args, **kwargs):
-		pass
-	pass
+		node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
+		treelib.swap_succ(node)
+		#FIXME ve formulari predat puvodni url a vratit redirect na ni
 
 
 class ProblemView(generic.DetailView):