diff --git a/Lib/idlelib/config-extensions.def b/Lib/idlelib/config-extensions.def
new file mode 100644
index 0000000..d1c1ee2
--- /dev/null
+++ b/Lib/idlelib/config-extensions.def
@@ -0,0 +1,34 @@
+# IDLE reads several config files to determine user preferences.  This 
+# file is the default config file for idle extensions settings.  
+
+[SearchBinding]
+enable=1
+
+[AutoIndent]
+enable=1
+
+[AutoExpand]
+enable=1
+
+[FormatParagraph]
+enable=1
+
+[ZoomHeight]
+enable=1
+
+#[ScriptBinding]    # disabled in favor of ExecBinding
+#enable=0
+
+[ExecBinding]
+enable=1
+
+[CallTips]
+enable=1
+
+[ParenMatch]
+enable=0
+style= expression
+flash-delay= 500
+bell= 1
+hilite-foreground= black
+hilite-background= #43cd80
diff --git a/Lib/idlelib/config-highlight.def b/Lib/idlelib/config-highlight.def
new file mode 100644
index 0000000..a2d3b56
--- /dev/null
+++ b/Lib/idlelib/config-highlight.def
@@ -0,0 +1,56 @@
+# IDLE reads several config files to determine user preferences.  This 
+# file is the default config file for idle highlight theme settings.  
+
+[IDLE Classic Old - plain fonts]
+normal-foreground= black
+normal-background= white
+normal-fontStyle= normal
+keyword-foreground= #ff7700
+keyword-fontStyle= normal
+comment-foreground= #dd0000
+comment-fontStyle= normal
+string-foreground= #00aa00
+string-fontStyle= normal
+definition-foreground= #0000ff
+definition-fontStyle= normal
+hilite-foreground= #000068
+hilite-background= #006868
+hilite-fontStyle= normal
+break-foreground= #ff7777
+break-fontStyle= normal
+hit-background= #000000
+hit-foreground= #ffffff
+hit-fontStyle= normal
+cursor-background= black
+error-background= #ff7777
+#shell window
+stdout-foreground= blue
+stdout-fontStyle= normal
+stderr-foreground= red
+stderr-fontStyle= normal
+console-foreground= #770000
+console-fontStyle= normal
+
+[IDLE Classic New]
+normal-foreground= black
+normal-background= white
+normal-fontStyle= normal
+keyword-foreground= #ff7700
+keyword-fontStyle= bold
+comment-foreground= #dd0000
+comment-fontStyle= italic
+string-foreground= #00aa00
+string-fontStyle= normal
+definition-foreground= #0000ff
+definition-fontStyle= bold
+hilite-foreground= #000068
+hilite-background= #006868
+break-foreground= #ff7777
+hit-background= #000000
+hit-foreground= #ffffff
+cursor-background= black
+error-background= #ff7777
+#shell window
+stdout-foreground= blue
+stderr-foreground= red
+console-foreground= #770000
diff --git a/Lib/idlelib/config-keys.def b/Lib/idlelib/config-keys.def
new file mode 100644
index 0000000..cae0301
--- /dev/null
+++ b/Lib/idlelib/config-keys.def
@@ -0,0 +1,58 @@
+# IDLE reads several config files to determine user preferences.  This 
+# file is the default config file for idle key binding settings.  
+
+[IDLE Classic - windows]
+Copy= '<Control-c> <Control-C>'
+Cut= '<Control-x> <Control-X>'
+Paste= '<Control-v> <Control-V>'
+beginning-of-line= '<Control-a> <Home>'
+center-insert= '<Control-l>'
+close-all-windows= '<Control-q>'
+close-window= '<Alt-F4>'
+dump-undo-state= '<Control-backslash>'
+end-of-file= '<Control-d>'
+python-docs= '<F1>'
+history-next= '<Alt-n>'
+history-previous= '<Alt-p>'
+interrupt-execution= '<Control-c>'
+open-class-browser= '<Alt-c>'
+open-module= '<Alt-m>'
+open-new-window= '<Control-n>'
+open-window-from-file= '<Control-o>'
+plain-newline-and-indent= '<Control-j>'
+redo= '<Control-y>'
+remove-selection= '<Escape>'
+save-copy-of-window-as-file= '<Alt-Shift-s>'
+save-window-as-file= '<Alt-s>'
+save-window= '<Control-s>'
+select-all= '<Alt-a>'
+toggle-auto-coloring= '<Control-slash>'
+undo= '<Control-z>'
+
+[IDLE Classic - posix]
+Copy= '<Alt-w> <Meta-w>'
+Cut= '<Control-w>'
+Paste= '<Control-y>'
+beginning-of-line= '<Control-a> <Home>'
+center-insert= '<Control-l>'
+close-all-windows= '<Control-x><Control-c>'
+close-window= '<Control-x><Control-0> <Control-x><Key-0>'
+do-nothing= '<Control-x>'
+dump-undo-state= '<Control-backslash>'
+end-of-file= '<Control-d>'
+help= '<F1>'
+history-next= '<Alt-n> <Meta-n>'
+history-previous= '<Alt-p> <Meta-p>'
+interrupt-execution= '<Control-c>'
+open-class-browser= '<Control-x><Control-b>'
+open-module= '<Control-x><Control-m>'
+open-new-window= '<Control-x><Control-n>'
+open-window-from-file= '<Control-x><Control-f>'
+plain-newline-and-indent= '<Control-j>'
+redo= '<Alt-z> <Meta-z>'
+save-copy-of-window-as-file= '<Control-x><w>'
+save-window-as-file= '<Control-x><Control-w>'
+save-window= '<Control-x><Control-s>'
+select-all= '<Alt-a> <Meta-a>'
+toggle-auto-coloring= '<Control-slash>'
+undo= '<Control-z>'
diff --git a/Lib/idlelib/config-main.def b/Lib/idlelib/config-main.def
new file mode 100644
index 0000000..47a2e52
--- /dev/null
+++ b/Lib/idlelib/config-main.def
@@ -0,0 +1,63 @@
+# IDLE reads several config files to determine user preferences.  This 
+# file is the default config file for general idle settings.
+#  
+# When IDLE starts, it will look in
+# the following two sets of files, in order:
+#
+#     default configuration
+#     ---------------------
+#     config-main.def         the default general config file
+#     config-extensions.def   the default extension config file
+#     config-highlight.def    the default highlighting config file
+#     config-keys.def         the default keybinding config file
+#
+#     user configuration
+#     -------------------
+#     ~/.idlerc/idle-main.cfg            the user general config file
+#     ~/.idlerc/idle-extensions.cfg      the user extension config file
+#     ~/.idlerc/idle-highlight.cfg       the user highlighting config file
+#     ~/.idlerc/idle-keys.cfg            the user keybinding config file
+# XXX what about Windows?
+#
+# Any options the user saves through the config dialog will be saved to
+# the relevant user config file. Reverting any general setting to the 
+# default causes that entry to be wiped from the user file and re-read 
+# from the default file. User highlighting themes or keybinding sets are
+# retained unless specifically deleted within the config dialog. Choosing
+# one of the default themes or keysets just applies the relevant settings 
+# from the default file. 
+
+[General]
+run-in-separate-process= 1
+
+[EditorWindow]
+width= 80
+height= 24
+font= courier
+font-size= 12
+
+[Indent]
+use-spaces= 1
+num-spaces= 4
+tab-cols= 4
+
+[Theme]
+user= 0  
+name= "IDLE Classic New"
+
+[Keys]
+user= 0  
+name= "IDLE Classic - windows"
+
+[RecentFiles]
+1=
+2=
+3=
+4=
+5=
+6=
+7=
+8=
+9=
+10=
+
diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py
index 4fb90e9..5b3c47d 100644
--- a/Lib/idlelib/configDialog.py
+++ b/Lib/idlelib/configDialog.py
@@ -10,7 +10,7 @@
 from Tkinter import *
 import tkMessageBox, tkColorChooser, tkFont
 
-import IdleConf
+from configHandler import idleConf
 
 class ConfigDialog(Toplevel):
     """
@@ -24,10 +24,7 @@
         self.configure(borderwidth=5)
         self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
                 parent.winfo_rooty()+30))
-        self.LoadConfig()
-        #elguavas - config placeholders til config stuff completed
-        self.bg=self.cget('bg')
-        self.fg=None
+        #self.LoadConfig()
 
         self.CreateWidgets()
         self.resizable(height=FALSE,width=FALSE)
@@ -45,19 +42,9 @@
         self.bind('<Alt-h>',self.ChangePageBinding)
         self.bind('<Alt-k>',self.ChangePageBinding)
         self.bind('<Alt-g>',self.ChangePageBinding)
+        #self.LoadOptMenuHighlightTarget()
         self.wait_window()
         
-    def LoadConfig(self):
-        #self.configParser=IdleConf.idleconf
-        #self.loadedConfig={}        
-        #self.workingConfig={}
-        #for key in .keys():        
-        #print self.configParser.getsection('Colors').options()
-        self.workingTestColours={
-                'Foo-Bg': '#ffffff',
-                'Foo-Fg': '#000000',
-                'Bar-Bg': '#777777'}
-        
     def Cancel(self):
         self.destroy()
 
@@ -134,17 +121,7 @@
             self.frameHighlightSample.update() #redraw after dialog
             self.labelTestSample.update()
 
-    def __LoadFontList(self):
-        fonts=list(tkFont.families(self))
-        fonts.sort()
-        for font in fonts:
-            self.listFontName.insert(END,font)
-        currentFontIndex=fonts.index('courier')
-        self.listFontName.see(currentFontIndex)
-        self.listFontName.select_set(currentFontIndex)
-        self.fontSize.set('12')
-    
-    def __SetFontSample(self,event):
+    def SetFontSample(self,event):
         self.newFont.config(size=self.fontSize.get(),weight=NORMAL,
             family=self.listFontName.get(self.listFontName.curselection()[0]))
     
@@ -167,13 +144,14 @@
         pageButtonNames=('Fonts/Tabs','Highlighting','Keys','General')
         self.pageButtons=[]
         buttonValue=0
+        buttonSelColour=framePageButtons.cget('bg')
         for name in pageButtonNames:
             buttonFrame=Frame(framePageButtons,borderwidth=2,relief=RIDGE)
             buttonFrame.pack(side=LEFT)
             button = Radiobutton(buttonFrame,command=self.ChangePage,
                 value=buttonValue,padx=5,pady=5,takefocus=FALSE,underline=0,
                 indicatoron=FALSE,highlightthickness=0,variable=self.pageNum,
-                selectcolor=self.bg,borderwidth=0,text=name)
+                selectcolor=buttonSelColour,borderwidth=0,text=name)
             button.pack()
             button.lift()
             self.pageButtons.append(button)
@@ -216,21 +194,20 @@
                 text='Font :')
         self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
                 exportselection=FALSE)
-        self.listFontName.bind('<<ListboxSelect>>',self.__SetFontSample)
+        self.listFontName.bind('<<ListboxSelect>>',self.SetFontSample)
         scrollFont=Scrollbar(frameFontName)
-        self.__LoadFontList()
+        self.LoadFontList()
         scrollFont.config(command=self.listFontName.yview)
         self.listFontName.config(yscrollcommand=scrollFont.set)
         labelFontSizeTitle=Label(frameFontSize,text='Size :')
         sizes=('10','11','12','13','14','16','18','20','22')
         args=(frameFontSize,self.fontSize)+sizes
-        keyArgs={'command':self.__SetFontSample}
+        keyArgs={'command':self.SetFontSample}
         optFontSize=apply(OptionMenu,args,keyArgs)
-        #optFontSize.bind('<<MenuSelect>>',self.__SetFontSample)
-        frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1,
-                bg=self.workingTestColours['Foo-Bg'])
-        self.labelFontSample=Label(frameFontSample,bg=self.workingTestColours['Foo-Bg'], 
-                fg='#000000',text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
+        #optFontSize.bind('<<MenuSelect>>',self.SetFontSample)
+        frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
+        self.labelFontSample=Label(frameFontSample,
+                text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
                 justify=LEFT,font=self.newFont)
         #frameIndent
         labelIndentTitle=Label(frameIndent,text='Set Indentation Defaults')
@@ -299,18 +276,16 @@
         frameCustom=Frame(frame,borderwidth=2,relief=GROOVE)
         frameTheme=Frame(frame,borderwidth=2,relief=GROOVE)
         #frameCustom
-        frameTarget=Frame(frameCustom)
-        self.frameHighlightSample=Frame(frameCustom,relief=SOLID,borderwidth=1,
-                bg=self.workingTestColours['Foo-Bg'],cursor='hand2')
+        self.frameHighlightTarget=Frame(frameCustom)
+        self.frameHighlightSample=Frame(frameCustom,relief=SOLID,
+                borderwidth=1,cursor='hand2')
         frameSet=Frame(frameCustom)
-        self.frameColourSet=Frame(frameSet,relief=SOLID,borderwidth=1,
-                bg=self.workingTestColours['Foo-Bg'])
+        self.frameColourSet=Frame(frameSet,relief=SOLID,borderwidth=1)
         frameFontSet=Frame(frameSet)
         labelCustomTitle=Label(frameCustom,text='Set Custom Highlighting')
-        labelTargetTitle=Label(frameTarget,text='for : ')
-        optMenuTarget=OptionMenu(frameTarget,
+        labelTargetTitle=Label(self.frameHighlightTarget,text='for : ')
+        self.optMenuHighlightTarget=OptionMenu(self.frameHighlightTarget,
             self.highlightTarget,'normal text background','test target interface item 2')
-        self.highlightTarget.set('normal text background')
         buttonSetColour=Button(self.frameColourSet,text='Set Colour',
                 command=self.GetColour)
         labelFontTitle=Label(frameFontSet,text='Set Font Style')
@@ -322,8 +297,7 @@
             text='#when finished, this\n#sample area will\n#be interactive\n'+
             'def Ahem(foo,bar):\n    '+
             '"""'+'doc hazard'+'"""'+
-            '\n    test=foo\n    text=bar\n    return',
-            bg=self.workingTestColours['Foo-Bg'])        
+            '\n    test=foo\n    text=bar\n    return')        
         buttonSaveCustomTheme=Button(frameCustom, 
             text='Save as a Custom Theme')
         #frameTheme
@@ -350,13 +324,13 @@
         frameTheme.pack(side=LEFT,padx=5,pady=10,fill=Y)
         #frameCustom
         labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
-        frameTarget.pack(side=TOP,padx=5,pady=5,fill=X)
+        self.frameHighlightTarget.pack(side=TOP,padx=5,pady=5,fill=X)
         self.frameHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
         frameSet.pack(side=TOP,fill=X)
         self.frameColourSet.pack(side=LEFT,padx=5,pady=5,fill=BOTH)
         frameFontSet.pack(side=RIGHT,padx=5,pady=5,anchor=W)
         labelTargetTitle.pack(side=LEFT,anchor=E)
-        optMenuTarget.pack(side=RIGHT,anchor=W,expand=TRUE,fill=X)
+        self.optMenuHighlightTarget.pack(side=RIGHT,anchor=W,expand=TRUE,fill=X)
         buttonSetColour.pack(expand=TRUE,fill=BOTH,padx=10,pady=10)
         labelFontTitle.pack(side=TOP,anchor=W)
         checkFontBold.pack(side=LEFT,anchor=W,pady=2)
@@ -529,6 +503,68 @@
 
         return frame
 
+    def LoadFontList(self):
+        fonts=list(tkFont.families(self))
+        fonts.sort()
+        for font in fonts:
+            self.listFontName.insert(END,font)
+        currentFontIndex=fonts.index('courier')
+        self.listFontName.see(currentFontIndex)
+        self.listFontName.select_set(currentFontIndex)
+        self.fontSize.set('12')
+    
+    #def LoadOptionMenu(self, optMenu, optList, optVar, optVal=None, 
+    #            command=None):
+    def LoadOptionMenu(self, optMenu, optVar, optVal=None, command=None):
+        """
+        Load the relevant list of values into an OptionMenu and set 
+        selected value if required.
+        """
+        params={'cfg':None,
+                'section':None,
+                'optList':None,
+                'optVar':None,
+                'optVal':None,
+                'command':None}
+        if optMenu == self.optMenuHighlightTarget:
+            params['cfg']=idleConf.userCfg['highlight']
+#             if 
+#             params['section']=idleconf.userCfg['main'].GetDef('EditorWindow',
+#                     'theme')
+#             
+#             params['optVar']=self.HighlightTarget
+#             params['optList']=idleconf.defaultCfg['main'].options(params.Section)
+#             else: # a default theme
+#                 pass
+            #params.optList=idleConf
+            
+
+        #if not params.optVar.get(): #no value set yet (initial load)
+        #    params.optVal=   
+
+        #if params.section: #we're asking to load a list of option names
+        #    optList=params.cfg
+        #elif optMenu == xx:
+        #else:
+        
+        #if self.HighlightTarget.get(): #if there was a value set (reload)
+        #    params.optVal=self.HighlightTarget.get() 
+        #else: #no value set yet (initial load)
+        #if not params.optVar.get(): #no value set yet (initial load)   
+            
+        menu=optMenu['menu']
+        print menu
+        menu.delete(0,END)
+        for item in optList:
+            menu.add_command(label=item,command=command)
+        if optVal:
+            optVar.set(optVal)
+        elif optList:
+            optVar.set(optList[0])
+
+    def SaveConfigs(self):
+        pass
+
 if __name__ == '__main__':
     #test the dialog
     root=Tk()
diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py
new file mode 100644
index 0000000..86bc004
--- /dev/null
+++ b/Lib/idlelib/configHandler.py
@@ -0,0 +1,173 @@
+##---------------------------------------------------------------------------##
+##
+## idle - configuration data handler, based on and replacing IdleConfig.py 
+## elguavas
+## 
+##---------------------------------------------------------------------------##
+"""Provides access to configuration information"""
+
+import os
+import sys
+from ConfigParser import ConfigParser, NoOptionError, NoSectionError
+
+class IdleConfParser(ConfigParser):
+    """
+    A ConfigParser specialised for idle configuration file handling
+    """
+    def __init__(self, cfgFile, cfgDefaults=None):
+        """
+        cfgFile - string, fully specified configuration file name
+        """
+        self.file=cfgFile
+        ConfigParser.__init__(self,defaults=cfgDefaults)
+    
+    def GetInt(self, section, option):
+        """
+        Get an option value as an integer
+        """
+        return self.Get(section, option, type='int')
+
+    def GetBool(self, section, option):
+        """
+        Get an option value as a boolean
+        """
+        return self.Get(section, option, type='bool')
+        
+    def Get(self, section, option, raw=0, vars=None, default=None, 
+            type=None):
+        """
+        Get an option value for given section/option or return default.
+        If type is specified, return as type.
+        """
+        if type=='bool': getVal=self.getbool
+        elif type=='int': getVal=self.getint
+        else: getVal=self.get
+        if self.has_option(section,option):
+            return getVal(section, option, raw, vars)
+        else:
+            return default
+
+    def GetSectionList(self):
+        # only provided for consistency
+        return self.sections()
+    
+    def GetOptionList(self,section):
+        """
+        Get an option list for given section
+        """
+        if self.has_section:
+            return self.options(section)
+        else:  #return a default value
+            return []
+
+    def GetHighlight(self, theme, element):
+        fore = self.Get(theme, element + "-foreground")
+        back = self.Get(theme, element + "-background")
+        style = self.Ge(theme, element + "-fontStyle", default='')
+        return {"fg": fore,
+                "bg": back,
+                "fStyle": style}
+
+    def Load(self):
+        """ 
+        Load the configuration file from disk 
+        """
+        self.read(self.file)
+        
+class IdleUserConfParser(IdleConfParser):
+    """
+    IdleConfigParser specialised for user configuration handling
+    """
+    def Save(self):
+        """
+        write loaded user configuration file back to disk
+        """
+        # this is a user config, it can be written to disk
+        self.write()
+
+class IdleConf:
+    """
+    holds config parsers for all idle config files:
+    default config files
+        (idle install dir)/config-main.def
+        (idle install dir)/config-extensions.def
+        (idle install dir)/config-highlight.def
+        (idle install dir)/config-keys.def
+    user config  files
+        (user home dir)/.idlerc/idle-main.cfg
+        (user home dir)/.idlerc/idle-extensions.cfg
+        (user home dir)/.idlerc/idle-highlight.cfg
+        (user home dir)/.idlerc/idle-keys.cfg
+    """
+    def __init__(self):
+        self.defaultCfg={}
+        self.userCfg={}
+        self.cfg={}
+        self.CreateConfigHandlers()
+        self.LoadCfgFiles()
+        #self.LoadCfg()
+            
+    def CreateConfigHandlers(self):
+        """
+        set up a dictionary config parsers for default and user 
+        configurations respectively
+        """
+        #build idle install path
+        if __name__ != '__main__': # we were imported
+            idledir=os.path.dirname(__file__)
+        else: # we were exec'ed (for testing only)
+            idledir=os.path.abspath(sys.path[0])
+        #print idledir
+        try: #build user home path
+            userdir = os.environ['HOME'] #real home directory
+        except KeyError:
+            userdir = os.getcwd() #hack for os'es without real homedirs
+        userdir=os.path.join(userdir,'.idlerc')
+        #print userdir
+        if not os.path.exists(userdir):
+            os.mkdir(userdir)
+        configTypes=('main','extensions','highlight','keys')
+        defCfgFiles={}
+        usrCfgFiles={}
+        for cfgType in configTypes: #build config file names
+            defCfgFiles[cfgType]=os.path.join(idledir,'config-'+cfgType+'.def')                    
+            usrCfgFiles[cfgType]=os.path.join(userdir,'idle-'+cfgType+'.cfg')                    
+        for cfgType in configTypes: #create config parsers
+            self.defaultCfg[cfgType]=IdleConfParser(defCfgFiles[cfgType])
+            self.userCfg[cfgType]=IdleUserConfParser(usrCfgFiles[cfgType])
+    
+    def LoadCfgFiles(self):
+        """ 
+        load all configuration files.
+        """
+        for key in self.defaultCfg.keys():
+            self.defaultCfg[key].Load()                    
+            self.userCfg[key].Load() #same keys                    
+
+    def SaveUserCfgFiles(self):
+        """
+        write all loaded user configuration files back to disk
+        """
+        for key in self.userCfg.keys():
+            self.userCfg[key].Save()    
+
+idleConf=IdleConf()
+
+### module test
+if __name__ == '__main__':
+    def dumpCfg(cfg):
+        print '\n',cfg,'\n'
+        for key in cfg.keys():
+            sections=cfg[key].sections()
+            print key
+            print sections
+            for section in sections:
+                options=cfg[key].options(section)
+                print section    
+                print options
+                for option in options:
+                    print option, '=', cfg[key].Get(section,option)
+    dumpCfg(idleConf.defaultCfg)
+    dumpCfg(idleConf.userCfg)
+    print idleConf.userCfg['main'].Get('Theme','name')
+    #print idleConf.userCfg['highlight'].GetDefHighlight('Foo','normal')
