diff --git a/R/revealjs_presentation.R b/R/revealjs_presentation.R
new file mode 100644
index 0000000..61cda17
--- /dev/null
+++ b/R/revealjs_presentation.R
@@ -0,0 +1,203 @@
+#' Convert to a reveal.js presentation
+#'
+#' Format for converting from R Markdown to a reveal.js presentation.
+#'
+#' @inheritParams rmarkdown::beamer_presentation
+#' @inheritParams rmarkdown::pdf_document
+#' @inheritParams rmarkdown::html_document
+#'
+#' @param center \code{TRUE} to vertically center content on slides
+#' @param theme Visual theme ("default", "simple", sky", "beige", "serif", or
+#'   "solarized").
+#' @param transition Slide transition ("default", "cube", "page", "concave",
+#'   "zoom", "linear", "fade", or "none")
+#' @param template Pandoc template to use for rendering. Pass "default"
+#'   to use the rmarkdown package default template; pass \code{NULL}
+#'   to use pandoc's built-in template; pass a path to use a custom template
+#'   that you've created. Note that if you don't use the "default" template
+#'   then some features of \code{revealjs_presentation} won't be available
+#'   (see the Templates section below for more details).
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @details
+#'
+#' In reveal.js presentations you can use level 1 or level 2 headers for
+#' slides. If you use a mix of level 1 and level 2 headers then a
+#' two-dimensional layout will be produced, with level 1 headers building
+#' horizontally and level 2 headers building vertically.
+#'
+#' For more information on markdown syntax for presentations see
+#' \href{http://johnmacfarlane.net/pandoc/demo/example9/producing-slide-shows-with-pandoc.html}{producing
+#' slide shows with pandoc}.
+#'
+#' @section Templates:
+#'
+#' You can provide a custom HTML template to be used for rendering. The syntax
+#' for templates is described in the documentation on
+#' \href{http://johnmacfarlane.net/pandoc/demo/example9/templates.html}{pandoc
+#' templates}. You can also use the basic pandoc template by passing
+#' \code{template = NULL}.
+#'
+#' Note however that if you choose not to use the "default" reveal.js template
+#' then several aspects of reveal.js presentation rendering will behave
+#' differently:
+#'
+#' \itemize{
+#'   \item{The \code{center} parameter does not work (you'd need to
+#'      set this directly in the template).
+#'   }
+#'   \item{The built-in template includes some additional tweaks to styles
+#'      to optimize for output from R, these won't be present.
+#'   }
+#'   \item{MathJax will not work if \code{self_contained} is \code{TRUE}
+#'      (these two options can't be used together in normal pandoc templates).
+#'   }
+#' }
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#' library(revealjs)
+#'
+#' # simple invocation
+#' render("pres.Rmd", revealjs_presentation())
+#'
+#' # specify an option for incremental rendering
+#' render("pres.Rmd", revealjs_presentation(incremental = TRUE))
+#' }
+#'
+#'
+#' @export
+revealjs_presentation <- function(incremental = FALSE,
+                                  center = FALSE,
+                                  fig_width = 8,
+                                  fig_height = 6,
+                                  fig_retina = if (!fig_caption) 2,
+                                  fig_caption = FALSE,
+                                  smart = TRUE,
+                                  self_contained = TRUE,
+                                  theme = "default",
+                                  transition = "default",
+                                  highlight = "default",
+                                  mathjax = "default",
+                                  template = "default",
+                                  includes = NULL,
+                                  keep_md = FALSE,
+                                  lib_dir = NULL,
+                                  pandoc_args = NULL,
+                                  ...) {
+  
+  # function to lookup reveal resource
+  reveal_resources <- function() {
+    system.file("rmarkdown/templates/revealjs_presentation",
+                package = "revealjs")
+  }
+  
+  # base pandoc options for all reveal.js output
+  args <- c()
+  
+  # template path and assets
+  if (identical(template, "default"))
+    args <- c(args, "--template",
+              pandoc_path_arg(file.path(reveal_resources(), "default.html")))
+  else if (!is.null(template))
+    args <- c(args, "--template", pandoc_path_arg(template))
+  
+  # incremental
+  if (incremental)
+    args <- c(args, "--incremental")
+  
+  # centering
+  if (center)
+    args <- c(args, "--variable", "center")
+  
+  # theme
+  theme <- match.arg(theme, revealjs_themes())
+  if (identical(theme, "default"))
+    theme <- "simple"
+  else if (identical(theme, "dark"))
+    theme <- "default"
+  if (theme %in% c("default", "blood", "moon", "night"))
+    args <- c(args, "--variable", "theme-dark")
+  args <- c(args, "--variable", paste("theme=", theme, sep=""))
+  
+  
+  # transition
+  transition <- match.arg(transition, revealjs_transitions())
+  args <- c(args, "--variable", paste("transition=", transition, sep=""))
+  
+  # content includes
+  args <- c(args, includes_to_pandoc_args(includes))
+  
+  # pre-processor for arguments that may depend on the name of the
+  # the input file (e.g. ones that need to copy supporting files)
+  pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir,
+                            output_dir) {
+    
+    # use files_dir as lib_dir if not explicitly specified
+    if (is.null(lib_dir))
+      lib_dir <- files_dir
+    
+    # extra args
+    args <- c()
+    
+    # reveal.js
+    revealjs_path <- reveal_resources()
+    if (!self_contained || identical(.Platform$OS.type, "windows"))
+      revealjs_path <- relative_to(
+        output_dir, render_supporting_files(revealjs_path, lib_dir))
+    args <- c(args, "--variable", paste("revealjs-url=",
+                                        pandoc_path_arg(revealjs_path), sep=""))
+    
+    # highlight
+    args <- c(args, pandoc_highlight_args(highlight, default = "pygments"))
+    
+    # return additional args
+    args
+  }
+  
+  # return format
+  output_format(
+    knitr = knitr_options_html(fig_width, fig_height, fig_retina, keep_md),
+    pandoc = pandoc_options(to = "revealjs",
+                            from = rmarkdown_format(ifelse(fig_caption, 
+                                                           "", 
+                                                           "-implicit_figures")),
+                            args = args),
+    keep_md = keep_md,
+    clean_supporting = self_contained,
+    pre_processor = pre_processor,
+    base_format = html_document_base(smart = smart, lib_dir = lib_dir,
+                                     self_contained = self_contained,
+                                     mathjax = mathjax,
+                                     pandoc_args = pandoc_args, ...))
+}
+
+revealjs_themes <- function() {
+  c("default",
+    "simple",
+    "sky",
+    "beige",
+    "serif",
+    "solarized",
+    "dark",
+    "blood",
+    "moon",
+    "night")
+}
+
+
+revealjs_transitions <- function() {
+  c("default",
+    "cube",
+    "page",
+    "concave",
+    "zoom",
+    "linear",
+    "fade",
+    "none")
+}
+
+
