diff --git a/src/org/sflphone/fragments/CallFragment.java b/src/org/sflphone/fragments/CallFragment.java
index 858be93..08e27b3 100644
--- a/src/org/sflphone/fragments/CallFragment.java
+++ b/src/org/sflphone/fragments/CallFragment.java
@@ -31,6 +31,8 @@
 
 package org.sflphone.fragments;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Locale;
 
@@ -45,6 +47,7 @@
 import org.sflphone.model.Conference;
 import org.sflphone.model.SipCall;
 import org.sflphone.service.ISipService;
+import org.sflphone.utils.CallProximityManager;
 
 import android.app.Activity;
 import android.app.Fragment;
@@ -59,6 +62,7 @@
 import android.hardware.SensorEventListener;
 import android.hardware.SensorManager;
 import android.os.Bundle;
+import android.os.PowerManager;
 import android.os.RemoteException;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -71,12 +75,11 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
-import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.ImageButton;
 import android.widget.TextView;
 
-public class CallFragment extends Fragment implements Callback, SensorEventListener {
+public class CallFragment extends Fragment implements Callback{
 
     static final String TAG = "CallFragment";
 
@@ -88,6 +91,8 @@
     private Conference conf;
 
     private TextView callStatusTxt;
+    private TextView codecNameTxt;
+
     private BubblesView view;
     private BubbleModel model;
 
@@ -98,10 +103,19 @@
     private SensorManager mSensorManager;
 
     private Sensor mSensor;
-    
+
     TransferDFragment editName;
 
-    private TextView codecNameTxt;
+    private PowerManager.WakeLock fullLock;
+    private PowerManager.WakeLock partialLock;
+    private PowerManager.WakeLock proximityLock;
+    
+    private static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32;
+    private static final int WAIT_FOR_PROXIMITY_NEGATIVE = 1;
+    
+    private Method wakelockParameterizedRelease;
+
+    
 
     @Override
     public void onCreate(Bundle savedBundle) {
@@ -115,6 +129,22 @@
         mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
         this.setHasOptionsMenu(true);
 
+
+        
+//        PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
+//        fullLock = pm.newWakeLock(PowerManager.ON_AFTER_RELEASE | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
+//        partialLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+//        proximityLock = pm.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
+//        
+//        Method maybeRelease = null;
+//        try {
+//          maybeRelease = proximityLock.getClass().getDeclaredMethod("release", Integer.TYPE);
+//        } catch (NoSuchMethodException e) {
+//          Log.d("LockManager", "Parameterized WakeLock release not available on this device.");
+//        }
+//        wakelockParameterizedRelease = maybeRelease;
+        
+
     }
 
     /**
@@ -122,7 +152,6 @@
      */
     private static Callbacks sDummyCallbacks = new Callbacks() {
 
-
         @Override
         public ISipService getService() {
             return null;
@@ -137,7 +166,7 @@
         }
 
         @Override
-        public void slideChatScreen() {            
+        public void slideChatScreen() {
         }
     };
 
@@ -152,7 +181,7 @@
         public void startTimer();
 
         public void slideChatScreen();
-        
+
         public void replaceCurrentCallDisplayed();
     }
 
@@ -167,10 +196,10 @@
         // rootView.requestDisallowInterceptTouchEvent(true);
 
         mCallbacks = (Callbacks) activity;
-//        myself = SipCall.SipCallBuilder.buildMyselfCall(activity.getContentResolver(), "Me");
+        // myself = SipCall.SipCallBuilder.buildMyselfCall(activity.getContentResolver(), "Me");
 
     }
-    
+
     @Override
     public void onCreateOptionsMenu(Menu m, MenuInflater inf) {
         super.onCreateOptionsMenu(m, inf);
@@ -180,11 +209,11 @@
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         super.onOptionsItemSelected(item);
-//        switch (item.getItemId()) {
-//        case R.id.menuitem_chat:
-//            mCallbacks.slideChatScreen();
-//            break;
-//        }
+        // switch (item.getItemId()) {
+        // case R.id.menuitem_chat:
+        // mCallbacks.slideChatScreen();
+        // break;
+        // }
 
         return true;
     }
@@ -193,7 +222,7 @@
     public void onDetach() {
         super.onDetach();
         mCallbacks = sDummyCallbacks;
-        mSensorManager.unregisterListener(this);
+//        mSensorManager.unregisterListener(this);
     }
 
     @Override
@@ -204,13 +233,13 @@
     @Override
     public void onResume() {
         super.onResume();
-        mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
+//        mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
     }
 
     @Override
     public void onPause() {
         super.onPause();
-        mSensorManager.unregisterListener(this);
+//        mSensorManager.unregisterListener(this);
     }
 
     @Override
@@ -361,7 +390,7 @@
     private Bubble getBubbleFor(SipCall call, float x, float y) {
         Bubble contact_bubble = model.getBubble(call.getCallId());
         if (contact_bubble != null) {
-            ((BubbleContact)contact_bubble).setCall(call);
+            ((BubbleContact) contact_bubble).setCall(call);
             contact_bubble.attractor.set(x, y);
             return contact_bubble;
         }
@@ -371,16 +400,17 @@
         model.addBubble(contact_bubble);
         return contact_bubble;
     }
-    
+
     private Bubble getBubbleForUser(Conference conf, float x, float y) {
         Bubble contact_bubble = model.getBubble(conf.getId());
         if (contact_bubble != null) {
             contact_bubble.attractor.set(x, y);
-            ((BubbleUser)contact_bubble).setConference(conf);
+            ((BubbleUser) contact_bubble).setConference(conf);
             return contact_bubble;
         }
 
-        contact_bubble = new BubbleUser(getActivity(), CallContact.ContactBuilder.buildUserContact(getActivity().getContentResolver(), getResources().getString(R.string.me)), conf, x, y, BUBBLE_SIZE);
+        contact_bubble = new BubbleUser(getActivity(), CallContact.ContactBuilder.buildUserContact(getActivity().getContentResolver(), getResources()
+                .getString(R.string.me)), conf, x, y, BUBBLE_SIZE);
 
         model.addBubble(contact_bubble);
         return contact_bubble;
@@ -390,9 +420,9 @@
      * Should be called when a bubble is removed from the model
      */
     void bubbleRemoved(Bubble b) {
-//        if (b.associated_call == null) {
-//            return;
-//        }
+        // if (b.associated_call == null) {
+        // return;
+        // }
     }
 
     public void changeCallState(String callID, String newState) {
@@ -468,7 +498,7 @@
         editName = TransferDFragment.newInstance();
         Bundle b = new Bundle();
         try {
-            b.putParcelableArrayList("calls", (ArrayList<Conference>)mCallbacks.getService().getConcurrentCalls());
+            b.putParcelableArrayList("calls", (ArrayList<Conference>) mCallbacks.getService().getConcurrentCalls());
             b.putParcelable("call_selected", contact.associated_call);
             editName.setArguments(b);
             editName.setTargetFragment(this, REQUEST_TRANSFER);
@@ -489,7 +519,7 @@
         // check that soft input is hidden
         InputMethodManager lManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
         lManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
-        if(editName != null && editName.isVisible()){
+        if (editName != null && editName.isVisible()) {
             editName.dismiss();
         }
     }
@@ -503,28 +533,46 @@
         callStatusTxt.setText(String.format("%d:%02d:%02d", duration / 3600, duration % 3600 / 60, duration % 60));
     }
 
-    @Override
-    public void onAccuracyChanged(Sensor sensor, int accuracy) {
+//    @Override
+//    public void onAccuracyChanged(Sensor sensor, int accuracy) {
+//
+//    }
 
-    }
-
-    @Override
-    public void onSensorChanged(SensorEvent event) {
-        if (event.values[0] == 0) {
-            WindowManager.LayoutParams params = getActivity().getWindow().getAttributes();
-            params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
-            params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
-            params.screenBrightness = 0.004f;
-            getActivity().getWindow().setAttributes(params);
-
-        } else {
-            WindowManager.LayoutParams params = getActivity().getWindow().getAttributes();
-            getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
-            params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
-            params.screenBrightness = 1.0f;
-            getActivity().getWindow().setAttributes(params);
-        }
-    }
+//    @Override
+//    public void onSensorChanged(SensorEvent event) {
+//        if (event.values[0] == 0) {
+//            // WindowManager.LayoutParams params = getActivity().getWindow().getAttributes();
+//            // params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+//            // params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+//            // params.screenBrightness = -1f;
+//            // getActivity().getWindow().setAttributes(params);
+//
+//        } else {
+//            // WindowManager.LayoutParams params = getActivity().getWindow().getAttributes();
+//            // getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
+//            // params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+//            // params.screenBrightness = 1.0f;
+//            // getActivity().getWindow().setAttributes(params);
+//        }
+//    }
+    
+//    private void releaseProximityLock() {
+//        boolean released = false;
+//        if (wakelockParameterizedRelease != null) {
+//          try {
+//            wakelockParameterizedRelease.invoke(proximityLock, new Integer(WAIT_FOR_PROXIMITY_NEGATIVE));
+//            released = true;
+//          } catch (IllegalAccessException e) {
+//            Log.d("LockManager", "Failed to invoke release method", e);
+//          } catch (InvocationTargetException e) {
+//            Log.d("LockManager", "Failed to invoke release method", e);
+//          }
+//        }
+//
+//        if(!released) {
+//          proximityLock.release();
+//        }
+//      }
 
     public Conference getConference() {
         return conf;
@@ -532,11 +580,10 @@
 
     public void onKeyUp(int keyCode, KeyEvent event) {
         try {
-            
-            if(event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN)
+
+            if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN)
                 return;
-            
-            
+
             String toSend = Character.toString(event.getDisplayLabel());
             toSend.toUpperCase(Locale.getDefault());
             Log.d(TAG, "toSend " + toSend);
