diff --git a/apps/client/hello/call_host/src/lib.rs b/apps/client/hello/call_host/src/lib.rs
new file mode 100644
index 0000000..417445c
--- /dev/null
+++ b/apps/client/hello/call_host/src/lib.rs
@@ -0,0 +1,117 @@
+use std::error;
+use tui::{
+    layout::{Alignment},
+    widgets::{Block, BorderType, Borders},
+    Terminal,
+};
+
+
+use core::result::Result;
+use std::io::Error;
+use tui::backend::Backend;
+use tui::buffer::Cell;
+use tui::layout::Rect;
+
+extern "C" {
+    fn cursorHide();
+    fn cursorShow();
+    fn cursorSet(x: u16, y: u16);
+    fn clearScreen();
+    fn getSize() -> (i32, i32, i32, i32);
+    fn flush();
+    fn draw(x: u16, y: u16);
+}
+
+struct HostBackend {}
+
+impl Backend for HostBackend {
+    fn draw<'a, I>(&mut self, content: I) -> Result<(), Error>
+    where
+        I: Iterator<Item = (u16, u16, &'a Cell)>,
+    {
+	for i in content {
+	    let x: u16 = i.0;
+	    let y: u16 = i.1;
+	    unsafe { draw(x, y) }
+	}
+        Ok(())
+    }
+
+    fn hide_cursor(&mut self) -> Result<(), Error> {
+	unsafe { cursorHide() }
+        Ok(())
+    }
+
+    fn show_cursor(&mut self) -> Result<(), Error> {
+	unsafe { cursorShow() }
+        Ok(())
+    }
+
+    fn get_cursor(&mut self) -> Result<(u16, u16), Error> {
+        Ok((100, 100))
+    }
+
+    fn set_cursor(&mut self, x: u16, y: u16) -> Result<(), Error> {
+	unsafe { cursorSet(x, y) }
+        Ok(())
+    }
+
+    fn clear(&mut self) -> Result<(), Error> {
+	unsafe { clearScreen() }
+        Ok(())
+    }
+
+    fn size(&self) -> Result<Rect, Error> {
+	let ws: (i32, i32, i32, i32);
+	unsafe { ws = getSize(); }
+        Ok(Rect {
+            x: ws.0 as u16,
+            y: ws.1 as u16,
+            width: ws.2 as u16,
+            height: ws.3 as u16,
+        })
+        // Ok(Rect {
+        //     x: 0,
+        //     y: 0,
+        //     width: 50,
+        //     height: 50,
+        // })
+    }
+
+    fn flush(&mut self) -> Result<(), Error> {
+	unsafe { flush() }
+        Ok(())
+    }
+}
+
+fn main() -> Result<(), Box<dyn error::Error>> {
+    let backend = HostBackend{};
+    let mut terminal = Terminal::new(backend)?;
+    let mut i: i32 = 0;
+    loop {
+	terminal.draw(|f| {
+	    let size = f.size();
+	    let block = Block::default()
+		.borders(Borders::ALL)
+		.title("Main block with round corners")
+		.title_alignment(Alignment::Center)
+		.border_type(BorderType::Rounded);
+	    f.render_widget(block, size);
+	})?;
+	i = i + 1;
+	if i > 1000 {
+	    break;
+	}
+    }
+    terminal.show_cursor()?;
+
+    Ok(())
+}
+
+struct Unused<T>(T);
+
+#[no_mangle]
+pub extern "C" fn run() {
+    // unsafe { cursorSet(10, 10) }
+    Unused(main());
+}
