Index: ctl/ctlListView.cpp
===================================================================
--- ctl/ctlListView.cpp	(revision 7539)
+++ ctl/ctlListView.cpp	(working copy)
@@ -56,13 +56,15 @@
 }
 
 
-long ctlListView::AppendItem(int icon, const wxChar *val, const wxChar *val2, const wxChar *val3)
+long ctlListView::AppendItem(int icon, const wxChar *val, const wxChar *val2, const wxChar *val3, const wxChar *val4)
 {
     long pos=InsertItem(GetItemCount(), val, icon);
     if (val2 && *val2)
         SetItem(pos, 1, val2);
     if (val3 && *val3)
         SetItem(pos, 2, val3);
+    if (val4 && *val4)
+        SetItem(pos, 3, val4);
 
     return pos;
 }
Index: include/ctl/ctlListView.h
===================================================================
--- include/ctl/ctlListView.h	(revision 7539)
+++ include/ctl/ctlListView.h	(working copy)
@@ -30,7 +30,7 @@
 
     void AddColumn(const wxChar *text, int size=wxLIST_AUTOSIZE_USEHEADER, int format=wxLIST_FORMAT_LEFT);
 
-    long AppendItem(int icon, const wxChar *val, const wxChar *val2=0, const wxChar *val3=0);
+    long AppendItem(int icon, const wxChar *val, const wxChar *val2=0, const wxChar *val3=0, const wxChar *val4=0);
     long AppendItem(const wxChar *val, const wxChar *val2=0, const wxChar *val3=0)
         {  return AppendItem(PGICON_PROPERTY, val, val2, val3); }
     void AppendItem(const wxChar *str, const long l)
Index: include/schema/pgFunction.h
===================================================================
--- include/schema/pgFunction.h	(revision 7539)
+++ include/schema/pgFunction.h	(working copy)
@@ -67,6 +67,8 @@
     void iSetBin(const wxString& s) { bin=s; }
     long GetArgCount() const { return argCount; }
     void iSetArgCount(long ac) { argCount = ac; }
+    void iSetArgDefValCount(long ac) { argDefValCount = ac; }
+    long GetArgDefValCount() { return argDefValCount; }
     long GetCost() const { return cost; }
     void iSetCost(long c) { cost = c; }
     long GetRows() const { return rows; }
@@ -101,7 +103,7 @@
     wxString returnType, language, volatility, source, bin;
     wxArrayString argNamesArray, argTypesArray, argModesArray, argDefsArray;
     bool returnAsSet, secureDefiner, isStrict;
-    long argCount, cost, rows;
+    long argCount, cost, rows, argDefValCount;
     wxArrayString configList;
 };
 
Index: include/utils/misc.h
===================================================================
--- include/utils/misc.h	(revision 7539)
+++ include/utils/misc.h	(working copy)
@@ -147,6 +147,8 @@
     char delimiter;
 };
 
+// Get comma(,) separated string array
+bool getCommaSeparatedArray(const wxString& str, wxArrayString& res);
 
 // File handling including encoding according to sysSettings if format<0,
 // 0-> local charset, 1->utf8
Index: include/dlg/dlgFunction.h
===================================================================
--- include/dlg/dlgFunction.h	(revision 7539)
+++ include/dlg/dlgFunction.h	(working copy)
@@ -49,6 +49,7 @@
     void OnSelChangeType(wxCommandEvent &ev);
     void OnAddArg(wxCommandEvent &ev);
     void OnChangeArg(wxCommandEvent &ev);
+    void OnChangeArgMode(wxCommandEvent &ev);
     void OnRemoveArg(wxCommandEvent &ev);
 
     void OnVarAdd(wxCommandEvent &ev);
@@ -71,6 +72,7 @@
 
 protected:
     bool isProcedure;
+    bool isBackendMinVer84;
 
     DECLARE_EVENT_TABLE()
 };
Index: schema/pgFunction.cpp
===================================================================
--- schema/pgFunction.cpp	(revision 7539)
+++ schema/pgFunction.cpp	(working copy)
@@ -272,10 +272,12 @@
                 arg += qtIdent(argNamesArray.Item(i));
 
             if (!argModesArray.Item(i).IsEmpty())
+            {
                 if (arg.IsEmpty())
                     arg += argModesArray.Item(i);
                 else
                     arg += wxT(" ") + argModesArray.Item(i);
+            }
         }
         else
         {
@@ -283,10 +285,12 @@
                 arg += argModesArray.Item(i);
 
             if (!argNamesArray.Item(i).IsEmpty())
+            {
                 if (arg.IsEmpty())
                     arg += qtIdent(argNamesArray.Item(i));
                 else
                     arg += wxT(" ") + qtIdent(argNamesArray.Item(i));
+            }
         }
 
         if (!arg.IsEmpty())
@@ -295,7 +299,7 @@
             arg += argTypesArray.Item(i);
 
         // Parameter default value
-        if (GetConnection()->HasFeature(FEATURE_FUNCTION_DEFAULTS))
+        if (GetConnection()->HasFeature(FEATURE_FUNCTION_DEFAULTS) || GetConnection()->BackendMinimumVersion(8, 4))
         {
             if (!argDefsArray.Item(i).IsEmpty())
                 arg += wxT(" DEFAULT ") + argDefsArray.Item(i);
@@ -343,13 +347,16 @@
     wxString argNamesCol, argDefsCol, proConfigCol;
     if (obj->GetConnection()->BackendMinimumVersion(8, 0))
         argNamesCol = wxT("proargnames, ");
-    if (obj->GetConnection()->HasFeature(FEATURE_FUNCTION_DEFAULTS))
+    if (obj->GetConnection()->HasFeature(FEATURE_FUNCTION_DEFAULTS) && !obj->GetConnection()->BackendMinimumVersion(8, 4))
         argDefsCol = wxT("proargdefvals, ");
+    if (obj->GetConnection()->BackendMinimumVersion(8, 4))
+        argDefsCol = wxT("pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals, pronargdefaults, ");
     if (obj->GetConnection()->BackendMinimumVersion(8, 3))
         proConfigCol = wxT("proconfig, ");
 
     pgSet *functions = obj->GetDatabase()->ExecuteSet(
-            wxT("SELECT pr.oid, pr.xmin, pr.*, format_type(TYP.oid, NULL) AS typname, typns.nspname AS typnsp, lanname, ") + argNamesCol  + argDefsCol + proConfigCol + 
+            wxT("SELECT pr.oid, pr.xmin, pr.*, format_type(TYP.oid, NULL) AS typname, typns.nspname AS typnsp, lanname, ") +
+            argNamesCol  + argDefsCol + proConfigCol + 
             wxT("       pg_get_userbyid(proowner) as funcowner, description\n")
             wxT("  FROM pg_proc pr\n")
             wxT("  JOIN pg_type typ ON typ.oid=prorettype\n")
@@ -362,20 +369,21 @@
     pgSet *types = obj->GetDatabase()->ExecuteSet(wxT(
                     "SELECT oid, format_type(oid, NULL) AS typname FROM pg_type"));
 
-	if (types)
-	{
+    if (types)
+    {
         while(!types->Eof())
         {
             typeCache[types->GetVal(wxT("oid"))] = types->GetVal(wxT("typname"));
             types->MoveNext();
         }
-	}
+    }
 
     if (functions)
     {
         while (!functions->Eof())
         {
             bool isProcedure=false;
+            bool hasDefValSupport = false;
             wxString lanname=functions->GetVal(wxT("lanname"));
             wxString typname=functions->GetVal(wxT("typname"));
 
@@ -390,13 +398,15 @@
                 function = new pgTriggerFunction(schema, functions->GetVal(wxT("proname")));
             else
                 function = new pgFunction(schema, functions->GetVal(wxT("proname")));
-
             
             // Tokenize the arguments
             wxStringTokenizer argTypesTkz(wxEmptyString), argModesTkz(wxEmptyString);
-            queryTokenizer argNamesTkz(wxEmptyString, (wxChar)','),  argDefsTkz(wxEmptyString, (wxChar)',');
+            queryTokenizer argNamesTkz(wxEmptyString, (wxChar)','), argDefsTkz(wxEmptyString, (wxChar)',');
             wxString tmp;
 
+            // Support for Default Value in PG 8.4
+            wxArrayString argDefValArray;
+
             // We always have types
             argTypesTkz.SetString(functions->GetVal(wxT("proargtypes")));
 
@@ -424,16 +434,27 @@
                     argModesTkz.SetString(tmp.Mid(1, tmp.Length()-2), wxT(","));
             }
 
-            // Function defaults
-            if (obj->GetConnection()->HasFeature(FEATURE_FUNCTION_DEFAULTS))
+            // EDB 8.3: Function defaults
+            if (obj->GetConnection()->HasFeature(FEATURE_FUNCTION_DEFAULTS) &&
+                !obj->GetConnection()->BackendMinimumVersion(8, 4))
             {
                 tmp = functions->GetVal(wxT("proargdefvals"));
                 if (!tmp.IsEmpty())
                     argDefsTkz.SetString(tmp.Mid(1, tmp.Length()-2), wxT(","));
             }
 
+            if (obj->GetConnection()->BackendMinimumVersion(8, 4))
+            {
+                hasDefValSupport = true;
+                tmp = functions->GetVal(wxT("proargdefaultvals"));
+                getCommaSeparatedArray(tmp, argDefValArray);
+
+                function->iSetArgDefValCount(functions->GetLong(wxT("pronargdefaults")));
+            }
+
             // Now iterate the arguments and build the arrays
             wxString type, name, mode, def;
+            size_t nArgsIN = 0;
             
             while (argTypesTkz.HasMoreTokens())
             {
@@ -469,19 +490,31 @@
                     else if (mode == wxT("3"))
                         mode = wxT("IN OUT");
                     else if (mode == wxT("v"))
-						mode = wxT("VARIADIC");
-					else
+                        mode = wxT("VARIADIC");
+                    else
+                    {
                         mode = wxT("IN");
+                        nArgsIN++;
+                    }
 
                     function->iAddArgMode(mode);
                 }
                 else
+                {
                     function->iAddArgMode(wxEmptyString);
+                    nArgsIN++;
+                }
 
-                // Finally the defaults, as we got them. 
-                def = argDefsTkz.GetNextToken();
-                if (!def.IsEmpty() && !def.IsSameAs(wxT("-")))
+                // Finally the defaults, as we got them.
+                if (!hasDefValSupport)
+                    def = argDefsTkz.GetNextToken();
+
+                if (hasDefValSupport)
                 {
+                    // We will process this later
+                }
+                else if (!def.IsEmpty() && !def.IsSameAs(wxT("-")))
+                {
                     if (def[0] == '"')
                         def = def.Mid(1, def.Length()-2);
 
@@ -497,13 +530,36 @@
                 else
                     function->iAddArgDef(wxEmptyString);
             }
+            
+            function->iSetArgCount(functions->GetLong(wxT("pronargs")));
 
+            // Process default values
+            if (obj->GetConnection()->BackendMinimumVersion(8, 4) &&
+                function->GetArgCount() != 0)
+            {
+                size_t currINindex = 0;
+                for (size_t index = 0; index < function->GetArgModesArray().Count(); index++)
+                {
+                    if (function->GetArgModesArray()[index] == wxT("IN") ||
+                        function->GetArgModesArray()[index].IsEmpty())
+                    {
+                        nArgsIN--;
+                        if (function->GetArgDefValCount() != 0 &&
+                            nArgsIN < (size_t)function->GetArgDefValCount())
+                        {
+                            function->iAddArgDef(argDefValArray[currINindex++]);
+                            continue;
+                        }
+                    }
+                    function->iAddArgDef(wxEmptyString);
+                }
+            }
+
             function->iSetOid(functions->GetOid(wxT("oid")));
-			function->iSetXid(functions->GetOid(wxT("xmin")));
+            function->iSetXid(functions->GetOid(wxT("xmin")));
             function->UpdateSchema(browser, functions->GetOid(wxT("pronamespace")));
             function->iSetOwner(functions->GetVal(wxT("funcowner")));
             function->iSetAcl(functions->GetVal(wxT("proacl")));
-            function->iSetArgCount(functions->GetLong(wxT("pronargs")));
             function->iSetReturnType(functions->GetVal(wxT("typname")));
             function->iSetComment(functions->GetVal(wxT("description")));
 
@@ -533,13 +589,13 @@
             if (browser)
             {
                 browser->AppendObject(obj, function);
-			    functions->MoveNext();
+                functions->MoveNext();
             }
             else
                 break;
         }
 
-		delete functions;
+        delete functions;
         delete types;
     }
     return function;
Index: schema/edbPackageFunction.cpp
===================================================================
--- schema/edbPackageFunction.cpp	(revision 7539)
+++ schema/edbPackageFunction.cpp	(working copy)
@@ -86,7 +86,7 @@
             arg += argTypesArray.Item(i);
 
         // Parameter default value
-        if (GetConnection()->HasFeature(FEATURE_FUNCTION_DEFAULTS))
+        if (GetConnection()->HasFeature(FEATURE_FUNCTION_DEFAULTS) || GetConnection()->BackendMinimumVersion(8, 4))
         {
             if (!argDefsArray.Item(i).IsEmpty())
                 arg += wxT(" DEFAULT ") + argDefsArray.Item(i);
Index: utils/misc.cpp
===================================================================
--- utils/misc.cpp	(revision 7539)
+++ utils/misc.cpp	(working copy)
@@ -1228,3 +1228,41 @@
 
 #endif // PGSCLI
 
+// Get comma(,) separated string array
+bool getCommaSeparatedArray(const wxString& str, wxArrayString& res)
+{
+    size_t len = str.Len(), index = 0, nBracketLevel = 0, startArray = 0;
+    bool inSingleQuote = false, inDoubleQuote = false;
+
+    if (len == 0)
+        return true;
+
+    for(; index < len; index++)
+    {
+        wxChar curr = str.GetChar(index);
+        if (!inDoubleQuote && curr == (wxChar)'\'')
+            inSingleQuote = !inSingleQuote;
+        else if (!inSingleQuote && curr == (wxChar)'"')
+            inDoubleQuote = !inDoubleQuote;
+        else if (!inDoubleQuote && !inSingleQuote && curr == (wxChar)'(')
+            nBracketLevel++;
+        else if (!inDoubleQuote && !inSingleQuote && curr == (wxChar)')')
+            nBracketLevel--;
+        else if (!inDoubleQuote && !inSingleQuote && nBracketLevel == 0 && curr == (wxChar)',')
+        {
+            if (index != startArray)
+                res.Add(str.SubString(startArray, index - 1).Trim());
+            else
+                res.Add(wxEmptyString);
+            startArray = index + 1;
+        }
+    }
+    if (inDoubleQuote || inSingleQuote || nBracketLevel != 0)
+        return false;
+
+    // Add last value to array
+    res.Add(str.SubString(startArray, index).Trim());
+    
+    return true;
+}
+
Index: dlg/dlgFunction.cpp
===================================================================
--- dlg/dlgFunction.cpp	(revision 7539)
+++ dlg/dlgFunction.cpp	(working copy)
@@ -43,6 +43,7 @@
 #define rdbVariadic         CTRL_RADIOBUTTON("rdbVariadic")
 
 #define txtArgName          CTRL_TEXT("txtArgName")
+#define txtArgDefVal        CTRL_TEXT("txtArgDefVal")
 #define btnAdd              CTRL_BUTTON("wxID_ADD")
 #define btnChange           CTRL_BUTTON("wxID_CHANGE")
 #define btnRemove           CTRL_BUTTON("wxID_REMOVE")
@@ -93,6 +94,10 @@
     EVT_BUTTON(XRCID("btnRemoveVar"),               dlgFunction::OnVarRemove)
     EVT_TEXT(XRCID("cbVarname"),                    dlgFunction::OnVarnameSelChange)
     EVT_COMBOBOX(XRCID("cbVarname"),                dlgFunction::OnVarnameSelChange)
+    EVT_RADIOBUTTON(XRCID("rdbIn"),                 dlgFunction::OnChangeArgMode)
+    EVT_RADIOBUTTON(XRCID("rdbOut"),                dlgFunction::OnChangeArgMode)
+    EVT_RADIOBUTTON(XRCID("rdbInOut"),              dlgFunction::OnChangeArgMode)
+    EVT_RADIOBUTTON(XRCID("rdbVariadic"),           dlgFunction::OnChangeArgMode)
 #ifdef __WXMAC__
     EVT_SIZE(                                       dlgFunction::OnChangeSize)
 #endif
@@ -154,24 +159,29 @@
 int dlgFunction::Go(bool modal)
 {
     int returncode;
+    isBackendMinVer84 = connection->BackendMinimumVersion(8, 4);
 
     if (function)
     {
         rdbIn->Disable();
         rdbOut->Disable();
         rdbInOut->Disable();
-		rdbVariadic->Disable();
+        rdbVariadic->Disable();
         isProcedure = function->GetIsProcedure();
     }
     else
         cbOwner->Append(wxEmptyString);
 
+    if (!isBackendMinVer84)
+        txtArgDefVal->Disable();
+
     AddGroups();
     AddUsers(cbOwner);
 
-    lstArguments->AddColumn(_("Type"), 80);
-    lstArguments->AddColumn(_("Mode"), 50);
-    lstArguments->AddColumn(_("Name"), 80);
+    lstArguments->AddColumn(_("Type"), 60);
+    lstArguments->AddColumn(_("Mode"), 40);
+    lstArguments->AddColumn(_("Name"), 60);
+    lstArguments->AddColumn(_("Default Value"), 60);
 
     if (!connection->BackendMinimumVersion(8, 0))
         cbOwner->Disable();
@@ -208,7 +218,7 @@
             rdbInOut->Disable();
         }
 
-        if (!connection->BackendMinimumVersion(8, 4))
+        if (!isBackendMinVer84)
         {
             rdbVariadic->Disable();
         }
@@ -261,13 +271,17 @@
 
         if (factory != &triggerFunctionFactory)
         {
-			wxArrayString argTypes = function->GetArgTypesArray();
+            wxArrayString argTypes = function->GetArgTypesArray();
             wxArrayString argNames = function->GetArgNamesArray();
             wxArrayString argModes = function->GetArgModesArray();
+            wxArrayString argDefs  = function->GetArgDefsArray();
 
             for (unsigned int i=0; i<argTypes.Count(); i++)
             {
-                lstArguments->AppendItem(-1, argTypes.Item(i), argModes[i], argNames[i]);
+                if (isBackendMinVer84)
+                    lstArguments->AppendItem(-1, argTypes.Item(i), argModes[i], argNames[i], argDefs[i]);
+                else
+                    lstArguments->AppendItem(-1, argTypes.Item(i), argModes[i], argNames[i]);
             }
         }
 
@@ -562,6 +576,11 @@
         else if (mode == wxT("VARIADIC"))
             rdbVariadic->SetValue(true);
         txtArgName->SetValue(lstArguments->GetText(row, 2));
+        if (isBackendMinVer84)
+        {
+            txtArgDefVal->SetValue(lstArguments->GetText(row, 3));
+            txtArgDefVal->Enable(mode == wxT("IN") || mode.IsEmpty());
+        }
 
         wxCommandEvent ev;
         OnChangeArgName(ev);
@@ -612,15 +631,32 @@
     }
 }
 
+void dlgFunction::OnChangeArgMode(wxCommandEvent &ev)
+{
+    // Do nothing, if Default value for function parameter not supported
+    if (!isBackendMinVer84)
+        return;
 
+    // Only IN parameter supports default value
+    if (!rdbIn->GetValue())
+    {
+        txtArgDefVal->SetValue(wxEmptyString);
+        txtArgDefVal->Enable(false);
+    }
+    else
+    {
+        txtArgDefVal->Enable(true);
+    }
+}
+
 void dlgFunction::OnChangeArg(wxCommandEvent &ev)
 {
-	if (GetSelectedDirection() == wxT("VARIADIC") && 
-		!cbDatatype->GetValue().EndsWith(wxT("[]")))
-	{
-		wxLogError(_("Only array types can be VARIADIC."));
-		return;
-	}
+    if (GetSelectedDirection() == wxT("VARIADIC") && 
+        !cbDatatype->GetValue().EndsWith(wxT("[]")))
+    {
+        wxLogError(_("Only array types can be VARIADIC."));
+        return;
+    }
 
     int row=lstArguments->GetSelection();
 
@@ -629,6 +665,8 @@
         lstArguments->SetItem(row, 0, cbDatatype->GetValue());
         lstArguments->SetItem(row, 1, GetSelectedDirection());
         lstArguments->SetItem(row, 2, txtArgName->GetValue());
+        if (isBackendMinVer84)
+            lstArguments->SetItem(row, 3, txtArgDefVal->GetValue());
 
         if (!function)
             argOids.Item(row) = typOids.Item(cbDatatype->GetGuessedSelection());
@@ -641,14 +679,14 @@
 
 void dlgFunction::OnAddArg(wxCommandEvent &ev)
 {
-	if (GetSelectedDirection() == wxT("VARIADIC") && 
-		!cbDatatype->GetValue().EndsWith(wxT("[]")))
-	{
-		wxLogError(_("Only array types can be VARIADIC."));
-		return;
-	}
+    if (GetSelectedDirection() == wxT("VARIADIC") && 
+        !cbDatatype->GetValue().EndsWith(wxT("[]")))
+    {
+        wxLogError(_("Only array types can be VARIADIC."));
+        return;
+    }
 
-    lstArguments->AppendItem(-1, cbDatatype->GetValue(), GetSelectedDirection(), txtArgName->GetValue());
+    lstArguments->AppendItem(-1, cbDatatype->GetValue(), GetSelectedDirection(), txtArgName->GetValue(), txtArgDefVal->GetValue().Trim());
 
     if (!function)
         argOids.Add(typOids.Item(cbDatatype->GetGuessedSelection()));
@@ -729,6 +767,8 @@
 
             args += lstArguments->GetText(i, 0);
         }
+        if (isBackendMinVer84 && !lstArguments->GetText(i, 3).IsEmpty())
+           args += wxT(" DEFAULT ") + lstArguments->GetText(i, 3);
     }
 
     return args;
Index: ui/dlgFunction.xrc
===================================================================
--- ui/dlgFunction.xrc	(revision 7539)
+++ ui/dlgFunction.xrc	(working copy)
@@ -301,10 +301,20 @@
                       <object class="wxTextCtrl" name="txtArgName"/>
                       <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag>
                     </object>
+                    <object class="sizeritem">
+                      <object class="wxStaticText" name="stArgDefVal">
+                        <label>Default Value</label>
+                      </object>
+                      <flag>wxALIGN_CENTRE_VERTICAL</flag>
+                    </object>
+                    <object class="sizeritem">
+                      <object class="wxTextCtrl" name="txtArgDefVal"/>
+                      <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag>
+                    </object>
                     <cols>2</cols>
-                    <rows>3</rows>
-                    <vgap>5</vgap>
-                    <hgap>5</hgap>
+                    <rows>4</rows>
+                    <vgap>4</vgap>
+                    <hgap>4</hgap>
                     <growablecols>1</growablecols>
                   </object>
                   <flag>wxALL|wxEXPAND|wxALIGN_BOTTOM|wxALIGN_CENTRE_HORIZONTAL</flag>