diff --git a/samples/BrowserPlugin/jni/animation/AnimationPlugin.cpp b/samples/BrowserPlugin/jni/animation/AnimationPlugin.cpp
index 9b26451..e18e29a 100644
--- a/samples/BrowserPlugin/jni/animation/AnimationPlugin.cpp
+++ b/samples/BrowserPlugin/jni/animation/AnimationPlugin.cpp
@@ -75,8 +75,6 @@
     m_x = m_y = 0;
     m_dx = 7 * SCALE;
     m_dy = 5 * SCALE;
-    m_scrollX = m_scrollY = m_screenW = m_screenH = 0;
-    m_zoom = 1;
 
     memset(&m_oval, 0, sizeof(m_oval));
 
@@ -90,7 +88,7 @@
     gTypefaceI.unref(tf);
 
     //register for key and touch events
-    ANPEventFlags flags = kKey_ANPEventFlag | kTouch_ANPEventFlag | kVisibleRect_ANPEventFlag;
+    ANPEventFlags flags = kKey_ANPEventFlag | kTouch_ANPEventFlag;
     NPError err = browser->setvalue(inst, kAcceptEvents_ANPSetValue, &flags);
     if (err != NPERR_NO_ERROR) {
         gLogI.log(inst, kError_ANPLogType, "Error selecting input events.");
@@ -193,37 +191,20 @@
     }
 }
 
-void BallAnimation::centerPluginOnScreen() {
+void BallAnimation::showEntirePluginOnScreen() {
     NPP instance = this->inst();
     PluginObject *obj = (PluginObject*) instance->pdata;
     NPWindow *window = obj->window;
 
-    //find global (x,y) coordinates for center of the plugin
-    int pluginCenterX = window->x + (window->width / 2);
-    int pluginCenterY = window->y + (window->height / 2);
+    ANPRectI visibleRects[1];
 
-    gLogI.log(instance, kDebug_ANPLogType, "---- %p Plugin Center: %d,%d : %d,%d",
-              instance, pluginCenterX, pluginCenterY, window->x, window->y);
+    visibleRects[0].left = 0;
+    visibleRects[0].top = 0;
+    visibleRects[0].right = window->width;
+    visibleRects[0].bottom = window->height;
 
-    //find global (x,y) coordinates for center of the visible screen
-    int screenCenterX = m_scrollX + (m_screenW / 2);
-    int screenCenterY = m_scrollY + (m_screenH / 2);
-
-    gLogI.log(instance, kDebug_ANPLogType, "---- %p Screen Center: %d,%d : %d,%d",
-              instance, screenCenterX, screenCenterY, m_scrollX, m_scrollY);
-
-    //compute the delta of the two coordinates
-    int deltaX = pluginCenterX - screenCenterX;
-    int deltaY = pluginCenterY - screenCenterY;
-
-    gLogI.log(instance, kDebug_ANPLogType, "---- %p Centering: %d,%d : %d,%d",
-              instance, deltaX, deltaY, m_scrollX + deltaX, m_scrollY + deltaY);
-
-    //move the visible screen
-    //webviewCore...
-    // (m_scrollX + deltaX, m_scrollY + deltaY)
-    gWindowI.scrollTo(instance, m_scrollX + deltaX, m_scrollY + deltaY);
-
+    gWindowI.setVisibleRects(instance, visibleRects, 1);
+    gWindowI.clearVisibleRects(instance);
 }
 
 int16 BallAnimation::handleEvent(const ANPEvent* evt) {
@@ -248,18 +229,9 @@
             return 1;
         case kTouch_ANPEventType:
              if (kDown_ANPTouchAction == evt->data.touch.action) {
-                 centerPluginOnScreen();
+                 showEntirePluginOnScreen();
              }
              return 1;
-
-        case kVisibleRect_ANPEventType:
-             m_scrollX = evt->data.visibleRect.rect.left;
-             m_scrollY = evt->data.visibleRect.rect.top;
-             m_screenW = evt->data.visibleRect.rect.right - m_scrollX;
-             m_screenH = evt->data.visibleRect.rect.bottom - m_scrollY;
-             m_zoom = evt->data.visibleRect.zoomScale;
-             gLogI.log(instance, kDebug_ANPLogType, "zoom event %g", m_zoom);
-             return 1;
         default:
             break;
     }
diff --git a/samples/BrowserPlugin/jni/animation/AnimationPlugin.h b/samples/BrowserPlugin/jni/animation/AnimationPlugin.h
index 464f906..de453c0 100644
--- a/samples/BrowserPlugin/jni/animation/AnimationPlugin.h
+++ b/samples/BrowserPlugin/jni/animation/AnimationPlugin.h
@@ -37,7 +37,7 @@
 private:
     void draw(ANPCanvas*);
     void drawPlugin(const ANPBitmap& bitmap, const ANPRectI& clip);
-    void centerPluginOnScreen();
+    void showEntirePluginOnScreen();
 
     float m_x;
     float m_y;
@@ -50,12 +50,6 @@
     ANPPaint*   m_paint;
 
     static const float SCALE = 0.1;
-
-    int m_scrollX;
-    int m_scrollY;
-    int m_screenH;
-    int m_screenW;
-    float m_zoom;
 };
 
 uint32_t getMSecs();
diff --git a/samples/BrowserPlugin/jni/form/FormPlugin.cpp b/samples/BrowserPlugin/jni/form/FormPlugin.cpp
index fbb4c6b..589550a 100644
--- a/samples/BrowserPlugin/jni/form/FormPlugin.cpp
+++ b/samples/BrowserPlugin/jni/form/FormPlugin.cpp
@@ -97,7 +97,7 @@
     gTypefaceI.unref(tf);
 
     //register for key and visibleRect events
-    ANPEventFlags flags = kKey_ANPEventFlag | kVisibleRect_ANPEventFlag;
+    ANPEventFlags flags = kKey_ANPEventFlag;
     NPError err = browser->setvalue(inst, kAcceptEvents_ANPSetValue, &flags);
     if (err != NPERR_NO_ERROR) {
         gLogI.log(inst, kError_ANPLogType, "Error selecting input events.");
@@ -275,22 +275,6 @@
             }
             return 1;
 
-        case kVisibleRect_ANPEventType: {
-
-            int oldScreenW = m_visibleRect.right - m_visibleRect.left;
-            int oldScreenH = m_visibleRect.bottom - m_visibleRect.top;
-
-            m_visibleRect = evt->data.visibleRect.rect;
-
-            int newScreenW = m_visibleRect.right - m_visibleRect.left;
-            int newScreenH = m_visibleRect.bottom - m_visibleRect.top;
-
-            if (m_activeInput && (oldScreenW != newScreenW || oldScreenH != newScreenH))
-                scrollIntoView(m_activeInput);
-
-            return 1;
-        }
-
         default:
             break;
     }
@@ -300,13 +284,17 @@
 void FormPlugin::switchActiveInput(TextInput* newInput) {
     NPP instance = this->inst();
 
-    if (m_activeInput)
+    if (m_activeInput) {
         inval(instance, m_activeInput->rect, true); // inval the old
+        gWindowI.clearVisibleRects(instance);
+    }
 
     m_activeInput = newInput; // set the new active input
 
-    if (m_activeInput)
+    if (m_activeInput) {
         inval(instance, m_activeInput->rect, true); // inval the new
+        scrollIntoView(m_activeInput);
+    }
 }
 
 bool FormPlugin::handleNavigation(ANPKeyCode keyCode) {
@@ -316,12 +304,10 @@
 
     if (!m_activeInput) {
         switchActiveInput(&m_usernameInput);
-        scrollIntoView(m_activeInput);
     }
     else if (m_activeInput == &m_usernameInput) {
         if (keyCode == kDpadDown_ANPKeyCode) {
             switchActiveInput(&m_passwordInput);
-            scrollIntoView(m_activeInput);
         }
         else if (keyCode == kDpadCenter_ANPKeyCode)
             gWindowI.showKeyboard(instance, false);
@@ -331,7 +317,6 @@
     else if (m_activeInput == &m_passwordInput) {
         if (keyCode == kDpadUp_ANPKeyCode) {
             switchActiveInput(&m_usernameInput);
-            scrollIntoView(m_activeInput);
         }
         else if (keyCode == kDpadCenter_ANPKeyCode)
             gWindowI.showKeyboard(instance, false);
@@ -373,44 +358,13 @@
     NPWindow *window = obj->window;
 
     // find the textInput's global rect coordinates
-    ANPRectI inputRect;
-    inputRect.left = window->x + input->rect.left;
-    inputRect.top = window->y + input->rect.top;
-    inputRect.right = inputRect.left + (input->rect.right - input->rect.left);
-    inputRect.bottom = inputRect.top + (input->rect.bottom - input->rect.top);
+    ANPRectI visibleRects[1];
+    visibleRects[0].left = input->rect.left;
+    visibleRects[0].top = input->rect.top;
+    visibleRects[0].right = input->rect.right;
+    visibleRects[0].bottom = input->rect.bottom;
 
-    // if the rect is contained within visible window then do nothing
-    if (inputRect.left > m_visibleRect.left
-            && inputRect.right < m_visibleRect.right
-            && inputRect.top > m_visibleRect.top
-            && inputRect.bottom < m_visibleRect.bottom) {
-        return;
-    }
-
-    // find the global (x,y) coordinates for center of the textInput
-    int inputCenterX = inputRect.left + ((inputRect.right - inputRect.left)/2);
-    int inputCenterY = inputRect.top + ((inputRect.bottom - inputRect.top)/2);
-
-    gLogI.log(instance, kDebug_ANPLogType, "---- %p Input Center: %d,%d : %d,%d",
-              instance, inputCenterX, inputCenterY, window->x, window->y);
-
-    //find global (x,y) coordinates for center of the visible screen
-    int screenCenterX = m_visibleRect.left + ((m_visibleRect.right - m_visibleRect.left)/2);
-    int screenCenterY = m_visibleRect.top + ((m_visibleRect.bottom - m_visibleRect.top)/2);
-
-    gLogI.log(instance, kDebug_ANPLogType, "---- %p Screen Center: %d,%d : %d,%d",
-              instance, screenCenterX, screenCenterY, m_visibleRect.left, m_visibleRect.top);
-
-    //compute the delta of the two coordinates
-    int deltaX = inputCenterX - screenCenterX;
-    int deltaY = inputCenterY - screenCenterY;
-
-    gLogI.log(instance, kDebug_ANPLogType, "---- %p Centering: %d,%d : %d,%d",
-              instance, deltaX, deltaY, m_visibleRect.left + deltaX, m_visibleRect.top + deltaY);
-
-    //move the visible screen
-    gWindowI.scrollTo(instance, m_visibleRect.left + deltaX, m_visibleRect.top + deltaY);
-
+    gWindowI.setVisibleRects(instance, visibleRects, 1);
 }
 
 TextInput* FormPlugin::validTap(int x, int y) {
