diff --git a/src/com/zst/xposed/halo/floatingwindow/HaloFlagInject.java b/src/com/zst/xposed/halo/floatingwindow/HaloFlagInject.java
index 7c857a5..3fea799 100644
--- a/src/com/zst/xposed/halo/floatingwindow/HaloFlagInject.java
+++ b/src/com/zst/xposed/halo/floatingwindow/HaloFlagInject.java
@@ -206,26 +206,19 @@
 				protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 
 					 Activity thiz = (Activity)param.thisObject;
 					 String name = thiz.getWindow().getContext().getPackageName();
-					 if (name.startsWith("com.android.systemui"))  return; 
-					  isHoloFloat = (thiz.getIntent().getFlags() & FLAG_FLOATING_WINDOW) == FLAG_FLOATING_WINDOW;
-					
-					 if(isHoloFloat && floatingWindow){ 
-						 
-					     LayoutScaling.applyThemeLess(thiz.getWindow().getContext(),thiz.getWindow());
+					 Intent intent = thiz.getIntent();
+					 if (name.startsWith("com.android.systemui")){
+						 //How did halo flag get into SystemUI? Remove it.
+						 intent.setFlags(intent.getFlags() & ~Res.FLAG_FLOATING_WINDOW);
+						 isHoloFloat = false;
+						 return; 
+					 }
+					  isHoloFloat = (intent.getFlags() & FLAG_FLOATING_WINDOW) == FLAG_FLOATING_WINDOW;
+					 if(isHoloFloat) {
+					     LayoutScaling.appleFloating(thiz.getWindow().getContext(),thiz.getWindow());
 						 return;
-					 } 
-					 
+					 }
 				}
-				protected void afterHookedMethod(MethodHookParam param) throws Throwable { 
-					 Activity thiz = (Activity)param.thisObject;
-					 if(isHoloFloat){ 
-						 
-					     LayoutScaling.applyThemeLess(thiz.getWindow().getContext(),thiz.getWindow());
-						 return;
-					 } 
-					 
-				}
-				
 			});
 		
 			
@@ -256,14 +249,14 @@
 				protected void afterHookedMethod(MethodHookParam param) throws Throwable {
 					Window window = (Window) param.thisObject;
 					Context context = window.getContext();
-					
+					String name = window.getContext().getPackageName();
+					if (name.startsWith("com.android.systemui"))  return; 
+					 
 					 if (!(isHoloFloat && floatingWindow)) return; 
 					 if (window.getDecorView().getTag(10000) != null) return;
 					 //Return so it doesnt override our custom movable window scaling
 					 
-						String localClassPackageName = context.getClass().getPackage().getName();
-
-						LayoutScaling.applyTheme(context, window,localClassPackageName);
+						LayoutScaling.appleFloating(context, window);
 						window.getDecorView().setTag(10000, (Object)1);
 					
 				}
diff --git a/src/com/zst/xposed/halo/floatingwindow/LayoutScaling.java b/src/com/zst/xposed/halo/floatingwindow/LayoutScaling.java
index 6bdcedc..6d80be3 100644
--- a/src/com/zst/xposed/halo/floatingwindow/LayoutScaling.java
+++ b/src/com/zst/xposed/halo/floatingwindow/LayoutScaling.java
@@ -1,14 +1,8 @@
 package com.zst.xposed.halo.floatingwindow;
 
 import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ResolveInfo;
-import android.content.res.TypedArray;
 import android.util.DisplayMetrics;
-import android.util.TypedValue;
 import android.view.Display;
-import android.view.Gravity;
 import android.view.Window;
 import android.view.WindowManager;
 import de.robv.android.xposed.XSharedPreferences;
@@ -16,37 +10,16 @@
 public class LayoutScaling {
 
 	public static XSharedPreferences pref;
-	public static void applyThemeLess(Context context , Window mWindow){
-		context.getTheme().applyStyle(R.style.Theme_Halo_FloatingWindow, true);
-		appleFloating( context ,  mWindow);
-	}
-	public static void applyTheme(Context context , Window mWindow, String class_name ){
-		try{
-			Intent intent__ = new Intent(context.getPackageManager().getLaunchIntentForPackage(class_name));
-		        	ResolveInfo rInfo = context.getPackageManager().resolveActivity(intent__, 0);
-		        	ActivityInfo info = rInfo.activityInfo;	            
-		        	TypedArray ta = context.obtainStyledAttributes(info.theme, com.android.internal.R.styleable.Window);
-		        	
-		            TypedValue backgroundValue = ta.peekValue(com.android.internal.R.styleable.Window_windowBackground);
-		            
-		            if (backgroundValue != null && backgroundValue.toString().contains("light")) {
-		                context.getTheme().applyStyle(R.style.Theme_Halo_FloatingWindowLight, true);
-		            } else {  //Checks if light or dark theme
-		                context.getTheme().applyStyle(R.style.Theme_Halo_FloatingWindow, true);
-		            }
-		            
-		            ta.recycle();
-			}catch(Throwable t){
-	            context.getTheme().applyStyle(R.style.Theme_Halo_FloatingWindow, true);
-			}
-		appleFloating( context ,  mWindow);
-	}
+	
 	public static void appleFloating(Context context , Window mWindow){
 	    pref = HaloFlagInject.pref;
 	    pref.reload();
 	    boolean isMovable = pref.getBoolean(Res.KEY_MOVABLE_WINDOW, Res.DEFAULT_MOVABLE_WINDOW);
-	    if(!isMovable){
-	            mWindow.setCloseOnTouchOutsideIfNotSet(true);
+	    if(isMovable){
+	    	mWindow.setCloseOnTouchOutside(false);
+			mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
+	    }else{
+	    	mWindow.setCloseOnTouchOutsideIfNotSet(true);
 	    }
 	            mWindow.setGravity(pref.getInt(Res.KEY_GRAVITY, Res.DEFAULT_GRAVITY));
 	            mWindow.setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND,WindowManager.LayoutParams.FLAG_DIM_BEHIND);
@@ -56,7 +29,7 @@
 
 	            params.alpha = alp;	
 	            params.dimAmount = dimm;
-	            mWindow.setAttributes((android.view.WindowManager.LayoutParams) params);
+	            mWindow.setAttributes(params);
 			     scaleFloatingWindow(context,mWindow);
 			     
 	}
diff --git a/src/com/zst/xposed/halo/floatingwindow/MovableWindow.java b/src/com/zst/xposed/halo/floatingwindow/MovableWindow.java
index 2e47f46..e3ccfb6 100644
--- a/src/com/zst/xposed/halo/floatingwindow/MovableWindow.java
+++ b/src/com/zst/xposed/halo/floatingwindow/MovableWindow.java
@@ -77,8 +77,6 @@
 	
 	@Override
 	public void handleLoadPackage(LoadPackageParam l) throws Throwable {
-		pref.reload();
-		if (!pref.getBoolean(Res.KEY_MOVABLE_WINDOW, Res.DEFAULT_MOVABLE_WINDOW)) return;
 		focusChangeContextFinder(l);
 		onCreateHook();
 		inject_dispatchTouchEvent();
@@ -151,6 +149,8 @@
 		Class<?> hookClass = findClass("com.android.internal.policy.impl.PhoneWindow", lpparam.classLoader);
 		XposedBridge.hookAllMethods(hookClass, "generateLayout",  new XC_MethodHook() { 
 			protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+				pref.reload();
+				if (!pref.getBoolean(Res.KEY_MOVABLE_WINDOW, Res.DEFAULT_MOVABLE_WINDOW)) return;
 				if (!isHoloFloat) return;
 
 				Window window = (Window) param.thisObject;
@@ -274,6 +274,9 @@
 	private static void inject_dispatchTouchEvent() throws Throwable{
 		XposedBridge.hookAllMethods(Activity.class, "dispatchTouchEvent", new XC_MethodHook(){
 			protected void afterHookedMethod(MethodHookParam param) throws Throwable { 
+				pref.reload();
+				if (!pref.getBoolean(Res.KEY_MOVABLE_WINDOW, Res.DEFAULT_MOVABLE_WINDOW)) return;
+				
 				Activity a =  (Activity)param.thisObject;
 				boolean isHoloFloat = (a.getIntent().getFlags() & Res.FLAG_FLOATING_WINDOW) == Res.FLAG_FLOATING_WINDOW;
 				if (!isHoloFloat) return;
@@ -320,9 +323,7 @@
 		WindowManager.LayoutParams params = mWindow.getAttributes(); 
 		params.x = (int)x;	
 		params.y = (int)y;
-		mWindow.setCloseOnTouchOutside(false);
-		mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
-		mWindow.setAttributes((android.view.WindowManager.LayoutParams) params);
+		mWindow.setAttributes(params);
 	}
 	
 	public static int dp(int dp, Context c){ //convert dp to px
diff --git a/src/com/zst/xposed/halo/floatingwindow/movable/Movable.java b/src/com/zst/xposed/halo/floatingwindow/movable/Movable.java
index 8cf8734..bc70e3d 100644
--- a/src/com/zst/xposed/halo/floatingwindow/movable/Movable.java
+++ b/src/com/zst/xposed/halo/floatingwindow/movable/Movable.java
@@ -1,12 +1,9 @@
 package com.zst.xposed.halo.floatingwindow.movable;
  
-import android.content.Context;
-import android.graphics.Color;
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.Window;
-import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
  
 public class Movable implements View.OnTouchListener {
