diff --git a/event/adapter/eventtest/eventtest.go b/event/adapter/eventtest/eventtest.go
index 9928955..616ffdc 100644
--- a/event/adapter/eventtest/eventtest.go
+++ b/event/adapter/eventtest/eventtest.go
@@ -22,7 +22,7 @@
 // NewContext returns a context you should use for the active test.
 func NewContext(ctx context.Context, tb testing.TB) context.Context {
 	h := &testHandler{tb: tb}
-	return event.WithExporter(ctx, event.NewExporter(h))
+	return event.WithExporter(ctx, event.NewExporter(h, nil))
 }
 
 type testHandler struct {
@@ -57,9 +57,9 @@
 	h.printer.Event(os.Stdout, ev)
 }
 
-func ExporterOptions() event.ExporterOptions {
+func ExporterOptions() *event.ExporterOptions {
 	nextTime, _ := time.Parse(time.RFC3339Nano, "2020-03-05T14:27:48Z")
-	return event.ExporterOptions{
+	return &event.ExporterOptions{
 		Now: func() time.Time {
 			thisTime := nextTime
 			nextTime = nextTime.Add(time.Second)
diff --git a/event/alloc_test.go b/event/alloc_test.go
index dc01b84..52c4500 100644
--- a/event/alloc_test.go
+++ b/event/alloc_test.go
@@ -19,7 +19,7 @@
 	anInt := event.Label{Name: "int", Value: event.Int64Of(4)}
 	aString := event.Label{Name: "string", Value: event.StringOf("value")}
 
-	e := event.NewExporter(logfmt.NewHandler(ioutil.Discard))
+	e := event.NewExporter(logfmt.NewHandler(ioutil.Discard), nil)
 	ctx := event.WithExporter(context.Background(), e)
 	allocs := int(testing.AllocsPerRun(5, func() {
 		event.To(ctx).With(aString).With(anInt).Log("message")
diff --git a/event/bench/event_test.go b/event/bench/event_test.go
index 8056b08..cd794d6 100644
--- a/event/bench/event_test.go
+++ b/event/bench/event_test.go
@@ -89,11 +89,11 @@
 }
 
 func eventNoop() context.Context {
-	return event.WithExporter(context.Background(), eventtest.ExporterOptions().NewExporter(noopHandler{}))
+	return event.WithExporter(context.Background(), event.NewExporter(noopHandler{}, eventtest.ExporterOptions()))
 }
 
 func eventPrint(w io.Writer) context.Context {
-	return event.WithExporter(context.Background(), eventtest.ExporterOptions().NewExporter(logfmt.NewHandler(w)))
+	return event.WithExporter(context.Background(), event.NewExporter(logfmt.NewHandler(w), eventtest.ExporterOptions()))
 }
 
 func BenchmarkLogEventNoExporter(b *testing.B) {
diff --git a/event/builder_test.go b/event/builder_test.go
index 65d429a..8e01474 100644
--- a/event/builder_test.go
+++ b/event/builder_test.go
@@ -22,7 +22,7 @@
 		labels = append(labels, keys.Int(fmt.Sprintf("l%d", i)).Of(i))
 	}
 
-	ctx := event.WithExporter(context.Background(), event.NewExporter(nil))
+	ctx := event.WithExporter(context.Background(), event.NewExporter(nil, nil))
 	b1 := event.To(ctx)
 	b1.With(labels[0]).With(labels[1])
 	check(t, b1, labels[:2])
@@ -65,7 +65,7 @@
 func TestTraceBuilder(t *testing.T) {
 	// Verify that the context returned from the handler is also returned from Start,
 	// and is the context passed to End.
-	ctx := event.WithExporter(context.Background(), event.NewExporter(&testTraceHandler{t}))
+	ctx := event.WithExporter(context.Background(), event.NewExporter(&testTraceHandler{t}, nil))
 	ctx, end := event.To(ctx).Start("s")
 	val := ctx.Value("x")
 	if val != 1 {
diff --git a/event/common_test.go b/event/common_test.go
index b86f9aa..1bbb4e3 100644
--- a/event/common_test.go
+++ b/event/common_test.go
@@ -15,7 +15,7 @@
 
 func TestCommon(t *testing.T) {
 	h := &catchHandler{}
-	ctx := event.WithExporter(context.Background(), event.NewExporter(h))
+	ctx := event.WithExporter(context.Background(), event.NewExporter(h, nil))
 
 	const simple = "simple message"
 	const trace = "a trace"
diff --git a/event/event_test.go b/event/event_test.go
index 1d830ed..e929438 100644
--- a/event/event_test.go
+++ b/event/event_test.go
@@ -98,7 +98,7 @@
 time=2020-03-05T14:27:49 myString="some string value" msg="string event"
 `}} {
 		buf := &strings.Builder{}
-		ctx := event.WithExporter(ctx, eventtest.ExporterOptions().NewExporter(logfmt.NewHandler(buf)))
+		ctx := event.WithExporter(ctx, event.NewExporter(logfmt.NewHandler(buf), eventtest.ExporterOptions()))
 		test.events(ctx)
 		got := strings.TrimSpace(buf.String())
 		expect := strings.TrimSpace(test.expect)
@@ -109,7 +109,7 @@
 }
 
 func ExampleLog() {
-	ctx := event.WithExporter(context.Background(), eventtest.ExporterOptions().NewExporter(logfmt.NewHandler(os.Stdout)))
+	ctx := event.WithExporter(context.Background(), event.NewExporter(logfmt.NewHandler(os.Stdout), eventtest.ExporterOptions()))
 	event.To(ctx).With(keys.Int("myInt").Of(6)).Log("my event")
 	event.To(ctx).With(keys.String("myString").Of("some string value")).Log("error event")
 	// Output:
diff --git a/event/export.go b/event/export.go
index 5366399..117ccf7 100644
--- a/event/export.go
+++ b/event/export.go
@@ -50,14 +50,17 @@
 	defaultExporter unsafe.Pointer
 )
 
-// NewExporter creates an Exporter using the supplied handler.
+// NewExporter creates an Exporter using the supplied handler and options.
 // Event delivery is serialized to enable safe atomic handling.
-func NewExporter(handler Handler) *Exporter {
-	return (ExporterOptions{}).NewExporter(handler)
-}
-
-func (opts ExporterOptions) NewExporter(handler Handler) *Exporter {
-	return &Exporter{opts: opts, handler: handler}
+func NewExporter(handler Handler, opts *ExporterOptions) *Exporter {
+	e := &Exporter{handler: handler}
+	if opts != nil {
+		e.opts = *opts
+	}
+	if e.opts.Now == nil {
+		e.opts.Now = time.Now
+	}
+	return e
 }
 
 func setDefaultExporter(e *Exporter) {
diff --git a/event/logging/internal/internal.go b/event/logging/internal/internal.go
index 55abb20..1f86804 100644
--- a/event/logging/internal/internal.go
+++ b/event/logging/internal/internal.go
@@ -34,6 +34,5 @@
 
 func NewTestExporter() (*event.Exporter, *TestHandler) {
 	te := &TestHandler{}
-	opts := event.ExporterOptions{Now: func() time.Time { return TestAt }}
-	return opts.NewExporter(te), te
+	return event.NewExporter(te, &event.ExporterOptions{Now: func() time.Time { return TestAt }}), te
 }
diff --git a/event/otel/trace_test.go b/event/otel/trace_test.go
index a7eea9c..fe05ef0 100644
--- a/event/otel/trace_test.go
+++ b/event/otel/trace_test.go
@@ -111,7 +111,7 @@
 	stp := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(bsp))
 	tracer := stp.Tracer("")
 
-	ee := event.NewExporter(otel.NewTraceHandler(tracer))
+	ee := event.NewExporter(otel.NewTraceHandler(tracer), nil)
 	ctx = event.WithExporter(ctx, ee)
 	return ctx, tracer, func() string { stp.Shutdown(ctx); return e.got }
 }
diff --git a/event/severity/severity_test.go b/event/severity/severity_test.go
index b2f0c8c..d4e045c 100644
--- a/event/severity/severity_test.go
+++ b/event/severity/severity_test.go
@@ -34,7 +34,7 @@
 		expect: `time=2020-03-05T14:27:48 level=info msg="a message"`},
 	} {
 		buf := &strings.Builder{}
-		ctx := event.WithExporter(ctx, eventtest.ExporterOptions().NewExporter(logfmt.NewHandler(buf)))
+		ctx := event.WithExporter(ctx, event.NewExporter(logfmt.NewHandler(buf), eventtest.ExporterOptions()))
 		test.events(ctx)
 		got := strings.TrimSpace(buf.String())
 		expect := strings.TrimSpace(test.expect)
