diff --git a/uiterm/label.go b/uiterm/label.go
index 259c22d..39394ff 100644
--- a/uiterm/label.go
+++ b/uiterm/label.go
@@ -30,6 +30,9 @@ func (l *Label) uiSetBounds(x0, y0, x1, y1 int) {
 }
 
 func (l *Label) uiDraw() {
+	l.ui.beginDraw()
+	defer l.ui.endDraw()
+
 	reader := strings.NewReader(l.Text)
 	for y := l.y0; y < l.y1; y++ {
 		for x := l.x0; x < l.x1; x++ {
diff --git a/uiterm/textbox.go b/uiterm/textbox.go
index cda0c41..60c7ab2 100644
--- a/uiterm/textbox.go
+++ b/uiterm/textbox.go
@@ -35,6 +35,9 @@ func (t *Textbox) uiSetBounds(x0, y0, x1, y1 int) {
 }
 
 func (t *Textbox) uiDraw() {
+	t.ui.beginDraw()
+	defer t.ui.endDraw()
+
 	var setCursor = false
 	reader := strings.NewReader(t.Text)
 	for y := t.y0; y < t.y1; y++ {
@@ -80,12 +83,10 @@ func (t *Textbox) uiKeyEvent(mod Modifier, key Key) {
 	}
 	if redraw {
 		t.uiDraw()
-		termbox.Flush()
 	}
 }
 
 func (t *Textbox) uiCharacterEvent(chr rune) {
 	t.Text = t.Text + string(chr)
 	t.uiDraw()
-	termbox.Flush()
 }
diff --git a/uiterm/textview.go b/uiterm/textview.go
index 395772e..f9cd0a9 100644
--- a/uiterm/textview.go
+++ b/uiterm/textview.go
@@ -103,6 +103,9 @@ func (t *Textview) Clear() {
 }
 
 func (t *Textview) uiDraw() {
+	t.ui.beginDraw()
+	defer t.ui.endDraw()
+
 	var reader *strings.Reader
 	line := len(t.parsedLines) - 1 - t.CurrentLine
 	if line < 0 {
diff --git a/uiterm/tree.go b/uiterm/tree.go
index c72a67f..ed6f45a 100644
--- a/uiterm/tree.go
+++ b/uiterm/tree.go
@@ -96,6 +96,9 @@ func (t *Tree) rebuild_rec(parent TreeItem, level int) []renderedTreeItem {
 }
 
 func (t *Tree) uiDraw() {
+	t.ui.beginDraw()
+	defer t.ui.endDraw()
+
 	if t.lines == nil {
 		t.Rebuild()
 	}
diff --git a/uiterm/ui.go b/uiterm/ui.go
index b9b1f8f..65fb6a9 100644
--- a/uiterm/ui.go
+++ b/uiterm/ui.go
@@ -2,6 +2,7 @@ package uiterm
 
 import (
 	"errors"
+	"sync/atomic"
 
 	"github.com/nsf/termbox-go"
 )
@@ -20,6 +21,7 @@ type Ui struct {
 	close   chan bool
 	manager UiManager
 
+	drawCount     int32
 	elements      map[string]*uiElement
 	activeElement *uiElement
 
@@ -50,11 +52,23 @@ func (ui *Ui) Close() {
 
 func (ui *Ui) Refresh() {
 	if termbox.IsInit {
+		ui.beginDraw()
+		defer ui.endDraw()
+
 		termbox.Clear(termbox.Attribute(ui.Fg), termbox.Attribute(ui.Bg))
 		termbox.HideCursor()
 		for _, element := range ui.elements {
 			element.View.uiDraw()
 		}
+	}
+}
+
+func (ui *Ui) beginDraw() {
+	atomic.AddInt32(&ui.drawCount, 1)
+}
+
+func (ui *Ui) endDraw() {
+	if count := atomic.AddInt32(&ui.drawCount, -1); count == 0 {
 		termbox.Flush()
 	}
 }