Improve RTL support in ConstraintLayout

The CL fixes the existing RTL APIs (using start & end), by resolving
them to left and right on the Compose side. This is needed only until
the resolving is fixed on the solver library side. The CL is also adding
RTL unaware APIs, which work with left and right rather than start and
end.

Relnote: Fixed RTL support in ConstraintLayout. Added RTL unaware APIs.
Bug: 157887944
Test: ConstraintLayoutTest
Change-Id: I3b1c75b837ef54b48306fe7938ec1d0444488d0b
diff --git a/ui/ui-layout/api/0.1.0-dev14.txt b/ui/ui-layout/api/0.1.0-dev14.txt
index b19565a..e88ec8c 100644
--- a/ui/ui-layout/api/0.1.0-dev14.txt
+++ b/ui/ui-layout/api/0.1.0-dev14.txt
@@ -89,6 +89,8 @@
     method public void centerHorizontallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerVerticallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteLeft();
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteRight();
     method public androidx.ui.layout.ConstrainScope.BaselineAnchorable getBaseline();
     method public androidx.ui.layout.ConstrainScope.HorizontalAnchorable getBottom();
     method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getEnd();
@@ -102,6 +104,8 @@
     method public void linkTo-tsa2a54(androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor start, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor top, androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom, float startMargin = 0.dp, float topMargin = 0.dp, float endMargin = 0.dp, float bottomMargin = 0.dp, @FloatRange(from=0.0, to=1.0) float horizontalBias = 0.5f, @FloatRange(from=0.0, to=1.0) float verticalBias = 0.5f);
     method public void setHeight(androidx.ui.layout.Dimension value);
     method public void setWidth(androidx.ui.layout.Dimension value);
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteLeft;
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteRight;
     property public final androidx.ui.layout.ConstrainScope.BaselineAnchorable baseline;
     property public final androidx.ui.layout.ConstrainScope.HorizontalAnchorable bottom;
     property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable end;
@@ -126,12 +130,16 @@
 
   public final class ConstrainedLayoutReference {
     ctor public ConstrainedLayoutReference(Object tag);
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteLeft();
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteRight();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor getBaseline();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getBottom();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getEnd();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getStart();
     method public Object getTag();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getTop();
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteLeft;
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteRight;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor baseline;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end;
@@ -141,24 +149,30 @@
 
   public abstract class ConstraintLayoutBaseScope {
     ctor public ConstraintLayoutBaseScope();
-    method public final void applyTo(androidx.constraintlayout.core.state.State state);
+    method public final void applyTo(androidx.ui.layout.State state);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteLeftBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteRightBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createBottomBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createEndBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop-ipo6vVg(float offset);
     method public final void createHorizontalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createStartBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createTopBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final void createVerticalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
-    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> getTasks();
+    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> getTasks();
     method public final void reset();
-    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> tasks;
+    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> tasks;
   }
 
   public static final class ConstraintLayoutBaseScope.BaselineAnchor {
@@ -214,7 +228,7 @@
   }
 
   @androidx.compose.Immutable public interface ConstraintSet {
-    method public void applyTo(androidx.constraintlayout.core.state.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
+    method public void applyTo(androidx.ui.layout.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
   }
 
   @Deprecated public final class ConstraintSetBuilderScope {
@@ -274,7 +288,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor {
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor other);
-    method @Deprecated public androidx.constraintlayout.core.state.State getState();
+    method @Deprecated public androidx.ui.layout.State getState();
     method @Deprecated public Object getTag();
   }
 
@@ -331,7 +345,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -341,7 +355,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -350,7 +364,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -368,7 +382,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -378,7 +392,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -387,7 +401,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -609,5 +623,18 @@
     method @androidx.compose.Stable public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
   }
 
+  public final class State extends androidx.constraintlayout.core.state.State {
+    ctor public State(androidx.ui.unit.Density density);
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public androidx.ui.core.Constraints getRootIncomingConstraints();
+    method public void setLayoutDirection(androidx.ui.core.LayoutDirection p);
+    method public void setRootIncomingConstraints(androidx.ui.core.Constraints p);
+    property public final androidx.ui.core.LayoutDirection layoutDirection;
+    property public final androidx.ui.core.Constraints rootIncomingConstraints;
+    field public androidx.ui.core.LayoutDirection layoutDirection;
+    field public androidx.ui.core.Constraints rootIncomingConstraints;
+  }
+
 }
 
diff --git a/ui/ui-layout/api/api_lint.ignore b/ui/ui-layout/api/api_lint.ignore
index ed1a6bd..697a4cf 100644
--- a/ui/ui-layout/api/api_lint.ignore
+++ b/ui/ui-layout/api/api_lint.ignore
@@ -7,3 +7,9 @@
 
 HiddenTypeParameter: androidx.ui.layout.Arrangement#Companion:
     Field Arrangement.Companion references hidden type androidx.ui.layout.Arrangement.Companion.
+
+
+MutableBareField: androidx.ui.layout.State#layoutDirection:
+    Bare field layoutDirection must be marked final, or moved behind accessors if mutable
+MutableBareField: androidx.ui.layout.State#rootIncomingConstraints:
+    Bare field rootIncomingConstraints must be marked final, or moved behind accessors if mutable
diff --git a/ui/ui-layout/api/current.txt b/ui/ui-layout/api/current.txt
index b19565a..e88ec8c 100644
--- a/ui/ui-layout/api/current.txt
+++ b/ui/ui-layout/api/current.txt
@@ -89,6 +89,8 @@
     method public void centerHorizontallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerVerticallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteLeft();
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteRight();
     method public androidx.ui.layout.ConstrainScope.BaselineAnchorable getBaseline();
     method public androidx.ui.layout.ConstrainScope.HorizontalAnchorable getBottom();
     method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getEnd();
@@ -102,6 +104,8 @@
     method public void linkTo-tsa2a54(androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor start, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor top, androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom, float startMargin = 0.dp, float topMargin = 0.dp, float endMargin = 0.dp, float bottomMargin = 0.dp, @FloatRange(from=0.0, to=1.0) float horizontalBias = 0.5f, @FloatRange(from=0.0, to=1.0) float verticalBias = 0.5f);
     method public void setHeight(androidx.ui.layout.Dimension value);
     method public void setWidth(androidx.ui.layout.Dimension value);
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteLeft;
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteRight;
     property public final androidx.ui.layout.ConstrainScope.BaselineAnchorable baseline;
     property public final androidx.ui.layout.ConstrainScope.HorizontalAnchorable bottom;
     property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable end;
@@ -126,12 +130,16 @@
 
   public final class ConstrainedLayoutReference {
     ctor public ConstrainedLayoutReference(Object tag);
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteLeft();
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteRight();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor getBaseline();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getBottom();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getEnd();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getStart();
     method public Object getTag();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getTop();
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteLeft;
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteRight;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor baseline;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end;
@@ -141,24 +149,30 @@
 
   public abstract class ConstraintLayoutBaseScope {
     ctor public ConstraintLayoutBaseScope();
-    method public final void applyTo(androidx.constraintlayout.core.state.State state);
+    method public final void applyTo(androidx.ui.layout.State state);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteLeftBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteRightBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createBottomBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createEndBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop-ipo6vVg(float offset);
     method public final void createHorizontalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createStartBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createTopBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final void createVerticalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
-    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> getTasks();
+    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> getTasks();
     method public final void reset();
-    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> tasks;
+    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> tasks;
   }
 
   public static final class ConstraintLayoutBaseScope.BaselineAnchor {
@@ -214,7 +228,7 @@
   }
 
   @androidx.compose.Immutable public interface ConstraintSet {
-    method public void applyTo(androidx.constraintlayout.core.state.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
+    method public void applyTo(androidx.ui.layout.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
   }
 
   @Deprecated public final class ConstraintSetBuilderScope {
@@ -274,7 +288,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor {
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor other);
-    method @Deprecated public androidx.constraintlayout.core.state.State getState();
+    method @Deprecated public androidx.ui.layout.State getState();
     method @Deprecated public Object getTag();
   }
 
@@ -331,7 +345,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -341,7 +355,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -350,7 +364,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -368,7 +382,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -378,7 +392,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -387,7 +401,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -609,5 +623,18 @@
     method @androidx.compose.Stable public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
   }
 
+  public final class State extends androidx.constraintlayout.core.state.State {
+    ctor public State(androidx.ui.unit.Density density);
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public androidx.ui.core.Constraints getRootIncomingConstraints();
+    method public void setLayoutDirection(androidx.ui.core.LayoutDirection p);
+    method public void setRootIncomingConstraints(androidx.ui.core.Constraints p);
+    property public final androidx.ui.core.LayoutDirection layoutDirection;
+    property public final androidx.ui.core.Constraints rootIncomingConstraints;
+    field public androidx.ui.core.LayoutDirection layoutDirection;
+    field public androidx.ui.core.Constraints rootIncomingConstraints;
+  }
+
 }
 
diff --git a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev14.txt b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev14.txt
index b19565a..e88ec8c 100644
--- a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev14.txt
+++ b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev14.txt
@@ -89,6 +89,8 @@
     method public void centerHorizontallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerVerticallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteLeft();
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteRight();
     method public androidx.ui.layout.ConstrainScope.BaselineAnchorable getBaseline();
     method public androidx.ui.layout.ConstrainScope.HorizontalAnchorable getBottom();
     method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getEnd();
@@ -102,6 +104,8 @@
     method public void linkTo-tsa2a54(androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor start, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor top, androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom, float startMargin = 0.dp, float topMargin = 0.dp, float endMargin = 0.dp, float bottomMargin = 0.dp, @FloatRange(from=0.0, to=1.0) float horizontalBias = 0.5f, @FloatRange(from=0.0, to=1.0) float verticalBias = 0.5f);
     method public void setHeight(androidx.ui.layout.Dimension value);
     method public void setWidth(androidx.ui.layout.Dimension value);
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteLeft;
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteRight;
     property public final androidx.ui.layout.ConstrainScope.BaselineAnchorable baseline;
     property public final androidx.ui.layout.ConstrainScope.HorizontalAnchorable bottom;
     property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable end;
@@ -126,12 +130,16 @@
 
   public final class ConstrainedLayoutReference {
     ctor public ConstrainedLayoutReference(Object tag);
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteLeft();
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteRight();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor getBaseline();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getBottom();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getEnd();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getStart();
     method public Object getTag();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getTop();
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteLeft;
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteRight;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor baseline;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end;
@@ -141,24 +149,30 @@
 
   public abstract class ConstraintLayoutBaseScope {
     ctor public ConstraintLayoutBaseScope();
-    method public final void applyTo(androidx.constraintlayout.core.state.State state);
+    method public final void applyTo(androidx.ui.layout.State state);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteLeftBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteRightBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createBottomBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createEndBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop-ipo6vVg(float offset);
     method public final void createHorizontalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createStartBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createTopBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final void createVerticalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
-    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> getTasks();
+    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> getTasks();
     method public final void reset();
-    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> tasks;
+    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> tasks;
   }
 
   public static final class ConstraintLayoutBaseScope.BaselineAnchor {
@@ -214,7 +228,7 @@
   }
 
   @androidx.compose.Immutable public interface ConstraintSet {
-    method public void applyTo(androidx.constraintlayout.core.state.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
+    method public void applyTo(androidx.ui.layout.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
   }
 
   @Deprecated public final class ConstraintSetBuilderScope {
@@ -274,7 +288,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor {
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor other);
-    method @Deprecated public androidx.constraintlayout.core.state.State getState();
+    method @Deprecated public androidx.ui.layout.State getState();
     method @Deprecated public Object getTag();
   }
 
@@ -331,7 +345,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -341,7 +355,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -350,7 +364,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -368,7 +382,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -378,7 +392,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -387,7 +401,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -609,5 +623,18 @@
     method @androidx.compose.Stable public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
   }
 
+  public final class State extends androidx.constraintlayout.core.state.State {
+    ctor public State(androidx.ui.unit.Density density);
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public androidx.ui.core.Constraints getRootIncomingConstraints();
+    method public void setLayoutDirection(androidx.ui.core.LayoutDirection p);
+    method public void setRootIncomingConstraints(androidx.ui.core.Constraints p);
+    property public final androidx.ui.core.LayoutDirection layoutDirection;
+    property public final androidx.ui.core.Constraints rootIncomingConstraints;
+    field public androidx.ui.core.LayoutDirection layoutDirection;
+    field public androidx.ui.core.Constraints rootIncomingConstraints;
+  }
+
 }
 
diff --git a/ui/ui-layout/api/public_plus_experimental_current.txt b/ui/ui-layout/api/public_plus_experimental_current.txt
index b19565a..e88ec8c 100644
--- a/ui/ui-layout/api/public_plus_experimental_current.txt
+++ b/ui/ui-layout/api/public_plus_experimental_current.txt
@@ -89,6 +89,8 @@
     method public void centerHorizontallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerVerticallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteLeft();
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteRight();
     method public androidx.ui.layout.ConstrainScope.BaselineAnchorable getBaseline();
     method public androidx.ui.layout.ConstrainScope.HorizontalAnchorable getBottom();
     method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getEnd();
@@ -102,6 +104,8 @@
     method public void linkTo-tsa2a54(androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor start, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor top, androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom, float startMargin = 0.dp, float topMargin = 0.dp, float endMargin = 0.dp, float bottomMargin = 0.dp, @FloatRange(from=0.0, to=1.0) float horizontalBias = 0.5f, @FloatRange(from=0.0, to=1.0) float verticalBias = 0.5f);
     method public void setHeight(androidx.ui.layout.Dimension value);
     method public void setWidth(androidx.ui.layout.Dimension value);
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteLeft;
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteRight;
     property public final androidx.ui.layout.ConstrainScope.BaselineAnchorable baseline;
     property public final androidx.ui.layout.ConstrainScope.HorizontalAnchorable bottom;
     property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable end;
@@ -126,12 +130,16 @@
 
   public final class ConstrainedLayoutReference {
     ctor public ConstrainedLayoutReference(Object tag);
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteLeft();
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteRight();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor getBaseline();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getBottom();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getEnd();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getStart();
     method public Object getTag();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getTop();
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteLeft;
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteRight;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor baseline;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end;
@@ -141,24 +149,30 @@
 
   public abstract class ConstraintLayoutBaseScope {
     ctor public ConstraintLayoutBaseScope();
-    method public final void applyTo(androidx.constraintlayout.core.state.State state);
+    method public final void applyTo(androidx.ui.layout.State state);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteLeftBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteRightBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createBottomBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createEndBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop-ipo6vVg(float offset);
     method public final void createHorizontalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createStartBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createTopBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final void createVerticalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
-    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> getTasks();
+    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> getTasks();
     method public final void reset();
-    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> tasks;
+    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> tasks;
   }
 
   public static final class ConstraintLayoutBaseScope.BaselineAnchor {
@@ -214,7 +228,7 @@
   }
 
   @androidx.compose.Immutable public interface ConstraintSet {
-    method public void applyTo(androidx.constraintlayout.core.state.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
+    method public void applyTo(androidx.ui.layout.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
   }
 
   @Deprecated public final class ConstraintSetBuilderScope {
@@ -274,7 +288,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor {
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor other);
-    method @Deprecated public androidx.constraintlayout.core.state.State getState();
+    method @Deprecated public androidx.ui.layout.State getState();
     method @Deprecated public Object getTag();
   }
 
@@ -331,7 +345,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -341,7 +355,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -350,7 +364,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -368,7 +382,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -378,7 +392,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -387,7 +401,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -609,5 +623,18 @@
     method @androidx.compose.Stable public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
   }
 
+  public final class State extends androidx.constraintlayout.core.state.State {
+    ctor public State(androidx.ui.unit.Density density);
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public androidx.ui.core.Constraints getRootIncomingConstraints();
+    method public void setLayoutDirection(androidx.ui.core.LayoutDirection p);
+    method public void setRootIncomingConstraints(androidx.ui.core.Constraints p);
+    property public final androidx.ui.core.LayoutDirection layoutDirection;
+    property public final androidx.ui.core.Constraints rootIncomingConstraints;
+    field public androidx.ui.core.LayoutDirection layoutDirection;
+    field public androidx.ui.core.Constraints rootIncomingConstraints;
+  }
+
 }
 
diff --git a/ui/ui-layout/api/restricted_0.1.0-dev14.txt b/ui/ui-layout/api/restricted_0.1.0-dev14.txt
index b19565a..e88ec8c 100644
--- a/ui/ui-layout/api/restricted_0.1.0-dev14.txt
+++ b/ui/ui-layout/api/restricted_0.1.0-dev14.txt
@@ -89,6 +89,8 @@
     method public void centerHorizontallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerVerticallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteLeft();
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteRight();
     method public androidx.ui.layout.ConstrainScope.BaselineAnchorable getBaseline();
     method public androidx.ui.layout.ConstrainScope.HorizontalAnchorable getBottom();
     method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getEnd();
@@ -102,6 +104,8 @@
     method public void linkTo-tsa2a54(androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor start, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor top, androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom, float startMargin = 0.dp, float topMargin = 0.dp, float endMargin = 0.dp, float bottomMargin = 0.dp, @FloatRange(from=0.0, to=1.0) float horizontalBias = 0.5f, @FloatRange(from=0.0, to=1.0) float verticalBias = 0.5f);
     method public void setHeight(androidx.ui.layout.Dimension value);
     method public void setWidth(androidx.ui.layout.Dimension value);
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteLeft;
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteRight;
     property public final androidx.ui.layout.ConstrainScope.BaselineAnchorable baseline;
     property public final androidx.ui.layout.ConstrainScope.HorizontalAnchorable bottom;
     property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable end;
@@ -126,12 +130,16 @@
 
   public final class ConstrainedLayoutReference {
     ctor public ConstrainedLayoutReference(Object tag);
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteLeft();
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteRight();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor getBaseline();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getBottom();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getEnd();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getStart();
     method public Object getTag();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getTop();
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteLeft;
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteRight;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor baseline;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end;
@@ -141,24 +149,30 @@
 
   public abstract class ConstraintLayoutBaseScope {
     ctor public ConstraintLayoutBaseScope();
-    method public final void applyTo(androidx.constraintlayout.core.state.State state);
+    method public final void applyTo(androidx.ui.layout.State state);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteLeftBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteRightBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createBottomBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createEndBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop-ipo6vVg(float offset);
     method public final void createHorizontalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createStartBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createTopBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final void createVerticalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
-    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> getTasks();
+    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> getTasks();
     method public final void reset();
-    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> tasks;
+    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> tasks;
   }
 
   public static final class ConstraintLayoutBaseScope.BaselineAnchor {
@@ -214,7 +228,7 @@
   }
 
   @androidx.compose.Immutable public interface ConstraintSet {
-    method public void applyTo(androidx.constraintlayout.core.state.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
+    method public void applyTo(androidx.ui.layout.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
   }
 
   @Deprecated public final class ConstraintSetBuilderScope {
@@ -274,7 +288,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor {
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor other);
-    method @Deprecated public androidx.constraintlayout.core.state.State getState();
+    method @Deprecated public androidx.ui.layout.State getState();
     method @Deprecated public Object getTag();
   }
 
@@ -331,7 +345,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -341,7 +355,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -350,7 +364,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -368,7 +382,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -378,7 +392,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -387,7 +401,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -609,5 +623,18 @@
     method @androidx.compose.Stable public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
   }
 
+  public final class State extends androidx.constraintlayout.core.state.State {
+    ctor public State(androidx.ui.unit.Density density);
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public androidx.ui.core.Constraints getRootIncomingConstraints();
+    method public void setLayoutDirection(androidx.ui.core.LayoutDirection p);
+    method public void setRootIncomingConstraints(androidx.ui.core.Constraints p);
+    property public final androidx.ui.core.LayoutDirection layoutDirection;
+    property public final androidx.ui.core.Constraints rootIncomingConstraints;
+    field public androidx.ui.core.LayoutDirection layoutDirection;
+    field public androidx.ui.core.Constraints rootIncomingConstraints;
+  }
+
 }
 
diff --git a/ui/ui-layout/api/restricted_current.txt b/ui/ui-layout/api/restricted_current.txt
index b19565a..e88ec8c 100644
--- a/ui/ui-layout/api/restricted_current.txt
+++ b/ui/ui-layout/api/restricted_current.txt
@@ -89,6 +89,8 @@
     method public void centerHorizontallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerTo(androidx.ui.layout.ConstrainedLayoutReference other);
     method public void centerVerticallyTo(androidx.ui.layout.ConstrainedLayoutReference other);
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteLeft();
+    method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getAbsoluteRight();
     method public androidx.ui.layout.ConstrainScope.BaselineAnchorable getBaseline();
     method public androidx.ui.layout.ConstrainScope.HorizontalAnchorable getBottom();
     method public androidx.ui.layout.ConstrainScope.VerticalAnchorable getEnd();
@@ -102,6 +104,8 @@
     method public void linkTo-tsa2a54(androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor start, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor top, androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end, androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom, float startMargin = 0.dp, float topMargin = 0.dp, float endMargin = 0.dp, float bottomMargin = 0.dp, @FloatRange(from=0.0, to=1.0) float horizontalBias = 0.5f, @FloatRange(from=0.0, to=1.0) float verticalBias = 0.5f);
     method public void setHeight(androidx.ui.layout.Dimension value);
     method public void setWidth(androidx.ui.layout.Dimension value);
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteLeft;
+    property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable absoluteRight;
     property public final androidx.ui.layout.ConstrainScope.BaselineAnchorable baseline;
     property public final androidx.ui.layout.ConstrainScope.HorizontalAnchorable bottom;
     property public final androidx.ui.layout.ConstrainScope.VerticalAnchorable end;
@@ -126,12 +130,16 @@
 
   public final class ConstrainedLayoutReference {
     ctor public ConstrainedLayoutReference(Object tag);
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteLeft();
+    method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getAbsoluteRight();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor getBaseline();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getBottom();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getEnd();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor getStart();
     method public Object getTag();
     method public androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor getTop();
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteLeft;
+    property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor absoluteRight;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.BaselineAnchor baseline;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor bottom;
     property public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor end;
@@ -141,24 +149,30 @@
 
   public abstract class ConstraintLayoutBaseScope {
     ctor public ConstraintLayoutBaseScope();
-    method public final void applyTo(androidx.constraintlayout.core.state.State state);
+    method public final void applyTo(androidx.ui.layout.State state);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteLeftBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteRightBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createBottomBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createEndBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteLeft-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromAbsoluteRight-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromBottom-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromLeft-ipo6vVg(float offset);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight(float percent);
-    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromRight-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromEnd-ipo6vVg(float offset);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart(float percent);
+    method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createGuidelineFromStart-ipo6vVg(float offset);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float percent);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop-ipo6vVg(float offset);
     method public final void createHorizontalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.VerticalAnchor createStartBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final androidx.ui.layout.ConstraintLayoutBaseScope.HorizontalAnchor createTopBarrier(androidx.ui.layout.ConstrainedLayoutReference... elements);
     method public final void createVerticalChain(androidx.ui.layout.ConstrainedLayoutReference![] elements, androidx.ui.layout.ChainStyle chainStyle = ChainStyle.Spread);
-    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> getTasks();
+    method protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> getTasks();
     method public final void reset();
-    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.constraintlayout.core.state.State,kotlin.Unit>> tasks;
+    property protected final java.util.List<kotlin.jvm.functions.Function1<androidx.ui.layout.State,kotlin.Unit>> tasks;
   }
 
   public static final class ConstraintLayoutBaseScope.BaselineAnchor {
@@ -214,7 +228,7 @@
   }
 
   @androidx.compose.Immutable public interface ConstraintSet {
-    method public void applyTo(androidx.constraintlayout.core.state.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
+    method public void applyTo(androidx.ui.layout.State state, java.util.List<? extends androidx.ui.core.Measurable> measurables);
   }
 
   @Deprecated public final class ConstraintSetBuilderScope {
@@ -274,7 +288,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor {
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.ConstrainedLayoutBaselineAnchor other);
-    method @Deprecated public androidx.constraintlayout.core.state.State getState();
+    method @Deprecated public androidx.ui.layout.State getState();
     method @Deprecated public Object getTag();
   }
 
@@ -331,7 +345,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -341,7 +355,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -350,7 +364,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.HorizontalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -368,7 +382,7 @@
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.BarrierAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -378,7 +392,7 @@
     method @Deprecated public infix void constrainTo(androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor other);
     method @Deprecated public int getIndex$lintWithKotlin();
     method @Deprecated public float getMargin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
     method @Deprecated public void setMargin-ipo6vVg(float value);
     property public final float margin;
@@ -387,7 +401,7 @@
 
   @Deprecated public static final class ConstraintSetBuilderScope.VerticalAnchor.GuidelineAnchor extends androidx.ui.layout.ConstraintSetBuilderScope.VerticalAnchor {
     method @Deprecated public int getIndex$lintWithKotlin();
-    method @Deprecated public androidx.constraintlayout.core.state.State getState$lintWithKotlin();
+    method @Deprecated public androidx.ui.layout.State getState$lintWithKotlin();
     method @Deprecated public Object getTag$lintWithKotlin();
   }
 
@@ -609,5 +623,18 @@
     method @androidx.compose.Stable public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
   }
 
+  public final class State extends androidx.constraintlayout.core.state.State {
+    ctor public State(androidx.ui.unit.Density density);
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public androidx.ui.core.Constraints getRootIncomingConstraints();
+    method public void setLayoutDirection(androidx.ui.core.LayoutDirection p);
+    method public void setRootIncomingConstraints(androidx.ui.core.Constraints p);
+    property public final androidx.ui.core.LayoutDirection layoutDirection;
+    property public final androidx.ui.core.Constraints rootIncomingConstraints;
+    field public androidx.ui.core.LayoutDirection layoutDirection;
+    field public androidx.ui.core.Constraints rootIncomingConstraints;
+  }
+
 }
 
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ConstraintLayoutTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ConstraintLayoutTest.kt
index 1e09fdd..0e1d4dd 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ConstraintLayoutTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ConstraintLayoutTest.kt
@@ -23,7 +23,9 @@
 import androidx.ui.core.tag
 import androidx.ui.core.globalPosition
 import androidx.ui.core.onPositioned
+import androidx.ui.core.positionInParent
 import androidx.ui.foundation.Box
+import androidx.ui.layout.ConstrainScope
 import androidx.ui.layout.ConstraintLayout
 import androidx.ui.layout.ConstraintSet2
 import androidx.ui.layout.Dimension
@@ -34,6 +36,7 @@
 import androidx.ui.layout.preferredSize
 import androidx.ui.layout.preferredWidth
 import androidx.ui.layout.rtl
+import androidx.ui.layout.size
 import androidx.ui.layout.wrapContentSize
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.runOnIdleCompose
@@ -41,6 +44,7 @@
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.dp
 import androidx.ui.unit.ipx
+import org.junit.Assert
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -65,7 +69,7 @@
                 modifier = Modifier.wrapContentSize(Alignment.TopStart).fillMaxWidth()
             ) {
                 val (aspectRatioBox, divider) = createRefs()
-                val guideline = createGuidelineFromLeft(0.5f)
+                val guideline = createGuidelineFromAbsoluteLeft(0.5f)
 
                 Box(Modifier
                     .constrainAs(aspectRatioBox) {
@@ -123,7 +127,7 @@
                 modifier = Modifier.wrapContentSize(Alignment.TopStart).fillMaxWidth()
             ) {
                 val (aspectRatioBox, divider) = createRefs()
-                val guideline = createGuidelineFromLeft(0.5f)
+                val guideline = createGuidelineFromAbsoluteLeft(0.5f)
 
                 Box(Modifier
                     .constrainAs(aspectRatioBox) {
@@ -182,7 +186,7 @@
                 modifier = Modifier.wrapContentSize(Alignment.TopStart)
             ) {
                 val (aspectRatioBox, divider) = createRefs()
-                val guideline = createGuidelineFromLeft(0.5f)
+                val guideline = createGuidelineFromAbsoluteLeft(0.5f)
 
                 Box(Modifier
                     .constrainAs(aspectRatioBox) {
@@ -246,7 +250,7 @@
                 }
             ) {
                 val (aspectRatioBox, divider) = createRefs()
-                val guideline = createGuidelineFromLeft(0.5f)
+                val guideline = createGuidelineFromAbsoluteLeft(0.5f)
 
                 Box(Modifier
                     .constrainAs(aspectRatioBox) {
@@ -315,7 +319,7 @@
                         position[0].value = it.globalPosition
                     }
                 )
-                val half = createGuidelineFromLeft(percent = 0.5f)
+                val half = createGuidelineFromAbsoluteLeft(percent = 0.5f)
                 Box(Modifier
                     .constrainAs(box1) {
                         start.linkTo(half, margin = offset.toDp())
@@ -376,7 +380,7 @@
                         centerTo(parent)
                     }
 
-                    val half = createGuidelineFromLeft(percent = 0.5f)
+                    val half = createGuidelineFromAbsoluteLeft(percent = 0.5f)
                     constrain(box1) {
                         start.linkTo(half, margin = offset.toDp())
                         bottom.linkTo(box0.top)
@@ -437,7 +441,7 @@
                         position[0].value = it.globalPosition
                     }
                 )
-                val half = createGuidelineFromLeft(percent = 0.5f)
+                val half = createGuidelineFromAbsoluteLeft(percent = 0.5f)
                 Box(Modifier
                     .constrainAs(box1) {
                         start.linkTo(half, margin = offset.toDp())
@@ -482,4 +486,328 @@
             )
         }
     }
+
+    @Test
+    fun testConstraintLayout_helpers_ltr() = with(density) {
+        val size = 200.ipx.toDp()
+        val offset = 50.ipx.toDp()
+
+        val position = Array(8) { 0f }
+        composeTestRule.setContent {
+            ConstraintLayout(Modifier.size(size)) {
+                val guidelines = arrayOf(
+                    createGuidelineFromStart(offset),
+                    createGuidelineFromAbsoluteLeft(offset),
+                    createGuidelineFromEnd(offset),
+                    createGuidelineFromAbsoluteRight(offset),
+                    createGuidelineFromStart(0.25f),
+                    createGuidelineFromAbsoluteLeft(0.25f),
+                    createGuidelineFromEnd(0.25f),
+                    createGuidelineFromAbsoluteRight(0.25f)
+                )
+
+                guidelines.forEachIndexed { index, guideline ->
+                    val ref = createRef()
+                    Box(Modifier.size(1.dp)
+                        .constrainAs(ref) {
+                            absoluteLeft.linkTo(guideline)
+                        }.onPositioned {
+                            position[index] = it.positionInParent.x
+                        }
+                    )
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            Assert.assertEquals(50f, position[0])
+            Assert.assertEquals(50f, position[1])
+            Assert.assertEquals(150f, position[2])
+            Assert.assertEquals(150f, position[3])
+            Assert.assertEquals(50f, position[4])
+            Assert.assertEquals(50f, position[5])
+            Assert.assertEquals(150f, position[6])
+            Assert.assertEquals(150f, position[7])
+        }
+    }
+
+    @Test
+    fun testConstraintLayout_helpers_rtl() = with(density) {
+        val size = 200.ipx.toDp()
+        val offset = 50.ipx.toDp()
+
+        val position = Array(8) { 0f }
+        composeTestRule.setContent {
+            ConstraintLayout(Modifier.size(size).rtl) {
+                val guidelines = arrayOf(
+                    createGuidelineFromStart(offset),
+                    createGuidelineFromAbsoluteLeft(offset),
+                    createGuidelineFromEnd(offset),
+                    createGuidelineFromAbsoluteRight(offset),
+                    createGuidelineFromStart(0.25f),
+                    createGuidelineFromAbsoluteLeft(0.25f),
+                    createGuidelineFromEnd(0.25f),
+                    createGuidelineFromAbsoluteRight(0.25f)
+                )
+
+                guidelines.forEachIndexed { index, guideline ->
+                    val ref = createRef()
+                    Box(Modifier.size(1.dp)
+                        .constrainAs(ref) {
+                            absoluteLeft.linkTo(guideline)
+                        }.onPositioned {
+                            position[index] = it.positionInParent.x
+                        }
+                    )
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            Assert.assertEquals(150f, position[0])
+            Assert.assertEquals(50f, position[1])
+            Assert.assertEquals(50f, position[2])
+            Assert.assertEquals(150f, position[3])
+            Assert.assertEquals(150f, position[4])
+            Assert.assertEquals(50f, position[5])
+            Assert.assertEquals(50f, position[6])
+            Assert.assertEquals(150f, position[7])
+        }
+    }
+
+    @Test
+    fun testConstraintLayout_barriers_ltr() = with(density) {
+        val size = 200.ipx.toDp()
+        val offset = 50.ipx.toDp()
+
+        val position = Array(4) { 0f }
+        composeTestRule.setContent {
+            ConstraintLayout(Modifier.size(size)) {
+                val (box1, box2) = createRefs()
+                val guideline1 = createGuidelineFromAbsoluteLeft(offset)
+                val guideline2 = createGuidelineFromAbsoluteRight(offset)
+                Box(Modifier.size(1.ipx.toDp())
+                    .constrainAs(box1) {
+                        absoluteLeft.linkTo(guideline1)
+                    }
+                )
+                Box(Modifier.size(1.ipx.toDp())
+                    .constrainAs(box2) {
+                        absoluteLeft.linkTo(guideline2)
+                    }
+                )
+
+                val barriers = arrayOf(
+                    createStartBarrier(box1, box2),
+                    createAbsoluteLeftBarrier(box1, box2),
+                    createEndBarrier(box1, box2),
+                    createAbsoluteRightBarrier(box1, box2)
+                )
+
+                barriers.forEachIndexed { index, barrier ->
+                    val ref = createRef()
+                    Box(Modifier.size(1.dp)
+                        .constrainAs(ref) {
+                            absoluteLeft.linkTo(barrier)
+                        }.onPositioned {
+                            position[index] = it.positionInParent.x
+                        }
+                    )
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            Assert.assertEquals(50f, position[0])
+            Assert.assertEquals(50f, position[1])
+            Assert.assertEquals(151f, position[2])
+            Assert.assertEquals(151f, position[3])
+        }
+    }
+
+    @Test
+    fun testConstraintLayout_barriers_rtl() = with(density) {
+        val size = 200.ipx.toDp()
+        val offset = 50.ipx.toDp()
+
+        val position = Array(4) { 0f }
+        composeTestRule.setContent {
+            ConstraintLayout(Modifier.size(size).rtl) {
+                val (box1, box2) = createRefs()
+                val guideline1 = createGuidelineFromAbsoluteLeft(offset)
+                val guideline2 = createGuidelineFromAbsoluteRight(offset)
+                Box(Modifier.size(1.ipx.toDp())
+                    .constrainAs(box1) {
+                        absoluteLeft.linkTo(guideline1)
+                    }
+                )
+                Box(Modifier.size(1.ipx.toDp())
+                    .constrainAs(box2) {
+                        absoluteLeft.linkTo(guideline2)
+                    }
+                )
+
+                val barriers = arrayOf(
+                    createStartBarrier(box1, box2),
+                    createAbsoluteLeftBarrier(box1, box2),
+                    createEndBarrier(box1, box2),
+                    createAbsoluteRightBarrier(box1, box2)
+                )
+
+                barriers.forEachIndexed { index, barrier ->
+                    val ref = createRef()
+                    Box(Modifier.size(1.dp)
+                        .constrainAs(ref) {
+                            absoluteLeft.linkTo(barrier)
+                        }.onPositioned {
+                            position[index] = it.positionInParent.x
+                        }
+                    )
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            Assert.assertEquals(151f, position[0])
+            Assert.assertEquals(50f, position[1])
+            Assert.assertEquals(50f, position[2])
+            Assert.assertEquals(151f, position[3])
+        }
+    }
+
+    @Test
+    fun testConstraintLayout_anchors_ltr() = with(density) {
+        val size = 200.ipx.toDp()
+        val offset = 50.ipx.toDp()
+
+        val position = Array(16) { 0f }
+        composeTestRule.setContent {
+            ConstraintLayout(Modifier.size(size)) {
+                val box = createRef()
+                val guideline = createGuidelineFromAbsoluteLeft(offset)
+                Box(Modifier.size(1.ipx.toDp())
+                    .constrainAs(box) {
+                        absoluteLeft.linkTo(guideline)
+                    }
+                )
+
+                val anchors = listOf<ConstrainScope.() -> Unit>(
+                    { start.linkTo(box.start) },
+                    { absoluteLeft.linkTo(box.start) },
+                    { start.linkTo(box.absoluteLeft) },
+                    { absoluteLeft.linkTo(box.absoluteLeft) },
+                    { end.linkTo(box.start) },
+                    { absoluteRight.linkTo(box.start) },
+                    { end.linkTo(box.absoluteLeft) },
+                    { absoluteRight.linkTo(box.absoluteLeft) },
+                    { start.linkTo(box.end) },
+                    { absoluteLeft.linkTo(box.end) },
+                    { start.linkTo(box.absoluteRight) },
+                    { absoluteLeft.linkTo(box.absoluteRight) },
+                    { end.linkTo(box.end) },
+                    { absoluteRight.linkTo(box.end) },
+                    { end.linkTo(box.absoluteRight) },
+                    { absoluteRight.linkTo(box.absoluteRight) }
+                )
+
+                anchors.forEachIndexed { index, anchor ->
+                    val ref = createRef()
+                    Box(Modifier.size(1.ipx.toDp())
+                        .constrainAs(ref) {
+                            anchor()
+                        }.onPositioned {
+                            position[index] = it.positionInParent.x
+                        }
+                    )
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            Assert.assertEquals(50f, position[0])
+            Assert.assertEquals(50f, position[1])
+            Assert.assertEquals(50f, position[2])
+            Assert.assertEquals(50f, position[3])
+            Assert.assertEquals(49f, position[4])
+            Assert.assertEquals(49f, position[5])
+            Assert.assertEquals(49f, position[6])
+            Assert.assertEquals(49f, position[7])
+            Assert.assertEquals(51f, position[8])
+            Assert.assertEquals(51f, position[9])
+            Assert.assertEquals(51f, position[10])
+            Assert.assertEquals(51f, position[11])
+            Assert.assertEquals(50f, position[12])
+            Assert.assertEquals(50f, position[13])
+            Assert.assertEquals(50f, position[14])
+            Assert.assertEquals(50f, position[15])
+        }
+    }
+
+    @Test
+    fun testConstraintLayout_anchors_rtl() = with(density) {
+        val size = 200.ipx.toDp()
+        val offset = 50.ipx.toDp()
+
+        val position = Array(16) { 0f }
+        composeTestRule.setContent {
+            ConstraintLayout(Modifier.size(size).rtl) {
+                val box = createRef()
+                val guideline = createGuidelineFromAbsoluteLeft(offset)
+                Box(Modifier.size(1.ipx.toDp())
+                    .constrainAs(box) {
+                        absoluteLeft.linkTo(guideline)
+                    }
+                )
+
+                val anchors = listOf<ConstrainScope.() -> Unit>(
+                    { start.linkTo(box.start) },
+                    { absoluteLeft.linkTo(box.start) },
+                    { start.linkTo(box.absoluteLeft) },
+                    { absoluteLeft.linkTo(box.absoluteLeft) },
+                    { end.linkTo(box.start) },
+                    { absoluteRight.linkTo(box.start) },
+                    { end.linkTo(box.absoluteLeft) },
+                    { absoluteRight.linkTo(box.absoluteLeft) },
+                    { start.linkTo(box.end) },
+                    { absoluteLeft.linkTo(box.end) },
+                    { start.linkTo(box.absoluteRight) },
+                    { absoluteLeft.linkTo(box.absoluteRight) },
+                    { end.linkTo(box.end) },
+                    { absoluteRight.linkTo(box.end) },
+                    { end.linkTo(box.absoluteRight) },
+                    { absoluteRight.linkTo(box.absoluteRight) }
+                )
+
+                anchors.forEachIndexed { index, anchor ->
+                    val ref = createRef()
+                    Box(Modifier.size(1.ipx.toDp())
+                        .constrainAs(ref) {
+                            anchor()
+                        }.onPositioned {
+                            position[index] = it.positionInParent.x
+                        }
+                    )
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            Assert.assertEquals(50f, position[0])
+            Assert.assertEquals(51f, position[1])
+            Assert.assertEquals(49f, position[2])
+            Assert.assertEquals(50f, position[3])
+            Assert.assertEquals(51f, position[4])
+            Assert.assertEquals(50f, position[5])
+            Assert.assertEquals(50f, position[6])
+            Assert.assertEquals(49f, position[7])
+            Assert.assertEquals(49f, position[8])
+            Assert.assertEquals(50f, position[9])
+            Assert.assertEquals(50f, position[10])
+            Assert.assertEquals(51f, position[11])
+            Assert.assertEquals(50f, position[12])
+            Assert.assertEquals(49f, position[13])
+            Assert.assertEquals(51f, position[14])
+            Assert.assertEquals(50f, position[15])
+        }
+    }
 }
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/ConstraintLayout.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/ConstraintLayout.kt
index 3f62ccb..3520eba 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/ConstraintLayout.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/ConstraintLayout.kt
@@ -26,7 +26,6 @@
 import androidx.constraintlayout.core.state.ConstraintReference
 import androidx.constraintlayout.core.state.Dimension.SPREAD_DIMENSION
 import androidx.constraintlayout.core.state.Dimension.WRAP_DIMENSION
-import androidx.constraintlayout.core.state.State
 import androidx.constraintlayout.core.state.helpers.BarrierReference
 import androidx.constraintlayout.core.widgets.ConstraintWidget
 import androidx.constraintlayout.core.widgets.ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT
@@ -39,6 +38,7 @@
 import androidx.constraintlayout.core.widgets.analyzer.BasicMeasure
 import androidx.compose.Immutable
 import androidx.ui.core.Constraints
+import androidx.ui.core.LayoutDirection
 import androidx.ui.text.FirstBaseline
 import androidx.ui.core.Measurable
 import androidx.ui.core.MeasureScope
@@ -52,6 +52,7 @@
 import androidx.ui.layout.ConstraintSetBuilderScope.Companion.baselineAnchorFunction
 import androidx.ui.layout.ConstraintSetBuilderScope.Companion.horizontalAnchorFunctions
 import androidx.ui.layout.ConstraintSetBuilderScope.Companion.verticalAnchorFunctions
+import androidx.ui.layout.ConstraintSetBuilderScope.Companion.verticalAnchorIndexToFunctionIndex
 import androidx.ui.unit.Density
 import androidx.ui.unit.Dp
 import androidx.ui.unit.IntPx
@@ -78,8 +79,7 @@
     MultiMeasureLayout(modifier = modifier, children = {
         scope.reset()
         scope.children()
-    }) { measurables, constraints, _ ->
-        // TODO(b/157886946): wire up RTL using ConstraintLayout's mechanism
+    }) { measurables, constraints, layoutDirection ->
         val constraintSet = object : ConstraintSet {
             override fun applyTo(state: State, measurables: List<Measurable>) {
                 scope.applyTo(state)
@@ -100,6 +100,7 @@
 
         val layoutSize = measurer.performMeasure(
             constraints,
+            layoutDirection,
             constraintSet,
             measurables,
             this
@@ -124,10 +125,10 @@
 ) {
     val measurer = remember { Measurer() }
     @Suppress("Deprecation")
-    MultiMeasureLayout(modifier = modifier, children = children) { measurables, constraints, _ ->
-        // TODO(b/157886946): wire up RTL using ConstraintLayout's mechanism
+    MultiMeasureLayout(modifier, children) { measurables, constraints, layoutDirection ->
         val layoutSize = measurer.performMeasure(
             constraints,
+            layoutDirection,
             constraintSet,
             measurables,
             this
@@ -145,7 +146,12 @@
     /**
      * The start anchor of this layout. Represents left in LTR layout direction, or right in RTL.
      */
-    val start = ConstraintLayoutBaseScope.VerticalAnchor(tag, 0)
+    val start = ConstraintLayoutBaseScope.VerticalAnchor(tag, -2)
+
+    /**
+     * The left anchor of this layout.
+     */
+    val absoluteLeft = ConstraintLayoutBaseScope.VerticalAnchor(tag, 0)
 
     /**
      * The top anchor of this layout.
@@ -155,7 +161,12 @@
     /**
      * The end anchor of this layout. Represents right in LTR layout direction, or left in RTL.
      */
-    val end = ConstraintLayoutBaseScope.VerticalAnchor(tag, 1)
+    val end = ConstraintLayoutBaseScope.VerticalAnchor(tag, -1)
+
+    /**
+     * The right anchor of this layout.
+     */
+    val absoluteRight = ConstraintLayoutBaseScope.VerticalAnchor(tag, 1)
 
     /**
      * The bottom anchor of this layout.
@@ -166,8 +177,6 @@
      * The baseline anchor of this layout.
      */
     val baseline = ConstraintLayoutBaseScope.BaselineAnchor(tag)
-
-    // TODO(popam, b/157887944): consider adding absoluteLeft and absoluteRight anchors.
 }
 
 /**
@@ -201,38 +210,88 @@
     data class BaselineAnchor internal constructor(internal val tag: Any)
 
     /**
+     * Creates a guideline at a specific offset from the start of the [ConstraintLayout].
+     */
+    fun createGuidelineFromStart(offset: Dp): VerticalAnchor {
+        val tag = createTag()
+        tasks.add { state ->
+            state.verticalGuideline(tag).apply {
+                if (state.layoutDirection == LayoutDirection.Ltr) start(offset) else end(offset)
+            }
+        }
+        return VerticalAnchor(tag, 0)
+    }
+
+    /**
      * Creates a guideline at a specific offset from the left of the [ConstraintLayout].
      */
-    fun createGuidelineFromLeft(offset: Dp): VerticalAnchor {
+    fun createGuidelineFromAbsoluteLeft(offset: Dp): VerticalAnchor {
         val tag = createTag()
         tasks.add { state -> state.verticalGuideline(tag).apply { start(offset) } }
         return VerticalAnchor(tag, 0)
     }
 
     /**
+     * Creates a guideline at a specific offset from the start of the [ConstraintLayout].
+     */
+    fun createGuidelineFromStart(percent: Float): VerticalAnchor {
+        val tag = createTag()
+        tasks.add { state ->
+            state.verticalGuideline(tag).apply {
+                if (state.layoutDirection == LayoutDirection.Ltr) {
+                    percent(percent)
+                } else {
+                    percent(1f - percent)
+                }
+            }
+        }
+        return VerticalAnchor(tag, 0)
+    }
+
+    /**
      * Creates a guideline at a width percentage from the left of the [ConstraintLayout].
      */
     // TODO(popam, b/157781990): this is not really percentage
-    fun createGuidelineFromLeft(percent: Float): VerticalAnchor {
+    fun createGuidelineFromAbsoluteLeft(percent: Float): VerticalAnchor {
         val tag = createTag()
         tasks.add { state -> state.verticalGuideline(tag).apply { percent(percent) } }
         return VerticalAnchor(tag, 0)
     }
 
     /**
+     * Creates a guideline at a specific offset from the end of the [ConstraintLayout].
+     */
+    fun createGuidelineFromEnd(offset: Dp): VerticalAnchor {
+        val tag = createTag()
+        tasks.add { state ->
+            state.verticalGuideline(tag).apply {
+                if (state.layoutDirection == LayoutDirection.Ltr) end(offset) else start(offset)
+            }
+        }
+        return VerticalAnchor(tag, 0)
+    }
+
+    /**
      * Creates a guideline at a specific offset from the right of the [ConstraintLayout].
      */
-    fun createGuidelineFromRight(offset: Dp): VerticalAnchor {
+    fun createGuidelineFromAbsoluteRight(offset: Dp): VerticalAnchor {
         val tag = createTag()
         tasks.add { state -> state.verticalGuideline(tag).apply { end(offset) } }
         return VerticalAnchor(tag, 0)
     }
 
     /**
+     * Creates a guideline at a width percentage from the end of the [ConstraintLayout].
+     */
+    fun createGuidelineFromEnd(percent: Float): VerticalAnchor {
+        return createGuidelineFromStart(1f - percent)
+    }
+
+    /**
      * Creates a guideline at a width percentage from the right of the [ConstraintLayout].
      */
-    fun createGuidelineFromRight(percent: Float): VerticalAnchor {
-        return createGuidelineFromLeft(1f - percent)
+    fun createGuidelineFromAbsoluteRight(percent: Float): VerticalAnchor {
+        return createGuidelineFromAbsoluteLeft(1f - percent)
     }
 
     /**
@@ -277,7 +336,27 @@
     ): VerticalAnchor {
         val tag = createTag()
         tasks.add { state ->
-            state.barrier(tag, State.Direction.START).apply {
+            val direction = if (state.layoutDirection == LayoutDirection.Ltr) {
+                SolverDirection.LEFT
+            } else {
+                SolverDirection.RIGHT
+            }
+            state.barrier(tag, direction).apply {
+                add(*(elements.map { it.tag }.toTypedArray()))
+            }
+        }
+        return VerticalAnchor(tag, 0)
+    }
+
+    /**
+     * Creates and returns a left barrier, containing the specified elements.
+     */
+    fun createAbsoluteLeftBarrier(
+        vararg elements: ConstrainedLayoutReference
+    ): VerticalAnchor {
+        val tag = createTag()
+        tasks.add { state ->
+            state.barrier(tag, SolverDirection.LEFT).apply {
                 add(*(elements.map { it.tag }.toTypedArray()))
             }
         }
@@ -292,7 +371,7 @@
     ): HorizontalAnchor {
         val tag = createTag()
         tasks.add { state ->
-            state.barrier(tag, State.Direction.TOP).apply {
+            state.barrier(tag, SolverDirection.TOP).apply {
                 add(*(elements.map { it.tag }.toTypedArray()))
             }
         }
@@ -307,7 +386,27 @@
     ): VerticalAnchor {
         val tag = createTag()
         tasks.add { state ->
-            state.barrier(tag, State.Direction.END).apply {
+            val direction = if (state.layoutDirection == LayoutDirection.Ltr) {
+                SolverDirection.RIGHT
+            } else {
+                SolverDirection.LEFT
+            }
+            state.barrier(tag, direction).apply {
+                add(*(elements.map { it.tag }.toTypedArray()))
+            }
+        }
+        return VerticalAnchor(tag, 0)
+    }
+
+    /**
+     * Creates and returns a right barrier, containing the specified elements.
+     */
+    fun createAbsoluteRightBarrier(
+        vararg elements: ConstrainedLayoutReference
+    ): VerticalAnchor {
+        val tag = createTag()
+        tasks.add { state ->
+            state.barrier(tag, SolverDirection.RIGHT).apply {
                 add(*(elements.map { it.tag }.toTypedArray()))
             }
         }
@@ -322,7 +421,7 @@
     ): HorizontalAnchor {
         val tag = createTag()
         tasks.add { state ->
-            state.barrier(tag, State.Direction.BOTTOM).apply {
+            state.barrier(tag, SolverDirection.BOTTOM).apply {
                 add(*(elements.map { it.tag }.toTypedArray()))
             }
         }
@@ -450,14 +549,14 @@
  * The style of a horizontal or vertical chain.
  */
 class ChainStyle internal constructor(
-    internal val style: State.Chain,
+    internal val style: SolverChain,
     internal val bias: Float? = null
 ) {
     companion object {
-        val Spread = ChainStyle(State.Chain.SPREAD)
-        val SpreadInside = ChainStyle(State.Chain.SPREAD_INSIDE)
+        val Spread = ChainStyle(SolverChain.SPREAD)
+        val SpreadInside = ChainStyle(SolverChain.SPREAD_INSIDE)
         val Packed = Packed(0.5f)
-        fun Packed(bias: Float) = ChainStyle(State.Chain.PACKED, bias)
+        fun Packed(bias: Float) = ChainStyle(SolverChain.PACKED, bias)
     }
 }
 
@@ -481,12 +580,17 @@
      * Reference to the [ConstraintLayout] itself, which can be used to specify constraints
      * between itself and its children.
      */
-    val parent = ConstrainedLayoutReference(State.PARENT)
+    val parent = ConstrainedLayoutReference(SolverState.PARENT)
 
     /**
      * The start anchor of the layout - can be constrained using [VerticalAnchorable.linkTo].
      */
-    val start = VerticalAnchorable(tag, 0)
+    val start = VerticalAnchorable(tag, -2)
+
+    /**
+     * The left anchor of the layout - can be constrained using [VerticalAnchorable.linkTo].
+     */
+    val absoluteLeft = VerticalAnchorable(tag, 0)
 
     /**
      * The top anchor of the layout - can be constrained using [HorizontalAnchorable.linkTo].
@@ -496,7 +600,12 @@
     /**
      * The end anchor of the layout - can be constrained using [VerticalAnchorable.linkTo].
      */
-    val end = VerticalAnchorable(tag, 1)
+    val end = VerticalAnchorable(tag, -1)
+
+    /**
+     * The right anchor of the layout - can be constrained using [VerticalAnchorable.linkTo].
+     */
+    val absoluteRight = VerticalAnchorable(tag, 1)
 
     /**
      * The bottom anchor of the layout - can be constrained using [HorizontalAnchorable.linkTo].
@@ -549,7 +658,10 @@
         fun linkTo(anchor: ConstraintLayoutBaseScope.VerticalAnchor, margin: Dp = 0.dp) {
             tasks.add { state ->
                 with(state.constraints(tag)) {
-                    verticalAnchorFunctions[index][anchor.index]
+                    val layoutDirection = state.layoutDirection
+                    val index1 = verticalAnchorIndexToFunctionIndex(index, layoutDirection)
+                    val index2 = verticalAnchorIndexToFunctionIndex(anchor.index, layoutDirection)
+                    verticalAnchorFunctions[index1][index2]
                         .invoke(this, anchor.tag)
                         .margin(margin)
                 }
@@ -907,7 +1019,7 @@
      * Reference to the [ConstraintLayout] itself, which can be used to specify constraints
      * between itself and its children.
      */
-    val parent = ConstrainedLayoutReference(State.PARENT)
+    val parent = ConstrainedLayoutReference(SolverState.PARENT)
 
     /**
      * Represents a dimension that can be assigned to the width or height of a [ConstraintLayout]
@@ -1373,20 +1485,20 @@
      * The style of a horizontal or vertical chain.
      */
     class ChainStyle internal constructor(
-        internal val style: State.Chain,
+        internal val style: SolverChain,
         internal val bias: Float? = null
     ) {
         companion object {
             /**
              * A chain style that evenly distributes the contained layouts.
              */
-            val Spread = ChainStyle(State.Chain.SPREAD)
+            val Spread = ChainStyle(SolverChain.SPREAD)
 
             /**
              * A chain style where the first and last layouts are affixed to the constraints
              * on each end of the chain and the rest are evenly distributed.
              */
-            val SpreadInside = ChainStyle(State.Chain.SPREAD_INSIDE)
+            val SpreadInside = ChainStyle(SolverChain.SPREAD_INSIDE)
 
             /**
              * A chain style where the contained layouts are packed together and placed to the
@@ -1398,7 +1510,7 @@
              * A chain style where the contained layouts are packed together and placed in
              * the available space according to a given [bias].
              */
-            fun Packed(bias: Float) = ChainStyle(State.Chain.PACKED, bias)
+            fun Packed(bias: Float) = ChainStyle(SolverChain.PACKED, bias)
         }
     }
 
@@ -1477,7 +1589,7 @@
         vararg elements: ConstrainedLayoutReference
     ): HorizontalAnchor.BarrierAnchor {
         val tag = createTag()
-        val barrier = state.barrier(tag, State.Direction.TOP).apply {
+        val barrier = state.barrier(tag, SolverDirection.TOP).apply {
             add(*(elements.map { it.tag }.toTypedArray()))
         }
         return HorizontalAnchor.BarrierAnchor(state, tag, barrier)
@@ -1490,7 +1602,7 @@
         vararg elements: ConstrainedLayoutReference
     ): HorizontalAnchor.BarrierAnchor {
         val tag = createTag()
-        val barrier = state.barrier(tag, State.Direction.BOTTOM).apply {
+        val barrier = state.barrier(tag, SolverDirection.BOTTOM).apply {
             add(*(elements.map { it.tag }.toTypedArray()))
         }
         return HorizontalAnchor.BarrierAnchor(state, tag, barrier)
@@ -1503,7 +1615,7 @@
         vararg elements: ConstrainedLayoutReference
     ): VerticalAnchor.BarrierAnchor {
         val tag = createTag()
-        val barrier = state.barrier(tag, State.Direction.START).apply {
+        val barrier = state.barrier(tag, SolverDirection.START).apply {
             add(*(elements.map { it.tag }.toTypedArray()))
         }
         return VerticalAnchor.BarrierAnchor(state, tag, barrier)
@@ -1516,7 +1628,7 @@
         vararg elements: ConstrainedLayoutReference
     ): VerticalAnchor.BarrierAnchor {
         val tag = createTag()
-        val barrier = state.barrier(tag, State.Direction.END).apply {
+        val barrier = state.barrier(tag, SolverDirection.END).apply {
             add(*(elements.map { it.tag }.toTypedArray()))
         }
         return VerticalAnchor.BarrierAnchor(state, tag, barrier)
@@ -1526,14 +1638,27 @@
         val verticalAnchorFunctions:
                 Array<Array<ConstraintReference.(Any) -> ConstraintReference>> = arrayOf(
             arrayOf(
-                { other -> startToStart(other) },
-                { other -> startToEnd(other) }
+                { other -> leftToLeft(other) },
+                { other -> leftToRight(other) }
             ),
             arrayOf(
-                { other -> endToStart(other) },
-                { other -> endToEnd(other) }
+                { other -> rightToLeft(other) },
+                { other -> rightToRight(other) }
             )
         )
+
+        /**
+         * Converts the index (-2 -> start, -1 -> end, 0 -> left, 1 -> right) to an index in
+         * the arrays above (0 -> left, 1 -> right).
+         */
+        // TODO(popam, b/157886946): this is temporary until we can use CL's own RTL handling
+        fun verticalAnchorIndexToFunctionIndex(index: Int, layoutDirection: LayoutDirection) =
+            when {
+                index >= 0 -> index // already left or right
+                layoutDirection == LayoutDirection.Ltr -> 2 + index // start -> left, end -> right
+                else -> -index - 1 // start -> right, end -> left
+            }
+
         val horizontalAnchorFunctions:
                 Array<Array<ConstraintReference.(Any) -> ConstraintReference>> = arrayOf(
             arrayOf(
@@ -1550,22 +1675,28 @@
     }
 }
 
+/**
+ * The state of the [ConstraintLayout] solver.
+ */
+class State(val density: Density) : SolverState() {
+    lateinit var rootIncomingConstraints: Constraints
+    lateinit var layoutDirection: LayoutDirection
+
+    override fun convertDimension(value: Any?): Int {
+        return if (value is Dp) {
+            with(density) { value.toIntPx().value }
+        } else {
+            super.convertDimension(value)
+        }
+    }
+}
+
 private class Measurer internal constructor() : BasicMeasure.Measurer {
     private val root = ConstraintWidgetContainer(0, 0).also { it.measurer = this }
     private val placeables = mutableMapOf<Measurable, Placeable>()
     private lateinit var density: Density
     private lateinit var measureScope: MeasureScope
-    private val state = object : State() {
-        lateinit var rootIncomingConstraints: Constraints
-
-        override fun convertDimension(value: Any?): Int {
-            return if (value is Dp) {
-                with(density) { value.toIntPx().value }
-            } else {
-                super.convertDimension(value)
-            }
-        }
-    }
+    private val state by lazy(LazyThreadSafetyMode.NONE) { State(density) }
 
     val widthConstraintsHolder = IntArray(2)
     val heightConstraintsHolder = IntArray(2)
@@ -1706,6 +1837,7 @@
 
     fun performMeasure(
         constraints: Constraints,
+        layoutDirection: LayoutDirection,
         constraintSet: ConstraintSet,
         measurables: List<Measurable>,
         measureScope: MeasureScope
@@ -1729,11 +1861,12 @@
             }
         )
         // Build constraint set and apply it to the state.
+        state.rootIncomingConstraints = constraints
+        state.layoutDirection = layoutDirection
         constraintSet.applyTo(state, measurables)
         state.apply(root)
         root.width = constraints.maxWidth.value
         root.height = constraints.maxHeight.value
-        state.rootIncomingConstraints = constraints
         root.updateHierarchy()
 
         if (DEBUG) {
@@ -1784,7 +1917,7 @@
             val measurable = child.companionWidget
             if (measurable !is Measurable) continue
             // TODO(popam, b/157886946): check if measurer's rtl support should be used instead
-            placeables[measurable]?.place(child.x.ipx, child.y.ipx)
+            placeables[measurable]?.placeAbsolute(child.x.ipx, child.y.ipx)
         }
     }
 
@@ -1792,6 +1925,9 @@
 }
 
 private typealias SolverDimension = androidx.constraintlayout.core.state.Dimension
+private typealias SolverState = androidx.constraintlayout.core.state.State
+private typealias SolverDirection = androidx.constraintlayout.core.state.State.Direction
+private typealias SolverChain = androidx.constraintlayout.core.state.State.Chain
 private val DEBUG = true
 private fun ConstraintWidget.toDebugString() =
     "$debugName " +