diff --git a/lens/private/struct/main.rkt b/lens/private/struct/main.rkt
index 5d8ab08..cb72ae6 100644
--- a/lens/private/struct/main.rkt
+++ b/lens/private/struct/main.rkt
@@ -1,3 +1,5 @@
-#lang reprovide
+#lang sweet-exp reprovide
 "field.rkt"
-"struct.rkt"
+except-in "struct.rkt"
+  struct-lenses-out
+  struct+lenses-out
diff --git a/lens/private/struct/struct.rkt b/lens/private/struct/struct.rkt
index d3fcd61..c5ef31d 100644
--- a/lens/private/struct/struct.rkt
+++ b/lens/private/struct/struct.rkt
@@ -2,6 +2,7 @@
 
 (require syntax/parse/define
          alexis/util/struct
+         racket/provide-syntax
          "../base/main.rkt"
          (submod alexis/util/struct get-struct-accessors)
          (for-syntax racket/base
@@ -15,7 +16,9 @@
            "../test-util/test-lens.rkt"))
 
 (provide define-struct-lenses
-         struct/lens)
+         struct/lens
+         struct-lenses-out
+         struct+lenses-out)
 
 
 (define-for-syntax (get-struct-field-ids struct-info failure-context)
@@ -55,6 +58,18 @@
     (struct s (field-spec ...) option ...)
     (define-struct-lenses s)))
 
+(define-provide-syntax struct-lenses-out
+  (syntax-parser
+    [(struct-lenses-out struct-type:id)
+     #:do [(define field-ids (get-struct-id-field-ids #'struct-type))]
+     #:with [lens-id ...] (map-format-id #'struct-type "~a-lens" field-ids)
+     #'(combine-out lens-id ...)]))
+
+(define-provide-syntax struct+lenses-out
+  (syntax-parser
+    [(struct+lenses-out struct-type:id)
+     #'(combine-out (struct-out struct-type) (struct-lenses-out struct-type))]))
+
 (module+ test
   (struct/lens foo (a b c d) #:transparent)
   (check-lens-view foo-b-lens (foo 1 2 3 4) 2)
diff --git a/unstable/lens/main.rkt b/unstable/lens/main.rkt
index 4039d98..2ceccd9 100644
--- a/unstable/lens/main.rkt
+++ b/unstable/lens/main.rkt
@@ -13,6 +13,7 @@
 "string-split.rkt"
 "struct-join.rkt"
 "struct-nested.rkt"
+"struct-provide.rkt"
 "sublist.rkt"
 "syntax.rkt"
 "view-set.rkt"
diff --git a/unstable/lens/main.scrbl b/unstable/lens/main.scrbl
index 00c6ef1..a9445e7 100644
--- a/unstable/lens/main.scrbl
+++ b/unstable/lens/main.scrbl
@@ -26,6 +26,7 @@ this library being backwards-compatible.
   "string-split.scrbl"
   "struct-join.scrbl"
   "struct-nested.scrbl"
+  "struct-provide.scrbl"
   "sublist.scrbl"
   "syntax.scrbl"
   "view-set.scrbl"
diff --git a/unstable/lens/struct-provide.rkt b/unstable/lens/struct-provide.rkt
new file mode 100644
index 0000000..d9601dd
--- /dev/null
+++ b/unstable/lens/struct-provide.rkt
@@ -0,0 +1,4 @@
+#lang sweet-exp reprovide
+only-in lens/private/struct/struct
+  struct-lenses-out
+  struct+lenses-out
diff --git a/unstable/lens/struct-provide.scrbl b/unstable/lens/struct-provide.scrbl
new file mode 100644
index 0000000..3eee241
--- /dev/null
+++ b/unstable/lens/struct-provide.scrbl
@@ -0,0 +1,17 @@
+#lang scribble/manual
+
+@(require lens/private/doc-util/main)
+
+@title{Struct-lens provide forms}
+
+@defmodule[unstable/lens/struct-provide]
+
+@defform[(struct-lenses-out struct-id)]{
+A @racket[provide] sub-form that provides the lenses defined by
+@racket[define-struct-lenses] or @racket[struct/lens].
+}
+
+@defform[(struct+lenses-out struct-id)]{
+A @racket[provide] sub-form short for using both @racket[struct-out] and
+@racket[struct-lenses-out].
+}