diff --git a/luatex/barvicky.lua b/luatex/barvicky.lua
new file mode 100644
index 0000000000000000000000000000000000000000..b7ffb6a0be3399d11a46137f500519cd764522b6
--- /dev/null
+++ b/luatex/barvicky.lua
@@ -0,0 +1,43 @@
+luatexbase.provides_module {
+	name = "x",
+	version = "0.0",
+	author = "Martin Mareš",
+}
+
+x = { }
+
+local number_sp_in_a_pdf_point = 65782
+
+function math.round(num, idp)
+  if idp and idp>0 then
+    local mult = 10^idp
+    return math.floor(num * mult + 0.5) / mult
+  end
+  return math.floor(num + 0.5)
+end
+
+function x.transform(parent)
+	local head = parent.list
+	while head do
+		local id = head.id
+		if id == 0 and head.subtype == 1 then
+			-- Line
+			if node.has_attribute(head, 222, 1) then
+				local wd = math.round(head.width / number_sp_in_a_pdf_point, 2)
+				local ht = math.round((head.height + head.depth) / number_sp_in_a_pdf_point, 2)
+				local dp = math.round(head.depth / number_sp_in_a_pdf_point, 2)
+				local bg = node.new("whatsit", "pdf_literal")
+				bg.data = string.format("q 1 0 0 RG 0 %g %g %g re s Q", 0, wd, -ht)
+				parent.list = node.insert_before(parent.list, head, bg)
+			end
+		end
+		x.transform(head)
+		head = head.next
+	end
+end
+
+function x.output()
+	texio.write("### output ###")
+	local outbox = tex.getbox(255)
+	x.transform(outbox)
+end
diff --git a/luatex/barvicky.tex b/luatex/barvicky.tex
new file mode 100644
index 0000000000000000000000000000000000000000..cd0faf64c2a0750e7d7cfff197172c6ff20bfc7d
--- /dev/null
+++ b/luatex/barvicky.tex
@@ -0,0 +1,30 @@
+\input ltluatex.tex
+\directlua{require('barvicky.lua')}
+
+\def\outputhack{\directlua{x.output()}}
+\output={\outputhack\plainoutput}
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque porta. Etiam sapien elit, consequat eget, tristique non, venenatis quis, ante. Vivamus ac leo pretium faucibus. Nulla quis diam. Aliquam erat volutpat. Praesent vitae arcu tempor neque lacinia pretium. Fusce tellus odio, dapibus id fermentum quis, suscipit id erat. In dapibus augue non sapien. Mauris metus. Duis condimentum augue id magna semper rutrum.
+
+{
+\attribute222=1
+
+Vivamus luctus egestas leo. Nam sed tellus id magna elementum tincidunt. Sed ac dolor sit amet purus malesuada congue. Quisque porta. Praesent dapibus. Maecenas ipsum velit, consectetuer eu lobortis ut, dictum at dui. Duis viverra diam non justo. Nullam at arcu a est sollicitudin euismod. Nullam eget nisl. Integer malesuada.
+
+}
+
+Aenean id metus id velit ullamcorper pulvinar. Etiam dictum tincidunt diam. Fusce tellus odio, dapibus id fermentum quis, suscipit id erat. Fusce consectetuer risus a nunc. Quisque porta. Proin in tellus sit amet nibh dignissim sagittis. Nunc dapibus tortor vel mi dapibus sollicitudin. Aenean placerat. Aenean id metus id velit ullamcorper pulvinar. Nulla est. Praesent dapibus. Aenean id metus id velit ullamcorper pulvinar. Etiam posuere lacus quis dolor. Sed elit dui, pellentesque a, faucibus vel, interdum nec, diam. Ut tempus purus at lorem. Aenean fermentum risus id tortor. Aliquam erat volutpat. Duis viverra diam non justo.
+
+Integer imperdiet lectus quis justo. Aliquam ante. In rutrum. Cras pede libero, dapibus nec, pretium sit amet, tempor quis. Duis ante orci, molestie vitae vehicula venenatis, tincidunt ac pede. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. In sem justo, commodo ut, suscipit at, pharetra vitae, orci. Vivamus ac leo pretium faucibus. Fusce suscipit libero eget elit. Donec vitae arcu. Aenean id metus id velit ullamcorper pulvinar. Fusce wisi. Aliquam ornare wisi eu metus. Etiam neque. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Curabitur ligula sapien, pulvinar a vestibulum quis, facilisis vel sapien. Etiam dictum tincidunt diam. Nullam sit amet magna in magna gravida vehicula. Maecenas sollicitudin.
+
+Sed convallis magna eu sem. Maecenas fermentum, sem in pharetra pellentesque, velit turpis volutpat ante, in pharetra metus odio a lectus. Fusce dui leo, imperdiet in, aliquam sit amet, feugiat eu, orci. Pellentesque arcu. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Nullam dapibus fermentum ipsum. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. Curabitur vitae diam non enim vestibulum interdum. Nunc tincidunt ante vitae massa. Praesent id justo in neque elementum ultrices. Sed convallis magna eu sem. Aliquam erat volutpat.
+
+Pellentesque sapien. In rutrum. Aenean fermentum risus id tortor. Sed convallis magna eu sem. Etiam bibendum elit eget erat. Fusce tellus. Sed convallis magna eu sem. Vivamus luctus egestas leo. Nullam faucibus mi quis velit. Quisque tincidunt scelerisque libero. Nulla non arcu lacinia neque faucibus fringilla. Fusce dui leo, imperdiet in, aliquam sit amet, feugiat eu, orci. Fusce tellus odio, dapibus id fermentum quis, suscipit id erat. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+
+Nulla est. Curabitur vitae diam non enim vestibulum interdum. Integer tempor. Nullam faucibus mi quis velit. Nulla pulvinar eleifend sem. Phasellus faucibus molestie nisl. Etiam sapien elit, consequat eget, tristique non, venenatis quis, ante. Vestibulum erat nulla, ullamcorper nec, rutrum non, nonummy ac, erat. Nam sed tellus id magna elementum tincidunt. In enim a arcu imperdiet malesuada. Curabitur ligula sapien, pulvinar a vestibulum quis, facilisis vel sapien. Etiam sapien elit, consequat eget, tristique non, venenatis quis, ante. Mauris dolor felis, sagittis at, luctus sed, aliquam non, tellus. Sed convallis magna eu sem.
+
+Praesent vitae arcu tempor neque lacinia pretium. Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? Nullam sit amet magna in magna gravida vehicula. Nulla non arcu lacinia neque faucibus fringilla. Nulla accumsan, elit sit amet varius semper, nulla mauris mollis quam, tempor suscipit diam nulla vel leo. Fusce consectetuer risus a nunc. Sed vel lectus. Donec odio tempus molestie, porttitor ut, iaculis quis, sem. Mauris suscipit, ligula sit amet pharetra semper, nibh ante cursus purus, vel sagittis velit mauris vel metus. Maecenas lorem. Vivamus ac leo pretium faucibus. Nam quis nulla. Etiam dui sem, fermentum vitae, sagittis id, malesuada in, quam.
+
+Ut tempus purus at lorem. Integer malesuada. Duis bibendum, lectus ut viverra rhoncus, dolor nunc faucibus libero, eget facilisis enim ipsum id lacus. In sem justo, commodo ut, suscipit at, pharetra vitae, orci. Nam sed tellus id magna elementum tincidunt. Aliquam id dolor. Etiam bibendum elit eget erat. Duis condimentum augue id magna semper rutrum. Nulla est. Aliquam erat volutpat. Duis ante orci, molestie vitae vehicula venenatis, tincidunt ac pede. Aenean placerat. Etiam commodo dui eget wisi. Nullam eget nisl. In laoreet, magna id viverra tincidunt, sem odio bibendum justo, vel imperdiet sapien wisi sed libero. Pellentesque ipsum. Fusce suscipit libero eget elit. In rutrum.
+
+\bye
diff --git a/luatex/boxes.epdf b/luatex/boxes.epdf
new file mode 100644
index 0000000000000000000000000000000000000000..ddbad512e90de7a316e2e91fb477d57b5cef33ff
Binary files /dev/null and b/luatex/boxes.epdf differ
diff --git a/luatex/boxes.tex b/luatex/boxes.tex
new file mode 100644
index 0000000000000000000000000000000000000000..6c4324302a9563d9424b84e79bb333cb8869844e
--- /dev/null
+++ b/luatex/boxes.tex
@@ -0,0 +1,31 @@
+\nopagenumbers
+
+\input luaotfload.sty
+\font\xx=LMRoman12-Regular:mode=base;script=latn;+tlig at 50pt
+\font\yy=LMRoman12-Italic:mode=base;script=latn;+tlig at 50pt
+\xx
+\baselineskip=60pt
+
+\input atbegshi.sty\relax
+\directlua{lvd = require("./debug")}
+\AtBeginShipout{\directlua{lvd.show_page_elements(tex.box["AtBeginShipoutBox"])}}
+\AtBeginShipoutInit
+
+\directlua{
+	local t = node.types()
+	for k, v in pairs(t) do
+		texio.write(k .. ':' .. v)
+	end
+}
+
+\hsize=140mm
+\vsize=90mm
+\parindent=0pt
+
+\line{Seminář o~\TeX{}u}
+\centerline{(NUOS005)}
+\vskip 10mm
+\leftline{\yy Vladan Majerech}
+\rightline{\yy \&~Martin Mareš}
+
+\bye
diff --git a/luatex/debug.lua b/luatex/debug.lua
new file mode 100644
index 0000000000000000000000000000000000000000..f6b789769a59bfdac50d25e024f7fdd49d1c1f1d
--- /dev/null
+++ b/luatex/debug.lua
@@ -0,0 +1,164 @@
+-- This is a hacked version for TeX seminar. Martin Mares, 2016-09
+
+-- Copyright 2012 Patrick Gundlach, patrick@gundla.ch
+-- Public repository: https://github.com/pgundlach/lvdebug (issues/pull requests,...)
+-- Version: 0.4
+
+-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
+-- "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge,
+-- publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do
+-- so, subject to the following conditions:
+--
+-- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+--
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+-- FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+-- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
+module(...,package.seeall)
+
+-- There are 65782 scaled points in a PDF point
+-- Therefore we need to divide all TeX lengths by
+-- this amount to get the PDF points.
+local number_sp_in_a_pdf_point = 65782
+
+
+-- The idea is the following: at page shipout, all elements on a page are fixed.
+-- TeX creates an intermediate data structure before putting that into the PDF
+-- We can "intercept" that data structure and add pdf_literal (whatist) nodes,
+-- that makes glues, kerns and other items visible by drawing a rule, rectangle or
+-- other visual aids.
+-- This has no influence on typeset material, because these pdf_literal instructions
+-- are only visible to the PDF file (PDF renderer) and have no size themselves.
+
+-- We recursively loop through the contents of boxes and look at the (linear) list of
+-- items in that box. We start at the "shipout box".
+
+-- The "algorithm" goes like this:
+--
+-- head = pointer_to_beginning_of_box_material
+-- while head is not nil
+--   if this_item_is_a_box
+--     recurse_into_contents
+--     draw a rectangle around the contents
+--   elseif this_item_is_a_glue
+--     draw a rule that has the length of that glue
+--   elseif this_item_is_a_kern
+--     draw a rectangle with width of that kern
+--   ...
+--   end
+--   move pointer to the next item in the list
+--   -- the pointer is "nil" if there is no next item
+-- end
+
+function math.round(num, idp)
+  if idp and idp>0 then
+    local mult = 10^idp
+    return math.floor(num * mult + 0.5) / mult
+  end
+  return math.floor(num + 0.5)
+end
+
+
+function show_page_elements(parent)
+  local head = parent.list
+  while head do
+    if head.id == 0 or head.id == 1 then -- hbox / vbox
+
+      local rule_width = 1
+      local wd = math.round(head.width                  / number_sp_in_a_pdf_point - rule_width     ,2)
+      local ht = math.round((head.height + head.depth)  / number_sp_in_a_pdf_point - rule_width     ,2)
+      local dp = math.round(head.depth                  / number_sp_in_a_pdf_point - rule_width / 2 ,2)
+
+      -- recurse into the contents of the box
+      show_page_elements(head)
+      local rectangle = node.new("whatsit","pdf_literal")
+      if head.id == 0 then -- hbox
+        rectangle.data = string.format("q 0.5 G %g w %g %g %g %g re s Q", rule_width, -rule_width / 2, -dp, wd, ht)
+      else
+        rectangle.data = string.format("q 0.1 G %g w %g %g %g %g re s Q", rule_width, -rule_width / 2, 0, wd, -ht)
+      end
+      head.list = node.insert_before(head.list,head.list,rectangle)
+
+
+    elseif head.id == 2 then -- rule
+      local show_rule = node.new("whatsit","pdf_literal")
+      if head.width == -1073741824 or head.height == -1073741824 or head.depth == -1073741824 then
+        -- ignore for now -- these rules are stretchable
+      else
+        local dp = math.round( head.depth / number_sp_in_a_pdf_point  ,2)
+        local ht = math.round( head.height / number_sp_in_a_pdf_point ,2)
+        show_rule.data =  string.format("q 1 0 0 RG 1 0 0 rg 0.4 w 0 %g m 0 %g l S Q",-dp,ht)
+      end
+      parent.list = node.insert_before(parent.list,head,show_rule)
+
+
+    elseif head.id == 7 then -- disc
+      local hyphen_marker = node.new("whatsit","pdf_literal")
+      hyphen_marker.data = "q 0 0 1 RG 0.3 w 0 -1 m 0 0 l S Q"
+      parent.list = node.insert_before(parent.list,head,hyphen_marker)
+
+
+  elseif head.id == 10 then -- glue
+      local wd = head.spec.width
+      local color = "0.5 G"
+      if parent.glue_sign == 1 and parent.glue_order == head.spec.stretch_order then
+        wd = wd + parent.glue_set * head.spec.stretch
+        color = "0 0 1 RG"
+      elseif parent.glue_sign == 2 and parent.glue_order == head.spec.shrink_order then
+        wd = wd - parent.glue_set * head.spec.shrink
+        color = "1 0 1 RG"
+      end
+      local pdfstring = node.new("whatsit","pdf_literal")
+      local wd_bp = math.round(wd / number_sp_in_a_pdf_point,2)
+      if parent.id == 0 then --hlist
+        pdfstring.data = string.format("q %s [2 2] 0 d  1.8 w 0 0  m %g 0 l s Q",color,wd_bp)
+      else -- vlist
+        pdfstring.data = string.format("q 0.1 G 0.1 w -0.5 0 m 0.5 0 l -0.5 %g m 0.5 %g l s [0.2] 0 d  0.5 w 0.25 0  m 0.25 %g l s Q",-wd_bp,-wd_bp,-wd_bp)
+      end
+      parent.list = node.insert_before(parent.list,head,pdfstring)
+
+
+    elseif head.id == 11 then -- kern
+      local rectangle = node.new("whatsit","pdf_literal")
+      local color = "1 1 0 rg"
+      if head.kern < 0 then color = "1 0 0 rg" end
+      local k = math.round(head.kern / number_sp_in_a_pdf_point,2)
+      if parent.id == 0 then --hlist
+        rectangle.data = string.format("q %s 0 w 0 0  %g 1 re B Q",color, k )
+      else
+        rectangle.data = string.format("q %s 0 w 0 0  1 %g re B Q",color, -k )
+      end
+      parent.list = node.insert_before(parent.list,head,rectangle)
+
+    elseif head.id == 12 then -- penalty
+      local color = "1 g"
+      local rectangle = node.new("whatsit","pdf_literal")
+      if head.penalty < 10000 then
+        color = string.format("%d g", 1 - head.penalty / 10000)
+      end
+      rectangle.data = string.format("q %s 0 w 0 0 10 10 re B Q",color)
+      parent.list = node.insert_before(parent.list,head,rectangle)
+
+    elseif head.id == 37 then -- glyph
+      local rule_width = 0.8
+      local wd = math.round(head.width                  / number_sp_in_a_pdf_point - rule_width     ,2)
+      local ht = math.round((head.height + head.depth)  / number_sp_in_a_pdf_point - rule_width     ,2)
+      local dp = math.round(head.depth                  / number_sp_in_a_pdf_point - rule_width / 2 ,2)
+
+      local rectangle = node.new("whatsit","pdf_literal")
+      rectangle.data = string.format("q 1 0 0 RG %g w %g %g %g %g re s Q", rule_width, -rule_width / 2, -dp, wd, ht) ..
+		string.format(" q 0 0 1 RG %g w %g %g m %g %g l s Q", rule_width, -rule_width/2, 0, wd, 0)
+      parent.list = node.insert_before(parent.list,head,rectangle)
+
+    else
+      texio.write("### node " .. head.id .. "\n")
+    end
+    head = head.next
+  end
+  return true
+end
+
diff --git a/luatex/debug2.lua b/luatex/debug2.lua
new file mode 100644
index 0000000000000000000000000000000000000000..3bc98bd87e11332e6f1c2050599f306ec471d98b
--- /dev/null
+++ b/luatex/debug2.lua
@@ -0,0 +1,110 @@
+module(...,package.seeall)
+
+local number_sp_in_a_pdf_point = 65782
+
+function math.round(num, idp)
+  if idp and idp>0 then
+    local mult = 10^idp
+    return math.floor(num * mult + 0.5) / mult
+  end
+  return math.floor(num + 0.5)
+end
+
+function show_page_elements(parent)
+  local head = parent.list
+  while head do
+    if head.id == 0 or head.id == 1 then -- hbox / vbox
+
+      local rule_width = 1
+      local wd = math.round(head.width                  / number_sp_in_a_pdf_point - rule_width     ,2)
+      local ht = math.round((head.height + head.depth)  / number_sp_in_a_pdf_point - rule_width     ,2)
+      local dp = math.round(head.depth                  / number_sp_in_a_pdf_point - rule_width / 2 ,2)
+
+      -- recurse into the contents of the box
+      show_page_elements(head)
+      local rectangle = node.new("whatsit","pdf_literal")
+      if head.id == 0 then -- hbox
+        rectangle.data = string.format("q 0.5 G %g w %g %g %g %g re s Q", rule_width, -rule_width / 2, -dp, wd, ht)
+      else
+        rectangle.data = string.format("q 0.1 G %g w %g %g %g %g re s Q", rule_width, -rule_width / 2, 0, wd, -ht)
+      end
+      head.list = node.insert_before(head.list,head.list,rectangle)
+
+
+    elseif head.id == 2 then -- rule
+      local show_rule = node.new("whatsit","pdf_literal")
+      if head.width == -1073741824 or head.height == -1073741824 or head.depth == -1073741824 then
+        -- ignore for now -- these rules are stretchable
+      else
+        local dp = math.round( head.depth / number_sp_in_a_pdf_point  ,2)
+        local ht = math.round( head.height / number_sp_in_a_pdf_point ,2)
+        show_rule.data =  string.format("q 1 0 0 RG 1 0 0 rg 0.4 w 0 %g m 0 %g l S Q",-dp,ht)
+      end
+      parent.list = node.insert_before(parent.list,head,show_rule)
+
+
+    elseif head.id == 7 then -- disc
+      local hyphen_marker = node.new("whatsit","pdf_literal")
+      hyphen_marker.data = "q 0 0 1 RG 0.3 w 0 -1 m 0 0 l S Q"
+      parent.list = node.insert_before(parent.list,head,hyphen_marker)
+
+
+  elseif head.id == 10 then -- glue
+      local wd = head.spec.width
+      local color = "0.5 G"
+      if parent.glue_sign == 1 and parent.glue_order == head.spec.stretch_order then
+        wd = wd + parent.glue_set * head.spec.stretch
+        color = "0 0 1 RG"
+      elseif parent.glue_sign == 2 and parent.glue_order == head.spec.shrink_order then
+        wd = wd - parent.glue_set * head.spec.shrink
+        color = "1 0 1 RG"
+      end
+      local pdfstring = node.new("whatsit","pdf_literal")
+      local wd_bp = math.round(wd / number_sp_in_a_pdf_point,2)
+      if parent.id == 0 then --hlist
+        pdfstring.data = string.format("q %s [2 2] 0 d  1.8 w 0 0  m %g 0 l s Q",color,wd_bp)
+      else -- vlist
+        pdfstring.data = string.format("q 0.1 G 0.1 w -0.5 0 m 0.5 0 l -0.5 %g m 0.5 %g l s [0.2] 0 d  0.5 w 0.25 0  m 0.25 %g l s Q",-wd_bp,-wd_bp,-wd_bp)
+      end
+      parent.list = node.insert_before(parent.list,head,pdfstring)
+
+
+    elseif head.id == 11 then -- kern
+      local rectangle = node.new("whatsit","pdf_literal")
+      local color = "1 1 0 rg"
+      if head.kern < 0 then color = "1 0 0 rg" end
+      local k = math.round(head.kern / number_sp_in_a_pdf_point,2)
+      if parent.id == 0 then --hlist
+        rectangle.data = string.format("q %s 0 w 0 0  %g 1 re B Q",color, k )
+      else
+        rectangle.data = string.format("q %s 0 w 0 0  1 %g re B Q",color, -k )
+      end
+      parent.list = node.insert_before(parent.list,head,rectangle)
+
+    elseif head.id == 12 then -- penalty
+      local color = "1 g"
+      local rectangle = node.new("whatsit","pdf_literal")
+      if head.penalty < 10000 then
+        color = string.format("%d g", 1 - head.penalty / 10000)
+      end
+      rectangle.data = string.format("q %s 0 w 0 0 10 10 re B Q",color)
+      parent.list = node.insert_before(parent.list,head,rectangle)
+
+    elseif head.id == 37 then -- glyph
+      local rule_width = 0.8
+      local wd = math.round(head.width                  / number_sp_in_a_pdf_point - rule_width     ,2)
+      local ht = math.round((head.height + head.depth)  / number_sp_in_a_pdf_point - rule_width     ,2)
+      local dp = math.round(head.depth                  / number_sp_in_a_pdf_point - rule_width / 2 ,2)
+
+      local rectangle = node.new("whatsit","pdf_literal")
+      rectangle.data = string.format("q 1 0 0 RG %g w %g %g %g %g re s Q", rule_width, -rule_width / 2, -dp, wd, ht) ..
+		string.format(" q 0 0 1 RG %g w %g %g m %g %g l s Q", rule_width, -rule_width/2, 0, wd, 0)
+      parent.list = node.insert_before(parent.list,head,rectangle)
+
+    else
+      texio.write("### node " .. head.id .. "\n")
+    end
+    head = head.next
+  end
+  return true
+end
diff --git a/luatex/letak.tex b/luatex/letak.tex
new file mode 100644
index 0000000000000000000000000000000000000000..750cab259bb07a5243a9a978d0df4e474cc7b1a0
--- /dev/null
+++ b/luatex/letak.tex
@@ -0,0 +1,49 @@
+\input luatex85.sty
+\input ucwmac.tex
+\input ucw-ofs.tex
+\input a35.tex
+\chyph
+\parindent=0pt
+\setmargins{1cm}
+\setuppage
+\nopagenumbers
+
+% Barvicky
+\chardef\colorstk=\pdfcolorstackinit page direct{0 g 0 G}
+\def\colorpush#1{\pdfcolorstack\colorstk push{#1 rg #1 RG}}
+\def\colorpushgray#1{\pdfcolorstack\colorstk push{#1 g #1 G}}
+\def\colorpop{\pdfcolorstack\colorstk pop}
+
+% Vkladani obrazku
+\def\putimage#1#2{\hbox{\pdfximage #1{#2}\pdfrefximage\pdflastximage}}
+
+\setfonts[Palatino/30]
+\settextsize{30}
+\setbaselines{30}
+
+\vglue 0pt plus 1fill
+
+\centerline{Rádi sázíte v~\TeX{}u}
+\centerline{a~chtěli byste se naučit víc?}
+
+\vfill
+
+\centerline{\putimage{width 0.9\hsize}{boxes.epdf}}
+
+\vfill
+
+{\leftskip=0pt plus 0.1\hsize\rightskip=\leftskip\parfillskip=0pt
+Letos se podíváme nejen do hlubin klasického \TeX{}u,
+ale i na různá jeho rozšíření (pdf\TeX{}, Lua\TeX{} apod.).
+
+}
+
+\vfill
+
+\centerline{\it {\bi Úmluva} v~úterý 2. 10. od 15:40 v~S4}
+
+\bigskip
+
+\centerline{\it http://mj.ucw.cz/vyuka/tex/}
+
+\bye