diff --git a/2015/gophercon-go-on-mobile/README b/2015/gophercon-go-on-mobile/README
index 1732cd8..ff64cf0 100644
--- a/2015/gophercon-go-on-mobile/README
+++ b/2015/gophercon-go-on-mobile/README
@@ -1,38 +1,2 @@
-Demo Setup
-----------------------
-
-- Download and install Android SDK
-
-https://developer.android.com/sdk/index.html
-Or, easiest way is to install Android Studio.
-
-
-- Download go1.5 and build for your host.
-
-- Set the following environment variables.
-
-GOPATH: your go path
-ANDROID_HOME: Android SDK directory
-PATH: make sure $GOROOT/bin, $GOPATH/bin are included in the path
-
-- Install the gomobile tool and run init before demo.
-
-% go install golang.org/x/mobile/cmd/gomobile
-% gomobile init
-
-- Hello Gopher demo
-
-% demo1.bash
-
-For android screen mirroring, I used Mobizen (mobizen.com).
-For ios screen mirroring, you can use quicktime.
-
-- Gobind demo
-
-% demo2.bash
-
-- Ivy demo: In my gophercon talk, I used pre-recorded video
-clips for mobile versions and ran the command line version from 
-my laptop in order to emphasize the cross-platform support.
-
-Enjoy.
+Demo source code and set up instruction is in
+https://github.com/hyangah/slides/tree/master/2015-gophercon-mobile
diff --git a/2015/gophercon-go-on-mobile/demo1.bash b/2015/gophercon-go-on-mobile/demo1.bash
deleted file mode 100755
index 8d750ed..0000000
--- a/2015/gophercon-go-on-mobile/demo1.bash
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-
-prompt() {
-	read -p "$1"
-}
-
-cd hello
-
-declare -a arr=(
-"wc -l main.go"
-"go run main.go"
-"gomobile install -target=android"
-)
-
-for i in "${arr[@]}"
-do
-	prompt "\$ $i"
-	$i
-	echo
-done
diff --git a/2015/gophercon-go-on-mobile/demo2.bash b/2015/gophercon-go-on-mobile/demo2.bash
deleted file mode 100755
index d377162..0000000
--- a/2015/gophercon-go-on-mobile/demo2.bash
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-
-prompt() {
-	read -p "$1"
-}
-
-declare -a arr=(
-"cd mypkg"
-"tree"
-"cat mypkg.go"
-"export ANDROID_HOME=${ANDROID_HOME}"
-"gomobile bind ."
-"tree"
-"unzip -l mypkg.aar"
-)
-
-for i in "${arr[@]}"
-do
-	prompt "\$ $i"
-	$i
-	echo
-done
-
-rm mypkg.aar
diff --git a/2015/gophercon-go-on-mobile/hello/assets/gophersmall.png b/2015/gophercon-go-on-mobile/hello/assets/gophersmall.png
deleted file mode 100644
index 53b4b4a..0000000
--- a/2015/gophercon-go-on-mobile/hello/assets/gophersmall.png
+++ /dev/null
Binary files differ
diff --git a/2015/gophercon-go-on-mobile/hello/assets/hello.wav b/2015/gophercon-go-on-mobile/hello/assets/hello.wav
deleted file mode 100644
index 1551ebf..0000000
--- a/2015/gophercon-go-on-mobile/hello/assets/hello.wav
+++ /dev/null
Binary files differ
diff --git a/2015/gophercon-go-on-mobile/hello/main.go b/2015/gophercon-go-on-mobile/hello/main.go
deleted file mode 100644
index 32aba94..0000000
--- a/2015/gophercon-go-on-mobile/hello/main.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Based on golang.org/x/mobile/example/audio
-
-package main
-
-import (
-	"image"
-	"log"
-	"time"
-
-	_ "image/png"
-
-	"golang.org/x/mobile/app"
-	"golang.org/x/mobile/asset"
-	"golang.org/x/mobile/event/config"
-	"golang.org/x/mobile/event/lifecycle"
-	"golang.org/x/mobile/event/paint"
-	"golang.org/x/mobile/event/touch"
-	"golang.org/x/mobile/exp/app/debug"
-	"golang.org/x/mobile/exp/audio"
-	"golang.org/x/mobile/exp/f32"
-	"golang.org/x/mobile/exp/sprite"
-	"golang.org/x/mobile/exp/sprite/clock"
-	"golang.org/x/mobile/exp/sprite/glsprite"
-	"golang.org/x/mobile/geom"
-	"golang.org/x/mobile/gl"
-)
-
-func main() {
-	app.Main(func(a app.App) {
-		for e := range a.Events() {
-			switch e := app.Filter(e).(type) {
-			case lifecycle.Event:
-				switch e.Crosses(lifecycle.StageVisible) {
-				case lifecycle.CrossOn:
-					onStart()
-				case lifecycle.CrossOff:
-					onStop()
-				}
-			case config.Event:
-				globalCfg = e // dimension change. move to the center.
-				touchLoc = geom.Point{globalCfg.Width / 2, globalCfg.Height / 2}
-			case paint.Event:
-				onPaint(globalCfg)
-				a.EndPaint()
-			case touch.Event:
-				onTouch(e)
-			}
-		}
-	})
-}
-
-const (
-	width  = 72
-	height = 74
-)
-
-var (
-	startClock = time.Now()
-	eng        = glsprite.Engine()
-	scene      *sprite.Node
-
-	player *audio.Player
-
-	started     = false
-	activate    = false
-	acceptTouch = false
-	touchLoc    geom.Point
-	globalCfg   config.Event
-)
-
-func onTouch(t touch.Event) {
-	if t.Type != touch.TypeStart {
-		return
-	}
-
-	touchLoc = t.Loc
-	acceptTouch = true
-	if !activate {
-		activate = true
-	}
-}
-
-func onStart() {
-	gl.Enable(gl.BLEND)
-	gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
-
-	rc, err := asset.Open("hello.wav")
-	if err != nil {
-		log.Fatal(err)
-	}
-	player, err = audio.NewPlayer(rc, 0, 0)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-func onStop() {
-	player.Close()
-}
-
-func onPaint(c config.Event) {
-	if !started {
-		touchLoc = geom.Point{c.Width / 2, c.Height / 2}
-		started = true
-	}
-	if scene == nil {
-		loadScene()
-	}
-	gl.ClearColor(242/255.0, 240/255.0, 217/255.0, 1) // gophercon bg color
-	gl.Clear(gl.COLOR_BUFFER_BIT)
-
-	now := clock.Time(time.Since(startClock) * 60 / time.Second)
-	eng.Render(scene, now, c)
-	debug.DrawFPS(c)
-}
-
-func newNode() *sprite.Node {
-	n := &sprite.Node{}
-	eng.Register(n)
-	scene.AppendChild(n)
-	return n
-}
-
-func loadScene() {
-	gopher := loadGopher()
-	scene = &sprite.Node{}
-	eng.Register(scene)
-	eng.SetTransform(scene, f32.Affine{
-		{1, 0, 0},
-		{0, 1, 0},
-	})
-
-	var x, y float32
-	dx, dy := float32(1), float32(1)
-
-	n := newNode()
-	n.Arranger = arrangerFunc(func(eng sprite.Engine, n *sprite.Node, t clock.Time) {
-		eng.SetSubTex(n, gopher)
-
-		if acceptTouch {
-			dx = (float32(touchLoc.X) - x) / 60
-			dy = (float32(touchLoc.Y) - y) / 60
-			acceptTouch = false
-			hello()
-			x += dx
-			y += dy
-		} else if activate {
-			if x < 0 {
-				dx = 1
-			}
-			if y < 0 {
-				dy = 1
-			}
-			if x+width > float32(globalCfg.Width) {
-				dx = -1
-			}
-			if y+height > float32(globalCfg.Height) {
-				dy = -1
-			}
-			x += dx
-			y += dy
-		}
-
-		if dx < 0 {
-			eng.SetTransform(n, f32.Affine{ // change direction
-				{-width, 0, x + width},
-				{0, height, y},
-			})
-		} else {
-			eng.SetTransform(n, f32.Affine{
-				{width, 0, x},
-				{0, height, y},
-			})
-		}
-	})
-}
-
-func hello() {
-	player.Seek(0)
-	player.Play()
-}
-
-func loadGopher() sprite.SubTex {
-	a, err := asset.Open("gophersmall.png")
-	if err != nil {
-		log.Fatal(err)
-	}
-	defer a.Close()
-
-	img, _, err := image.Decode(a)
-	if err != nil {
-		log.Fatal(err)
-	}
-	t, err := eng.LoadTexture(img)
-	if err != nil {
-		log.Fatal(err)
-	}
-	return sprite.SubTex{t, image.Rect(0, 0, 360, 370)}
-}
-
-type arrangerFunc func(e sprite.Engine, n *sprite.Node, t clock.Time)
-
-func (a arrangerFunc) Arrange(e sprite.Engine, n *sprite.Node, t clock.Time) { a(e, n, t) }
diff --git a/2015/gophercon-go-on-mobile/mypkg/assets/myassets.txt b/2015/gophercon-go-on-mobile/mypkg/assets/myassets.txt
deleted file mode 100644
index 7e2f179..0000000
--- a/2015/gophercon-go-on-mobile/mypkg/assets/myassets.txt
+++ /dev/null
@@ -1 +0,0 @@
-assets
diff --git a/2015/gophercon-go-on-mobile/mypkg/mypkg.go b/2015/gophercon-go-on-mobile/mypkg/mypkg.go
deleted file mode 100644
index 12c88ec..0000000
--- a/2015/gophercon-go-on-mobile/mypkg/mypkg.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package mypkg
-
-import "fmt"
-
-func Hello(name string) string {
-	return fmt.Sprintf("Hello, %s!", name)
-}
