diff --git a/basis/ui/baseline-alignment/baseline-alignment-tests.factor b/basis/ui/baseline-alignment/baseline-alignment-tests.factor
index ab749e56f0..6ad47c9d1b 100644
--- a/basis/ui/baseline-alignment/baseline-alignment-tests.factor
+++ b/basis/ui/baseline-alignment/baseline-alignment-tests.factor
@@ -5,12 +5,13 @@ ui.baseline-alignment ui.baseline-alignment.private ;
 IN: ui.baseline-alignment.tests
 
 ! Test baseline calculations
-[ 10 ] [ 0 10 0 combine-metrics + ] unit-test
-[ 15 ] [ 0 10 5 combine-metrics + ] unit-test
-[ 30 ] [ 30 0 0 combine-metrics + ] unit-test
-[ 35 ] [ 10 0 30 combine-metrics + ] unit-test
-[ 20 ] [ 5 10 10 combine-metrics + ] unit-test
-[ 20 ] [ 20 10 0 combine-metrics + ] unit-test
-[ 55 ] [ 20 10 40 combine-metrics + ] unit-test
+[ 10 0 ] [ 0 10 0 10 combine-metrics ] unit-test
+[ 10 5 ] [ 0 10 5 10 combine-metrics ] unit-test
+[ 15 15 ] [ 30 0 0 0 combine-metrics ] unit-test
+[ 5 30 ] [ 10 0 30 0 combine-metrics ] unit-test
+[ 10 10 ] [ 5 10 10 10 combine-metrics ] unit-test
+[ 15 5 ] [ 20 10 0 10 combine-metrics ] unit-test
+[ 15 40 ] [ 20 10 40 10 combine-metrics ] unit-test
+[ 12 3 ] [ 0 12 3 9 combine-metrics ] unit-test
 
 [ t ] [ \ baseline \ cap-height [ order ] bi@ set= ] unit-test 
\ No newline at end of file
diff --git a/basis/ui/baseline-alignment/baseline-alignment.factor b/basis/ui/baseline-alignment/baseline-alignment.factor
index f9dec64e82..e02c6188f5 100644
--- a/basis/ui/baseline-alignment/baseline-alignment.factor
+++ b/basis/ui/baseline-alignment/baseline-alignment.factor
@@ -1,7 +1,7 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays kernel locals math math.order math.vectors
-sequences ui.gadgets accessors ;
+sequences ui.gadgets accessors combinators ;
 IN: ui.baseline-alignment
 
 SYMBOL: +baseline+
@@ -27,6 +27,9 @@ TUPLE: gadget-metrics height ascent descent cap-height ;
 : max-ascent ( seq -- n )
     0 [ ascent>> [ max ] when* ] reduce ; inline
 
+: max-cap-height ( seq -- n )
+    0 [ cap-height>> [ max ] when* ] reduce ; inline
+
 : max-descent ( seq -- n )
     0 [ descent>> [ max ] when* ] reduce ; inline
 
@@ -36,32 +39,41 @@ TUPLE: gadget-metrics height ascent descent cap-height ;
 : max-graphics-height ( seq -- y )
     0 [ [ height>> ] [ ascent>> ] bi [ drop ] [ max ] if ] reduce ;
 
-: combine-metrics ( graphics-height ascent descent -- ascent' descent' )
-    [ [ [-] 2 /i ] keep ] dip [ + ] [ max ] bi-curry* bi ;
+: (align-baselines) ( y max leading -- y' ) [ swap - ] dip + ;
+
+:: combine-metrics ( graphics-height ascent descent cap-height -- ascent' descent' )
+    cap-height 2 / :> mid-line 
+    graphics-height 2 /
+    [ ascent mid-line - max mid-line + >integer ]
+    [ descent mid-line + max mid-line - >integer ] bi ;
 
 PRIVATE>
 
 :: align-baselines ( gadgets -- ys )
     gadgets [ dup pref-dim <gadget-metrics> ] map
     dup max-ascent :> max-ascent
-    dup max-graphics-height :> max-height
-    max-height max-ascent [-] 2 /i :> offset-text
-    max-ascent max-height [-] 2 /i :> offset-graphics
+    dup max-cap-height :> max-cap-height
+    dup max-graphics-height :> max-graphics-height
+    
+    max-cap-height max-graphics-height + 2 /i :> critical-line
+    critical-line max-ascent [-] :> text-leading
+    max-ascent critical-line [-] :> graphics-leading
+
     [
-        dup ascent>> [
-            ascent>>
-            max-ascent
-            offset-text
-        ] [
-            height>>
-            max-height
-            offset-graphics
-        ] if [ swap - ] dip +
+        dup ascent>>
+        [ ascent>> max-ascent text-leading ]
+        [ height>> max-graphics-height graphics-leading ] if
+        (align-baselines)
     ] map ;
 
 : measure-metrics ( children sizes -- ascent descent )
     [ <gadget-metrics> ] 2map
-    [ max-graphics-height ] [ max-ascent ] [ max-descent ] tri
+    {
+        [ max-graphics-height ]
+        [ max-ascent ]
+        [ max-descent ]
+        [ max-cap-height ]
+    } cleave
     combine-metrics ;
 
 : measure-height ( children sizes -- height )
diff --git a/basis/ui/gadgets/debug/debug.factor b/basis/ui/gadgets/debug/debug.factor
index 800fdc850e..d5b4930a0b 100644
--- a/basis/ui/gadgets/debug/debug.factor
+++ b/basis/ui/gadgets/debug/debug.factor
@@ -4,15 +4,16 @@ USING: kernel accessors sequences ui ui.gadgets ui.gadgets.buttons
 ui.baseline-alignment ui.render ;
 IN: ui.gadgets.debug
 
-TUPLE: baseline-gadget < gadget baseline ;
+TUPLE: baseline-gadget < gadget baseline cap-height ;
 
 M: baseline-gadget baseline baseline>> ;
 
-M: baseline-gadget cap-height dim>> second ;
+M: baseline-gadget cap-height cap-height>> ;
 
-: <baseline-gadget> ( baseline dim -- gadget )
+: <baseline-gadget> ( baseline cap-height dim -- gadget )
     baseline-gadget new
         swap >>dim
+        swap >>cap-height
         swap >>baseline ;
 
 ! An intentionally broken gadget -- used to test UI error handling,
diff --git a/basis/ui/gadgets/grids/grids-tests.factor b/basis/ui/gadgets/grids/grids-tests.factor
index 852d63c346..fb92cd2ac6 100644
--- a/basis/ui/gadgets/grids/grids-tests.factor
+++ b/basis/ui/gadgets/grids/grids-tests.factor
@@ -71,8 +71,8 @@ IN: ui.gadgets.grids.tests
 [ { 10 230 } ] [ "c" get loc>> ] unit-test
 [ { 100 100 } ] [ "c" get dim>> ] unit-test
 
-5 { 10 10 } <baseline-gadget>
-10 { 10 10 } <baseline-gadget> 2array
+5 10 { 10 10 } <baseline-gadget>
+10 10 { 10 10 } <baseline-gadget> 2array
 1array <grid> f >>fill?
 "g" set
 
diff --git a/basis/ui/gadgets/packs/packs-tests.factor b/basis/ui/gadgets/packs/packs-tests.factor
index cf95380de2..cae7d12dc3 100644
--- a/basis/ui/gadgets/packs/packs-tests.factor
+++ b/basis/ui/gadgets/packs/packs-tests.factor
@@ -23,8 +23,8 @@ IN: ui.gadgets.packs.tests
 
 ! Test baseline alignment
 <shelf> +baseline+ >>align
-    5 { 10 10 } <baseline-gadget> add-gadget
-    10 { 10 10 } <baseline-gadget> add-gadget
+    5 5 { 10 10 } <baseline-gadget> add-gadget
+    10 10 { 10 10 } <baseline-gadget> add-gadget
 "g" set
 
 [ ] [ "g" get prefer ] unit-test
@@ -40,7 +40,7 @@ IN: ui.gadgets.packs.tests
 ! Test mixed baseline and ordinary alignment
 <shelf> +baseline+ >>align
     <gadget> { 20 20 } >>dim add-gadget
-    10 { 10 10 } <baseline-gadget> add-gadget
+    10 10 { 10 10 } <baseline-gadget> add-gadget
 "g" set
 
 [ { 30 20 } ] [ "g" get pref-dim ] unit-test
@@ -53,11 +53,13 @@ IN: ui.gadgets.packs.tests
 
 <shelf> +baseline+ >>align
     <gadget> { 15 15 } >>dim add-gadget
-    5 { 10 10 } <baseline-gadget> add-gadget
+    5 5 { 10 10 } <baseline-gadget> add-gadget
 "g" set
 
 [ { 25 15 } ] [ "g" get pref-dim ] unit-test
 
+[ ] [ "g" get prefer ] unit-test
+
 [ ] [ "g" get layout ] unit-test
 
 [ V{ { 0 0 } { 15 5 } } ] [
@@ -66,13 +68,26 @@ IN: ui.gadgets.packs.tests
 
 <shelf> +baseline+ >>align
     <gadget> { 20 20 } >>dim add-gadget
-    30 { 10 50 } <baseline-gadget> add-gadget
+    30 30 { 10 50 } <baseline-gadget> add-gadget
 "g" set
 
 [ { 30 50 } ] [ "g" get pref-dim ] unit-test
 
+[ ] [ "g" get prefer ] unit-test
+
 [ ] [ "g" get layout ] unit-test
 
 [ V{ { 0 5 } { 20 0 } } ] [
     "g" get children>> [ loc>> ] map
-] unit-test
\ No newline at end of file
+] unit-test
+
+<shelf> +baseline+ >>align
+    <gadget> { 30 30 } >>dim add-gadget
+    30 4 { 30 30 } <baseline-gadget> add-gadget
+"g" set
+
+[ { 60 43 } ] [ "g" get pref-dim ] unit-test
+
+[ ] [ "g" get prefer ] unit-test
+
+[ ] [ "g" get layout ] unit-test
\ No newline at end of file
diff --git a/basis/ui/gadgets/packs/packs.factor b/basis/ui/gadgets/packs/packs.factor
index 2176b63b76..95f04dfe4d 100644
--- a/basis/ui/gadgets/packs/packs.factor
+++ b/basis/ui/gadgets/packs/packs.factor
@@ -84,7 +84,8 @@ M: pack pref-dim*
     children>> dup pref-dims measure-metrics drop ;
 
 : pack-cap-height ( pack -- n )
-    children>> [ f ] [ first cap-height ] if-empty ;
+    children>> [ cap-height ] map sift
+    [ f ] [ supremum ] if-empty ;
 
 PRIVATE>
 
diff --git a/basis/ui/gadgets/paragraphs/paragraphs-tests.factor b/basis/ui/gadgets/paragraphs/paragraphs-tests.factor
index 0a759ab11d..fcc121e584 100644
--- a/basis/ui/gadgets/paragraphs/paragraphs-tests.factor
+++ b/basis/ui/gadgets/paragraphs/paragraphs-tests.factor
@@ -32,11 +32,11 @@ INSTANCE: fake-break word-break
 [ { 0 30 } ] [ "c" get loc>> ] unit-test
 
 100 <paragraph>
-15 { 40 30 } <baseline-gadget> dup "a" set add-gadget
+15 15 { 40 30 } <baseline-gadget> dup "a" set add-gadget
 <fake-break> add-gadget
-10 { 40 30 } <baseline-gadget> dup "b" set add-gadget
+10 10 { 40 30 } <baseline-gadget> dup "b" set add-gadget
 <fake-break> add-gadget
-20 { 40 30 } <baseline-gadget> dup "c" set add-gadget
+20 20 { 40 30 } <baseline-gadget> dup "c" set add-gadget
 "p" set
 
 [ { 85 65 } ] [ "p" get pref-dim ] unit-test