diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 65cb202..ffc6e69 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2,7 +2,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.zst.xposed.halo.floatingwindow"
     android:versionCode="124"
-    android:versionName="1.24 Beta" >
+    android:versionName="1.25 Beta 1" >
 
     <uses-sdk
         android:minSdkVersion="14"
diff --git a/src/com/zst/xposed/halo/floatingwindow/HaloFlagInject.java b/src/com/zst/xposed/halo/floatingwindow/HaloFlagInject.java
index 819fa7e..7c857a5 100644
--- a/src/com/zst/xposed/halo/floatingwindow/HaloFlagInject.java
+++ b/src/com/zst/xposed/halo/floatingwindow/HaloFlagInject.java
@@ -13,25 +13,33 @@
 import android.content.pm.ActivityInfo;
 import android.view.Window;
 import de.robv.android.xposed.IXposedHookLoadPackage;
+import de.robv.android.xposed.IXposedHookZygoteInit;
 import de.robv.android.xposed.XC_MethodHook;
 import de.robv.android.xposed.XC_MethodReplacement;
 import de.robv.android.xposed.XSharedPreferences;
 import de.robv.android.xposed.XposedBridge;
+import de.robv.android.xposed.IXposedHookZygoteInit.StartupParam;
 import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
 import de.robv.android.xposed.callbacks.XCallback;
 
 
-public class HaloFlagInject implements  IXposedHookLoadPackage{
+public class HaloFlagInject implements  IXposedHookLoadPackage, IXposedHookZygoteInit{
 	public static final int FLAG_FLOATING_WINDOW = 0x00002000;
 	public static XSharedPreferences pref;
 	    static boolean newTask;
 	    static boolean floatingWindow;
 		 static String previousPkg = Res.NULL;
+		 
+	@Override
+	public void initZygote(StartupParam startupParam) throws Throwable {
+		 pref = new XSharedPreferences(Res.MY_PACKAGE_NAME,Res.MY_PACKAGE_NAME);
+	}
+		 
 	@Override
 	public void handleLoadPackage(LoadPackageParam l) throws Throwable {
-		pref = new XSharedPreferences(Res.MY_PACKAGE_NAME,Res.MY_PACKAGE_NAME);
+		pref.reload();
 		inject_ActivityRecord_ActivityRecord(l);
-		inject_ActivityStack(l);
+		inject_ActivityStack(l,pref);
 		inject_WindowManagerService_setAppStartingWindow(l);
 		inject_Activity(pref);
 		inject_DecorView_generateLayout(l);
@@ -122,12 +130,11 @@
 		}
 	}
 	static Object previous = null;
-	public static void inject_ActivityStack(final LoadPackageParam lpparam) {
+	public static void inject_ActivityStack(final LoadPackageParam lpparam, final XSharedPreferences pref) {
 		Class<?> hookClass = findClass("com.android.server.am.ActivityStack", lpparam.classLoader);
 			XposedBridge.hookAllMethods(hookClass, "resumeTopActivityLocked", new XC_MethodHook() { 
 				
 				protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-		    	    pref = new XSharedPreferences(Res.MY_PACKAGE_NAME,Res.MY_PACKAGE_NAME);
 		    		boolean b = pref.getBoolean(Res.KEY_APP_PAUSE, Res.DEFAULT_APP_PAUSE);
 		    		if (!b) return;
 					if (!floatingWindow) return;
@@ -142,7 +149,6 @@
 					}	
 				}
 				protected void afterHookedMethod(MethodHookParam param) throws Throwable {
-					pref = new XSharedPreferences(Res.MY_PACKAGE_NAME,Res.MY_PACKAGE_NAME);
 		    		boolean b = pref.getBoolean(Res.KEY_APP_PAUSE, Res.DEFAULT_APP_PAUSE);
 		    		if (!b) return;
 					if (!floatingWindow) return;
diff --git a/src/com/zst/xposed/halo/floatingwindow/LayoutScaling.java b/src/com/zst/xposed/halo/floatingwindow/LayoutScaling.java
index f8d8183..6bdcedc 100644
--- a/src/com/zst/xposed/halo/floatingwindow/LayoutScaling.java
+++ b/src/com/zst/xposed/halo/floatingwindow/LayoutScaling.java
@@ -42,7 +42,8 @@
 		appleFloating( context ,  mWindow);
 	}
 	public static void appleFloating(Context context , Window mWindow){
-	    pref = new XSharedPreferences(Res.MY_PACKAGE_NAME,Res.MY_PACKAGE_NAME);
+	    pref = HaloFlagInject.pref;
+	    pref.reload();
 	    boolean isMovable = pref.getBoolean(Res.KEY_MOVABLE_WINDOW, Res.DEFAULT_MOVABLE_WINDOW);
 	    if(!isMovable){
 	            mWindow.setCloseOnTouchOutsideIfNotSet(true);
@@ -71,7 +72,8 @@
 			metrics = new DisplayMetrics();
 			metrics = dm;
 		}
-	    pref = new XSharedPreferences(Res.MY_PACKAGE_NAME,Res.MY_PACKAGE_NAME);
+		pref = HaloFlagInject.pref;
+	    pref.reload();
         if (metrics.heightPixels > metrics.widthPixels) { // portrait 
         	Float width_portrait = pref.getFloat(Res.KEY_PORTRAIT_WIDTH, Res.DEFAULT_PORTRAIT_WIDTH);
     		Float height__portrait = pref.getFloat(Res.KEY_PORTRAIT_HEIGHT, Res.DEFAULT_PORTRAIT_HEIGHT);
diff --git a/src/com/zst/xposed/halo/floatingwindow/MovableWindow.java b/src/com/zst/xposed/halo/floatingwindow/MovableWindow.java
index 06f9cc6..2e47f46 100644
--- a/src/com/zst/xposed/halo/floatingwindow/MovableWindow.java
+++ b/src/com/zst/xposed/halo/floatingwindow/MovableWindow.java
@@ -62,6 +62,7 @@
 	static ImageView triangle;
 	static View overlayView;
 	private static String MODULE_PATH = null;
+	private static XSharedPreferences pref;
 	
 	@Override
 	public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable {
@@ -71,11 +72,12 @@
 	@Override
 	public void initZygote(StartupParam startupParam) throws Throwable {
 		MODULE_PATH = startupParam.modulePath;		
+		pref = new XSharedPreferences(Res.MY_PACKAGE_NAME,Res.MY_PACKAGE_NAME);
 	}
 	
 	@Override
 	public void handleLoadPackage(LoadPackageParam l) throws Throwable {
-		XSharedPreferences pref = new XSharedPreferences(Res.MY_PACKAGE_NAME,Res.MY_PACKAGE_NAME);
+		pref.reload();
 		if (!pref.getBoolean(Res.KEY_MOVABLE_WINDOW, Res.DEFAULT_MOVABLE_WINDOW)) return;
 		focusChangeContextFinder(l);
 		onCreateHook();
diff --git a/src/com/zst/xposed/halo/floatingwindow/movable/Movable.java b/src/com/zst/xposed/halo/floatingwindow/movable/Movable.java
index 6d1cc95..8cf8734 100644
--- a/src/com/zst/xposed/halo/floatingwindow/movable/Movable.java
+++ b/src/com/zst/xposed/halo/floatingwindow/movable/Movable.java
@@ -47,6 +47,6 @@
         private void updateView(Window mWindow, float x , float y){
     		param.x = (int)x;	
     		param.y = (int)y;
-    		mWindow.setAttributes((android.view.WindowManager.LayoutParams) param);
+    		mWindow.setAttributes(param);
     	}
 }
diff --git a/src/com/zst/xposed/halo/floatingwindow/movable/Resizable.java b/src/com/zst/xposed/halo/floatingwindow/movable/Resizable.java
index 9adad18..c4b5855 100644
--- a/src/com/zst/xposed/halo/floatingwindow/movable/Resizable.java
+++ b/src/com/zst/xposed/halo/floatingwindow/movable/Resizable.java
@@ -73,42 +73,3 @@
         	}
         }
 }
-        /*
-        @Override
-        public boolean onTouch(View v, MotionEvent event) {
-        	switch (event.getAction()){
-        	case MotionEvent.ACTION_DOWN:
-        		window.setGravity(Gravity.LEFT | Gravity.TOP);
-        		param = window.getAttributes();
-        		oldX = (int)event.getRawX();
-        		oldY = (int)event.getRawY();
-                oldW = param.width;
-                oldH = param.height;
-                distance_from_top = param.y;
-                return false;
-                
-        	case MotionEvent.ACTION_MOVE:
-        		int newX = (int)event.getRawX();
-        		int newY = (int)event.getRawY();
-        		
-        		int calculatedW = oldW + (oldX - newX);
-        		int calculatedH = newY - distance_from_top;
-
-        		if (calculatedW > minSize && calculatedH > minSize){
-        			param.x = newX;
-            		param.y = distance_from_top;
-            		param.width = calculatedW;
-            		param.height = calculatedH;
-            		window.setAttributes(param);
-        		}
-        		return false;
-        	case MotionEvent.ACTION_UP:
-        		break;
-        	}
-        	return false;
-        }
-        
-        private int dp(int dp){ //Convert dp to px
-        	return MovableWindow.dp(dp, context);
-        }
-}*/
