diff --git a/src/lib.rs b/src/lib.rs
index cd5740683004dc9cbe946b45a7aea1d1d33849f3..d86b6bbdeb40bafd5d01302edad5374ebc054285 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -387,7 +387,7 @@ impl Plugin for CosmicEditPlugin {
     fn build(&self, app: &mut App) {
         let font_system = create_cosmic_font_system(self.font_config.clone());
 
-        app.add_systems(First, cosmic_editor_builder)
+        app.add_systems(First, (cosmic_editor_builder, on_scale_factor_change))
             .add_systems(PreUpdate, update_buffer_text)
             .add_systems(
                 Update,
@@ -405,7 +405,6 @@ impl Plugin for CosmicEditPlugin {
                 (cosmic_edit_redraw_buffer_ui, cosmic_edit_redraw_buffer)
                     .after(TransformSystem::TransformPropagate),
             )
-            .add_systems(Last, on_scale_factor_change)
             .init_resource::<Focus>()
             .insert_resource(CursorBlinkTimer(Timer::from_seconds(
                 0.53,
@@ -499,18 +498,20 @@ fn create_cosmic_font_system(cosmic_font_config: CosmicFontConfig) -> FontSystem
 
 fn on_scale_factor_change(
     mut scale_factor_changed: EventReader<WindowScaleFactorChanged>,
-    mut cosmic_query: Query<(&mut CosmicEditor, &mut CosmicMetrics)>,
+    mut cosmic_query: Query<(&mut CosmicEditor, &CosmicMetrics, &mut XOffset)>,
     mut font_system: ResMut<CosmicFontSystem>,
 ) {
     if !scale_factor_changed.is_empty() {
         let new_scale_factor = scale_factor_changed.iter().last().unwrap().scale_factor as f32;
-        for (mut editor, metrics) in &mut cosmic_query.iter_mut() {
+        for (mut editor, metrics, mut x_offset) in &mut cosmic_query.iter_mut() {
             let font_system = &mut font_system.0;
             let metrics =
                 Metrics::new(metrics.font_size, metrics.line_height).scale(new_scale_factor);
 
             editor.0.buffer_mut().set_metrics(font_system, metrics);
             editor.0.buffer_mut().set_redraw(true);
+
+            *x_offset = XOffset(None);
         }
     }
 }
@@ -861,15 +862,21 @@ fn cosmic_edit_redraw_buffer_ui(
             continue;
         }
 
-        let width = node.size().x;
-        let mut height = node.size().y;
+        let width = node.size().x.ceil();
+        let mut height = node.size().y.ceil();
         let widget_height = height * scale;
         let widget_width = width * scale;
 
+        let padding_x = match text_position {
+            CosmicTextPosition::Center => 0.,
+            CosmicTextPosition::TopLeft { padding } => *padding as f32,
+            CosmicTextPosition::Left { padding } => *padding as f32,
+        };
+
         let (buffer_width, buffer_height) = match mode {
             CosmicMode::InfiniteLine => (f32::MAX, widget_height),
-            CosmicMode::AutoHeight => (widget_width, (i32::MAX / 2) as f32),
-            CosmicMode::Wrap => (widget_width, widget_height),
+            CosmicMode::AutoHeight => (widget_width - padding_x, (i32::MAX / 2) as f32),
+            CosmicMode::Wrap => (widget_width - padding_x, widget_height),
         };
         editor
             .0
@@ -878,9 +885,9 @@ fn cosmic_edit_redraw_buffer_ui(
 
         if mode == &CosmicMode::AutoHeight {
             let text_size = get_text_size(editor.0.buffer());
-            let text_height = (text_size.1 / primary_window.scale_factor() as f32) + 30.;
+            let text_height = (text_size.1 + 30.) / primary_window.scale_factor() as f32;
             if text_height > height {
-                height = text_height;
+                height = text_height.ceil();
                 style.height = Val::Px(height);
             }
         }
@@ -940,8 +947,8 @@ fn cosmic_edit_redraw_buffer(
         if !editor.0.buffer().redraw() {
             continue;
         }
-        let width = sprite.custom_size.unwrap().x;
-        let mut height = sprite.custom_size.unwrap().y;
+        let width = sprite.custom_size.unwrap().x.ceil();
+        let mut height = sprite.custom_size.unwrap().y.ceil();
         let widget_height = height * scale;
         let widget_width = width * scale;
 
@@ -957,9 +964,9 @@ fn cosmic_edit_redraw_buffer(
 
         if mode == &CosmicMode::AutoHeight {
             let text_size = get_text_size(editor.0.buffer());
-            let text_height = (text_size.1 / primary_window.scale_factor() as f32) + 30.;
+            let text_height = (text_size.1 + 30.) / primary_window.scale_factor() as f32;
             if text_height > height {
-                height = text_height;
+                height = text_height.ceil();
                 sprite.custom_size.unwrap().y = height;
             }
         }