diff --git a/lib/control-features.sls b/lib/control-features.sls
--- a/lib/control-features.sls
+++ b/lib/control-features.sls
@@ -297,8 +297,7 @@
 
   (define clear-marks!
     (lambda ()
-      (current-marks (make-marks (current-parameterization)
-				 (exception-handler-stack)))))
+      (current-marks '())))
 
   (define set-mark!
     (lambda (key val)
@@ -316,6 +315,16 @@
     (lambda (key default)
       (marks-ref (current-marks) key (lambda () default))))
 
+  (define current-continuation-mark-ref
+    (lambda (key)
+      (let loop ([marks (current-marks)]
+		 [mk (current-metacontinuation)])
+	(marks-ref marks key
+		   (lambda ()
+		     (assert (pair? mk))
+		     (loop (metacontinuation-frame-marks (car mk))
+			   (cdr mk)))))))
+
   ;; Winders
 
   (define-record-type winder
@@ -1142,7 +1151,8 @@
 
   (define current-parameterization
     (lambda ()
-      (marks-ref (current-marks) (parameterization-continuation-mark-key))))
+      (current-continuation-mark-ref
+       (parameterization-continuation-mark-key))))
 
   (define/who call-with-parameterization
     (lambda (parameterization thunk)
@@ -1354,7 +1364,8 @@
 
   (define exception-handler-stack
     (lambda ()
-      (marks-ref (current-marks) (handler-stack-continuation-mark-key))))
+      (current-continuation-mark-ref
+       (handler-stack-continuation-mark-key))))
 
   (define current-exception-handler
     (lambda ()
diff --git a/tests.sps b/tests.sps
--- a/tests.sps
+++ b/tests.sps
@@ -1244,6 +1244,45 @@
          (shift k (cons 2 (k 'void)))
          '())))
 
+;;; See <https://github.com/scheme-requests-for-implementation/srfi-226/pull/14>.
+;;;
+;;; Parameterizations and exception-handler stacks are continuation marks.  A
+;;; composable continuation excludes its delimiting prompt, so marks installed
+;;; outside that prompt are not captured.  Its first invocation below must use
+;;; the initial mark, and its second the caller's mark.  A naive implementation
+;;; that copies these marks into every fresh continuation frame puts them above
+;;; the prompt and incorrectly captures them.
+
+(test '(1 3)
+      (let ((p (make-parameter 1))
+	    (c #f))
+	(parameterize ((p 2))
+	  (call-with-continuation-prompt
+	   (lambda ()
+	     (call-with-composable-continuation
+	      (lambda (k) (set! c k)))
+	     (p))))
+	(list (c) (parameterize ((p 3)) (c)))))
+
+(test '(#t #t)
+      (let ((c #f)
+	    (handler (lambda (obj) obj))
+	    (other-handler (lambda (obj) obj)))
+	(let ((initial-handler (current-exception-handler)))
+	  (with-exception-handler
+	   handler
+	   (lambda ()
+	     (call-with-continuation-prompt
+	      (lambda ()
+		(call-with-composable-continuation
+		 (lambda (k) (set! c k)))
+		(current-exception-handler)))))
+	  (list (eq? (c) initial-handler)
+		(with-exception-handler
+		 other-handler
+		 (lambda ()
+		   (eq? (c) other-handler)))))))
+
 (test '(1 0)
       (let ((m (make-parameter 0))
 	    (n (make-parameter 0)))
