diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 4bf65b7189cc24a25418209dc67f6533912a67d9..8693482e5880258e72478ca51587d5a6fc857453 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -90,6 +90,8 @@ public class CallActivity extends Activity implements OnClickListener
 
         findViewById(R.id.buttonanswer).setOnClickListener(this);
         findViewById(R.id.buttonhangup).setOnClickListener(this);
+        findViewById(R.id.buttonhold).setOnClickListener(this);
+        findViewById(R.id.buttonunhold).setOnClickListener(this);
 
         setCallStateDisplay(mCall.getCallStateString());
         
@@ -129,7 +131,6 @@ public class CallActivity extends Activity implements OnClickListener
             case R.id.buttonhangup:
                 if((mCall.getCallStateInt() == SipCall.CALL_STATE_NONE) ||
                    (mCall.getCallStateInt() == SipCall.CALL_STATE_CURRENT)) {
-
                     mCall.notifyServiceHangup(service);
                     finish();
                 }
@@ -138,6 +139,18 @@ public class CallActivity extends Activity implements OnClickListener
                     finish();
                 }
                 break;
+            case R.id.buttonhold:
+                Log.i(TAG, "HOLDBUTTONCLICK call state " + mCall.getCallStateString());
+                if(mCall.getCallStateInt() == SipCall.CALL_STATE_CURRENT) {
+                    mCall.notifyServiceHold(service);
+                }
+                break;
+            case R.id.buttonunhold:
+                Log.i(TAG, "UNHOLDBUTTONCLICK call state " + mCall.getCallStateString());
+                if(mCall.getCallStateInt() == SipCall.CALL_STATE_HOLD) {
+                    mCall.notifyServiceUnhold(service);
+                }
+                break;
             default:
                 Log.e(TAG, "Invalid button clicked");
         }
@@ -149,21 +162,29 @@ public class CallActivity extends Activity implements OnClickListener
         String newState = bundle.getString("State");
 
         if(newState.equals("INCOMING")) {
+            mCall.setCallState(SipCall.CALL_STATE_INCOMING);
             setCallStateDisplay(newState);
         } else if(newState.equals("RINGING")) {
+            mCall.setCallState(SipCall.CALL_STATE_RINGING);
             setCallStateDisplay(newState);
         } else if(newState.equals("CURRENT")) {
+            mCall.setCallState(SipCall.CALL_STATE_CURRENT);
             setCallStateDisplay(newState);
         } else if(newState.equals("HUNGUP")) {
+            mCall.setCallState(SipCall.CALL_STATE_HUNGUP);
             setCallStateDisplay(newState);
             finish();
         } else if(newState.equals("BUSY")) {
+            mCall.setCallState(SipCall.CALL_STATE_BUSY);
             setCallStateDisplay(newState);
         } else if(newState.equals("FAILURE")) {
+            mCall.setCallState(SipCall.CALL_STATE_FAILURE);
             setCallStateDisplay(newState);
         } else if(newState.equals("HOLD")) {
+            mCall.setCallState(SipCall.CALL_STATE_HOLD);
             setCallStateDisplay(newState);
         } else if(newState.equals("UNHOLD")) {
+            mCall.setCallState(SipCall.CALL_STATE_UNHOLD);
             setCallStateDisplay(newState);
         }
     }
diff --git a/src/com/savoirfairelinux/sflphone/client/SipCall.java b/src/com/savoirfairelinux/sflphone/client/SipCall.java
index 3895b979cb8313b29816d216291c4302347dfc27..6ca7d386d3f24378096d52b9f70ba7f358da9a00 100644
--- a/src/com/savoirfairelinux/sflphone/client/SipCall.java
+++ b/src/com/savoirfairelinux/sflphone/client/SipCall.java
@@ -332,6 +332,23 @@ public class SipCall
         }
     }
 
+    public void notifyServiceHold(ISipService service)
+    {
+        try {
+            service.hold(mCallInfo.mCallID);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Cannot call service method", e);
+        }
+    }
+
+    public void notifyServiceUnhold(ISipService service)
+    {
+        try {
+            service.unhold(mCallInfo.mCallID);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Cannot call service method", e);
+        }
+    }
 
     public void addToConference()
     {
diff --git a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
index 98dfc75ebb2d07eb882bc1842f8fd8bd8283124c..1bcf4b52a7f554ba06875d1f17a027df70b2d5e7 100644
--- a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
+++ b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
@@ -5,6 +5,8 @@ interface ISipService {
     void refuse(in String callID);
     void accept(in String callID);
     void hangUp(in String callID);
+    void hold(in String callID);
+    void unhold(in String callID);
     List getAccountList();
     String addAccount(in Map accountDetails);
     void removeAccount(in String accoundId);
diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index 3eb275850b9f003e9600a8c8f2920b3c3057ed31..c619970a940b53787ba419034a0166e757d3f998 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -109,6 +109,28 @@ public class SipService extends Service {
             });
         }
 
+        @Override
+        public void hold(final String callID) {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException {
+                    Log.i(TAG, "SipService.hold() thread running...");
+                    callManagerJNI.hold(callID);
+                }
+            });
+        }
+
+        @Override
+        public void unhold(final String callID) {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException {
+                    Log.i(TAG, "SipService.unhold() thread running...");
+                    callManagerJNI.unhold(callID);
+                }
+            });
+        }
+
         @Override
         public void setAudioPlugin(final String audioPlugin) {
             getExecutor().execute(new SipRunnable() {