[go: nahoru, domu]

Rtl support in Column and Row.

Bug: 146346559
Bug: 149198860
Test: layout/material tests + new tests for Column/Row
Change-Id: I984990928333b9db526003c4c0c39c0464393b31
diff --git a/ui/ui-layout/api/0.1.0-dev05.txt b/ui/ui-layout/api/0.1.0-dev05.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/0.1.0-dev05.txt
+++ b/ui/ui-layout/api/0.1.0-dev05.txt
@@ -11,24 +11,55 @@
     method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class Arrangement {
-    ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
-    field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+  public interface Arrangement {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
   }
 
-  public static final class Arrangement.Companion {
-    method public androidx.ui.layout.Arrangement getBegin();
-    method public androidx.ui.layout.Arrangement getCenter();
-    method public androidx.ui.layout.Arrangement getEnd();
-    method public androidx.ui.layout.Arrangement getSpaceAround();
-    method public androidx.ui.layout.Arrangement getSpaceBetween();
-    method public androidx.ui.layout.Arrangement getSpaceEvenly();
-    property public final androidx.ui.layout.Arrangement Begin;
-    property public final androidx.ui.layout.Arrangement Center;
-    property public final androidx.ui.layout.Arrangement End;
-    property public final androidx.ui.layout.Arrangement SpaceAround;
-    property public final androidx.ui.layout.Arrangement SpaceBetween;
-    property public final androidx.ui.layout.Arrangement SpaceEvenly;
+  public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+  }
+
+  public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+  }
+
+  public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+  }
+
+  public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+  }
+
+  public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+  }
+
+  public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+  }
+
+  public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+  }
+
+  public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
   }
 
   public final class AspectRatioKt {
@@ -112,8 +143,8 @@
   }
 
   public final class FlexKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/current.txt b/ui/ui-layout/api/current.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/current.txt
+++ b/ui/ui-layout/api/current.txt
@@ -11,24 +11,55 @@
     method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class Arrangement {
-    ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
-    field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+  public interface Arrangement {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
   }
 
-  public static final class Arrangement.Companion {
-    method public androidx.ui.layout.Arrangement getBegin();
-    method public androidx.ui.layout.Arrangement getCenter();
-    method public androidx.ui.layout.Arrangement getEnd();
-    method public androidx.ui.layout.Arrangement getSpaceAround();
-    method public androidx.ui.layout.Arrangement getSpaceBetween();
-    method public androidx.ui.layout.Arrangement getSpaceEvenly();
-    property public final androidx.ui.layout.Arrangement Begin;
-    property public final androidx.ui.layout.Arrangement Center;
-    property public final androidx.ui.layout.Arrangement End;
-    property public final androidx.ui.layout.Arrangement SpaceAround;
-    property public final androidx.ui.layout.Arrangement SpaceBetween;
-    property public final androidx.ui.layout.Arrangement SpaceEvenly;
+  public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+  }
+
+  public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+  }
+
+  public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+  }
+
+  public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+  }
+
+  public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+  }
+
+  public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+  }
+
+  public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+  }
+
+  public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
   }
 
   public final class AspectRatioKt {
@@ -112,8 +143,8 @@
   }
 
   public final class FlexKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev05.txt b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev05.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev05.txt
+++ b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev05.txt
@@ -11,24 +11,55 @@
     method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class Arrangement {
-    ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
-    field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+  public interface Arrangement {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
   }
 
-  public static final class Arrangement.Companion {
-    method public androidx.ui.layout.Arrangement getBegin();
-    method public androidx.ui.layout.Arrangement getCenter();
-    method public androidx.ui.layout.Arrangement getEnd();
-    method public androidx.ui.layout.Arrangement getSpaceAround();
-    method public androidx.ui.layout.Arrangement getSpaceBetween();
-    method public androidx.ui.layout.Arrangement getSpaceEvenly();
-    property public final androidx.ui.layout.Arrangement Begin;
-    property public final androidx.ui.layout.Arrangement Center;
-    property public final androidx.ui.layout.Arrangement End;
-    property public final androidx.ui.layout.Arrangement SpaceAround;
-    property public final androidx.ui.layout.Arrangement SpaceBetween;
-    property public final androidx.ui.layout.Arrangement SpaceEvenly;
+  public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+  }
+
+  public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+  }
+
+  public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+  }
+
+  public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+  }
+
+  public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+  }
+
+  public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+  }
+
+  public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+  }
+
+  public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
   }
 
   public final class AspectRatioKt {
@@ -112,8 +143,8 @@
   }
 
   public final class FlexKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/public_plus_experimental_current.txt b/ui/ui-layout/api/public_plus_experimental_current.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/public_plus_experimental_current.txt
+++ b/ui/ui-layout/api/public_plus_experimental_current.txt
@@ -11,24 +11,55 @@
     method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class Arrangement {
-    ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
-    field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+  public interface Arrangement {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
   }
 
-  public static final class Arrangement.Companion {
-    method public androidx.ui.layout.Arrangement getBegin();
-    method public androidx.ui.layout.Arrangement getCenter();
-    method public androidx.ui.layout.Arrangement getEnd();
-    method public androidx.ui.layout.Arrangement getSpaceAround();
-    method public androidx.ui.layout.Arrangement getSpaceBetween();
-    method public androidx.ui.layout.Arrangement getSpaceEvenly();
-    property public final androidx.ui.layout.Arrangement Begin;
-    property public final androidx.ui.layout.Arrangement Center;
-    property public final androidx.ui.layout.Arrangement End;
-    property public final androidx.ui.layout.Arrangement SpaceAround;
-    property public final androidx.ui.layout.Arrangement SpaceBetween;
-    property public final androidx.ui.layout.Arrangement SpaceEvenly;
+  public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+  }
+
+  public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+  }
+
+  public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+  }
+
+  public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+  }
+
+  public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+  }
+
+  public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+  }
+
+  public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+  }
+
+  public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
   }
 
   public final class AspectRatioKt {
@@ -112,8 +143,8 @@
   }
 
   public final class FlexKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/restricted_0.1.0-dev05.txt b/ui/ui-layout/api/restricted_0.1.0-dev05.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/restricted_0.1.0-dev05.txt
+++ b/ui/ui-layout/api/restricted_0.1.0-dev05.txt
@@ -11,24 +11,55 @@
     method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class Arrangement {
-    ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
-    field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+  public interface Arrangement {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
   }
 
-  public static final class Arrangement.Companion {
-    method public androidx.ui.layout.Arrangement getBegin();
-    method public androidx.ui.layout.Arrangement getCenter();
-    method public androidx.ui.layout.Arrangement getEnd();
-    method public androidx.ui.layout.Arrangement getSpaceAround();
-    method public androidx.ui.layout.Arrangement getSpaceBetween();
-    method public androidx.ui.layout.Arrangement getSpaceEvenly();
-    property public final androidx.ui.layout.Arrangement Begin;
-    property public final androidx.ui.layout.Arrangement Center;
-    property public final androidx.ui.layout.Arrangement End;
-    property public final androidx.ui.layout.Arrangement SpaceAround;
-    property public final androidx.ui.layout.Arrangement SpaceBetween;
-    property public final androidx.ui.layout.Arrangement SpaceEvenly;
+  public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+  }
+
+  public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+  }
+
+  public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+  }
+
+  public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+  }
+
+  public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+  }
+
+  public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+  }
+
+  public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+  }
+
+  public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
   }
 
   public final class AspectRatioKt {
@@ -112,8 +143,8 @@
   }
 
   public final class FlexKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/restricted_current.txt b/ui/ui-layout/api/restricted_current.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/restricted_current.txt
+++ b/ui/ui-layout/api/restricted_current.txt
@@ -11,24 +11,55 @@
     method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class Arrangement {
-    ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
-    field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+  public interface Arrangement {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
   }
 
-  public static final class Arrangement.Companion {
-    method public androidx.ui.layout.Arrangement getBegin();
-    method public androidx.ui.layout.Arrangement getCenter();
-    method public androidx.ui.layout.Arrangement getEnd();
-    method public androidx.ui.layout.Arrangement getSpaceAround();
-    method public androidx.ui.layout.Arrangement getSpaceBetween();
-    method public androidx.ui.layout.Arrangement getSpaceEvenly();
-    property public final androidx.ui.layout.Arrangement Begin;
-    property public final androidx.ui.layout.Arrangement Center;
-    property public final androidx.ui.layout.Arrangement End;
-    property public final androidx.ui.layout.Arrangement SpaceAround;
-    property public final androidx.ui.layout.Arrangement SpaceBetween;
-    property public final androidx.ui.layout.Arrangement SpaceEvenly;
+  public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+  }
+
+  public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+  }
+
+  public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+  }
+
+  public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+  }
+
+  public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+  }
+
+  public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+  }
+
+  public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+  }
+
+  public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+    method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+    field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+  }
+
+  public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
   }
 
   public final class AspectRatioKt {
@@ -112,8 +143,8 @@
   }
 
   public final class FlexKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml b/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
index 41c77fe..713c5d4 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
@@ -43,6 +43,14 @@
                 <category android:name="androidx.ui.demos.SAMPLE_CODE" />
             </intent-filter>
         </activity>
+        <activity android:name=".RtlDemosActivity"
+            android:configChanges="orientation|screenSize"
+            android:label="Layout/Rtl support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="androidx.ui.demos.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
 
         <activity android:name=".TableActivity"
             android:configChanges="orientation|screenSize"
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutActivity.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutActivity.kt
index 48d6e31..011fb8b 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutActivity.kt
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutActivity.kt
@@ -24,8 +24,8 @@
 import androidx.ui.core.setContent
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.Color
-import androidx.ui.layout.Arrangement
 import androidx.ui.layout.Column
+import androidx.ui.layout.Arrangement
 import androidx.ui.layout.LayoutGravity
 import androidx.ui.layout.LayoutHeight
 import androidx.ui.layout.LayoutSize
@@ -106,7 +106,7 @@
             }
             Spacer(LayoutWidth(24.dp))
             Stack(LayoutHeight(ExampleSize) + DrawBackground(color = lightGrey)) {
-                Column(LayoutHeight.Fill, arrangement = Arrangement.End) {
+                Column(LayoutHeight.Fill, arrangement = Arrangement.Bottom) {
                     PurpleSquare()
                     CyanSquare()
                 }
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemos.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemos.kt
new file mode 100644
index 0000000..b8cdf35
--- /dev/null
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemos.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.layout.demos
+
+import android.app.Activity
+import android.os.Bundle
+import androidx.compose.Composable
+import androidx.compose.Providers
+import androidx.ui.core.LayoutDirection
+import androidx.ui.core.LayoutDirectionAmbient
+import androidx.ui.core.Text
+import androidx.ui.core.setContent
+import androidx.ui.graphics.Color
+import androidx.ui.layout.Column
+import androidx.ui.layout.LayoutGravity
+import androidx.ui.layout.LayoutSize
+import androidx.ui.layout.Row
+import androidx.ui.layout.Arrangement
+import androidx.ui.layout.LayoutWidth
+import androidx.ui.layout.Stack
+import androidx.ui.foundation.DrawBackground
+import androidx.ui.unit.dp
+
+class RtlDemosActivity : Activity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContent {
+            Column(arrangement = Arrangement.SpaceEvenly) {
+                Text("TEXT", LayoutGravity.Center)
+                testText()
+                Text("ROW", LayoutGravity.Center)
+                testRow()
+                Text("ROW WITH AMBIENT", LayoutGravity.Center)
+                testRow_ambient()
+                Text("RELATIVE TO SIBLINGS", LayoutGravity.Center)
+                testSiblings()
+            }
+        }
+    }
+}
+
+val boxSize = LayoutSize(50.dp, 50.dp)
+val size = LayoutSize(10.dp, 10.dp)
+
+@Composable
+fun testRow() {
+    Row {
+        Stack(boxSize + DrawBackground(Color.Red)) {}
+        Stack(boxSize + DrawBackground(Color.Green)) {}
+        Row {
+            Stack(boxSize + DrawBackground(Color.Magenta)) {}
+            Stack(boxSize + DrawBackground(Color.Yellow)) {}
+            Stack(boxSize + DrawBackground(Color.Cyan)) {}
+        }
+        Stack(boxSize + DrawBackground(Color.Blue)) {}
+    }
+}
+
+@Composable
+fun testRow_ambient() {
+    Row {
+        Stack(boxSize + DrawBackground(Color.Red)) {}
+        Stack(boxSize + DrawBackground(Color.Green)) {}
+        Providers(LayoutDirectionAmbient provides LayoutDirection.Ltr) {
+            Row {
+                Stack(boxSize + DrawBackground(Color.Magenta)) {}
+                Stack(boxSize + DrawBackground(Color.Yellow)) {}
+                Stack(boxSize + DrawBackground(Color.Cyan)) {}
+            }
+        }
+        Stack(boxSize + DrawBackground(Color.Blue)) {}
+    }
+}
+
+@Composable
+fun testText() {
+    Column {
+        Row {
+            Stack(boxSize + DrawBackground(Color.Red)) {}
+            Stack(boxSize + DrawBackground(Color.Green)) {}
+            Stack(boxSize + DrawBackground(Color.Blue)) {}
+        }
+        Text("Text.")
+        Text("Width filled text.", LayoutWidth.Fill)
+        Text("שלום!")
+        Text("שלום!", LayoutWidth.Fill)
+        Text("-->")
+        Text("-->", LayoutWidth.Fill)
+    }
+}
+
+@Composable
+fun testSiblings() {
+    Column {
+        Stack(boxSize +
+                DrawBackground(Color.Red) +
+                LayoutGravity.RelativeToSiblings { p -> p.width }
+        ) {}
+        Stack(boxSize +
+                DrawBackground(Color.Green) +
+                LayoutGravity.RelativeToSiblings { p -> p.width * 0.5 }
+        ) {}
+        Stack(boxSize +
+                DrawBackground(Color.Blue) +
+                LayoutGravity.RelativeToSiblings { p -> p.width / 4 }
+        ) {}
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/FlexTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/FlexTest.kt
index 841765d..2aa8032 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/FlexTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/FlexTest.kt
@@ -33,13 +33,14 @@
 import androidx.ui.core.WithConstraints
 import androidx.ui.core.globalPosition
 import androidx.ui.layout.Align
-import androidx.ui.layout.Arrangement
 import androidx.ui.layout.Center
 import androidx.ui.layout.Column
 import androidx.ui.layout.Container
 import androidx.ui.layout.DpConstraints
+import androidx.ui.layout.Arrangement
 import androidx.ui.layout.LayoutAlign
 import androidx.ui.layout.LayoutAspectRatio
+import androidx.ui.layout.LayoutDirectionModifier
 import androidx.ui.layout.LayoutGravity
 import androidx.ui.layout.LayoutHeight
 import androidx.ui.layout.LayoutPadding
@@ -2087,7 +2088,7 @@
         val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         show {
             Center {
-                Row(LayoutWidth.Fill, arrangement = Arrangement(customArrangement)) {
+                Row(LayoutWidth.Fill, arrangement = customHorizontalArrangement) {
                     for (i in childPosition.indices) {
                         Container(width = sizeDp, height = sizeDp) {
                             OnPositioned( coordinates ->
@@ -2175,7 +2176,7 @@
         val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         show {
             Center {
-                Column(LayoutHeight.Fill, arrangement = Arrangement.End) {
+                Column(LayoutHeight.Fill, arrangement = Arrangement.Bottom) {
                     for (i in 0 until childPosition.size) {
                         Container(width = sizeDp, height = sizeDp) {
                             OnPositioned( coordinates ->
@@ -2390,7 +2391,7 @@
         val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         show {
             Center {
-                Column(LayoutHeight.Fill, arrangement = Arrangement(customArrangement)) {
+                Column(LayoutHeight.Fill, arrangement = customVerticalArrangement) {
                     for (i in childPosition.indices) {
                         Container(width = sizeDp, height = sizeDp) {
                             OnPositioned( coordinates ->
@@ -2517,7 +2518,7 @@
                 )
             }
         }, @Composable {
-            Row(LayoutWidth.Fill, arrangement = Arrangement.Begin) {
+            Row(LayoutWidth.Fill, arrangement = Arrangement.Start) {
                 Container(LayoutAspectRatio(2f), children = emptyContent())
                 ConstrainedBox(DpConstraints.fixed(50.dp, 40.dp), children = emptyContent())
             }
@@ -2615,7 +2616,7 @@
                 )
             }
         }, @Composable {
-            Row(arrangement = Arrangement.Begin) {
+            Row(arrangement = Arrangement.Start) {
                 ConstrainedBox(
                     DpConstraints.fixed(20.dp, 30.dp),
                     LayoutFlexible(3f),
@@ -2809,7 +2810,7 @@
                 ConstrainedBox(DpConstraints.fixed(50.dp, 40.dp), children = emptyContent())
             }
         }, @Composable {
-            Column(LayoutHeight.Fill, arrangement = Arrangement.Begin) {
+            Column(LayoutHeight.Fill, arrangement = Arrangement.Top) {
                 Container(LayoutAspectRatio(2f), children = emptyContent())
                 ConstrainedBox(DpConstraints.fixed(50.dp, 40.dp), children = emptyContent())
             }
@@ -2819,7 +2820,7 @@
                 ConstrainedBox(DpConstraints.fixed(50.dp, 40.dp), children = emptyContent())
             }
         }, @Composable {
-            Column(LayoutHeight.Fill, arrangement = Arrangement.End) {
+            Column(LayoutHeight.Fill, arrangement = Arrangement.Bottom) {
                 Container(LayoutGravity.End + LayoutAspectRatio(2f), children = emptyContent())
                 ConstrainedBox(
                     DpConstraints.fixed(50.dp, 40.dp),
@@ -2899,7 +2900,7 @@
                 ConstrainedBox(DpConstraints.fixed(30.dp, 20.dp), LayoutGravity.End) { }
             }
         }, @Composable {
-            Column(arrangement = Arrangement.Begin) {
+            Column(arrangement = Arrangement.Top) {
                 ConstrainedBox(DpConstraints.fixed(30.dp, 20.dp), LayoutFlexible(3f)) { }
                 ConstrainedBox(DpConstraints.fixed(40.dp, 30.dp), LayoutFlexible(2f)) { }
                 Container(LayoutAspectRatio(0.5f) + LayoutFlexible(2f)) { }
@@ -2924,7 +2925,7 @@
                 ) { }
             }
         }, @Composable {
-            Column(arrangement = Arrangement.End) {
+            Column(arrangement = Arrangement.Bottom) {
                 ConstrainedBox(
                     constraints = DpConstraints.fixed(30.dp, 20.dp),
                     modifier = LayoutFlexible(3f) + LayoutGravity.End
@@ -3089,6 +3090,223 @@
         assertEquals(PxPosition(size.toPx(), size.toPx()), containerPosition.value)
     }
     // endregion
+
+    // region Rtl tests
+    @Test
+    fun testRow_Rtl_arrangementStart() = with(density) {
+        val sizeDp = 35.dp
+        val size = sizeDp.toIntPx()
+
+        val drawLatch = CountDownLatch(2)
+        val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+        show {
+            Row(LayoutWidth.Fill + LayoutDirectionModifier.Rtl) {
+                Container(LayoutSize(sizeDp, sizeDp)) {
+                    OnPositioned( coordinates ->
+                        childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+
+                Container(LayoutSize(sizeDp * 2, sizeDp * 2)) {
+                    OnPositioned( coordinates ->
+                        childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+            }
+        }
+
+        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+        val root = findAndroidComposeView()
+        waitForDraw(root)
+        val rootWidth = root.width.px
+
+        assertEquals(PxPosition(rootWidth - size.toPx(), 0.px), childPosition[0])
+        assertEquals(
+            PxPosition(rootWidth - (sizeDp.toPx() * 3).round().toPx(), 0.px),
+            childPosition[1]
+        )
+    }
+
+    @Test
+    fun testRow_Rtl_arrangementEnd() = with(density) {
+        val sizeDp = 35.dp
+
+        val drawLatch = CountDownLatch(2)
+        val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+        show {
+            Row(
+                LayoutWidth.Fill + LayoutDirectionModifier.Rtl,
+                arrangement = Arrangement.End
+            ) {
+                Container(LayoutSize(sizeDp, sizeDp)) {
+                    OnPositioned( coordinates ->
+                        childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+
+                Container(LayoutSize(sizeDp * 2, sizeDp * 2)) {
+                    OnPositioned( coordinates ->
+                        childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+            }
+        }
+
+        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+        assertEquals(PxPosition((sizeDp.toPx() * 2).round().toPx(), 0.px), childPosition[0])
+        assertEquals(PxPosition(0.px, 0.px), childPosition[1])
+    }
+
+    @Test
+    fun testRow_Rtl_customArrangement() = with(density) {
+        val sizeDp = 35.dp
+
+        val drawLatch = CountDownLatch(2)
+        val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+        show {
+            Row(
+                LayoutWidth.Fill + LayoutDirectionModifier.Rtl,
+                arrangement = customHorizontalArrangement
+            ) {
+                Container(width = sizeDp, height = sizeDp) {
+                    OnPositioned( coordinates ->
+                        childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+
+                Container(width = (sizeDp * 2), height = (sizeDp * 2)) {
+                    OnPositioned( coordinates ->
+                        childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+            }
+        }
+
+        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+        val root = findAndroidComposeView()
+        waitForDraw(root)
+
+        assertEquals(PxPosition((sizeDp.toPx() * 2).round().toPx(), 0.px), childPosition[0])
+        assertEquals(PxPosition(0.px, 0.px), childPosition[1])
+    }
+
+    @Test
+    fun testColumn_Rtl_gravityStart() = with(density) {
+        val sizeDp = 35.dp
+        val size = sizeDp.toIntPx()
+
+        val drawLatch = CountDownLatch(2)
+        val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+        show {
+            Column(LayoutWidth.Fill + LayoutDirectionModifier.Rtl) {
+                Container(LayoutSize(sizeDp, sizeDp)) {
+                    OnPositioned( coordinates ->
+                        childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+
+                Container(LayoutSize(sizeDp * 2, sizeDp * 2)) {
+                    OnPositioned( coordinates ->
+                        childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+            }
+        }
+
+        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+        val root = findAndroidComposeView()
+        waitForDraw(root)
+        val rootWidth = root.width.px
+
+        assertEquals(PxPosition(rootWidth - size.toPx(), 0.px), childPosition[0])
+        assertEquals(
+            PxPosition((rootWidth - (sizeDp * 2).toPx()).round().toPx(), size.toPx()),
+            childPosition[1]
+        )
+    }
+
+    @Test
+    fun testColumn_Rtl_gravityEnd() = with(density) {
+        val sizeDp = 50.dp
+        val size = sizeDp.toIntPx()
+
+        val drawLatch = CountDownLatch(2)
+        val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+        show {
+            Column(LayoutWidth.Fill + LayoutDirectionModifier.Rtl) {
+                Container(LayoutSize(sizeDp, sizeDp) + LayoutGravity.End) {
+                    OnPositioned( coordinates ->
+                        childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+
+                Container(LayoutSize(sizeDp * 2, sizeDp * 2) + LayoutGravity.End) {
+                    OnPositioned( coordinates ->
+                        childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+            }
+        }
+
+        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+        assertEquals(PxPosition(0.px, 0.px), childPosition[0])
+        assertEquals(PxPosition(0.px, size.toPx()), childPosition[1])
+    }
+
+    @Test
+    fun testColumn_Rtl_gravityRelativeToSiblings() = with(density) {
+        val sizeDp = 50.dp
+        val size = sizeDp.toIntPx()
+
+        val drawLatch = CountDownLatch(2)
+        val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+        show {
+            Column(LayoutWidth.Fill + LayoutDirectionModifier.Rtl) {
+                Container(LayoutSize(sizeDp, sizeDp) +
+                        LayoutGravity.RelativeToSiblings { it.width }
+                ) {
+                    OnPositioned( coordinates ->
+                        childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+
+                Container(LayoutSize(sizeDp, sizeDp) +
+                        LayoutGravity.RelativeToSiblings { it.width / 2 }
+                ) {
+                    OnPositioned( coordinates ->
+                        childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+                        drawLatch.countDown()
+                    })
+                }
+            }
+        }
+
+        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+        val root = findAndroidComposeView()
+        waitForDraw(root)
+        val rootWidth = root.width.px
+
+        assertEquals(PxPosition(rootWidth - size.toPx(), 0.px), childPosition[0])
+        assertEquals(
+            PxPosition((rootWidth - size.toPx() * 1.5f).round().toPx(), size.toPx()),
+            childPosition[1]
+        )
+    }
+
+    // endregion
 }
 
 private val TestHorizontalLine = HorizontalAlignmentLine(::min)
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt
index f63bcf9..2242e5e 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt
@@ -27,11 +27,13 @@
 import androidx.ui.core.AndroidComposeView
 import androidx.ui.core.Constraints
 import androidx.ui.core.Layout
+import androidx.ui.core.LayoutDirection
 import androidx.ui.core.Modifier
 import androidx.ui.core.OnPositioned
 import androidx.ui.core.Ref
 import androidx.ui.core.enforce
 import androidx.ui.core.setContent
+import androidx.ui.layout.Arrangement
 import androidx.ui.layout.Constraints
 import androidx.ui.layout.DpConstraints
 import androidx.ui.unit.Density
@@ -292,20 +294,56 @@
         )
     }
 
-    internal val customArrangement = { totalSize: IntPx, size: List<IntPx> ->
-        val usedSpace = size.fold(0.ipx) { sum, e -> sum + e }
-        val step = if (size.size < 2) {
-            0.px
-        } else {
-            (totalSize - usedSpace).toPx() * 2 / (size.lastIndex * size.size)
+    internal val customVerticalArrangement = object : Arrangement.Vertical {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ): List<IntPx> {
+            val positions = mutableListOf<IntPx>()
+            var current = 0.px
+            val usedSpace = size.fold(0.ipx) { sum, e -> sum + e }
+            val step = if (size.size < 2) {
+                0.px
+            } else {
+                (totalSize - usedSpace).toPx() * 2 / (size.lastIndex * size.size)
+            }
+            size.forEachIndexed { i, childSize ->
+                current += step * i
+                positions.add(current.round())
+                current += childSize.toPx()
+            }
+            return positions
         }
-        val positions = mutableListOf<IntPx>()
-        var current = 0.px
-        size.forEachIndexed { i, childSize ->
-            current += step * i
-            positions.add(current.round())
-            current += childSize.toPx()
+    }
+
+    internal val customHorizontalArrangement = object : Arrangement.Horizontal {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ): List<IntPx> {
+            val positions = mutableListOf<IntPx>()
+            var current = 0.px
+            if (layoutDirection == LayoutDirection.Rtl) {
+                size.forEach {
+                    positions.add(current.round())
+                    current += it
+                }
+            } else {
+                val usedSpace = size.fold(0.ipx) { sum, e -> sum + e }
+                val step = if (size.size < 2) {
+                    0.px
+                } else {
+                    (totalSize - usedSpace).toPx() * 2 / (size.lastIndex * size.size)
+                }
+                size.forEachIndexed { i, childSize ->
+                    current += step * i
+                    positions.add(current.round())
+                    current += childSize.toPx()
+                }
+            }
+            return positions
         }
-        positions
     }
 }
\ No newline at end of file
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
index 701c398..b1cbb48 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
@@ -26,6 +26,7 @@
 import androidx.ui.core.IntrinsicMeasurable
 import androidx.ui.core.IntrinsicMeasureBlock
 import androidx.ui.core.Layout
+import androidx.ui.core.LayoutDirection
 import androidx.ui.core.Modifier
 import androidx.ui.core.ParentDataModifier
 import androidx.ui.core.Placeable
@@ -226,7 +227,7 @@
 @Composable
 fun Row(
     modifier: Modifier = Modifier.None,
-    arrangement: Arrangement = Arrangement.Begin,
+    arrangement: Arrangement.Horizontal = Arrangement.Start,
     children: @Composable() RowScope.() -> Unit
 ) {
     FlexLayout(
@@ -270,7 +271,7 @@
 @Composable
 fun Column(
     modifier: Modifier = Modifier.None,
-    arrangement: Arrangement = Arrangement.Begin,
+    arrangement: Arrangement.Vertical = Arrangement.Top,
     children: @Composable() ColumnScope.() -> Unit
 ) {
     FlexLayout(
@@ -313,6 +314,8 @@
  * Used to specify the alignment of a layout's children, in main axis direction.
  */
 enum class MainAxisAlignment(internal val arrangement: Arrangement) {
+    // TODO(soboleva) support RTl in Flow
+    // workaround for now - use Arrangement that equals to previous Arrangement
     /**
      * Place children such that they are as close as possible to the middle of the main axis.
      */
@@ -320,12 +323,11 @@
     /**
      * Place children such that they are as close as possible to the start of the main axis.
      */
-    // TODO(popam): Consider rtl directionality.
-    Start(Arrangement.Begin),
+    Start(Arrangement.Top),
     /**
      * Place children such that they are as close as possible to the end of the main axis.
      */
-    End(Arrangement.End),
+    End(Arrangement.Bottom),
     /**
      * Place children such that they are spaced evenly across the main axis, including free
      * space before the first child and after the last child.
@@ -347,46 +349,96 @@
 /**
  * Used to specify the arrangement of the layout's children in [Row] or [Column] in the main axis
  * direction (horizontal and vertical, respectively).
- * @constructor Creates an arrangement using the [arrangeBlock]. Use it to provide your own
+ * @constructor Creates an arrangement using the [arrange] function. Use it to provide your own
  * arrangement of the layout's children.
  */
 @Immutable
-class Arrangement(
-    internal val arrangeBlock: (totalSize: IntPx, elementSize: List<IntPx>) -> List<IntPx>
-) {
-    companion object {
-        /**
-         * Place children such that they are as close as possible to the beginning of the main axis.
-         */
-        // TODO(soboleva/popam): Consider rtl directionality.
-        val Begin = Arrangement { _, size ->
-                val positions = mutableListOf<IntPx>()
-                var current = 0.ipx
-                size.forEach {
-                    positions.add(current)
-                    current += it
-                }
-                positions
-            }
+interface Arrangement {
+    /**
+     * Places the layout children inside the parent layout along the main axis.
+     *
+     * @param totalSize Available space that can be occupied by the children.
+     * @param size A list of sizes of all children.
+     * @param layoutDirection A layout direction, left-to-right or right-to-left, of the parent
+     * layout that should be taken into account when determining positions of the children in
+     * horizontal direction.
+     */
+    fun arrange(totalSize: IntPx, size: List<IntPx>, layoutDirection: LayoutDirection): List<IntPx>
 
-        /**
-         * Place children such that they are as close as possible to the end of the main axis.
-         */
-        val End = Arrangement { totalSize, size ->
-            val consumedSize = size.fold(0.ipx) { a, b -> a + b }
-            val positions = mutableListOf<IntPx>()
-            var current = totalSize - consumedSize
-            size.forEach {
-                positions.add(current)
-                current += it
-            }
-            positions
+    /**
+     * Used to specify the vertical arrangement of the layout's children in a [Column].
+     */
+    interface Vertical : Arrangement
+    /**
+     * Used to specify the horizontal arrangement of the layout's children in a [Row].
+     */
+    interface Horizontal : Arrangement
+
+    /**
+     * Place children horizontally such that they are as close as possible to the beginning of the
+     * main axis.
+     */
+    object Start : Horizontal {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ) = if (layoutDirection == LayoutDirection.Ltr) {
+            placeLeftOrTop(size)
+        } else {
+            placeRightOrBottom(totalSize, size)
         }
+    }
 
-        /**
-         * Place children such that they are as close as possible to the middle of the main axis.
-         */
-        val Center = Arrangement { totalSize, size ->
+    /**
+     * Place children horizontally such that they are as close as possible to the end of the main
+     * axis.
+     */
+    object End : Horizontal {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ) = if (layoutDirection == LayoutDirection.Ltr) {
+            placeRightOrBottom(totalSize, size)
+        } else {
+            placeLeftOrTop(size)
+        }
+    }
+
+    /**
+     * Place children vertically such that they are as close as possible to the top of the main
+     * axis.
+     */
+    object Top : Vertical {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ) = placeLeftOrTop(size)
+    }
+
+    /**
+     * Place children vertically such that they are as close as possible to the bottom of the main
+     * axis.
+     */
+    object Bottom : Vertical {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ) = placeRightOrBottom(totalSize, size)
+    }
+
+    /**
+     * Place children such that they are as close as possible to the middle of the main axis.
+     */
+    object Center : Vertical, Horizontal {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ): List<IntPx> {
             val consumedSize = size.fold(0.ipx) { a, b -> a + b }
             val positions = mutableListOf<IntPx>()
             var current = (totalSize - consumedSize).toPx() / 2
@@ -394,14 +446,20 @@
                 positions.add(current.round())
                 current += it
             }
-            positions
+            return positions
         }
+    }
 
-        /**
-         * Place children such that they are spaced evenly across the main axis, including free
-         * space before the first child and after the last child.
-         */
-        val SpaceEvenly = Arrangement { totalSize, size ->
+    /**
+     * Place children such that they are spaced evenly across the main axis, including free
+     * space before the first child and after the last child.
+     */
+    object SpaceEvenly : Vertical, Horizontal {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ): List<IntPx> {
             val consumedSize = size.fold(0.ipx) { a, b -> a + b }
             val gapSize = (totalSize - consumedSize).toPx() / (size.size + 1)
             val positions = mutableListOf<IntPx>()
@@ -410,14 +468,20 @@
                 positions.add(current.round())
                 current += it.toPx() + gapSize
             }
-            positions
+            return positions
         }
+    }
 
-        /**
-         * Place children such that they are spaced evenly across the main axis, without free
-         * space before the first child or after the last child.
-         */
-        val SpaceBetween = Arrangement { totalSize, size ->
+    /**
+     * Place children such that they are spaced evenly across the main axis, without free
+     * space before the first child or after the last child.
+     */
+    object SpaceBetween : Vertical, Horizontal {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ): List<IntPx> {
             val consumedSize = size.fold(0.ipx) { a, b -> a + b }
             val gapSize = if (size.size > 1) {
                 (totalSize - consumedSize).toPx() / (size.size - 1)
@@ -430,15 +494,21 @@
                 positions.add(current.round())
                 current += it.toPx() + gapSize
             }
-            positions
+            return positions
         }
+    }
 
-        /**
-         * Place children such that they are spaced evenly across the main axis, including free
-         * space before the first child and after the last child, but half the amount of space
-         * existing otherwise between two consecutive children.
-         */
-        val SpaceAround = Arrangement { totalSize, size ->
+    /**
+     * Place children such that they are spaced evenly across the main axis, including free
+     * space before the first child and after the last child, but half the amount of space
+     * existing otherwise between two consecutive children.
+     */
+    object SpaceAround : Vertical, Horizontal {
+        override fun arrange(
+            totalSize: IntPx,
+            size: List<IntPx>,
+            layoutDirection: LayoutDirection
+        ): List<IntPx> {
             val consumedSize = size.fold(0.ipx) { a, b -> a + b }
             val gapSize = if (size.isNotEmpty()) {
                 (totalSize - consumedSize).toPx() / size.size
@@ -451,7 +521,29 @@
                 positions.add(current.round())
                 current += it.toPx() + gapSize
             }
-            positions
+            return positions
+        }
+    }
+
+    private companion object {
+        private fun placeRightOrBottom(totalSize: IntPx, size: List<IntPx>): List<IntPx> {
+            val consumedSize = size.fold(0.ipx) { a, b -> a + b }
+            val positions = mutableListOf<IntPx>()
+            var current = totalSize - consumedSize
+            size.forEach {
+                positions.add(current)
+                current += it
+            }
+            return positions
+        }
+        private fun placeLeftOrTop(size: List<IntPx>): List<IntPx> {
+            val positions = mutableListOf<IntPx>()
+            var current = 0.ipx
+            size.forEach {
+                positions.add(current)
+                current += it
+            }
+            return positions
         }
     }
 }
@@ -575,7 +667,15 @@
         minIntrinsicHeightMeasureBlock = MinIntrinsicHeightMeasureBlock(orientation),
         maxIntrinsicWidthMeasureBlock = MaxIntrinsicWidthMeasureBlock(orientation),
         maxIntrinsicHeightMeasureBlock = MaxIntrinsicHeightMeasureBlock(orientation)
-    ) { measurables, outerConstraints ->
+    ) { ltrMeasurables, outerConstraints ->
+        // rtl support
+        val measurables = if (orientation == LayoutOrientation.Horizontal &&
+                layoutDirection == LayoutDirection.Rtl) {
+            ltrMeasurables.asReversed()
+        } else {
+            ltrMeasurables
+        }
+
         val constraints = OrientationIndependentConstraints(outerConstraints, orientation)
 
         var totalFlex = 0f
@@ -703,16 +803,31 @@
         }
         layout(layoutWidth, layoutHeight) {
             val childrenMainAxisSize = placeables.map { it!!.mainAxisSize() }
-            val mainAxisPositions =
-                arrangement.arrangeBlock(mainAxisLayoutSize, childrenMainAxisSize)
+            val mainAxisPositions = arrangement.arrange(
+                mainAxisLayoutSize,
+                childrenMainAxisSize,
+                layoutDirection
+            )
             placeables.forEachIndexed { index, placeable ->
                 placeable!!
-                val childCrossAlignment =
-                    measurables[index].crossAxisAlignment ?: crossAxisAlignment
+                val measurable = measurables[index]
+                val childCrossAlignment = measurable.crossAxisAlignment ?: crossAxisAlignment
+                val isRtlColumn = orientation == LayoutOrientation.Vertical &&
+                        layoutDirection == LayoutDirection.Rtl
                 val crossAxis = when (childCrossAlignment) {
-                    CrossAxisAlignment.Start -> IntPx.Zero
+                    CrossAxisAlignment.Start -> {
+                        if (isRtlColumn) {
+                            crossAxisLayoutSize - placeable.crossAxisSize()
+                        } else {
+                            IntPx.Zero
+                        }
+                    }
                     CrossAxisAlignment.End -> {
-                        crossAxisLayoutSize - placeable.crossAxisSize()
+                        if (isRtlColumn) {
+                            IntPx.Zero
+                        } else {
+                            crossAxisLayoutSize - placeable.crossAxisSize()
+                        }
                     }
                     CrossAxisAlignment.Center -> {
                         Alignment.Center.align(
@@ -723,15 +838,21 @@
                         ).y
                     }
                     else -> {
-                        val provider = measurables[index].crossAxisAlignment?.alignmentLineProvider
-                            ?: crossAxisAlignment.alignmentLineProvider
+                        val provider = childCrossAlignment.alignmentLineProvider
                         val alignmentLinePosition = when (provider) {
                             is AlignmentLineProvider.Block -> provider.lineProviderBlock(placeable)
                             is AlignmentLineProvider.Value -> placeable[provider.line]
                             else -> null
                         }
                         if (alignmentLinePosition != null) {
-                            beforeCrossAxisAlignmentLine - alignmentLinePosition
+                            val line = beforeCrossAxisAlignmentLine - alignmentLinePosition
+                            if (orientation == LayoutOrientation.Vertical &&
+                                layoutDirection == LayoutDirection.Rtl
+                            ) {
+                                layoutWidth - line - placeable.width
+                            } else {
+                                line
+                            }
                         } else {
                             IntPx.Zero
                         }
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Flow.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Flow.kt
index 220f9fa..34fac1a 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Flow.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Flow.kt
@@ -236,8 +236,13 @@
                 } else {
                     lastLineMainAxisAlignment.arrangement
                 }
-                val mainAxisPositions =
-                    arrangement.arrangeBlock(mainAxisLayoutSize, childrenMainAxisSizes)
+                // TODO(soboleva): rtl support
+                // Handle vertical direction
+                val mainAxisPositions = arrangement.arrange(
+                    mainAxisLayoutSize,
+                    childrenMainAxisSizes,
+                    layoutDirection
+                )
                 placeables.forEachIndexed { j, placeable ->
                     val crossAxis = when (crossAxisAlignment) {
                         FlowCrossAxisAlignment.Start -> IntPx.Zero
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/FloatingActionButtonActivity.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/FloatingActionButtonActivity.kt
index 2d124b7..7a81533 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/FloatingActionButtonActivity.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/FloatingActionButtonActivity.kt
@@ -19,11 +19,11 @@
 import android.util.Log
 import androidx.compose.Composable
 import androidx.ui.graphics.imageFromResource
-import androidx.ui.layout.Arrangement
 import androidx.ui.layout.Center
 import androidx.ui.layout.Column
 import androidx.ui.layout.LayoutGravity
 import androidx.ui.layout.LayoutHeight
+import androidx.ui.layout.Arrangement
 import androidx.ui.material.FloatingActionButton
 
 class FloatingActionButtonActivity : MaterialDemoActivity() {
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ProgressIndicatorActivity.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ProgressIndicatorActivity.kt
index 4984550..67e21ed 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ProgressIndicatorActivity.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ProgressIndicatorActivity.kt
@@ -22,8 +22,8 @@
 import androidx.compose.onActive
 import androidx.compose.onDispose
 import androidx.ui.graphics.Color
-import androidx.ui.layout.Arrangement
 import androidx.ui.layout.Column
+import androidx.ui.layout.Arrangement
 import androidx.ui.layout.LayoutGravity
 import androidx.ui.layout.LayoutWidth
 import androidx.ui.layout.Row