diff --git a/src/com/savoirfairelinux/sflphone/client/ButtonSectionFragment.java b/src/com/savoirfairelinux/sflphone/client/ButtonSectionFragment.java
index 076ef5f..f4fb81b 100644
--- a/src/com/savoirfairelinux/sflphone/client/ButtonSectionFragment.java
+++ b/src/com/savoirfairelinux/sflphone/client/ButtonSectionFragment.java
@@ -6,8 +6,10 @@
 import android.view.InflateException;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.Button;
+import android.widget.EditText;
 import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
@@ -40,12 +42,11 @@
 		@Override
 		public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
 		{
-			View view;
-			
-			Log.i(TAG, "onCreateView" );
-			view = inflater.inflate(R.layout.test_layout, parent, false);
+		    View view;
+		    Log.i(TAG, "onCreateView" );
+		    view = inflater.inflate(R.layout.test_layout, parent, false);
 
-			callVoidText = (TextView) view.findViewById(R.id.callVoid_text);
+		    callVoidText = (TextView) view.findViewById(R.id.callVoid_text);
 
 		    NewDataText = (TextView) view.findViewById(R.id.NewData_text);  
 		    buttonGetNewData = (Button) view.findViewById(R.id.buttonGetNewData);
@@ -53,13 +54,21 @@
 		    DataStringText = (TextView) view.findViewById(R.id.DataString_text);
 		    buttonGetDataString = (Button) view.findViewById(R.id.buttonGetDataString);
 
-		    try {
-				inflater.inflate(R.layout.test_layout, parent, false);
-			} catch (InflateException e) {
-				Log.e(TAG, "Error inflating test_layout ", e);
-				return null;
-			}
+                    Numpad numpad = (Numpad) view.findViewById(R.id.numPad);
+                    EditText textEntry = (EditText) view.findViewById(R.id.numDisplay);
 
-			return view;
+                    numpad.setEditText(textEntry);
+
+/*
+		    try {
+		        inflater.inflate(R.layout.test_layout, parent, false);
+		    } catch (InflateException e) {
+			Log.e(TAG, "Error inflating test_layout ", e);
+			return null;
+		    }
+*/
+
+
+		    return view;
 		}
 }
diff --git a/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
index ce19330..f2239df 100644
--- a/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
@@ -238,6 +238,18 @@
                 return true;
             }
         });
+
+        lv.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                Log.i(TAG, "On Item Selected");
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+                Log.i(TAG, "On Nothing Selected");
+            }
+        });
     }
 
     @Override
diff --git a/src/com/savoirfairelinux/sflphone/client/Numpad.java b/src/com/savoirfairelinux/sflphone/client/Numpad.java
new file mode 100644
index 0000000..e8a570a
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/client/Numpad.java
@@ -0,0 +1,74 @@
+package com.savoirfairelinux.sflphone.client;
+
+import android.content.Context;
+import android.text.Editable;
+import android.widget.TableLayout;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+
+import com.savoirfairelinux.sflphone.R;
+
+public class Numpad extends TableLayout implements OnClickListener
+{
+    private static final String TAG = "Numpad";
+    private static final SparseArray<String> DIGITS_NAME = new SparseArray<String>();
+    private EditText mEditText;
+
+    static {
+        DIGITS_NAME.put(R.id.numButton0, "0");
+        DIGITS_NAME.put(R.id.numButton1, "1");
+        DIGITS_NAME.put(R.id.numButton2, "2");
+        DIGITS_NAME.put(R.id.numButton3, "3");
+        DIGITS_NAME.put(R.id.numButton4, "4");
+        DIGITS_NAME.put(R.id.numButton5, "5");
+        DIGITS_NAME.put(R.id.numButton6, "6");
+        DIGITS_NAME.put(R.id.numButton7, "7");
+        DIGITS_NAME.put(R.id.numButton8, "8");
+        DIGITS_NAME.put(R.id.numButton9, "9");
+        DIGITS_NAME.put(R.id.numButtonStar, "*");
+        DIGITS_NAME.put(R.id.numButtonSharp, "#");
+    }
+
+    public Numpad(Context context)
+    {
+        super(context);
+    }
+
+    public Numpad(Context context, AttributeSet attrs)
+    {
+        super(context, attrs);
+        LayoutInflater inflater = LayoutInflater.from(context);
+        inflater.inflate(R.layout.numpad, this, true);
+    }
+
+    protected void onFinishInflate()
+    {
+        super.onFinishInflate();
+
+        for(int i = 0; i < DIGITS_NAME.size(); i++)
+        {
+            Button b = (Button) findViewById(DIGITS_NAME.keyAt(i));
+            b.setText(DIGITS_NAME.valueAt(i));
+            b.setOnClickListener(this);
+        }
+    }
+
+    public void setEditText(EditText editText)
+    {
+        mEditText = editText;
+    } 
+
+    @Override
+    public void onClick(View v)
+    {
+        Log.i(TAG, "Clicked " + ((Button)v).getText().toString() );
+        Editable edit = mEditText.getText(); 
+        edit.append(((Button)v).getText());
+    }
+}
