diff --git a/resources/slides.lua b/resources/slides.lua
index 30f146d..06bb810 100644
--- a/resources/slides.lua
+++ b/resources/slides.lua
@@ -2,8 +2,10 @@
 gPath = "/skia/trunk/resources/"
 
 function load_file(file)
+    local prev_path = package.path
     package.path = package.path .. ";" .. gPath .. file .. ".lua"
     require(file)
+    package.path = prev_path
 end
 
 load_file("slides_utils")
@@ -44,97 +46,6 @@
     end
 end
 
-function scale_text_delta(template, delta)
-    template = template.slide
-    for i = 1, #template do
-        local paint = template[i].paint
-        paint:setTextSize(paint:getTextSize() + delta)
-    end
-end
-
-function slide_transition(prev, next, is_forward)
-    local rec = {
-        proc = function(self, canvas, drawSlideProc)
-            if self:isDone() then
-                drawSlideProc(canvas)
-                return nil
-            end
-            self.prevDrawable:draw(canvas, self.curr_x, 0)
-            self.nextDrawable:draw(canvas, self.curr_x + 640, 0)
-            self.curr_x = self.curr_x + self.step_x
-            return self
-        end
-    }
-    if is_forward then
-        rec.prevDrawable = prev
-        rec.nextDrawable = next
-        rec.curr_x = 0
-        rec.step_x = -15
-        rec.isDone = function (self) return self.curr_x <= -640 end
-    else
-        rec.prevDrawable = next
-        rec.nextDrawable = prev
-        rec.curr_x = -640
-        rec.step_x = 15
-        rec.isDone = function (self) return self.curr_x >= 0 end
-    end
-    return rec
-end
-
-function sqr(value) return value * value end
-
-function set_blur(paint, alpha)
-    local sigma = sqr(1 - alpha) * 20
---    paint:setImageFilter(Sk.newBlurImageFilter(sigma, sigma))
-    paint:setAlpha(alpha)
-end
-
-function fade_slide_transition(prev, next, is_forward)
-    local rec = {
-        paint = Sk.newPaint(),
-        prevDrawable = prev,
-        nextDrawable = next,
-        proc = function(self, canvas, drawSlideProc)
-            if self:isDone() then
-                drawSlideProc(canvas)
-                return nil
-            end
-
-            set_blur(self.paint, self.prev_a)
-            self.prevDrawable:draw(canvas, self.prev_x, 0, self.paint)
-
-            set_blur(self.paint, self.next_a)
-            self.nextDrawable:draw(canvas, self.next_x, 0, self.paint)
-            self:step()
-            return self
-        end
-    }
-    if is_forward then
-        rec.prev_x = 0
-        rec.prev_a = 1
-        rec.next_x = 640
-        rec.next_a = 0
-        rec.isDone = function (self) return self.next_x <= 0 end
-        rec.step = function (self)
-            self.next_x = self.next_x - 20
-            self.next_a = (640 - self.next_x) / 640
-            self.prev_a = 1 - self.next_a
-        end
-    else
-        rec.prev_x = 0
-        rec.prev_a = 1
-        rec.next_x = 0
-        rec.next_a = 0
-        rec.isDone = function (self) return self.prev_x >= 640 end
-        rec.step = function (self)
-            self.prev_x = self.prev_x + 20
-            self.prev_a = (640 - self.prev_x) / 640
-            self.next_a = 1 - self.prev_a
-        end
-    end
-    return rec
-end
-
 --------------------------------------------------------------------------------------
 function make_tmpl(paint, extra_dy)
     return { paint = paint, extra_dy = extra_dy }
@@ -253,12 +164,14 @@
 -- gMakeDrawable = convert_to_picture_drawable
 gMakeDrawable = new_drawable_slide
 
+load_file("slides_transitions")
+
 function spawn_transition(prevSlide, nextSlide, is_forward)
     local transition
     if is_forward then
-        transition = prevSlide.transition
+        transition = gTransitionTable[nextSlide.transition]
     else
-        transition = nextSlide.transition
+        transition = gTransitionTable[prevSlide.transition]
     end
 
     if not transition then
diff --git a/resources/slides_content.lua b/resources/slides_content.lua
index 85f3a26..a2f376a 100644
--- a/resources/slides_content.lua
+++ b/resources/slides_content.lua
@@ -1,4 +1,6 @@
-Skia Overview [Fall '13]
+Skia Overview 2014
+
+< transition =slide>
 
 One API -- many backends
 - Raster [8888, 565, A8]
@@ -8,6 +10,8 @@
 - Picture
 - Pipe
 
+<transition= fade>
+
 One Team -- many clients
 - Chrome
 - ChromeOS
@@ -15,11 +19,15 @@
 - Android Framework
 - 3rd parties (e.g. FireFox)
 
+<transition= rotate>
+
 Optimize for CPU variety
 - x86 - 32bit (SSE, SSE2, ...), 64bit
 - Arm - thumb, arm, NEON, ... 64bit?
 - MIPS (just starting)
 
+<transition= zoom>
+
 Optimize for GPU variety
 - Nvidia
 - Qualcom
diff --git a/resources/slides_transitions.lua b/resources/slides_transitions.lua
new file mode 100644
index 0000000..4a838a4
--- /dev/null
+++ b/resources/slides_transitions.lua
@@ -0,0 +1,206 @@
+function scale_text_delta(template, delta)
+    template = template.slide
+    for i = 1, #template do
+        local paint = template[i].paint
+        paint:setTextSize(paint:getTextSize() + delta)
+    end
+end
+
+function slide_transition(prev, next, is_forward)
+    local rec = {
+        proc = function(self, canvas, drawSlideProc)
+            if self:isDone() then
+                drawSlideProc(canvas)
+                return nil
+            end
+            self.prevDrawable:draw(canvas, self.curr_x, 0)
+            self.nextDrawable:draw(canvas, self.curr_x + 640, 0)
+            self.curr_x = self.curr_x + self.step_x
+            return self
+        end
+    }
+    if is_forward then
+        rec.prevDrawable = prev
+        rec.nextDrawable = next
+        rec.curr_x = 0
+        rec.step_x = -15
+        rec.isDone = function (self) return self.curr_x <= -640 end
+    else
+        rec.prevDrawable = next
+        rec.nextDrawable = prev
+        rec.curr_x = -640
+        rec.step_x = 15
+        rec.isDone = function (self) return self.curr_x >= 0 end
+    end
+    return rec
+end
+
+function sqr(value) return value * value end
+
+function set_blur(paint, alpha)
+    local sigma = sqr(1 - alpha) * 20
+--    paint:setImageFilter(Sk.newBlurImageFilter(sigma, sigma))
+    paint:setAlpha(alpha)
+end
+
+function fade_slide_transition(prev, next, is_forward)
+    local rec = {
+        paint = Sk.newPaint(),
+        prevDrawable = prev,
+        nextDrawable = next,
+        proc = function(self, canvas, drawSlideProc)
+            if self:isDone() then
+                drawSlideProc(canvas)
+                return nil
+            end
+
+            set_blur(self.paint, self.prev_a)
+            self.prevDrawable:draw(canvas, self.prev_x, 0, self.paint)
+
+            set_blur(self.paint, self.next_a)
+            self.nextDrawable:draw(canvas, self.next_x, 0, self.paint)
+            self:step()
+            return self
+        end
+    }
+    if is_forward then
+        rec.prev_x = 0
+        rec.prev_a = 1
+        rec.next_x = 640
+        rec.next_a = 0
+        rec.isDone = function (self) return self.next_x <= 0 end
+        rec.step = function (self)
+            self.next_x = self.next_x - 20
+            self.next_a = (640 - self.next_x) / 640
+            self.prev_a = 1 - self.next_a
+        end
+    else
+        rec.prev_x = 0
+        rec.prev_a = 1
+        rec.next_x = 0
+        rec.next_a = 0
+        rec.isDone = function (self) return self.prev_x >= 640 end
+        rec.step = function (self)
+            self.prev_x = self.prev_x + 20
+            self.prev_a = (640 - self.prev_x) / 640
+            self.next_a = 1 - self.prev_a
+        end
+    end
+    return rec
+end
+
+function fade_transition(prev, next, is_forward)
+    local rec = {
+        paint = Sk.newPaint(),
+        prevDrawable = prev,
+        nextDrawable = next,
+        proc = function(self, canvas, drawSlideProc)
+            if self:isDone() then
+                drawSlideProc(canvas)
+                return nil
+            end
+
+            set_blur(self.paint, self.prev_a)
+            self.prevDrawable:draw(canvas, 0, 0, self.paint)
+
+            set_blur(self.paint, self.next_a)
+            self.nextDrawable:draw(canvas, 0, 0, self.paint)
+            self:step()
+            return self
+        end
+    }
+    rec.prev_a = 1
+    rec.next_a = 0
+    rec.isDone = function (self) return self.next_a >= 1 end
+    rec.step = function (self)
+        self.prev_a = math.max(self.prev_a - 0.025, 0)
+        self.next_a = 1 - self.prev_a
+    end
+
+    return rec
+end
+
+function rotate_transition(prev, next, is_forward)
+    local rec = {
+        angle = 0,
+        prevDrawable = prev,
+        nextDrawable = next,
+        activeDrawable = prev,
+        proc = function(self, canvas, drawSlideProc)
+            if self:isDone() then
+                drawSlideProc(canvas)
+                return nil
+            end
+
+            canvas:save()
+            canvas:translate(320, 240)
+            canvas:rotate(self.angle)
+            canvas:translate(-320, -240)
+            self.activeDrawable:draw(canvas, 0, 0)
+            self:step()
+            return self
+        end,
+        isDone = function (self) return self.angle >= 360 or self.angle <= -360 end
+    }
+    if is_forward then
+        rec.step = function (self)
+            self.angle = self.angle + 10
+            if self.angle >= 180 then
+                self.activeDrawable = self.nextDrawable
+            end
+        end
+    else
+        rec.step = function (self)
+            self.angle = self.angle - 10
+            if self.angle <= -180 then
+                self.activeDrawable = self.nextDrawable
+            end
+        end
+    end
+    return rec
+end
+
+function zoom_transition(prev, next, is_forward)
+    local rec = {
+        scale = 1,
+        scale_delta = .95,
+        scale_limit = 0.2,
+        pivot_x = 320,
+        pivot_y = 240,
+        prevDrawable = prev,
+        nextDrawable = next,
+        activeDrawable = prev,
+        proc = function(self, canvas, drawSlideProc)
+            if self:isDone() then
+                drawSlideProc(canvas)
+                return nil
+            end
+
+            canvas:translate(self.pivot_x, self.pivot_y)
+            canvas:scale(self.scale, self.scale)
+            canvas:translate(-self.pivot_x, -self.pivot_y)
+            self.activeDrawable:draw(canvas, 0, 0)
+            self:step()
+            return self
+        end,
+        isDone = function (self) return self.scale > 1 end,
+        step = function (self)
+            if self.scale < self.scale_limit then
+                self.scale = self.scale_limit
+                self.scale_delta = 1 / self.scale_delta
+                self.activeDrawable = self.nextDrawable
+            end
+            self.scale = self.scale * self.scale_delta
+        end
+    }
+    return rec
+end
+
+gTransitionTable = {
+    fade = fade_transition,
+    slide = slide_transition,
+    fade_slide = fade_slide_transition,
+    rotate = rotate_transition,
+    zoom = zoom_transition,
+}
+
diff --git a/resources/slides_utils.lua b/resources/slides_utils.lua
index 29c0c71..a0b42b4 100644
--- a/resources/slides_utils.lua
+++ b/resources/slides_utils.lua
@@ -29,30 +29,11 @@
     return string.len(s) - string.len(leftover)
 end
 
-function parse_file(file)
-    local slides = {}
-    local block = {}
-
-    for line in file:lines() do
-        local s = trim_ws(line)
-        if #s == 0 then   -- done with a block
-            if #block > 0 then
-                slides[#slides + 1] = block
-                block = {}
-            end
-        else
-            local n = count_hypens(s)
-            block[#block + 1] = {
-                indent = n,
-                text = trim_ws(s:sub(n + 1, -1))
-            }
-        end
-    end
-    return slides
-end
-
 function pretty_print_slide(slide)
     io.write("{\n")
+    if slide.transition then
+        io.write("   transition = \"", slide.transition, "\",\n")
+    end
     for i = 1, #slide do
         local node = slide[i]
         for j = 0, node.indent do
@@ -73,3 +54,35 @@
     io.write("}\n")
 end
 
+function parse_transition_type(s)
+    return s:match("^<%s*transition%s*=%s*(%a+)%s*>$")
+end
+
+function parse_file(file)
+    local slides = {}
+    local block = {}
+
+    for line in file:lines() do
+        local s = trim_ws(line)
+        if #s == 0 then   -- done with a block
+            if #block > 0 then
+                slides[#slides + 1] = block
+                block = {}
+            end
+        else
+            local transition_type = parse_transition_type(s)
+            if transition_type then
+                block["transition"] = transition_type
+            else
+                local n = count_hypens(s)
+                block[#block + 1] = {
+                    indent = n,
+                    text = trim_ws(s:sub(n + 1, -1))
+                }
+            end
+        end
+    end
+--    pretty_print_slides(slides)
+    return slides
+end
+
