diff --git a/native_client_sdk/src/libraries/nacl_io/mount_node_tty.cc b/native_client_sdk/src/libraries/nacl_io/mount_node_tty.cc
index af9b7543a1637..6b8fb66877134 100644
--- a/native_client_sdk/src/libraries/nacl_io/mount_node_tty.cc
+++ b/native_client_sdk/src/libraries/nacl_io/mount_node_tty.cc
@@ -257,6 +257,8 @@ Error MountNodeTty::VIoctl(int request, va_list args) {
       struct winsize* size = va_arg(args, struct winsize*);
       {
         AUTO_LOCK(node_lock_);
+        if (rows_ == size->ws_row && cols_ == size->ws_col)
+          return 0;
         rows_ = size->ws_row;
         cols_ = size->ws_col;
       }
diff --git a/native_client_sdk/src/libraries/ppapi_simple/ps_instance.cc b/native_client_sdk/src/libraries/ppapi_simple/ps_instance.cc
index 3f59e08b48ac2..a7dffc7118149 100644
--- a/native_client_sdk/src/libraries/ppapi_simple/ps_instance.cc
+++ b/native_client_sdk/src/libraries/ppapi_simple/ps_instance.cc
@@ -238,6 +238,26 @@ bool PSInstance::ProcessProperties() {
       if (tty_resize)
         RegisterMessageHandler(tty_resize, MessageHandlerResizeStatic, this);
 
+      char* tty_rows = getenv("PS_TTY_ROWS");
+      char* tty_cols = getenv("PS_TTY_COLS");
+      if (tty_rows && tty_cols) {
+        char* end = tty_rows;
+        int rows = strtol(tty_rows, &end, 10);
+        if (*end != '\0' || rows < 0) {
+          Error("Invalid value for PS_TTY_ROWS: %s", tty_rows);
+        } else {
+          end = tty_cols;
+          int cols = strtol(tty_cols, &end, 10);
+          if (*end != '\0' || cols < 0)
+            Error("Invalid value for PS_TTY_COLS: %s", tty_cols);
+          else
+            HandleResize(cols, rows);
+        }
+      }
+      else if (tty_rows || tty_cols) {
+        Error("PS_TTY_ROWS and PS_TTY_COLS must be set together");
+      }
+
       tioc_nacl_output handler;
       handler.handler = TtyOutputHandlerStatic;
       handler.user_data = this;
@@ -372,16 +392,22 @@ void PSInstance::MessageHandlerInput(const pp::Var& message) {
   }
 }
 
+void PSInstance::HandleResize(int width, int height){
+  struct winsize size;
+  memset(&size, 0, sizeof(size));
+  size.ws_col = width;
+  size.ws_row = height;
+  ioctl(tty_fd_, TIOCSWINSZ, reinterpret_cast<char*>(&size));
+}
+
 void PSInstance::MessageHandlerResize(const pp::Var& message) {
   assert(message.is_array());
   pp::VarArray array(message);
   assert(array.GetLength() == 2);
 
-  struct winsize size;
-  memset(&size, 0, sizeof(size));
-  size.ws_col = array.Get(0).AsInt();
-  size.ws_row = array.Get(1).AsInt();
-  ioctl(tty_fd_, TIOCSWINSZ, reinterpret_cast<char*>(&size));
+  int width = array.Get(0).AsInt();
+  int height = array.Get(1).AsInt();
+  HandleResize(width, height);
 }
 
 ssize_t PSInstance::TtyOutputHandlerStatic(const char* buf,
diff --git a/native_client_sdk/src/libraries/ppapi_simple/ps_instance.h b/native_client_sdk/src/libraries/ppapi_simple/ps_instance.h
index ce96aae5b991b..4138982b48755 100644
--- a/native_client_sdk/src/libraries/ppapi_simple/ps_instance.h
+++ b/native_client_sdk/src/libraries/ppapi_simple/ps_instance.h
@@ -154,6 +154,7 @@ class PSInstance : public pp::Instance, pp::MouseLock, pp::Graphics3DClient {
   ssize_t TtyOutputHandler(const char* buf, size_t count);
   void MessageHandlerInput(const pp::Var& message);
   void MessageHandlerResize(const pp::Var& message);
+  void HandleResize(int width, int height);
 
   static ssize_t TtyOutputHandlerStatic(const char* buf, size_t count,
                                         void* user_data);