diff --git a/samples/SampleBrowserPlugin/jni/main.cpp b/samples/SampleBrowserPlugin/jni/main.cpp
index ab95ce6..b851fff 100644
--- a/samples/SampleBrowserPlugin/jni/main.cpp
+++ b/samples/SampleBrowserPlugin/jni/main.cpp
@@ -34,20 +34,20 @@
 NPNetscapeFuncs* browser;
 #define EXPORT __attribute__((visibility("default")))
 
-NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, 
+NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
         char* argn[], char* argv[], NPSavedData* saved);
 NPError NPP_Destroy(NPP instance, NPSavedData** save);
 NPError NPP_SetWindow(NPP instance, NPWindow* window);
-NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, 
+NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream,
         NPBool seekable, uint16* stype);
 NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason);
 int32   NPP_WriteReady(NPP instance, NPStream* stream);
-int32   NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, 
+int32   NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len,
         void* buffer);
 void    NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname);
 void    NPP_Print(NPP instance, NPPrint* platformPrint);
 int16   NPP_HandleEvent(NPP instance, void* event);
-void    NPP_URLNotify(NPP instance, const char* URL, NPReason reason, 
+void    NPP_URLNotify(NPP instance, const char* URL, NPReason reason,
         void* notifyData);
 NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value);
 NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value);
@@ -56,7 +56,7 @@
 EXPORT NPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env, void *application_context);
 EXPORT NPError NP_GetValue(NPP instance, NPPVariable variable, void *value);
 EXPORT const char* NP_GetMIMEDescription(void);
-EXPORT void NP_Shutdown(void); 
+EXPORT void NP_Shutdown(void);
 };
 
 ANPAudioTrackInterfaceV0    gSoundI;
@@ -74,11 +74,11 @@
     if (browserFuncs->size < sizeof(NPNetscapeFuncs)) {
         return NPERR_GENERIC_ERROR;
     }
-    
+
     // Copy the function table (structure)
     browser = (NPNetscapeFuncs*) malloc(sizeof(NPNetscapeFuncs));
     memcpy(browser, browserFuncs, sizeof(NPNetscapeFuncs));
-    
+
     // Build the plugin function table
     pluginFuncs->version = 11;
     pluginFuncs->size = sizeof(pluginFuncs);
@@ -115,7 +115,7 @@
             return err;
         }
     }
-    
+
     return NPERR_NO_ERROR;
 }
 
@@ -124,7 +124,7 @@
 
 }
 
-const char *NP_GetMIMEDescription(void) 
+const char *NP_GetMIMEDescription(void)
 {
     return "application/x-testplugin:tst:Test plugin mimetype is application/x-testplugin";
 }
@@ -140,14 +140,14 @@
         obj = static_cast<PluginObject*>(instance->pdata);
         bzero(obj, sizeof(*obj));
     }
-    
+
     uint32_t bits;
     NPError err = browser->getvalue(instance, kSupportedDrawingModel_ANPGetValue, &bits);
     if (err) {
         gLogI.log(instance, kError_ANPLogType, "supported model err %d", err);
         return err;
     }
-    
+
     ANPDrawingModel model = kBitmap_ANPDrawingModel;
 
     int count = argc;
@@ -188,7 +188,7 @@
 
 static int gTimerRepeatCount;
 static void timer_repeat(NPP instance, uint32 timerID) {
-    
+
     gLogI.log(instance, kDebug_ANPLogType, "-------- repeat timer %d\n",
               gTimerRepeatCount);
     if (--gTimerRepeatCount == 0) {
@@ -214,9 +214,9 @@
     uint32_t expectedDur = obj->mTimerCount * TIMER_INTERVAL;
     int32_t drift = dur - expectedDur;
     int32_t aveDrift = drift / obj->mTimerCount;
-    
+
     obj->mPrevTime = now;
-    
+
     gLogI.log(instance, kDebug_ANPLogType,
               "-------- latency test: [%3d] interval %d expected %d, total %d expected %d, drift %d ave %d\n",
               obj->mTimerCount, interval, TIMER_INTERVAL, dur, expectedDur,
@@ -226,12 +226,12 @@
 NPError NPP_SetWindow(NPP instance, NPWindow* window)
 {
     PluginObject *obj = (PluginObject*) instance->pdata;
-    
+
     // Do nothing if browser didn't support NPN_CreateObject which would have created the PluginObject.
     if (obj != NULL) {
         obj->window = window;
     }
-    
+
     static bool gTestTimers;
     if (!gTestTimers) {
         gTestTimers = true;
@@ -248,18 +248,18 @@
         // test double unschedlue (should be no-op)
         browser->unscheduletimer(instance, id);
     }
-    
+
     if (obj->mTestTimers) {
         browser->scheduletimer(instance, TIMER_INTERVAL, true, timer_latency);
         obj->mStartTime = obj->mPrevTime = getMSecs();
         obj->mTestTimers = false;
     }
-    
+
     browser->invalidaterect(instance, NULL);
 
     return NPERR_NO_ERROR;
 }
- 
+
 
 NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype)
 {
@@ -363,18 +363,13 @@
                 browser->invalidaterect(instance, NULL);
             }
             return 1;
-            
-        case kPause_ANPEventType:
-            gLogI.log(instance, kDebug_ANPLogType, "---- %p pause event\n",
-                      instance);
+
+        case kLifecycle_ANPEventType:
+            gLogI.log(instance, kDebug_ANPLogType, "---- %p Lifecycle action=%d",
+                      instance, evt->data.lifecycle.action);
             break;
 
-        case kResume_ANPEventType:
-            gLogI.log(instance, kDebug_ANPLogType, "---- %p resume event\n",
-                      instance);
-            break;
-            
-            case kTouch_ANPEventType:
+        case kTouch_ANPEventType:
             gLogI.log(instance, kDebug_ANPLogType, "---- %p Touch action=%d [%d %d]",
                       instance, evt->data.touch.action, evt->data.touch.x,
                       evt->data.touch.y);
@@ -412,13 +407,13 @@
         *str = "Test Plugin";
         return NPERR_NO_ERROR;
     }
-    
+
     if (variable == NPPVpluginDescriptionString) {
         const char **str = (const char **)value;
         *str = "Description of Test Plugin";
         return NPERR_NO_ERROR;
     }
-    
+
     return NPERR_GENERIC_ERROR;
 }
 
@@ -427,14 +422,14 @@
     if (variable == NPPVpluginScriptableNPObject) {
         void **v = (void **)value;
         PluginObject *obj = (PluginObject*) instance->pdata;
-        
+
         if (obj)
             browser->retainobject((NPObject*)obj);
-        
+
         *v = obj;
         return NPERR_NO_ERROR;
     }
-    
+
     return NPERR_GENERIC_ERROR;
 }
 
