diff --git a/examples/ring-spec-swagger/.gitignore b/examples/ring-spec-swagger/.gitignore
new file mode 100644
index 00000000..c53038ec
--- /dev/null
+++ b/examples/ring-spec-swagger/.gitignore
@@ -0,0 +1,11 @@
+/target
+/classes
+/checkouts
+pom.xml
+pom.xml.asc
+*.jar
+*.class
+/.lein-*
+/.nrepl-port
+.hgignore
+.hg/
diff --git a/examples/ring-spec-swagger/README.md b/examples/ring-spec-swagger/README.md
new file mode 100644
index 00000000..814545ef
--- /dev/null
+++ b/examples/ring-spec-swagger/README.md
@@ -0,0 +1,23 @@
+# reitit-ring, clojure.spec, swagger
+
+## Usage
+
+```clj
+> lein repl
+(start)
+```
+
+To test the endpoints using [httpie](https://httpie.org/):
+
+```bash
+http GET :3000/math/plus x==1 y==20
+http POST :3000/math/spec/plus x:=1 y:=20
+
+http GET :3000/swagger.json
+```
+
+
+
+## License
+
+Copyright © 2017-2018 Metosin Oy
diff --git a/examples/ring-spec-swagger/project.clj b/examples/ring-spec-swagger/project.clj
new file mode 100644
index 00000000..a098180c
--- /dev/null
+++ b/examples/ring-spec-swagger/project.clj
@@ -0,0 +1,6 @@
+(defproject ring-example "0.1.0-SNAPSHOT"
+ :description "Reitit Ring App with Swagger"
+ :dependencies [[org.clojure/clojure "1.9.0"]
+ [ring "1.6.3"]
+ [metosin/reitit "0.2.1"]]
+ :repl-options {:init-ns example.server})
diff --git a/examples/ring-spec-swagger/resources/reitit.png b/examples/ring-spec-swagger/resources/reitit.png
new file mode 100644
index 00000000..c89c3654
Binary files /dev/null and b/examples/ring-spec-swagger/resources/reitit.png differ
diff --git a/examples/ring-spec-swagger/src/example/server.clj b/examples/ring-spec-swagger/src/example/server.clj
new file mode 100644
index 00000000..744c5671
--- /dev/null
+++ b/examples/ring-spec-swagger/src/example/server.clj
@@ -0,0 +1,105 @@
+(ns example.server
+ (:require [reitit.ring :as ring]
+ [reitit.swagger :as swagger]
+ [reitit.swagger-ui :as swagger-ui]
+ [reitit.ring.coercion :as coercion]
+ [reitit.coercion.spec]
+ [reitit.ring.middleware.muuntaja :as muuntaja]
+ [reitit.ring.middleware.exception :as exception]
+ [reitit.ring.middleware.multipart :as multipart]
+ [ring.middleware.params :as params]
+ [ring.adapter.jetty :as jetty]
+ [muuntaja.core :as m]
+ [clojure.spec.alpha :as s]
+ [spec-tools.spec :as spec]
+ [clojure.java.io :as io]))
+
+(s/def ::file multipart/temp-file-part)
+(s/def ::file-params (s/keys :req-un [::file]))
+
+(s/def ::name spec/string?)
+(s/def ::size spec/int?)
+(s/def ::file-response (s/keys :req-un [::name ::size]))
+
+(s/def ::x spec/int?)
+(s/def ::y spec/int?)
+(s/def ::total spec/int?)
+(s/def ::math-request (s/keys :req-un [::x ::y]))
+(s/def ::math-response (s/keys :req-un [::total]))
+
+(def app
+ (ring/ring-handler
+ (ring/router
+ [["/swagger.json"
+ {:get {:no-doc true
+ :swagger {:info {:title "my-api"}}
+ :handler (swagger/create-swagger-handler)}}]
+
+ ["/files"
+ {:swagger {:tags ["files"]}}
+
+ ["/upload"
+ {:post {:summary "upload a file"
+ :parameters {:multipart ::file-params}
+ :responses {200 {:body ::file-response}}
+ :handler (fn [{{{:keys [file]} :multipart} :parameters}]
+ {:status 200
+ :body {:name (:filename file)
+ :size (:size file)}})}}]
+
+ ["/download"
+ {:get {:summary "downloads a file"
+ :swagger {:produces ["image/png"]}
+ :handler (fn [_]
+ {:status 200
+ :headers {"Content-Type" "image/png"}
+ :body (io/input-stream
+ (io/resource "reitit.png"))})}}]]
+
+ ["/math"
+ {:swagger {:tags ["math"]}}
+
+ ["/plus"
+ {:get {:summary "plus with spec query parameters"
+ :parameters {:query ::math-request}
+ :responses {200 {:body ::math-response}}
+ :handler (fn [{{{:keys [x y]} :query} :parameters}]
+ {:status 200
+ :body {:total (+ x y)}})}
+ :post {:summary "plus with spec body parameters"
+ :parameters {:body ::math-request}
+ :responses {200 {:body ::math-response}}
+ :handler (fn [{{{:keys [x y]} :body} :parameters}]
+ {:status 200
+ :body {:total (+ x y)}})}}]]]
+
+ {:data {:coercion reitit.coercion.spec/coercion
+ :muuntaja m/instance
+ :middleware [;; query-params & form-params
+ params/wrap-params
+ ;; content-negotiation
+ muuntaja/format-negotiate-middleware
+ ;; encoding response body
+ muuntaja/format-response-middleware
+ ;; exception handling
+ exception/exception-middleware
+ ;; decoding request body
+ muuntaja/format-request-middleware
+ ;; coercing response bodys
+ coercion/coerce-response-middleware
+ ;; coercing request parameters
+ coercion/coerce-request-middleware
+ ;; multipart
+ multipart/multipart-middleware]}})
+ (ring/routes
+ (swagger-ui/create-swagger-ui-handler
+ {:path "/"
+ :config {:validatorUrl nil}})
+ (ring/create-default-handler))))
+
+(defn start []
+ (jetty/run-jetty #'app {:port 3000, :join? false})
+ (println "server running in port 3000"))
+
+(comment
+ (start))
diff --git a/examples/ring-spec-swagger/swagger.png b/examples/ring-spec-swagger/swagger.png
new file mode 100644
index 00000000..9d5a55b8
Binary files /dev/null and b/examples/ring-spec-swagger/swagger.png differ
diff --git a/examples/ring-swagger/README.md b/examples/ring-swagger/README.md
index e1a11527..90585d1e 100644
--- a/examples/ring-swagger/README.md
+++ b/examples/ring-swagger/README.md
@@ -10,15 +10,12 @@
To test the endpoints using [httpie](https://httpie.org/):
```bash
-http GET :3000/api/schema/plus x==1 y==20
-http GET :3000/api/spec/plus x==1 y==20
+http GET :3000/math/plus x==1 y==20
+http POST :3000/math/spec/plus x:=1 y:=20
-http GET :3000/api/swagger.json
+http GET :3000/swagger.json
```
-* swagger.json: http://localhost:3000/api/swagger.json
-* swagger-ui: http://localhost:3000/api-docs/
-
## License