diff --git a/src/com/savoirfairelinux/sflphone/fragments/AudioManagementFragment.java b/src/com/savoirfairelinux/sflphone/fragments/AudioManagementFragment.java
new file mode 100644
index 0000000..954eb49
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/fragments/AudioManagementFragment.java
@@ -0,0 +1,261 @@
+/*
+ *  Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
+ *
+ *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+package com.savoirfairelinux.sflphone.fragments;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Typeface;
+import android.preference.EditTextPreference;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+import android.os.Bundle;
+import android.util.Log;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TextView;
+
+import com.savoirfairelinux.sflphone.R;
+
+public class AudioManagementFragment extends PreferenceFragment
+{
+    static final String TAG = "PrefManagementFragment";
+    static final String CURRENT_VALUE = "Current value:: "; 
+
+    public AudioManagementFragment()
+    {
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+
+        setPreferenceScreen(getAudioPreferenceScreen()); 
+    }
+
+    Preference.OnPreferenceChangeListener changePreferenceListener = new Preference.OnPreferenceChangeListener() {
+        public boolean onPreferenceChange(Preference preference, Object newValue) {
+            preference.setSummary(CURRENT_VALUE + (CharSequence)newValue);
+            return true;
+        }
+    };
+
+    public PreferenceScreen getAudioPreferenceScreen()
+    {
+        Activity currentContext = getActivity();
+
+        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(currentContext);
+
+        PreferenceCategory audioPrefCat = new PreferenceCategory(currentContext);
+        audioPrefCat.setTitle(R.string.audio_preferences);
+        root.addPreference(audioPrefCat);
+
+        // Codec List
+        ListPreference codecListPref = new ListPreference(currentContext);
+        codecListPref.setEntries(R.array.audio_codec_list);
+        codecListPref.setEntryValues(R.array.audio_codec_list_value);
+        codecListPref.setDialogTitle(R.string.dialogtitle_audio_codec_list);
+        codecListPref.setPersistent(false);
+        codecListPref.setTitle(R.string.title_audio_codec_list);
+        codecListPref.setSummary(CURRENT_VALUE + "PCMU");
+        codecListPref.setOnPreferenceChangeListener(changePreferenceListener);
+        audioPrefCat.addPreference(codecListPref);
+
+        // Ringtone
+        EditTextPreference audioRingtonePref = new EditTextPreference(currentContext);
+        audioRingtonePref.setDialogTitle(R.string.dialogtitle_audio_ringtone_field);
+        audioRingtonePref.setPersistent(false);
+        audioRingtonePref.setTitle(R.string.title_audio_ringtone_field);
+        audioRingtonePref.setSummary(CURRENT_VALUE + "path/to/ringtone");
+        audioRingtonePref.setOnPreferenceChangeListener(changePreferenceListener);
+        audioPrefCat.addPreference(audioRingtonePref);
+
+        // Speaker volume seekbar
+        SeekBarPreference speakerSeekBarPref = new SeekBarPreference(currentContext);
+        speakerSeekBarPref.setPersistent(false);
+        speakerSeekBarPref.setTitle("Speaker Volume");
+        speakerSeekBarPref.setProgress(50);
+        speakerSeekBarPref.setSummary(CURRENT_VALUE + speakerSeekBarPref.getProgress());
+        audioPrefCat.addPreference(speakerSeekBarPref);
+
+        // Capture volume seekbar
+        SeekBarPreference captureSeekBarPref = new SeekBarPreference(currentContext);
+        captureSeekBarPref.setPersistent(false);
+        captureSeekBarPref.setTitle("Capture Volume");
+        captureSeekBarPref.setProgress(50);
+        captureSeekBarPref.setSummary(CURRENT_VALUE + captureSeekBarPref.getProgress());
+        audioPrefCat.addPreference(captureSeekBarPref);
+
+        // Ringtone volume seekbar
+        SeekBarPreference ringtoneSeekBarPref = new SeekBarPreference(currentContext);
+        ringtoneSeekBarPref.setPersistent(false);
+        ringtoneSeekBarPref.setTitle("Ringtone Volume");
+        ringtoneSeekBarPref.setProgress(50);
+        ringtoneSeekBarPref.setSummary(CURRENT_VALUE + ringtoneSeekBarPref.getProgress());
+        audioPrefCat.addPreference(ringtoneSeekBarPref);
+
+        return root;
+    }
+
+    public class SeekBarPreference extends Preference implements OnSeekBarChangeListener
+    {
+        private SeekBar seekbar;
+        private int progress;
+        private int max = 100;
+        private TextView summary;
+        private boolean discard;
+
+        public SeekBarPreference (Context context)
+        {
+            super( context );
+        }
+
+        public SeekBarPreference (Context context, AttributeSet attrs)
+        {
+            super( context, attrs );
+        }
+
+        public SeekBarPreference (Context context, AttributeSet attrs, int defStyle)
+        {
+            super( context, attrs, defStyle );
+        }
+
+        protected View onCreateView (ViewGroup p)
+        {
+            final Context ctx = getContext();
+
+            LinearLayout layout = new LinearLayout( ctx );
+            layout.setId( android.R.id.widget_frame );
+            layout.setOrientation( LinearLayout.VERTICAL );
+            layout.setPadding(65, 10, 15, 10);
+
+            TextView title = new TextView( ctx );
+            int textColor = title.getCurrentTextColor();
+            title.setId( android.R.id.title );
+            title.setSingleLine();
+            title.setTextAppearance( ctx, android.R.style.TextAppearance_Medium );
+            title.setTextColor( textColor );
+            layout.addView( title );
+
+            summary = new TextView( ctx );
+            summary.setId( android.R.id.summary );
+            summary.setSingleLine();
+            summary.setTextAppearance( ctx, android.R.style.TextAppearance_Small );
+            summary.setTextColor( textColor );
+            layout.addView( summary );
+
+            seekbar = new SeekBar( ctx );
+            seekbar.setId( android.R.id.progress );
+            seekbar.setMax( max );
+            seekbar.setOnSeekBarChangeListener( this );
+            layout.addView( seekbar );
+
+            return layout;
+        }
+
+        @Override
+        protected void onBindView (View view)
+        {
+            super.onBindView( view );
+
+            if (seekbar != null)
+                seekbar.setProgress( progress );
+        }
+
+        public void setProgress (int pcnt) {
+            if (progress != pcnt) {
+                persistInt( progress = pcnt );
+
+                notifyDependencyChange( shouldDisableDependents() );
+                notifyChanged();
+            }
+        }
+
+        public int getProgress () {
+            return progress;
+        }
+
+        public void setMax (int max) {
+            this.max = max;
+            if (seekbar != null)
+                seekbar.setMax( max );
+        }
+
+        private SeekBar getSeekBar () {
+            return seekbar;
+        }
+
+        @Override
+        protected Object onGetDefaultValue (TypedArray a, int index) {
+            return a.getInt( index, progress );
+        }
+
+        @Override
+        protected void onSetInitialValue (boolean restoreValue, Object defaultValue) {
+            setProgress( restoreValue ? getPersistedInt( progress ) : (Integer)defaultValue );
+        }
+
+        @Override
+        public boolean shouldDisableDependents () {
+            return progress == 0 || super.shouldDisableDependents();
+        }
+
+        public void onProgressChanged (SeekBar seekBar, int progress, boolean fromUser) {
+            discard = !callChangeListener( progress );
+            summary.setText(CURRENT_VALUE + progress); 
+        }
+
+        public void onStartTrackingTouch (SeekBar seekBar) {
+            discard = false;
+        }
+
+        public void onStopTrackingTouch (SeekBar seekBar) {
+            if (discard)
+                seekBar.setProgress( progress );
+            else {
+                setProgress( seekBar.getProgress() );
+
+                OnPreferenceChangeListener listener = getOnPreferenceChangeListener();
+                //if (listener instanceof AbstractSeekBarListener)
+                ////        setSummary( ((AbstractSeekBarListener)listener).toSummary( seekBar.getProgress() ) );
+            }
+        }
+    }
+}
