diff --git a/configure.ac b/configure.ac
index 18e574b5..268a08fa 100644
--- a/configure.ac
+++ b/configure.ac
@@ -309,6 +309,10 @@ AC_LANG_POP(C++)
 AM_CONDITIONAL(USE_NACL, test "${ac_cv_my_have_nacl}" != "no")
 
 
+dnl  Use Emscripten?
+AC_CHECK_HEADERS(emscripten.h)
+
+
 dnl  Use Android? FIXME: super hacks!
 ac_cv_my_have_android="no"
 AC_CHECK_LIB(log, __android_log_vprint,
diff --git a/src/application/application.cpp b/src/application/application.cpp
index 63e2c677..7dc904a6 100644
--- a/src/application/application.cpp
+++ b/src/application/application.cpp
@@ -8,26 +8,30 @@
 //   http://www.wtfpl.net/ for more details.
 //
 
-#if defined HAVE_CONFIG_H
+#if HAVE_CONFIG_H
 #   include "config.h"
 #endif
 
+#if HAVE_EMSCRIPTEN_H
+#   include <emscripten.h>
+#endif
+
 #include "core.h"
 
 #include "lolgl.h"
 
-#if defined __CELLOS_LV2__
+#if __CELLOS_LV2__
 #   include "platform/ps3/ps3app.h"
-#elif defined _XBOX
+#elif _XBOX
 #   include "platform/xbox/xboxapp.h"
-#elif defined __native_client__
+#elif __native_client__
 #   include "platform/nacl/nacl-app.h"
-#elif defined __ANDROID__
+#elif __ANDROID__
 #   include "platform/android/androidapp.h"
-#elif defined USE_SDL
+#elif USE_SDL
 #   include "platform/sdl/sdlapp.h"
 #   include "platform/sdl/sdlinput.h"
-#elif defined HAVE_GLES_2X
+#elif HAVE_GLES_2X
 #   include "eglapp.h"
 #endif
 
@@ -44,17 +48,17 @@ class ApplicationData
         : app(name, resolution, framerate)
     { }
 
-#if defined __CELLOS_LV2__
+#if __CELLOS_LV2__
     Ps3App app;
-#elif defined _XBOX
+#elif _XBOX
     XboxApp app;
-#elif defined __native_client__
+#elif __native_client__
     NaClApp app;
-#elif defined __ANDROID__
+#elif __ANDROID__
     AndroidApp app;
-#elif defined USE_SDL
+#elif USE_SDL
     SdlApp app;
-#elif defined HAVE_GLES_2X
+#elif HAVE_GLES_2X
     /* FIXME: this macro is only deactivated if we include "lolgl.h" */
     EglApp app;
 #else
@@ -62,6 +66,15 @@ class ApplicationData
 #endif
 };
 
+#if EMSCRIPTEN
+static Application *g_app;
+
+static void AppCallback()
+{
+    g_app->Tick();
+}
+#endif
+
 /*
  * Public Application class
  */
@@ -83,6 +96,16 @@ void Application::Tick()
     data->app.Tick();
 }
 
+void Application::Run()
+{
+#if EMSCRIPTEN
+    emscripten_set_main_loop(AppCallback, 0, 1);
+#else
+    while (MustTick())
+        Tick();
+#endif
+}
+
 void Application::ShowPointer(bool show)
 {
     data->app.ShowPointer(show);
diff --git a/src/application/application.h b/src/application/application.h
index 428efb3c..583d3181 100644
--- a/src/application/application.h
+++ b/src/application/application.h
@@ -29,8 +29,7 @@ public:
 
     bool MustTick();
     void Tick();
-
-    void Run() { while(MustTick()) Tick(); }
+    void Run();
 
     void ShowPointer(bool show);
 
diff --git a/tutorial/01_triangle.lolfx b/tutorial/01_triangle.lolfx
index 881f936c..5f59871b 100644
--- a/tutorial/01_triangle.lolfx
+++ b/tutorial/01_triangle.lolfx
@@ -24,6 +24,10 @@ void main(void)
 [frag.glsl]
 #version 120
 
+#if defined GL_ES
+precision highp float;
+#endif
+
 void main(void)
 {
     gl_FragColor = vec4(0.7, 0.2, 0.5, 1.0);
diff --git a/tutorial/04_texture.lolfx b/tutorial/04_texture.lolfx
index 48987db0..6ee4804d 100644
--- a/tutorial/04_texture.lolfx
+++ b/tutorial/04_texture.lolfx
@@ -16,6 +16,10 @@ void main(void)
 
 #version 120
 
+#if defined GL_ES
+precision highp float;
+#endif
+
 uniform sampler2D u_Texture;
 
 varying vec4 pass_Position;
diff --git a/tutorial/11_fractal.lolfx b/tutorial/11_fractal.lolfx
index f028eeea..803e8021 100644
--- a/tutorial/11_fractal.lolfx
+++ b/tutorial/11_fractal.lolfx
@@ -2,10 +2,6 @@
 
 #version 120
 
-#if defined GL_ES
-precision highp float;
-#endif
-
 uniform mat4 u_ZoomSettings;
 uniform vec4 u_TexelSize;
 uniform vec4 u_ScreenSize;