diff --git a/pd/src/dialog_array.tcl b/pd/src/dialog_array.tcl
new file mode 100644
index 0000000000000000000000000000000000000000..0b39567431da70ac151e67ef86eb5199127612fe
--- /dev/null
+++ b/pd/src/dialog_array.tcl
@@ -0,0 +1,456 @@
+package provide dialog_array 0.1
+
+# todo: probably not a bad idea to unset these arrays
+
+namespace eval ::dialog_array:: {
+    namespace export pdtk_array_dialog
+    namespace export pdtk_array_listview_new
+    namespace export pdtk_array_listview_fillpage
+    namespace export pdtk_array_listview_setpage
+    namespace export pdtk_array_listview_closeWindow
+}
+
+# global variables for the listview
+array set pd_array_listview_entry {}
+array set pd_array_listview_id {}
+array set pd_array_listview_page {}
+set pd_array_listview_pagesize 0
+# this stores the state of the "save me" check button
+array set saveme_button {}
+# this stores the state of the "joc" check button
+array set joc_button {}
+# whether to hide the array name
+array set hidename_button {}
+# this stores the state of the "draw as" radio buttons
+array set drawas_button {}
+# border color for an element
+array set pd_array_outlinecolor {}
+# inner color for an element
+array set pd_array_fillcolor {}
+# this stores the state of the "in new graph"/"in last graph" radio buttons
+# and the "delete array" checkbutton
+array set otherflag_button {}
+
+# TODO figure out how to escape $ args so sharptodollar() isn't needed
+
+############ pdtk_array_dialog -- dialog window for arrays #########
+
+# hack: this should just use ::pd_bindings::dialog_bindings from 0.43 API
+proc ::dialog_array::dialog_bindings {mytoplevel dialogname} {
+    variable modifier
+
+    bind $mytoplevel <KeyPress-Escape> "dialog_${dialogname}::cancel $mytoplevel"
+    bind $mytoplevel <KeyPress-Return> "dialog_${dialogname}::ok $mytoplevel"
+    bind $mytoplevel <$::modifier-Key-w> "dialog_${dialogname}::cancel $mytoplevel"
+    # these aren't supported in the dialog, so alert the user, then break so
+    # that no other key bindings are run
+    bind $mytoplevel <$::modifier-Key-s>       {bell; break}
+    bind $mytoplevel <$::modifier-Shift-Key-S> {bell; break}
+    bind $mytoplevel <$::modifier-Key-p>       {bell; break}
+
+    wm protocol $mytoplevel WM_DELETE_WINDOW "dialog_${dialogname}::cancel $mytoplevel"
+}
+
+proc ::dialog_array::pdtk_array_listview_setpage {arrayName page} {
+    set ::pd_array_listview_page($arrayName) $page
+}
+
+proc ::dialog_array::listview_changepage {arrayName np} {
+    pdtk_array_listview_setpage \
+        $arrayName [expr $::pd_array_listview_page($arrayName) + $np]
+    pdtk_array_listview_fillpage $arrayName
+}
+
+proc ::dialog_array::pdtk_array_listview_fillpage {arrayName} {
+    set windowName [format ".%sArrayWindow" $arrayName]
+    set topItem [expr [lindex [$windowName.lb yview] 0] * \
+                     [$windowName.lb size]]
+    
+    if {[winfo exists $windowName]} {
+        set cmd "$::pd_array_listview_id($arrayName) \
+               arrayviewlistfillpage \
+               $::pd_array_listview_page($arrayName) \
+               $topItem"
+        
+        pdsend $cmd
+    }
+}
+
+proc ::dialog_array::pdtk_array_listview_new {id arrayName page} {
+    set ::pd_array_listview_page($arrayName) $page
+    set ::pd_array_listview_id($arrayName) $id
+    set windowName [format ".%sArrayWindow" $arrayName]
+    if [winfo exists $windowName] then [destroy $windowName]
+    toplevel $windowName -class DialogWindow
+    wm group $windowName .
+    wm protocol $windowName WM_DELETE_WINDOW \
+        "::dialog_array::listview_close $id $arrayName"
+    wm title $windowName [concat $arrayName "(list view)"]
+    # FIXME
+    set font 12
+    set $windowName.lb [listbox $windowName.lb -height 20 -width 25\
+                            -selectmode extended \
+                            -relief solid -background white -borderwidth 1 \
+                            -font [format {{%s} %d %s} $::font_family $font $::font_weight]\
+                            -yscrollcommand "$windowName.lb.sb set"]
+    set $windowName.lb.sb [scrollbar $windowName.lb.sb \
+                               -command "$windowName.lb yview" -orient vertical]
+    place configure $windowName.lb.sb -relheight 1 -relx 0.9 -relwidth 0.1
+    pack $windowName.lb -expand 1 -fill both
+    bind $windowName.lb <Double-ButtonPress-1> \
+        "::dialog_array::listview_edit $arrayName $page $font"
+    # handle copy/paste
+    switch -- $::windowingsystem {
+        "x11" {selection handle $windowName.lb \
+                   "::dialog_array::listview_lbselection $arrayName"}
+        "win32" {bind $windowName.lb <ButtonPress-3> \
+                     "::dialog_array::listview_popup $arrayName"} 
+    }
+    set $windowName.prevBtn [button $windowName.prevBtn -text "<-" \
+                                 -command "::dialog_array::listview_changepage $arrayName -1"]
+    set $windowName.nextBtn [button $windowName.nextBtn -text "->" \
+                                 -command "::dialog_array::listview_changepage $arrayName 1"]
+    pack $windowName.prevBtn -side left -ipadx 20 -pady 10 -anchor s
+    pack $windowName.nextBtn -side right -ipadx 20 -pady 10 -anchor s
+    focus $windowName
+}
+
+proc ::dialog_array::listview_lbselection {arrayName off size} {
+    set windowName [format ".%sArrayWindow" $arrayName]
+    set itemNums [$windowName.lb curselection]
+    set cbString ""
+    for {set i 0} {$i < [expr [llength $itemNums] - 1]} {incr i} {
+        set listItem [$windowName.lb get [lindex $itemNums $i]]
+        append cbString [string range $listItem \
+                             [expr [string first ") " $listItem] + 2] \
+                             end]
+        append cbString "\n"
+    }
+    set listItem [$windowName.lb get [lindex $itemNums $i]]
+    append cbString [string range $listItem \
+                         [expr [string first ") " $listItem] + 2] \
+                         end]
+    set last $cbString
+}
+
+# Win32 uses a popup menu for copy/paste
+proc ::dialog_array::listview_popup {arrayName} {
+    set windowName [format ".%sArrayWindow" $arrayName]
+    if [winfo exists $windowName.popup] then [destroy $windowName.popup]
+    menu $windowName.popup -tearoff false
+    $windowName.popup add command -label [_ "Copy"] \
+        -command "::dialog_array::listview_copy $arrayName; \
+                  destroy $windowName.popup"
+    $windowName.popup add command -label [_ "Paste"] \
+        -command "::dialog_array::listview_paste $arrayName; \
+                  destroy $windowName.popup"
+    tk_popup $windowName.popup [winfo pointerx $windowName] \
+        [winfo pointery $windowName] 0
+}
+
+proc ::dialog_array::listview_copy {arrayName} {
+    set windowName [format ".%sArrayWindow" $arrayName]
+    set itemNums [$windowName.lb curselection]
+    set cbString ""
+    for {set i 0} {$i < [expr [llength $itemNums] - 1]} {incr i} {
+        set listItem [$windowName.lb get [lindex $itemNums $i]]
+        append cbString [string range $listItem \
+                             [expr [string first ") " $listItem] + 2] \
+                             end]
+        append cbString "\n"
+    }
+    set listItem [$windowName.lb get [lindex $itemNums $i]]
+    append cbString [string range $listItem \
+                         [expr [string first ") " $listItem] + 2] \
+                         end]
+    clipboard clear
+    clipboard append $cbString
+}
+
+proc ::dialog_array::listview_paste {arrayName} {
+    set cbString [selection get -selection CLIPBOARD]
+    set lbName [format ".%sArrayWindow.lb" $arrayName]
+    set itemNum [lindex [$lbName curselection] 0]
+    set splitChars ", \n"
+    set itemString [split $cbString $splitChars]
+    set flag 1
+    for {set i 0; set counter 0} {$i < [llength $itemString]} {incr i} {
+        if {[lindex $itemString $i] ne {}} {
+            pdsend "$arrayName [expr $itemNum + \
+                                       [expr $counter + \
+                                            [expr $::pd_array_listview_pagesize \
+                                                 * $::pd_array_listview_page($arrayName)]]] \
+                    [lindex $itemString $i]"
+            incr counter
+            set flag 0
+        }
+    }
+}
+
+proc ::dialog_array::listview_edit {arrayName page font} {
+    set lbName [format ".%sArrayWindow.lb" $arrayName]
+    if {[winfo exists $lbName.entry]} {
+        ::dialog_array::listview_update_entry \
+            $arrayName $::pd_array_listview_entry($arrayName)
+        unset ::pd_array_listview_entry($arrayName)
+    }
+    set itemNum [$lbName index active]
+    set ::pd_array_listview_entry($arrayName) $itemNum
+    set bbox [$lbName bbox $itemNum]
+    set y [expr [lindex $bbox 1] - 4]
+    set $lbName.entry [entry $lbName.entry \
+                           -font [format {{%s} %d %s} $::font_family $font $::font_weight]]
+    $lbName.entry insert 0 []
+    place configure $lbName.entry -relx 0 -y $y -relwidth 1
+    lower $lbName.entry
+    focus $lbName.entry
+    bind $lbName.entry <Return> \
+        "::dialog_array::listview_update_entry $arrayName $itemNum;"
+}
+
+proc ::dialog_array::listview_update_entry {arrayName itemNum} {
+    set lbName [format ".%sArrayWindow.lb" $arrayName]
+    set splitChars ", \n"
+    set itemString [split [$lbName.entry get] $splitChars]
+    set flag 1
+    for {set i 0; set counter 0} {$i < [llength $itemString]} {incr i} {
+        if {[lindex $itemString $i] ne {}} {
+            pdsend "$arrayName [expr $itemNum + \
+                                       [expr $counter + \
+                                            [expr $::pd_array_listview_pagesize \
+                                                 * $::pd_array_listview_page($arrayName)]]] \
+                    [lindex $itemString $i]"
+            incr counter
+            set flag 0
+        }
+    }
+    pdtk_array_listview_fillpage $arrayName
+    destroy $lbName.entry
+}
+
+proc ::dialog_array::pdtk_array_listview_closeWindow {arrayName} {
+    set mytoplevel [format ".%sArrayWindow" $arrayName]
+    destroy $mytoplevel
+}
+
+proc ::dialog_array::listview_close {mytoplevel arrayName} {
+    pdtk_array_listview_closeWindow $arrayName
+    pdsend "$mytoplevel arrayviewclose"
+}
+
+proc ::dialog_array::apply {mytoplevel} {
+# TODO figure out how to ditch this escaping mechanism
+    set mofo [$mytoplevel.name.entry get]
+    if {[string index $mofo 0] == "$"} {
+        set mofo [string replace $mofo 0 0 #] }
+pdtk_post "drawas is $::drawas_button($mytoplevel)\n"
+pdtk_post "full bajitas is \
+            [expr $::saveme_button($mytoplevel) + \
+                (2 * $::drawas_button($mytoplevel)) + \
+                (8 * $::hidename_button($mytoplevel)) + \
+                (16 * $::joc_button($mytoplevel))] \
+\n"
+
+pdtk_post "mytop fucking level is $mytoplevel\n"
+    pd "[concat $mytoplevel arraydialog \
+            $mofo \
+            [$mytoplevel.size.entry get] \
+            [expr $::saveme_button($mytoplevel) + \
+                (2 * $::drawas_button($mytoplevel)) + \
+                (8 * $::hidename_button($mytoplevel)) + \
+                (16 * $::joc_button($mytoplevel))] \
+            $::otherflag_button($mytoplevel) \
+            $::pd_array_fillcolor($mytoplevel) \
+            $::pd_array_outlinecolor($mytoplevel) \
+            \; ]"
+}
+
+proc ::dialog_array::openlistview {mytoplevel} {
+    pdsend "$mytoplevel arrayviewlistnew"
+}
+
+proc ::dialog_array::choosecolor {mytoplevel type} {
+    set colorp [format "::pd_array_%scolor(%s)" $type $mytoplevel]
+    if {[info exists $colorp]} {
+        set initcolor [set $colorp]
+    } else {
+        set initcolor "black"}
+    set tmp [tk_chooseColor -parent $mytoplevel -initialcolor $initcolor]
+    if {$tmp eq ""} {return} else {set $colorp $tmp}
+}
+
+proc ::dialog_array::update_colorpreview {color widget args} {
+    upvar #0 $color c
+    $widget configure -background $c -activebackground $c
+}
+
+proc ::dialog_array::update_drawas {mytoplevel outlineframe filllabel args} {
+    if {$::drawas_button($mytoplevel) == 3} {
+        pack $outlineframe -before $mytoplevel.colors.o -side top -anchor w
+        $filllabel configure -text "Outline color"
+    } else {
+        pack forget $outlineframe
+        $filllabel configure -text "Trace color"
+    }
+}
+
+proc ::dialog_array::cancel {mytoplevel} {
+    pd "[concat $mytoplevel cancel \;]"
+}
+
+proc ::dialog_array::ok {mytoplevel} {
+    ::dialog_array::apply $mytoplevel
+    ::dialog_array::cancel $mytoplevel
+}
+
+proc ::dialog_array::pdtk_array_dialog {mytoplevel name \
+    size flags newone fillcolor outlinecolor} {
+if {[catch {
+    if {[winfo exists $mytoplevel]} {
+        wm deiconify $mytoplevel
+        raise $mytoplevel
+    } else {
+        create_dialog $mytoplevel $newone
+    }
+} fid]} {pdtk_post "error: $fid\n"}
+    $mytoplevel.name.entry insert 0 $name
+    $mytoplevel.size.entry insert 0 $size
+    set ::saveme_button($mytoplevel) [expr $flags & 1]
+    set ::drawas_button($mytoplevel) [expr ( $flags & 6 ) >> 1]
+    set ::hidename_button($mytoplevel) [expr ( $flags & 8 ) >> 3]
+    set ::joc_button($mytoplevel)    [expr ( $flags & 16) >> 4]
+    set ::otherflag_button($mytoplevel) 0
+    set ::pd_array_fillcolor($mytoplevel) $fillcolor
+    set ::pd_array_outlinecolor($mytoplevel) $outlinecolor
+
+# pd -> tcl
+#  2 * (int)(template_getfloat(template_findbyname(sc->sc_template), gensym("style"), x->x_scalar->sc_vec, 1)));
+
+# tcl->pd
+#    int style = ((flags & 6) >> 1);
+}
+
+proc ::dialog_array::create_dialog {mytoplevel newone} {
+    toplevel $mytoplevel -class DialogWindow
+    wm title $mytoplevel [_ "Array Properties"]
+    wm group $mytoplevel .
+    wm resizable $mytoplevel 0 0
+#    wm transient $mytoplevel $::focused_window
+    $mytoplevel configure -menu $::dialog_menubar
+    $mytoplevel configure -padx 0 -pady 0
+    # bad hack... this should just be ::pd_bindings::
+    # from the 0.43 API
+    ::dialog_array::dialog_bindings $mytoplevel "array"
+
+    frame $mytoplevel.name
+    pack $mytoplevel.name -side top
+    label $mytoplevel.name.label -text [_ "Name:"]
+    entry $mytoplevel.name.entry
+    pack $mytoplevel.name.label $mytoplevel.name.entry -anchor w
+
+    frame $mytoplevel.size
+    pack $mytoplevel.size -side top
+    label $mytoplevel.size.label -text [_ "Size:"]
+    entry $mytoplevel.size.entry
+    pack $mytoplevel.size.label $mytoplevel.size.entry -anchor w
+
+    frame $mytoplevel.flags
+    pack $mytoplevel.flags -side top -fill x -padx 20
+    checkbutton $mytoplevel.flags.saveme -text [_ "Save contents"] \
+        -variable ::saveme_button($mytoplevel)
+    pack $mytoplevel.flags.saveme -side top -anchor w
+    checkbutton $mytoplevel.flags.joc -text [_ "Jump on click"] \
+        -variable ::joc_button($mytoplevel) -anchor w
+    pack $mytoplevel.flags.joc -side top -anchor w
+    checkbutton $mytoplevel.flags.hidename -text [_ "Hide array name"] \
+        -variable ::hidename_button($mytoplevel) -anchor w
+    pack $mytoplevel.flags.hidename -side top -anchor w
+
+    labelframe $mytoplevel.drawas -text [_ "Draw as:"] -padx 20 -borderwidth 1
+    pack $mytoplevel.drawas -side top -fill x
+    radiobutton $mytoplevel.drawas.points -value 1 \
+        -variable ::drawas_button($mytoplevel) -text [_ "Points"]
+    radiobutton $mytoplevel.drawas.polygon -value 0 \
+        -variable ::drawas_button($mytoplevel) -text [_ "Polygon"]
+    radiobutton $mytoplevel.drawas.bezier -value 2 \
+        -variable ::drawas_button($mytoplevel) -text [_ "Bezier curve"]
+    radiobutton $mytoplevel.drawas.bargraph -value 3 \
+        -variable ::drawas_button($mytoplevel) -text [_ "Bargraph"]
+    pack $mytoplevel.drawas.points -side top -anchor w
+    pack $mytoplevel.drawas.polygon -side top -anchor w
+    pack $mytoplevel.drawas.bezier -side top -anchor w
+    pack $mytoplevel.drawas.bargraph -side top -anchor w
+    trace add variable ::drawas_button($mytoplevel) write \
+        "::dialog_array::update_drawas $mytoplevel $mytoplevel.colors.f \
+        $mytoplevel.colors.o.outlinecolor"
+
+    set fillp ::pd_array_fillcolor($mytoplevel)
+    set outlinep ::pd_array_outlinecolor($mytoplevel)
+    labelframe $mytoplevel.colors -text [_ "Colors:"] -padx 20 -pady 5 \
+        -borderwidth 1
+    pack $mytoplevel.colors -side top -fill both
+    frame $mytoplevel.colors.f
+    frame $mytoplevel.colors.o
+    pack $mytoplevel.colors.f -side top -anchor w
+    pack $mytoplevel.colors.o -side top -anchor w
+    set fillpreview $mytoplevel.colors.f.preview
+    set flabel [label $mytoplevel.colors.f.fillcolor -text [_ "Fill color"]]
+    set olabel \
+        [label $mytoplevel.colors.o.outlinecolor -text [_ "Outline color"]]
+    bind $flabel <Enter> "$flabel configure -foreground blue"
+    bind $flabel <Leave> "$flabel configure -foreground black"
+    bind $flabel <1> "::dialog_array::choosecolor $mytoplevel fill"
+    bind $olabel <Enter> "$olabel configure -foreground blue"
+    bind $olabel <Leave> "$olabel configure -foreground black"
+    bind $olabel <1> "::dialog_array::choosecolor $mytoplevel outline"
+    button $fillpreview -relief raised -padx 7 -pady 0 \
+        -command "::dialog_array::choosecolor $mytoplevel fill"
+    set outlinepreview $mytoplevel.colors.o.preview
+    button $outlinepreview -relief raised -padx 7 -pady 0 \
+        -command \
+        "::dialog_array::choosecolor $mytoplevel outline"
+    #automagically update the preview buttons when the variables are changed
+    trace add variable $fillp write \
+        "::dialog_array::update_colorpreview $fillp $fillpreview"
+    trace add variable $outlinep write \
+        "::dialog_array::update_colorpreview $outlinep $outlinepreview"
+    pack $mytoplevel.colors.f.fillcolor -side right -anchor w
+    pack $mytoplevel.colors.f.preview -side left -anchor e -padx 3
+    pack $mytoplevel.colors.o.outlinecolor -side right -anchor w
+    pack $mytoplevel.colors.o.preview -side left -anchor e -padx 3
+
+    if {$newone != 0} {
+        labelframe $mytoplevel.radio -text [_ "Put array into:"] -padx 20 -borderwidth 1
+        pack $mytoplevel.radio -side top -fill x
+        radiobutton $mytoplevel.radio.radio0 -value 0 \
+            -variable ::otherflag_button($mytoplevel) -text [_ "New graph"]
+        radiobutton $mytoplevel.radio.radio1 -value 1 \
+            -variable ::otherflag_button($mytoplevel) -text [_ "Last graph"]
+        pack $mytoplevel.radio.radio0 -side top -anchor w
+        pack $mytoplevel.radio.radio1 -side top -anchor w
+    } else {    
+        checkbutton $mytoplevel.deletearray -text [_ "Delete array"] \
+            -variable ::otherflag_button($mytoplevel) -anchor w
+        pack $mytoplevel.deletearray -side top
+    }
+    # jsarlo
+    if {$newone == 0} {
+        button $mytoplevel.listview -text [_ "Open List View..."] \
+            -command "::dialog_array::openlistview $mytoplevel [$mytoplevel.name.entry get]"
+        pack $mytoplevel.listview -side top
+    }
+    # end jsarlo
+    frame $mytoplevel.buttonframe
+    pack $mytoplevel.buttonframe -side bottom -expand 1 -fill x -pady 2m
+    button $mytoplevel.buttonframe.cancel -text [_ "Cancel"] \
+        -command "::dialog_array::cancel $mytoplevel"
+    pack $mytoplevel.buttonframe.cancel -side left -expand 1 -fill x -padx 10
+    if {$newone == 0 && $::windowingsystem ne "aqua"} {
+        button $mytoplevel.buttonframe.apply -text [_ "Apply"] \
+            -command "::dialog_array::apply $mytoplevel"
+        pack $mytoplevel.buttonframe.apply -side left -expand 1 -fill x -padx 10
+    }
+    button $mytoplevel.buttonframe.ok -text [_ "OK"]\
+        -command "::dialog_array::ok $mytoplevel"
+    pack $mytoplevel.buttonframe.ok -side left -expand 1 -fill x -padx 10
+}
diff --git a/pd/src/dialog_audio.tcl b/pd/src/dialog_audio.tcl
new file mode 100644
index 0000000000000000000000000000000000000000..878adacdd6d60506a2fb4af9d8f3f5613b9be3cb
--- /dev/null
+++ b/pd/src/dialog_audio.tcl
@@ -0,0 +1,353 @@
+package provide dialog_audio 0.1
+
+namespace eval ::dialog_audio:: {
+#    namespace export pdtk_audio_dialog
+}
+
+# TODO this panel really needs some reworking, it works but the code is very
+# unreadable.  The panel could look a lot better too, like using menubuttons
+# instead of regular buttons with tk_popup for pulldown menus.
+# * make sure combobox is setting the device number
+# * get focus order to do right
+# * add "Close" button to prefs dialog
+
+####################### audio dialog ##################3
+
+proc ::dialog_audio::apply {mytoplevel} {
+    global audio_indev1 audio_indev2 audio_indev3 audio_indev4 
+    global audio_inchan1 audio_inchan2 audio_inchan3 audio_inchan4
+    global audio_inenable1 audio_inenable2 audio_inenable3 audio_inenable4
+    global audio_outdev1 audio_outdev2 audio_outdev3 audio_outdev4 
+    global audio_outchan1 audio_outchan2 audio_outchan3 audio_outchan4
+    global audio_outenable1 audio_outenable2 audio_outenable3 audio_outenable4
+    global audio_sr audio_advance audio_callback audio_blocksize
+
+    # Hackety hack! Rather than make this audio dialog code sane,
+    # which would be a larger project, I'm just making the user interface
+    # look more friendly. The global "enable" variables were used
+    # for checkbuttons; I simplified the interface by removing them and
+    # adding a "None" option to the device list.  This means I have
+    # to parse the dev names for the string "None" and set the "enable"
+    # variables accordingly. I also assume "None" is the last value in the
+    # list.
+
+    foreach type {in out} {
+        foreach i {1 2 3 4} {
+            if {[set audio_${type}dev${i}] == \
+                [llength [set ::audio_${type}devlist]] || 
+                [set audio_${type}chan${i}] <= 0} {
+                set audio_${type}dev${i} 0
+                set audio_${type}enable${i} 0
+                set audio_${type}chan${i} 0
+            } else {
+                set audio_${type}enable${i} 1
+            }
+        }
+    }
+
+    pd [concat pd audio-dialog \
+        $audio_indev1 \
+        $audio_indev2 \
+        $audio_indev3 \
+        $audio_indev4 \
+        [expr $audio_inchan1 * ( $audio_inenable1 ? 1 : -1 ) ]\
+        [expr $audio_inchan2 * ( $audio_inenable2 ? 1 : -1 ) ]\
+        [expr $audio_inchan3 * ( $audio_inenable3 ? 1 : -1 ) ]\
+        [expr $audio_inchan4 * ( $audio_inenable4 ? 1 : -1 ) ]\
+        $audio_outdev1 \
+        $audio_outdev2 \
+        $audio_outdev3 \
+        $audio_outdev4 \
+        [expr $audio_outchan1 * ( $audio_outenable1 ? 1 : -1 ) ]\
+        [expr $audio_outchan2 * ( $audio_outenable2 ? 1 : -1 ) ]\
+        [expr $audio_outchan3 * ( $audio_outenable3 ? 1 : -1 ) ]\
+        [expr $audio_outchan4 * ( $audio_outenable4 ? 1 : -1 ) ]\
+        $audio_sr \
+        $audio_advance \
+        $audio_callback \
+        $audio_blocksize" \
+        \;]
+
+    # Pd always makes devices contiguous-- for example, if you only set
+    # device 1 and device 3 it will change device 3 to device 2.
+    # So we look for non-contiguous devices and request an update
+    # on connect so that the user doesn't see incorrect information
+    # in the GUI. This rebuilds part of the dialog window which causes
+    # a slight flicker-- otherwise I'd just do this everytime:
+    # pdsend "pd audio-properties $::audio_longform
+    foreach type {in out} {
+        set empty_dev 0
+        set aliased_dev 0
+        foreach i {1 2 3 4} {
+            set enabled [set audio_${type}enable$i]
+            if {$empty_dev && $enabled} {
+                set aliased_dev 1
+                break
+            } elseif {!$enabled} {incr empty_dev}
+        }
+        if {$aliased_dev} {
+            pd [concat pd audio-properties $::audio_longform \;]
+            break
+        }
+    }
+    pd [concat pd save-preferences \;]
+}
+
+proc ::dialog_audio::cancel {mytoplevel} {
+#    pdsend "$mytoplevel cancel"
+}
+
+proc ::dialog_audio::ok {mytoplevel} {
+    ::dialog_audio::apply $mytoplevel
+    ::dialog_audio::cancel $mytoplevel
+}
+
+proc ::dialog_audio::setapi {var - op} {
+    if {$op ne "write"} {return}
+    set name [set $var]
+    set index [lsearch -exact -index 0 $::pd_apilist $name]
+    set ::pd_whichapi [lindex $::pd_apilist $index 1]
+    pd [concat pd audio-setapi $::pd_whichapi \;]
+}
+
+proc ::dialog_audio::setlongform {widget} {
+    set state [set ::$widget]
+    if {$state == 0} {
+        # back to single devs
+        set extra_devs 0
+        foreach type {in out} {
+            foreach i {2 3 4} {
+                if { [set ::audio_${type}chan$i] > 0 &&
+                     [set ::audio_${type}enable$i] > 0 } {
+                          incr extra_devs
+                }
+            }
+        }
+        if {$extra_devs} {
+            set devices devices
+            if {$extra_devs == 1} {set devices device}
+            set continue [tk_messageBox -type yesno -message \
+                [_ "This will disconnect $extra_devs $devices. Continue?"] \
+                 -default "no" -parent [winfo parent $widget] -icon question]
+            if {$continue eq "yes"} {
+               foreach type {in out} {
+                   foreach i {2 3 4} {
+                       set ::audio_${type}chan$i 0
+                       set ::audio_${type}enable$i 0
+                   }
+               }
+            ::dialog_audio::apply [winfo parent $widget]
+            }
+        }
+    }
+    pd [concat pd audio-properties $state \;]
+}
+
+# start a dialog window to select audio devices and settings.  "multi"
+# is 0 if only one device is allowed; 1 if one apiece may be specified for
+# input and output; and 2 if we can select multiple devices.  "longform"
+# (which only makes sense if "multi" is 2) asks us to make controls for
+# opening several devices; if not, we get an extra button to turn longform
+# on and restart the dialog.
+
+proc ::dialog_audio::pdtk_audio_dialog {id \
+        indev1 indev2 indev3 indev4 \
+        inchan1 inchan2 inchan3 inchan4 \
+        outdev1 outdev2 outdev3 outdev4 \
+        outchan1 outchan2 outchan3 outchan4 sr advance multi callback \
+        longform blocksize} {
+    global audio_indev1 audio_indev2 audio_indev3 audio_indev4 
+    global audio_inchan1 audio_inchan2 audio_inchan3 audio_inchan4
+    global audio_inenable1 audio_inenable2 audio_inenable3 audio_inenable4
+    global audio_outdev1 audio_outdev2 audio_outdev3 audio_outdev4
+    global audio_outchan1 audio_outchan2 audio_outchan3 audio_outchan4
+    global audio_outenable1 audio_outenable2 audio_outenable3 audio_outenable4
+    global audio_sr audio_advance audio_callback audio_blocksize
+    global audio_indevlist audio_outdevlist
+    global pd_indev pd_outdev
+    global audio_longform
+
+    set audio_inchan1 [expr ( $inchan1 > 0 ? $inchan1 : -$inchan1 ) ]
+    set audio_inenable1 [expr $inchan1 > 0 ]
+    set audio_inchan2 [expr ( $inchan2 > 0 ? $inchan2 : -$inchan2 ) ]
+    set audio_inenable2 [expr $inchan2 > 0 ]
+    set audio_inchan3 [expr ( $inchan3 > 0 ? $inchan3 : -$inchan3 ) ]
+    set audio_inenable3 [expr $inchan3 > 0 ]
+    set audio_inchan4 [expr ( $inchan4 > 0 ? $inchan4 : -$inchan4 ) ]
+    set audio_inenable4 [expr $inchan4 > 0 ]
+
+    # "None" is added as the last value in the dropdown menu, so it's
+    # equivalent to the length of the devlist
+    set nonein [llength $audio_indevlist]
+    set noneout [llength $audio_outdevlist]
+
+    set audio_indev1 [expr ( $audio_inenable1 ? $indev1 : $nonein )]
+    set audio_indev2 [expr ( $audio_inenable2 ? $indev2 : $nonein )]
+    set audio_indev3 [expr ( $audio_inenable3 ? $indev3 : $nonein )]
+    set audio_indev4 [expr ( $audio_inenable4 ? $indev4 : $nonein )]
+
+    set audio_outchan1 [expr ( $outchan1 > 0 ? $outchan1 : -$outchan1 ) ]
+    set audio_outenable1 [expr $outchan1 > 0 ]
+    set audio_outchan2 [expr ( $outchan2 > 0 ? $outchan2 : -$outchan2 ) ]
+    set audio_outenable2 [expr $outchan2 > 0 ]
+    set audio_outchan3 [expr ( $outchan3 > 0 ? $outchan3 : -$outchan3 ) ]
+    set audio_outenable3 [expr $outchan3 > 0 ]
+    set audio_outchan4 [expr ( $outchan4 > 0 ? $outchan4 : -$outchan4 ) ]
+    set audio_outenable4 [expr $outchan4 > 0 ]
+
+    set audio_outdev1 [expr ( $audio_outenable1 ? $outdev1 : $noneout )]
+    set audio_outdev2 [expr ( $audio_outenable2 ? $outdev2 : $noneout )]
+    set audio_outdev3 [expr ( $audio_outenable3 ? $outdev3 : $noneout )]
+    set audio_outdev4 [expr ( $audio_outenable4 ? $outdev4 : $noneout )]
+
+    set audio_sr $sr
+    set audio_advance $advance
+    set audio_callback $callback
+    set audio_blocksize $blocksize
+    set audio_longform $longform
+
+    set mytoplevel .prefs.nb.audio
+    set apifr $mytoplevel.api
+    if {![winfo exists $apifr]} {
+
+        # Audio API
+        ttk::labelframe $mytoplevel.api -text [_ "Audio API"] \
+            -style Prefs.TLabelframe
+        pack $apifr -side top -padx 1 -pady 1 -fill x
+        set api_names {}
+        set ::audio_apiname {};
+        foreach api $::pd_apilist {lappend api_names [lindex $api 0]}
+        set api_i [lsearch -exact -index 1 $::pd_apilist $::pd_whichapi]
+        set ::audio_apiname [lindex $::pd_apilist $api_i 0]
+        ::dialog_prefs::dropdown $apifr.apilist ::audio_apiname $api_names
+        trace add variable ::audio_apiname write ::dialog_audio::setapi
+        grid $apifr.apilist -sticky e -column 0 -row 0 -padx 3 -pady 10
+        ttk::checkbutton $apifr.longbutton -text "Use multiple devices" \
+            -command "::dialog_audio::setlongform $apifr.longbutton"
+        grid $apifr.longbutton -sticky w -column 1 -row 0 -padx 3 -pady 10
+        grid columnconfigure $apifr {0 1} -weight 1
+    }
+    # disable longbutton if hardware doesn't support multi devices
+    set state normal
+    if {![expr [llength $audio_indevlist] > 1 && \
+        $multi>1 && [llength $audio_outdevlist] > 1]} {
+            set state disabled
+    }
+    $apifr.longbutton configure -state $state
+
+    # frame to encapsulate api-specific settings and devices,
+    # as well as the "Connect" button
+    set afr $mytoplevel.audio
+
+    destroy $afr
+    ttk::frame $afr
+    pack $afr -side top -fill x
+
+    # todo: put padding with style settings in dialog_prefs.tcl
+    set padx 1
+
+    # sample rate and advance
+    set sfr [ttk::labelframe $afr.settings -text [_ "Settings"] \
+        -style Prefs.TLabelframe -padding 5 ]
+    pack $sfr -side top -fill x -padx 3 -pady 10
+    ttk::label $sfr.l1 -text [_ "Sample rate"]
+    ttk::label $sfr.l2 -text [_ "Block size"]
+    ::dialog_prefs::dropdown $sfr.x2 \
+        ::audio_blocksize {64 128 256 512 1024 2048}
+    ttk::entry $sfr.x1 -textvariable audio_sr -width 7
+    ttk::label $sfr.l3 -text [_ "Delay (ms)"]
+    ttk::entry $sfr.x3 -textvariable audio_advance -width 7
+    grid $sfr.l1 -row 0 -sticky e -padx $padx
+    grid $sfr.x1 -row 0 -column 1 -sticky w -padx $padx
+    grid $sfr.l2 -row 0 -column 2 -sticky e -padx $padx
+    grid $sfr.x2 -row 0 -column 3 -sticky w -padx $padx
+    grid $sfr.l3 -row 1 -column 0 -sticky e -padx $padx
+    grid $sfr.x3 -row 1 -column 1 -sticky w -padx $padx
+    if {$audio_callback >= 0} {
+        ttk::label $sfr.l4 -text [_ "Use callbacks"] -anchor e
+        ttk::checkbutton $sfr.x4 -variable audio_callback
+        grid $sfr.l4 -column 2 -row 1 -sticky e -padx $padx
+        grid $sfr.x4 -column 3 -row 1 -sticky w -padx $padx
+    }
+    grid columnconfigure $sfr {0 2} -weight 1
+    grid columnconfigure $sfr {1 3} -weight 2
+
+    # Devices 
+    set devfr [ttk::labelframe $afr.devs -text [_ "Devices"] \
+        -style Prefs.TLabelframe]
+    pack $devfr -side top -fill x -padx 3 -pady 10
+    set j 2
+    # todo: change in out to input output and make translatable strings
+    foreach {type name} [list in [_ "Input"] out [_ "Output"]] {
+        set domulti [expr $longform && $multi > 1 && \
+            [llength [set "audio_${type}devlist"]] > 1]
+        if {$domulti} {
+            ttk::label $devfr.$type \
+                -text [concat $name [_ "Devices"]]
+            ttk::label $devfr.${type}ch -text [_ "Channels"]
+            grid $devfr.$type -row $j -column 1 -padx $padx
+            grid $devfr.${type}ch -row $j -column 3 -padx $padx
+            incr j
+        } else {
+            if {$type eq "in"} {
+            ttk::label $devfr.$type \
+                -text [_ "Device Name"]
+            ttk::label $devfr.${type}ch -text [_ "Channels"]
+            grid $devfr.$type -row $j -column 1 -columnspan 2 -padx $padx
+            grid $devfr.${type}ch -row $j -column 3 -padx $padx
+            incr j
+            }
+        }
+        # Note: it'd be fairly easy to change the GUI to accommodate
+        # more than four devices, but Pd only takes and receives at most
+        # four devices, so the entire backend would have to change in order
+        # to do that
+        for {set i 0} {$i < 4} \
+            {incr i} {
+            set devno [expr $i + 1]
+            set row "$devfr.${type}$devno"
+            if {$domulti} {
+                set ctext "$devno."
+            } else {
+                set ctext $name
+            }
+            ttk::label ${row}x0 -text $ctext -anchor w
+            set ::audio_${type}dev${devno}label {}
+            ::dialog_prefs::dropdown_by_index ${row}x1 \
+                "::audio_${type}dev$devno" \
+                [concat [set audio_${type}devlist] None] \
+                "::audio_${type}dev${devno}label"
+            if {[set audio_${type}enable$devno] > 0} {
+                ::dialog_prefs::dropdown_set ${row}x1 [lindex [set audio_${type}devlist] [set audio_${type}dev$devno]]
+            } else {
+                ::dialog_prefs::dropdown_set ${row}x1 "None"
+                set audio_${type} [llength [set audio_${type}devlist]]
+            }
+            ttk::entry ${row}x2 -textvariable "audio_${type}chan$devno" -width 4
+            grid ${row}x0 -row $j -column 0 -sticky e -padx $padx
+            grid ${row}x1 -row $j -column 1 -columnspan 2 -sticky ew -padx $padx
+            grid ${row}x2 -row $j -column 3 -padx $padx
+            grid columnconfigure $afr.devs {1 2 3} -weight 2
+            grid columnconfigure $afr.devs 0 -weight 1
+            incr j
+            if {![expr $longform && $multi > 1 && \
+                [llength [set "audio_${type}devlist"]] > 1]} {
+                break
+            }
+        }
+    }
+    grid rowconfigure $devfr all -pad 3
+
+    # Connect button
+    ttk::frame $afr.buttonframe
+    pack $afr.buttonframe
+    pack $afr.buttonframe -side bottom
+    ttk::button $afr.buttonframe.apply -text [_ "Apply Audio Settings"]\
+        -command "::dialog_audio::apply $mytoplevel"
+    pack $afr.buttonframe.apply -side left -expand 1 -fill x \
+        -padx 15
+
+#    $sfr.x1 select from 0
+#    $sfr.x1 select adjust end
+    focus $apifr.apilist
+}
diff --git a/pd/src/dialog_gui.tcl b/pd/src/dialog_gui.tcl
new file mode 100644
index 0000000000000000000000000000000000000000..fce8d34bc9b74ec90ec626d44bddd953c565c65a
--- /dev/null
+++ b/pd/src/dialog_gui.tcl
@@ -0,0 +1,314 @@
+package provide dialog_gui 0.1
+package require dialog_prefs
+
+namespace eval ::dialog_gui:: {
+    namespace export create_gui_dialog
+}
+
+####################### gui dialog ##################3
+
+proc ::dialog_gui::apply {mytoplevel} {
+    # nothing to do
+}
+
+proc ::dialog_gui::cancel {mytoplevel} {
+#    pdsend "$mytoplevel cancel"
+}
+
+proc ::dialog_gui::ok {mytoplevel} {
+    ::dialog_gui::apply $mytoplevel
+    ::dialog_gui::cancel $mytoplevel
+}
+
+proc ::dialog_gui::setswatch {b swatch} {
+    $b configure -image $swatch
+}
+
+# this is triggered whenever the ::gui_preset
+# variable is written to
+proc ::dialog_gui::set_gui_preset {args} {
+    set choice $::gui_preset
+    switch $choice {
+        Vanilla {
+            set ::pd_colors(atom_box)        white
+            set ::pd_colors(atom_box_border) black
+            set ::pd_colors(canvas_color)    white
+            set ::pd_colors(canvas_cursor)   black
+            set ::pd_colors(text)            black
+            set ::pd_colors(box)             white
+            set ::pd_colors(box_border)      black
+            set ::pd_colors(msg)             white
+            set ::pd_colors(msg_border)      black
+            set ::pd_colors(iemgui_border)   black
+            set ::pd_colors(control_cord)    black
+            set ::pd_colors(control_nlet)    white
+            set ::pd_colors(iemgui_nlet)     black
+            set ::pd_colors(signal_cord)     black
+            set ::pd_colors(signal_nlet)     $::pd_colors(signal_cord)
+            set ::pd_colors(control_nlet)    white
+            set ::pd_colors(xlet_hover)      grey
+            set ::pd_colors(link)            blue
+            set ::pd_colors(selection)       blue
+            set ::pd_colors(selection_rectangle) black
+            set ::pd_colors(highlighted_text) black
+            set ::pd_colors(highlighted_text_bg) #c3c3c3
+            set ::pd_colors(dash_outline)    "#f00"
+            set ::pd_colors(dash_fill)       white
+            set ::pd_colors(graph_border)    black
+            set ::pd_colors(graph)           white
+            set ::pd_colors(magic_glass_bg)  black
+            set ::pd_colors(magic_glass_bd)  black
+            set ::pd_colors(magic_glass_text) "#ffffff"
+            set ::pd_colors(magic_glass_flash) "#e87216"
+        }
+        Inverted {
+            set ::pd_colors(atom_box)        black
+            set ::pd_colors(atom_box_border) white
+            set ::pd_colors(canvas_color)    black
+            set ::pd_colors(canvas_cursor)   white
+            set ::pd_colors(text)            white
+            set ::pd_colors(box)             black
+            set ::pd_colors(box_border)      white
+            set ::pd_colors(msg)             black
+            set ::pd_colors(msg_border)      white
+            set ::pd_colors(iemgui_border)   white
+            set ::pd_colors(control_cord)    white
+            set ::pd_colors(control_nlet)    white
+            set ::pd_colors(iemgui_nlet)     white
+            set ::pd_colors(signal_cord)     white
+            set ::pd_colors(signal_nlet)     $::pd_colors(signal_cord)
+            set ::pd_colors(control_nlet)    white
+            set ::pd_colors(xlet_hover)      grey
+            set ::pd_colors(link)            yellow
+            set ::pd_colors(selection)       yellow
+            set ::pd_colors(selection_rectangle) white
+            set ::pd_colors(highlighted_text) white
+            set ::pd_colors(highlighted_text_bg) #3c3c3c
+            set ::pd_colors(dash_outline)    "#f00"
+            set ::pd_colors(dash_fill)       black
+            set ::pd_colors(graph_border)    white
+            set ::pd_colors(graph)           gray
+            set ::pd_colors(magic_glass_bg)  white
+            set ::pd_colors(magic_glass_bd)  white
+            set ::pd_colors(magic_glass_text) "#000000"
+            set ::pd_colors(magic_glass_flash) "#e87216"
+        }
+        L2ork    {
+            set ::pd_colors(atom_box)        "#eee"
+            set ::pd_colors(atom_box_border) "#ccc"
+            set ::pd_colors(canvas_color)     white
+            set ::pd_colors(canvas_cursor)    black
+            set ::pd_colors(text)             black
+            set ::pd_colors(box)              "#f6f8f8"
+            set ::pd_colors(box_border)       "#ccc"
+            set ::pd_colors(msg)              #f8f8f6
+            set ::pd_colors(msg_border)       "#ccc"
+            set ::pd_colors(iemgui_border)    "#000000"
+            set ::pd_colors(iemgui_nlet)      "#000000"
+            set ::pd_colors(control_cord)     "#565"
+            set ::pd_colors(control_nlet)     white
+            set ::pd_colors(signal_cord)      #808095
+            set ::pd_colors(signal_nlet)      $::pd_colors(signal_cord)
+            set ::pd_colors(xlet_hover)       grey
+            set ::pd_colors(link)             #eb5f28
+            set ::pd_colors(selection)        #e87216
+            set ::pd_colors(selection_rectangle) #e87216
+            set ::pd_colors(highlighted_text) black
+            set ::pd_colors(highlighted_text_bg) #c3c3c3
+            set ::pd_colors(dash_outline)     "#f00"
+            set ::pd_colors(dash_fill)        "#ffdddd"
+            set ::pd_colors(graph_border)     "#777"
+            set ::pd_colors(graph)            white
+            set ::pd_colors(magic_glass_bg)    black
+            set ::pd_colors(magic_glass_bd)    black
+            set ::pd_colors(magic_glass_text)  white
+            set ::pd_colors(magic_glass_flash) "#e87216"
+        }
+        L2ork_Inverted {
+            set ::pd_colors(atom_box)       black
+            set ::pd_colors(atom_box_border) white
+            set ::pd_colors(canvas_color)     black
+            set ::pd_colors(canvas_cursor) white
+            set ::pd_colors(text)          white
+            set ::pd_colors(box)           #090707
+            set ::pd_colors(box_border)    #3e3e3e
+            set ::pd_colors(msg)       #090707
+            set ::pd_colors(msg_border) #3e3e3e
+            set ::pd_colors(iemgui_border) white
+            set ::pd_colors(iemgui_nlet) white
+            set ::pd_colors(control_cord)  white
+            set ::pd_colors(control_nlet)  #a294a2
+            set ::pd_colors(signal_cord)   #7d7d68
+            set ::pd_colors(signal_nlet)   $::pd_colors(signal_cord)
+            set ::pd_colors(xlet_hover)    white
+            set ::pd_colors(link)          blue
+            set ::pd_colors(selection)      #ffff00
+            set ::pd_colors(selection_rectangle) white
+            set ::pd_colors(highlighted_text) white
+            set ::pd_colors(highlighted_text_bg) #3c3c3c
+            set ::pd_colors(dash_outline)  "#f00"
+            set ::pd_colors(dash_fill)     "#002222"
+            set ::pd_colors(graph_border)  "#777"
+            set ::pd_colors(graph)         gray
+            set ::pd_colors(magic_glass_bg) black
+            set ::pd_colors(magic_glass_bd) black
+            set ::pd_colors(magic_glass_text) white
+            set ::pd_colors(magic_glass_flash) "#e87216"
+        }
+        Extended    {
+            set ::pd_colors(atom_box)       #e0e0e0
+            set ::pd_colors(atom_box_border) #c1c1c1
+            set ::pd_colors(canvas_color)     white
+            set ::pd_colors(canvas_cursor) black
+            set ::pd_colors(text)          black
+            set ::pd_colors(box)           #f6f8f8
+            set ::pd_colors(box_border)    #c1c1c1
+            set ::pd_colors(msg)       #f6f8f8
+            set ::pd_colors(msg_border) #c1c1c1
+            set ::pd_colors(iemgui_border) black
+            set ::pd_colors(iemgui_nlet) black
+            set ::pd_colors(control_cord)  black
+            set ::pd_colors(control_nlet)  white
+            set ::pd_colors(signal_cord)   #828297
+            set ::pd_colors(signal_nlet)   $::pd_colors(signal_cord)
+            set ::pd_colors(control_nlet)         #536253
+            set ::pd_colors(xlet_hover)    grey
+            set ::pd_colors(link)          blue
+            set ::pd_colors(selection)      blue
+            set ::pd_colors(selection_rectangle) black
+            set ::pd_colors(highlighted_text) black
+            set ::pd_colors(highlighted_text_bg) #c3c3c3
+            set ::pd_colors(dash_outline)  "#f00"
+            set ::pd_colors(dash_fill)     "#f7f7f7"
+            set ::pd_colors(graph_border)  "#777"
+            set ::pd_colors(graph)         white
+            set ::pd_colors(magic_glass_bg) black
+            set ::pd_colors(magic_glass_bd) black
+            set ::pd_colors(magic_glass_text) white
+            set ::pd_colors(magic_glass_flash) "#e87216"
+        }
+        C64   {
+            set ::pd_colors(atom_box)       #3e32a2
+            set ::pd_colors(atom_box_border) #7569d7
+            set ::pd_colors(canvas_color)     #3e32a2
+            set ::pd_colors(canvas_cursor) white
+            set ::pd_colors(text)          #a49aea
+            set ::pd_colors(box)           #3e32a2
+            set ::pd_colors(box_border)    #7569d7
+            set ::pd_colors(msg)       #3e32a2
+            set ::pd_colors(msg_border) #7569d7
+            set ::pd_colors(iemgui_border) #7569d7
+            set ::pd_colors(iemgui_nlet) #7569d7
+            set ::pd_colors(control_cord)  #7569d7
+            set ::pd_colors(control_nlet)  white
+            set ::pd_colors(signal_cord)   #7569d7
+            set ::pd_colors(signal_nlet)   $::pd_colors(signal_cord)
+            set ::pd_colors(control_nlet)         #7c71da
+            set ::pd_colors(xlet_hover)    grey
+            set ::pd_colors(link)          #e87216
+            set ::pd_colors(selection)      #cc9933
+            set ::pd_colors(selection_rectangle) #7c71da
+            set ::pd_colors(highlighted_text) #3e32a2
+            set ::pd_colors(highlighted_text_bg) #a49aea
+            set ::pd_colors(dash_outline)  "#f00"
+            set ::pd_colors(dash_fill)     "#3e32a2"
+            set ::pd_colors(graph_border)  "#777"
+            set ::pd_colors(graph)         "#3e32a2"
+            set ::pd_colors(magic_glass_bg) black
+            set ::pd_colors(magic_glass_bd) black
+            set ::pd_colors(magic_glass_text) white
+            set ::pd_colors(magic_glass_flash) "#e87216"
+        }
+        Strongbad {
+            set ::pd_colors(atom_box)       black
+            set ::pd_colors(atom_box_border) #0b560b
+            set ::pd_colors(canvas_color)     black
+            set ::pd_colors(canvas_cursor) white
+            set ::pd_colors(text)          #4bd046
+            set ::pd_colors(box)           black
+            set ::pd_colors(box_border)    #0b560b
+            set ::pd_colors(msg)       black
+            set ::pd_colors(msg_border) #0b560b
+            set ::pd_colors(iemgui_border) #0b560b
+            set ::pd_colors(iemgui_nlet) #0b560b
+            set ::pd_colors(control_cord)  #53b83b
+            set ::pd_colors(control_nlet)  #53b83b
+            set ::pd_colors(signal_cord)   #53b83b
+            set ::pd_colors(signal_nlet)   $::pd_colors(signal_cord)
+            set ::pd_colors(xlet_hover)    white
+            set ::pd_colors(link)          blue
+            set ::pd_colors(selection)      green
+            set ::pd_colors(selection_rectangle) #53b83b
+            set ::pd_colors(highlighted_text) black
+            set ::pd_colors(highlighted_text_bg) #4bd046 
+            set ::pd_colors(dash_outline)  "#f00"
+            set ::pd_colors(dash_fill)     "#f7f7f7"
+            set ::pd_colors(graph_border)  "#777"
+            set ::pd_colors(graph)         "#53b83b"
+            set ::pd_colors(magic_glass_bg) black
+            set ::pd_colors(magic_glass_bd) black
+            set ::pd_colors(magic_glass_text) white
+            set ::pd_colors(magic_glass_flash) "#e87216"
+        }
+        Subdued {
+            set ::pd_colors(atom_box)       #9fc79f
+            set ::pd_colors(atom_box_border) #b1d3b1
+            set ::pd_colors(canvas_color)     #c0dcc0
+            set ::pd_colors(canvas_cursor) black
+            set ::pd_colors(text)          black
+            set ::pd_colors(box)           #c0dcc0
+            set ::pd_colors(box_border)    #666666
+            set ::pd_colors(msg)       #c0dcc0
+            set ::pd_colors(msg_border) #666666
+            set ::pd_colors(iemgui_border) #666666
+            set ::pd_colors(iemgui_nlet) #666666
+            set ::pd_colors(control_cord)  #333333
+            set ::pd_colors(control_nlet)         #333333
+            set ::pd_colors(signal_cord)   #666666
+            set ::pd_colors(signal_nlet)   $::pd_colors(signal_cord)
+            set ::pd_colors(xlet_hover)    white
+            set ::pd_colors(link)          blue
+            set ::pd_colors(selection)      blue
+            set ::pd_colors(selection_rectangle) #333333
+            set ::pd_colors(highlighted_text) black 
+            set ::pd_colors(highlighted_text_bg) #c3c3c3
+            set ::pd_colors(dash_outline)  "#f00"
+            set ::pd_colors(dash_fill)     "#f7f7f7"
+            set ::pd_colors(graph_border)  "#777"
+            set ::pd_colors(graph)         "#9fc79f"
+            set ::pd_colors(magic_glass_bg) black
+            set ::pd_colors(magic_glass_bd) black
+            set ::pd_colors(magic_glass_text) white
+            set ::pd_colors(magic_glass_flash) "#e87216"
+        }
+    }
+}
+
+proc ::dialog_gui::create_gui_dialog {mytoplevel} {
+    if [winfo exists $mytoplevel.colors] then return
+    set fr [ttk::frame $mytoplevel.colors]
+    set p [ttk::frame $fr.presets]
+    ttk::label $p.presetlabel -text "Color Preset"
+#    ttk::combobox $fr.presets -state readonly -values {Inverted L2ork Foo}
+# todo: set presets in _one_ place
+    ::dialog_prefs::dropdown $p.presets ::gui_preset {Vanilla Inverted L2ork L2ork_Inverted Extended C64 Strongbad Subdued}
+    pack $fr -side top
+    grid $p -column 0 -columnspan 3 -row 0 -sticky w -pady 21
+    pack $p.presetlabel -side left -padx 7
+    pack $p.presets -side left
+    set clen [expr {[llength [array names ::pd_colors]] / 2}]
+    set i 0
+    foreach name [lsort [array names ::pd_colors]] {
+        # hack to exclude widths
+        if {[regexp {.*width} $name]} {continue}
+        set label [string map {_ " "} $name]
+        set label [string toupper $label 0 0]
+        ::dialog_prefs::swatchbutton $fr.$name ::pd_colors($name)
+        ::dialog_prefs::set_swatchbutton $fr.$name \
+            ::pd_colors($name)
+        ttk::label $fr.${name}label -text "$label"
+        grid $fr.${name} -column [expr $i/$clen * 2] -row [expr $i%$clen+1] -sticky e
+        grid $fr.${name}label -column [expr $i/$clen * 2 + 1] -row [expr $i%$clen+1] -sticky w -padx 7 -pady 3
+        incr i
+    }
+}
diff --git a/pd/src/dialog_midi.tcl b/pd/src/dialog_midi.tcl
new file mode 100644
index 0000000000000000000000000000000000000000..5930f29893b9e9d54b72ed6a3be0ee29731094d2
--- /dev/null
+++ b/pd/src/dialog_midi.tcl
@@ -0,0 +1,324 @@
+package provide dialog_midi 0.1
+
+namespace eval ::dialog_midi:: {
+#    namespace export pdtk_midi_dialog
+#    namespace export pdtk_alsa_midi_dialog
+}
+
+# TODO this panel really needs some reworking, it works but the code is
+# very unreadable
+
+
+####################### midi dialog ##################
+
+proc ::dialog_midi::apply {mytoplevel} {
+    global midi_indev1 midi_indev2 midi_indev3 midi_indev4 
+    global midi_outdev1 midi_outdev2 midi_outdev3 midi_outdev4
+    global midi_alsain midi_alsaout
+    
+    pdsend "pd midi-dialog \
+        $midi_indev1 \
+        $midi_indev2 \
+        $midi_indev3 \
+        $midi_indev4 \
+        $midi_outdev1 \
+        $midi_outdev2 \
+        $midi_outdev3 \
+        $midi_outdev4 \
+        $midi_alsain \
+        $midi_alsaout"
+}
+
+proc ::dialog_midi::cancel {mytoplevel} {
+    pdsend "$mytoplevel cancel"
+}
+
+proc ::dialog_midi::ok {mytoplevel} {
+    ::dialog_midi::apply $mytoplevel
+    ::dialog_midi::cancel $mytoplevel
+}
+
+proc ::dialog_midi::setapi {var - op} {
+    if {$op ne "write"} {return}
+    set name [set $var]
+    set index [lsearch -exact -index 0 $::pd_midiapilist $name]
+    set ::pd_whichmidiapi [lindex $::pd_midiapilist $index 1]
+    pdsend "pd midi-setapi $::pd_whichmidiapi"
+}
+
+proc ::dialog_midi::setlongform {widget} {
+    set state [set ::$widget]
+    if {$state == 0} {
+        # back to single devs
+        set extra_devs 0
+        foreach type {in out} {
+            foreach i {2 3 4} {
+                if { [set ::midi_${type}chan$i] > 0 &&
+                     [set ::midi_${type}enable$i] > 0 } {
+                          incr extra_devs
+                }
+            }
+        }
+        if {$extra_devs} {
+            set devices devices
+            if {$extra_devs == 1} {set devices device}
+            set continue [tk_messageBox -type yesno -message \
+                [_ "This will disconnect $extra_devs $devices. Continue?"] \
+                 -default "no" -parent [winfo parent $widget] -icon question]
+            if {$continue eq "yes"} {
+               foreach type {in out} {
+                   foreach i {2 3 4} {
+                       set ::midi_${type}chan$i 0
+                       set ::midi_${type}enable$i 0
+                   }
+               }
+            ::dialog_midi::apply [winfo parent $widget]
+            }
+        }
+    }
+    pdsend "pd midi-properties $state"
+}
+
+proc ::dialog_midi::create_api_frame {mytoplevel apifr midi_indevlist \
+    midi_outdevlist longform} {
+    if {![winfo exists $apifr]} {
+
+        # MIDI API
+        ttk::labelframe $mytoplevel.api -text [_ "Midi API"] \
+            -style Prefs.TLabelframe
+        pack $apifr -side top -padx 1 -pady 1 -fill x
+        if {$::pd_midiapilist eq ""} {
+            ttk::label $apifr.label -text "System Midi"
+            grid $apifr.label -sticky e -column 0 -row 0 -padx 3 -pady 10
+        } else {
+            set api_names {}
+            foreach api $::pd_midiapilist {lappend api_names [lindex $api 0]}
+            set api_i [lsearch -exact -index 1 $::pd_midiapilist \
+                $::pd_whichmidiapi]
+            set ::midi_apiname [lindex $::pd_midiapilist $api_i 0]
+            ::dialog_prefs::dropdown $apifr.apilist ::midi_apiname $api_names
+            trace add variable ::midi_apiname write ::dialog_midi::setapi
+            grid $apifr.apilist -sticky e -column 0 -row 0 -padx 3 -pady 10
+        }
+        ttk::checkbutton $apifr.longbutton -text "Use multiple devices" \
+            -command "::dialog_midi::setlongform $apifr.longbutton"
+        grid $apifr.longbutton -sticky w -column 1 -row 0 -padx 3 -pady 10
+        grid columnconfigure $apifr {0 1} -weight 1
+    }
+    # disable longbutton if hardware doesn't support multi devices
+    set state normal
+    if {![expr [llength $midi_indevlist] > 1 && \
+        [llength $midi_outdevlist] > 1]} {
+            set state disabled
+    }
+    $apifr.longbutton configure -state disabled
+}
+
+# start a dialog window to select midi devices.  "longform" asks us to make
+# controls for opening several devices; if not, we get an extra button to
+# turn longform on and restart the dialog.
+proc ::dialog_midi::pdtk_midi_dialog {id indev1 indev2 indev3 indev4 \
+        outdev1 outdev2 outdev3 outdev4 longform} {
+    global midi_indev1 midi_indev2 midi_indev3 midi_indev4
+    global midi_outdev1 midi_outdev2 midi_outdev3 midi_outdev4
+    global midi_indevlist midi_outdevlist
+    global midi_alsain midi_alsaout
+    global midi_longform
+    set midi_indev1 $indev1
+    set midi_indev2 $indev2
+    set midi_indev3 $indev3
+    set midi_indev4 $indev4
+    set midi_outdev1 $outdev1
+    set midi_outdev2 $outdev2
+    set midi_outdev3 $outdev3
+    set midi_outdev4 $outdev4
+    set midi_alsain [llength $midi_indevlist]
+    set midi_alsaout [llength $midi_outdevlist]
+    set midi_longform $longform
+    set mytoplevel .prefs.nb.midi
+    set apifr $mytoplevel.api
+    # not sure why it's ...midi.midi... should probably
+    # fix that...
+    ::dialog_midi::create_api_frame $mytoplevel $apifr $midi_indevlist \
+        $midi_outdevlist $longform
+    destroy $mytoplevel.midi
+    ttk::frame $mytoplevel.midi
+    pack $mytoplevel.midi -side top -fill x
+
+    # todo: put padding with style settings in dialog_prefs.tcl
+    set padx 1
+
+    # Devices 
+    set devfr [ttk::labelframe $mytoplevel.midi.devs -text [_ "Devices"] \
+        -style Prefs.TLabelframe -padding 5]
+    pack $devfr -side top -fill x -padx 3 -pady 10
+
+    set j 2
+    # todo: change in out to input output and make translatable strings
+    foreach {type name} [list in [_ "Input"] out [_ "Output"]] {
+        set domulti [expr $longform && \
+            [llength [set "midi_${type}devlist"]] > 1]
+        if {$domulti} {
+            ttk::label $devfr.$type \
+                -text [concat $name [_ "Devices"]]
+            ttk::label $devfr.${type}ch -text [_ "Channels"]
+            grid $devfr.$type -row $j -column 1 -padx $padx
+            grid $devfr.${type}ch -row $j -column 3 -padx $padx
+            incr j
+        } else {
+            if {$type eq "in"} {
+            ttk::label $devfr.$type \
+                -text [_ "Device Name"]
+            ttk::label $devfr.${type}ch -text [_ "Channels"]
+            grid $devfr.$type -row $j -column 1 -columnspan 2 -padx $padx
+            grid $devfr.${type}ch -row $j -column 3 -padx $padx
+            incr j
+            }
+        }
+        # Note: it'd be fairly easy to change the GUI to accommodate
+        # more than four devices, but Pd only takes and receives at most
+        # four devices, so the entire backend would have to change in order
+        # to do that
+        for {set i 0} {$i < 4} {incr i} {
+            set devno [expr $i + 1]
+            set row "$devfr.${type}$devno"
+            if {$domulti} {
+                set ctext "$devno."
+            } else {
+                set ctext $name
+            }
+            ttk::label ${row}x0 -text $ctext -anchor w
+            set ::midi_${type}dev${devno}label {}
+            ::dialog_prefs::dropdown_by_index ${row}x1 \
+                "::midi_${type}dev$devno" \
+                [set "midi_${type}devlist"] \
+                "::midi_${type}dev${devno}label"
+            ttk::entry ${row}x2 -textvariable "midi_${type}chan$devno" -width 4
+            grid ${row}x0 -row $j -column 0 -sticky e -padx $padx
+            grid ${row}x1 -row $j -column 1 -columnspan 2 -sticky ew -padx $padx
+            grid ${row}x2 -row $j -column 3 -padx $padx
+            grid columnconfigure $mytoplevel.midi.devs {1 2 3} -weight 2
+            grid columnconfigure $mytoplevel.midi.devs 0 -weight 1
+            incr j
+            if {![expr $longform && \
+                [llength [set "midi_${type}devlist"]] > 1]} {
+                break
+            }
+        }
+    }
+    grid rowconfigure $devfr all -pad 3
+
+    # Connect button
+    ttk::frame $mytoplevel.midi.buttonframe
+    pack $mytoplevel.midi.buttonframe
+    pack $mytoplevel.midi.buttonframe -side bottom
+    ttk::button $mytoplevel.midi.buttonframe.apply \
+        -text [_ "Apply MIDI Settings"] \
+        -command "::dialog_midi::apply $mytoplevel"
+    pack $mytoplevel.midi.buttonframe.apply -side left -expand 1 -fill x \
+        -padx 15
+}
+
+proc ::dialog_midi::pdtk_alsa_midi_dialog {id indev1 indev2 indev3 indev4 \
+        outdev1 outdev2 outdev3 outdev4 longform alsa} {
+    global midi_indev1 midi_indev2 midi_indev3 midi_indev4 
+    global midi_outdev1 midi_outdev2 midi_outdev3 midi_outdev4
+    global midi_indevlist midi_outdevlist
+    global midi_alsain midi_alsaout
+    set midi_indev1 $indev1
+    set midi_indev2 $indev2
+    set midi_indev3 $indev3
+    set midi_indev4 $indev4
+    set midi_outdev1 $outdev1
+    set midi_outdev2 $outdev2
+    set midi_outdev3 $outdev3
+    set midi_outdev4 $outdev4
+    set midi_alsain [llength $midi_indevlist]
+    set midi_alsaout [llength $midi_outdevlist]
+    set mytoplevel .prefs.nb.midi
+    set apifr $mytoplevel.api
+    # not sure why it's ...midi.midi... should probably
+    # fix that...
+    ::dialog_midi::create_api_frame $mytoplevel $apifr $midi_indevlist \
+        $midi_outdevlist $longform
+    destroy $mytoplevel.midi
+    ttk::frame $mytoplevel.midi
+    pack $mytoplevel.midi -side top -fill x
+
+    # todo: put padding with style settings in dialog_prefs.tcl
+    set padx 1
+
+    # Devices 
+    set devfr [ttk::labelframe $mytoplevel.midi.devs -text [_ "Devices"] \
+        -style Prefs.TLabelframe -padding 5]
+    pack $devfr -side top -fill x -padx 3 -pady 10
+
+    if {$alsa == 0} {
+        set j 2
+        foreach {type name} [list in [_ "Input"] out [_ "Output"]] {
+            set domulti [expr $longform && \
+                [llength [set "midi_${type}devlist"]] > 1]
+            if {$domulti} {
+                ttk::label $devfr.$type \
+                    -text [concat $name [_ "Devices"]]
+                ttk::label $devfr.${type}ch -text [_ "Channels"]
+                grid $devfr.$type -row $j -column 1 -padx $padx
+                grid $devfr.${type}ch -row $j -column 3 -padx $padx
+                incr j
+            } else {
+                if {$type eq "in"} {
+                ttk::label $devfr.$type \
+                    -text [_ "Device Name"]
+                ttk::label $devfr.${type}ch -text [_ "Channels"]
+                grid $devfr.$type -row $j -column 1 -columnspan 2 -padx $padx
+                grid $devfr.${type}ch -row $j -column 3 -padx $padx
+                incr j
+                }
+            }
+            for {set i 0} {$i < [llength [set "midi_${type}devlist"]]} \
+                {incr i} {
+                set devno [expr $i + 1]
+                set row "$devfr.${type}$devno"
+                if {$domulti} {
+                    set ctext "$devno."
+                } else {
+                    set ctext $name
+                }
+                ttk::label ${row}x0 -text $ctext -anchor w
+                set ::midi_${type}dev${devno}label {}
+                ::dialog_prefs::dropdown_by_index ${row}x1 \
+                    "midi_${type}dev$devno" \
+                    [set "midi_${type}devlist"] \
+                    "::midi_${type}dev${devno}label"
+                ttk::entry ${row}x2 -textvariable "midi_${type}chan$devno" -width 4
+                grid ${row}x0 -row $j -column 0 -sticky e -padx $padx
+                grid ${row}x1 -row $j -column 1 -columnspan 2 -sticky ew -padx $padx
+                grid ${row}x2 -row $j -column 3 -padx $padx
+                grid columnconfigure $mytoplevel.midi.devs {1 2 3} -weight 2
+                grid columnconfigure $mytoplevel.midi.devs 0 -weight 1
+                incr j
+                if {![expr $longform && \
+                    [llength [set "midi_${type}devlist"]] > 1]} {
+                    break
+                }
+            }
+        }
+        grid rowconfigure $devfr all -pad 3
+    } else {
+        label $devfr.l1 -text [_ "In Ports:"]
+        entry $devfr.x1 -textvariable midi_alsain -width 4
+        pack $devfr.l1 $devfr.x1 -side left
+        label $devfr.l2 -text [_ "Out Ports:"]
+        entry $devfr.x2 -textvariable midi_alsaout -width 4
+        pack $devfr.l2 $devfr.x2 -side left
+    }
+
+    # Connect button
+    ttk::frame $mytoplevel.midi.buttonframe
+    pack $mytoplevel.midi.buttonframe
+    pack $mytoplevel.midi.buttonframe -side bottom
+    ttk::button $mytoplevel.midi.buttonframe.apply -text [_ "Connect"]\
+        -command "::dialog_midi::apply $mytoplevel"
+    pack $mytoplevel.midi.buttonframe.apply -side left -expand 1 -fill x \
+        -padx 15
+}
diff --git a/pd/src/dialog_prefs.tcl b/pd/src/dialog_prefs.tcl
new file mode 100644
index 0000000000000000000000000000000000000000..2f0eb2ae540b96e87c793f182a0c31b43081efa4
--- /dev/null
+++ b/pd/src/dialog_prefs.tcl
@@ -0,0 +1,444 @@
+# the find dialog panel is a bit unusual in that it is created directly by the
+# Tcl 'pd-gui'. Most dialog panels are created by sending a message to 'pd',
+# which then sends a message to 'pd-gui' to create the panel.
+
+package provide dialog_prefs 0.1
+
+#package require pd_bindings
+#package require dialog_gui
+
+namespace eval ::dialog_prefs:: {
+#    namespace export pdtk_
+}
+
+# mytoplevel isn't used here, but is kept for compatibility with other dialog ok procs
+proc ::dialog_prefs::ok {mytoplevel} {
+    return # hash this out later
+    variable find_history
+
+    if {$findstring eq ""} {
+        if {$::windowingsystem eq "aqua"} {bell}
+        return
+    }
+    if {$find_in_window eq ".pdwindow"} {
+        if {$::tcl_version < 8.5} {
+            # TODO implement in 8.4 style, without -all
+            set matches [.pdwindow.text search -nocase -- $findstring 0.0]
+        } else {
+            set matches [.pdwindow.text search -all -nocase -- $findstring 0.0]
+        }
+        .pdwindow.text tag delete sel
+        if {[llength $matches] > 0} {
+            foreach match $matches {
+                .pdwindow.text tag add sel $match "$match wordend"
+            }
+            .pdwindow.text see [lindex $matches 0]
+            lappend find_history $findstring
+        }
+    } else {
+        if {$findstring eq $previous_findstring \
+                && $wholeword_button == $previous_wholeword_button} {
+            pdsend "$find_in_window findagain"
+        } else {
+            pdsend [concat $find_in_window find [pdtk_encodedialog $findstring] \
+                        $wholeword_button]
+            set previous_findstring $findstring
+            set previous_wholeword_button $wholeword_button
+            lappend find_history $findstring
+        }
+    }
+    if {$::windowingsystem eq "aqua"} {
+        # (Mac OS X) hide panel after success, but keep it if unsuccessful by
+        # having the couldnotfind proc reopen it
+        cancel $mytoplevel
+    } else {
+        # (GNOME/Windows) find panel should retain focus after a find
+        # (yes, a bit of a kludge)
+        after 100 "raise .find; focus .find.entry"
+    }
+}
+
+# mytoplevel isn't used here, but is kept for compatibility with other dialog cancel procs
+proc ::dialog_prefs::cancel {mytoplevel} {
+    wm withdraw .prefs
+}
+
+# the find panel is opened from the menu and key bindings
+proc ::dialog_prefs::open_prefs_dialog {mytoplevel} {
+    if {[winfo exists .prefs]} {
+        wm deiconify .prefs
+        raise .prefs
+    } else {
+        create_dialog $mytoplevel
+    }
+    pd [concat pd audio-properties \;]
+    pd [concat pd midi-properties \;]
+    ::dialog_gui::create_gui_dialog .prefs.nb.gui
+#    need to think about what should get focus with ttk::notebook
+#    .prefs.entry selection range 0 end
+}
+
+proc ::dialog_prefs::dropdown_set {name value} {
+    if {$::windowingsystem eq "aqua"} {
+        set my_var [$name cget -textvariable]
+        set $my_var $value
+    } else {
+        $name set "$value"
+    }
+}
+
+proc ::dialog_prefs::dropdown_by_index {name variable values textvar} {
+    ::dialog_prefs::dropdown $name $variable $values $textvar
+}
+
+proc ::dialog_prefs::dropdown {name variable values args} {
+    set textvar $variable
+    if {$args ne ""} {set textvar $args}
+    if {$::windowingsystem eq "aqua"} {
+        ttk::menubutton $name -menu $name.menu -direction flush \
+            -textvariable $textvar -cursor boat
+        menu $name.menu -cursor boat
+        set i 0
+        foreach label $values {
+            set value $label
+            if {$args ne ""} {set value $i}
+            $name.menu add radiobutton -value $value -variable $variable \
+                -label $label -command "set $textvar \"$label\""
+            incr i
+        }
+    } else {
+        # set combobox width to largest string
+        set width 0
+        foreach value $values {
+            set len [string length $value]
+            set width [expr $len > $width ? $len : $width]
+        }
+        ttk::combobox $name -state readonly -width $width \
+            -style Prefs.TCombobox -values $values
+        set command "get"
+        if {$args ne ""} {
+            set command "current"
+            # the following cmd prevents a bug in the alsa midi api
+            # from throwing an index that's out of range. but once
+            # that bug gets fixed, this should be removed so that
+            # it doesn't hide any future bugs
+            set $variable [expr min([set $variable], [llength $values] - 1)]
+        }
+        bind $name <<ComboboxSelected>> "set $variable \
+            [concat {[} $name $command {]} ]; after 0 {%W selection clear}"
+        if {$command eq "get"} {set command "set"}
+        $name $command [set $variable]
+    }
+}
+
+proc ::dialog_prefs::set_color {array key op} {
+    # not sure if this is necessary, but just in case...
+    if {$op ne "write"} {return}
+    set c [set ${array}($key)]
+    set commands {}
+    switch $key {
+        box {set commands [list "itemconfigure \
+            box&&(!msg)&&(!atom) -fill $c"] }
+        text { set commands [list "itemconfigure \
+                   (text&&(!box&&!iemgui)) -fill $c"]
+               lappend commands "itemconfigure \
+                   label&&graph -fill $c"
+              # lappend commands "itemconfigure \
+              #     (text&&(!label) -fill $c"
+             if {[winfo exists .search.resultstext]} {
+                 .search.resultstext configure -foreground $c
+                 .search.navtext configure -foreground $c
+             }
+             if {[winfo exists .printout.frame.text]} {
+                 .printout.frame.text configure -foreground $c
+             }
+        }
+        canvas_color {set commands [list "configure -bg $c"]
+            if {[winfo exists .search.resultstext]} {
+                .search.resultstext configure -bg $c
+                .search.navtext configure -bg $c
+            }
+            if {[winfo exists .printout.frame.text]} {
+                .printout.frame.text configure -bg $c
+            }
+        }
+        canvas_cursor {set commands [list "configure -insertbackground $c"]}
+        highlighted_text_bg \
+            {set commands [list "configure -selectbackground $c"]}
+        highlighted_text {set commands [list "configure -selectforeground $c"]}
+        msg_border {set commands [list "itemconfigure \
+            msg&&box -stroke $c"]}
+        msg {set commands [list "itemconfigure \
+            msg&&box -fill $c"]}
+        control_nlet {set commands [list "itemconfigure \
+            ((inlet||outlet)&&control) -fill $c"]
+        }
+        iemgui_nlet {set commands [list "itemconfigure \
+                (inlet&&iemgui)||(outlet&&iemgui) -stroke $c"]
+        }
+        signal_nlet {set commands [list "itemconfigure \
+            inlet&&signal -fill $c"]
+            lappend commands "itemconfigure \
+                outlet&&signal -fill $c"
+        }
+        outlet  {set commands [list "itemconfigure outlet -outline $c"]}
+        signal_cord {set commands [list "itemconfigure \
+            all_cords&&signal -stroke $c"]
+            lappend commands "itemconfigure \
+            (outlet&&signal)||(inlet&&signal) -stroke $c"
+        }
+        control_cord {set commands [list "itemconfigure \
+            all_cords&&control -stroke $c"]}
+        selection {
+            set commands [list "itemconfigure \
+                selected&&text -fill $c"]
+            lappend commands "itemconfigure \
+                selected&&(border&&(!iemgui)) -fill $c"
+            lappend commands "itemconfigure \
+                selected&&border&&iemgui -outline $c"
+        }
+        box_border {set commands [list "itemconfigure \
+            border&&(!iemgui) -outline $c"]}
+        iemgui_border {
+            set commands [list "itemconfigure border&&iemgui -stroke $c"]}
+        atom_box {set commands [list "itemconfigure \
+            atom&&box -fill $c"]}
+        atom_box_border {set commands [list "itemconfigure \
+            atom&&box -stroke $c"]}
+        graph_border {set commands [list "itemconfigure \
+            graph&&(!label) -stroke $c"]}
+        graph {set commands [list "itemconfigure graph&&(!label) -fill $c"]}
+        dash_fill {set commands [list "itemconfigure broken&&box -fill $c"]}
+        dash_outline {set commands [list "itemconfigure \
+            broken&&box -stroke $c"]}
+        magic_glass_bg {set commands [list "itemconfigure \
+            magicGlassBg -fill $c"]}
+        magic_glass_bd {set commands [list "itemconfigure \
+            magicGlassLine -fill $c"]}
+        magic_glass_text {set commands [list "itemconfigure \
+            magicGlassText -fill $c"]}
+        link {
+            if {[winfo exists .search.resultstext]} {
+                .search.resultstext tag configure link -foreground $c
+                .search.navtext tag configure link -foreground $c
+                .search.f.advancedlabel configure -foreground $c
+            }
+            return
+        }
+        default {}
+    }
+    if {$commands ne ""} {
+        foreach w [winfo children .] {
+            foreach child [winfo children $w] {
+                if {$child ne "" && [winfo class $child] eq "PathCanvas"} {
+                    if {$key eq "canvas_color" &&
+                        [info exists [format ::%s(%s) $key $w]]} {
+                            continue
+                    }
+                    foreach command $commands {
+                        eval $child $command
+                    }
+                }
+            }
+        }
+    }
+    # hack! how do I avoid hard-coding the window names here?
+    set mytoplevel .prefs.nb.gui.colors
+    if {[winfo exists $mytoplevel.$key]} {
+        ::dialog_prefs::set_swatchbutton $mytoplevel.$key ${array}($key)
+    }
+    
+}
+
+proc ::dialog_prefs::set_swatchbutton {name variable} {
+    if {[set $variable] eq ""} {return}
+    image create photo ::img::swatchbutton::$name
+    set c [set $variable]
+    set bd #000000
+    set stupid_top_and_bottom \
+        [list $bd $bd $bd $bd $bd $bd $bd $bd $bd $bd $bd $bd]
+    set dumb \
+        [list $bd $c $c $c $c $c $c $c $c $c $c $bd]
+    ::img::swatchbutton::$name put [list $stupid_top_and_bottom \
+        $dumb $dumb $dumb $dumb $dumb $dumb $dumb $dumb \
+        $dumb $dumb $stupid_top_and_bottom] -to 0 0 12 12
+    $name configure -image ::img::swatchbutton::$name
+}
+
+proc ::dialog_prefs::swatchmenu_nav {w dir} {
+    set new [expr {[$w index active] + 7 * $dir}]
+    if {$new > [$w index end] || $new < 0} then return
+    $w activate $new
+}
+
+proc ::dialog_prefs::swatchbutton_colorchooser {name variable} {
+    set col [tk_chooseColor -parent $name]
+    if {$col ne ""} {
+        set $variable $col
+    }
+}
+
+proc ::dialog_prefs::swatchbutton {name variable} {
+    if {$::windowingsystem ne "x11"} {
+        ttk::button $name -command "::dialog_prefs::swatchbutton_colorchooser $name $variable"
+        return
+    }
+    # Tk's color chooser for x11 isn't very good. So instead, the user
+    # gets a matrix of predefined colors to choose from. If a few custom
+    # colors could be added (or maybe triggering Ivica's L2ork color
+    # chooser) this would be improved.
+    ttk::menubutton $name -menu $name.m -style PrefsColors.TMenubutton
+    menu $name.m
+    bind $name.m <Left>  "::dialog_prefs::swatchmenu_nav %W -1"
+    bind $name.m <Right> "::dialog_prefs::swatchmenu_nav %W 1"
+    set i 0
+    foreach swatch [::dialog_prefs::get_colorswatches] {
+        set columnbreak [expr {$i % 7 == 0}]
+        # Note: there is a trace set in pd-gui.tcl that calls
+        # ::dialog_prefs::set_color whenever the value of a
+        # ::pd_colors variable is changed.  So for the menu we just
+        # have to link to one of those variables and trace does the rest
+        $name.m add radiobutton -value $swatch -variable $variable \
+            -image ::img::colorswatches::$swatch -columnbreak $columnbreak \
+            -hidemargin 1
+        incr i
+    }
+}
+    
+
+# These are images used to build the menu for choosing
+# colors. The images hang around in memory until you exit
+# Pd, but they shouldn't take up too much space to matter
+# (and this only gets called once).  If there's a simpler
+# way to build a _straightforward_ _user-friendly_
+# colorchooser that would be nice, but I couldn't figure
+# one out.
+proc ::dialog_prefs::get_colorswatches {} {
+    # stolen from the Firefox colorchooser
+    set colors {  \
+        #ffffff #cfcccc #c0c0c0 #999999 #666666 #333333 #000000 \
+        #ffcccc #ff6666 #ff0000 #cc0000 #990000 #660000 #330000 \
+        #ffcc99 #ff9966 #ff9900 #ff6600 #cc6600 #993300 #663300 \
+        #ffff99 #ffff66 #ffcc66 #ffcc33 #cc9933 #996633 #663333 \
+        #ffffcc #ffff33 #ffff00 #ffcc00 #999900 #666600 #333300 \
+        #99ff99 #66ff99 #33ff33 #33cc00 #009900 #006600 #003300 \
+        #99ffff #33ffff #66cccc #00cccc #339999 #336666 #003333 \
+        #ccffff #66ffff #33ccff #3366ff #3333ff #000099 #000066 \
+        #ccccff #9999ff #6666cc #6633ff #6600cc #333399 #330099 \
+        #ffccff #ff99ff #cc66cc #cc33cc #993399 #663366 #330033 \
+    }
+    if {[lsearch [image names] ::img::colorswatches::*] == -1} {
+        foreach color $colors {
+        image create photo ::img::colorswatches::$color
+        ::img::colorswatches::$color put $color -to 0 0 16 16
+        }
+    }
+    return $colors
+}
+
+proc ::dialog_prefs::help {notebook} {
+    set pane [$notebook select]
+    regsub {.*\.(.*)} $pane {\1} topic
+    set file all_about_${topic}_settings.pd
+    set dir [file join $::sys_libdir doc 5.reference]
+    menu_doc_open $dir $file
+}
+
+proc ::dialog_prefs::dialog_bindings {mytoplevel dialogname} {
+    variable modifier
+
+    bind $mytoplevel <KeyPress-Escape> "dialog_${dialogname}::cancel $mytoplevel"
+    bind $mytoplevel <KeyPress-Return> "dialog_${dialogname}::ok $mytoplevel"
+    bind $mytoplevel <$::modifier-Key-w> "dialog_${dialogname}::cancel $mytoplevel"
+    # these aren't supported in the dialog, so alert the user, then break so
+    # that no other key bindings are run
+    bind $mytoplevel <$::modifier-Key-s>       {bell; break}
+    bind $mytoplevel <$::modifier-Shift-Key-S> {bell; break}
+    bind $mytoplevel <$::modifier-Key-p>       {bell; break}
+
+    wm protocol $mytoplevel WM_DELETE_WINDOW "dialog_${dialogname}::cancel $mytoplevel"
+}
+
+proc ::dialog_prefs::create_dialog {mytoplevel} {
+    toplevel .prefs -class DialogWindow
+    wm title .prefs [_ "Pure Data Preferences"]
+#    wm geometry .prefs =475x125+150+150
+    wm group .prefs .
+    wm resizable .prefs 0 0
+    wm transient .prefs
+#    .prefs configure -menu $::dialog_menubar
+
+# todo: check this on the mac and on windows
+#    .prefs configure -padx 10 -pady 5
+    ::dialog_prefs::dialog_bindings .prefs "prefs"
+    bind .prefs <$::modifier-Key-f> break
+
+    # Ttk style setup
+
+    # Common settings
+    ttk::style configure Prefs.TLabelframe -borderwidth 0
+    # todo: don't hardcode font here
+    ttk::style configure Prefs.TLabelframe.Label \
+        -font "{DejaVu Sans} 9 bold"
+
+    # for OSX swatchbutton
+    if {$::windowingsystem eq "x11"} {
+        # custom arrow image for ttk::combobox
+        set ::prefs_arrowimg [image create photo -data \
+            {R0lGODlhGQAVAMIGACEhIVBQUFpaWl1dXXBwcImJif///////yH+EUNyZWF0ZWQg
+            d2l0aCBHSU1QACH5BAEKAAcALAAAAAAZABUAAAMleLrc/jDKSau9OOutC/ggUGRE
+            CBCbAArcEQBBqwxybd94ru9QAgA7
+        }]
+        # ttk::style theme use clam
+        ttk::style element create Prefs.downarrow image $::prefs_arrowimg
+        ttk::style layout Prefs.TCombobox {
+            Combobox.focus -sticky nsew -children {
+                Combobox.field -sticky nswe -children {
+                    Prefs.downarrow -side right -sticky ns
+                    Combobox.padding -expand 1 -sticky nswe -children {
+                        Combobox.textarea -sticky nswe
+                    }
+                }
+            }
+        }
+        ttk::style layout PrefsColors.TMenubutton {
+            Menubutton.border -sticky nswe -children {
+                Menubutton.focus -sticky nswe -children {
+                    Menubutton.padding -expand 1 -sticky we -children {
+                        Menubutton.label -side left -sticky {}
+                    }
+                }
+            }
+        }
+        ttk::style configure Prefs.TCombobox -padding 3
+        ttk::style map Prefs.TCombobox \
+            -fieldbackground {{readonly pressed} #c1c4c7 \
+                              {readonly hover} #fafaf9 \
+                              readonly #f5f5f4} \
+            -foreground {{readonly focus} black}
+        # this shouldn't be global, but I can't get it to work for just
+        # Prefsdialog class
+        option add *TCombobox*Listbox.selectBackground #4a90d9
+        option add *TCombobox*Listbox.selectForeground white
+    }
+
+    ttk::notebook .prefs.nb
+    .prefs.nb add [ttk::frame .prefs.nb.audio -padding 10] \
+        -text "Audio" -sticky nsew
+    .prefs.nb add [ttk::frame .prefs.nb.midi -padding 10] \
+        -text "MIDI" -sticky nsew
+    .prefs.nb add [ttk::frame .prefs.nb.gui -padding 10] \
+        -text "GUI" -stick nsew
+    pack .prefs.nb -fill both -expand 1
+
+    ttk::frame .prefs.bottomframe -padding 10
+    pack .prefs.bottomframe -side bottom -fill both  -expand 1
+    if {$::windowingsystem ne "aqua"} {
+    ttk::button .prefs.bottomframe.closebutton \
+        -text "Close" -command "::dialog_prefs::cancel .prefs"
+    pack .prefs.bottomframe.closebutton -side right
+    }
+    ttk::button .prefs.bottomframe.helpbutton \
+        -text "Help" -command "::dialog_prefs::help .prefs.nb"
+    pack .prefs.bottomframe.helpbutton -side left
+}
diff --git a/pd/src/g_all_guis.h b/pd/src/g_all_guis.h
index 10653984f4f2888a1831c2a9e9d795316e631b40..6b13155eaf66246556d96df0e194deb0cb7c450b 100644
--- a/pd/src/g_all_guis.h
+++ b/pd/src/g_all_guis.h
@@ -42,7 +42,7 @@
 #define IEM_GUI_COLOR_SELECTED       16749334
 /* end deprecated */
 
-#define IEM_GUI_COLOR_NORMAL         0
+#define IEM_GUI_COLOR_NORMAL         "$pd_colors(iemgui_border)"
 
 #define IEM_GUI_MAX_COLOR            30
 
diff --git a/pd/src/g_bang.c b/pd/src/g_bang.c
index c906457fa922854ef2d3fa1978d65d0db413ca90..b32be38bc7f6faa81fd7a1a72388a07d080ca6d5 100644
--- a/pd/src/g_bang.c
+++ b/pd/src/g_bang.c
@@ -64,31 +64,31 @@ void bng_draw_new(t_bng *x, t_glist *glist)
 
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-		sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -tags {%lxBASE %lxBNG text %s}\n",
+		sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_border) -fill #%6.6x -tags {%lxBASE %lxBNG text iemgui border %s}\n",
 		         canvas, xpos, ypos,
 		         xpos + x->x_gui.x_w, ypos + x->x_gui.x_h,
 		         x->x_gui.x_bcol, x, x, nlet_tag);
 		t_float cr = (x->x_gui.x_w-2)/2.0;
 		t_float cx = xpos+cr+1.5;
 		t_float cy = ypos+cr+1.5;
-		sys_vgui(".x%lx.c create circle %f %f -r %f -fill #%6.6x -tags {%lxBUT %lxBNG text %s}\n",
+		sys_vgui(".x%lx.c create circle %f %f -r %f -stroke $pd_colors(iemgui_border) -fill #%6.6x -tags {%lxBUT %lxBNG text iemgui border %s}\n",
 		         canvas, cx, cy, cr,
 		         x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol, x, x, nlet_tag);
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxBNG text %s}\n",
+		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxBNG text iemgui %s}\n",
 		         canvas, xpos+x->x_gui.x_ldx,
 		         ypos+x->x_gui.x_ldy,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 		         x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 				 x->x_gui.x_lcol, x, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist) {
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxBNG%so%d %so%d %lxBNG outlet %s}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxBNG%so%d %so%d %lxBNG outlet iemgui %s}\n",
 		         canvas, xpos,
 		         ypos + x->x_gui.x_h-1, xpos + IOWIDTH,
 		         ypos + x->x_gui.x_h, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		}
 		if(!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist) {
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxBNG%si%d %si%d %lxBNG inlet %s}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxBNG%si%d %si%d %lxBNG inlet iemgui %s}\n",
 		         canvas, xpos, ypos,
 		         xpos + IOWIDTH, ypos+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		}
@@ -111,7 +111,7 @@ void bng_draw_move(t_bng *x, t_glist *glist)
 		t_float cr = (x->x_gui.x_w-2)/2.0;
 		t_float cx = xpos+cr+1.5;
 		t_float cy = ypos+cr+1.5;
-		/*sys_vgui(".x%lx.c create circle %d %d -r %d -stroke #%6.6x -tags {%lxBUT %lxBNG %lx text}\n",
+		/*sys_vgui(".x%lx.c create circle %d %d -r %d -stroke #%6.6x -tags {%lxBUT %lxBNG %lx text iemgui}\n",
 		         canvas, cx, cy, cr,*/
 		sys_vgui(".x%lx.c coords %lxBUT %f %f\n",
 		         canvas, x, cx, cy);
@@ -165,13 +165,13 @@ void bng_draw_config(t_bng* x, t_glist* glist)
 	/*
 	char color[64];
 	if (x->x_gui.x_fsf.x_selected)
-		sprintf(color, "$select_color");
+		sprintf(color, "$pd_colors(selection)");
 	else
 		sprintf(color, "#%6.6x", x->x_gui.x_lcol);
 	*/
 
 	if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas)
-	    sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $select_color -text {%s} \n",
+	    sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $pd_colors(selection) -text {%s} \n",
              canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
              strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
 	else
@@ -197,14 +197,14 @@ void bng_draw_io(t_bng* x, t_glist* glist, int old_snd_rcv_flags)
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
 		if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxBNG%so%d %so%d %lxBNG outlet %s}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxBNG%so%d %so%d %lxBNG outlet iemgui %s}\n",
 		         canvas, xpos,
 		         ypos + x->x_gui.x_h-1, xpos + IOWIDTH,
 		         ypos + x->x_gui.x_h, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able)
 		    sys_vgui(".x%lx.c delete %lxBNG%so%d\n", canvas, x, nlet_tag, 0);
 		if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxBNG%si%d %si%d %lxBNG inlet %s}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxBNG%si%d %si%d %lxBNG inlet iemgui %s}\n",
 		         canvas, xpos, ypos,
 		         xpos + IOWIDTH, ypos+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && x->x_gui.x_fsf.x_rcv_able)
@@ -228,18 +228,18 @@ void bng_draw_select(t_bng* x, t_glist* glist)
 
 				char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-				sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $select_color\n", canvas, x);
-				sys_vgui(".x%lx.c itemconfigure %lxBUT -stroke $select_color\n", canvas, x);
-				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $select_color\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $pd_colors(selection)\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxBUT -stroke $pd_colors(selection)\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $pd_colors(selection)\n", canvas, x);
 
 				if (x->x_gui.scale_vis) {
 					sys_vgui("destroy %s\n", sh->h_pathname);
 					sys_vgui(".x%lx.c delete %lxSCALE\n", canvas, x);
 				}
 
-				sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+				sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 					 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
-				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxBNG %s}\n",
+				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxBNG iemgui %s}\n",
 					 canvas, x->x_gui.x_obj.te_xpix + x->x_gui.x_w - SCALEHANDLE_WIDTH - 1,
 					 x->x_gui.x_obj.te_ypix + x->x_gui.x_h - SCALEHANDLE_HEIGHT - 1,
 					 SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT,
@@ -259,9 +259,9 @@ void bng_draw_select(t_bng* x, t_glist* glist)
 						sys_vgui(".x%lx.c delete %lxLABELH\n", canvas, x);
 					}
 
-					sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+					sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 						lh->h_pathname, LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT);
-					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxBNG %s}\n",
+					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxBNG iemgui %s}\n",
 						canvas, x->x_gui.x_obj.te_xpix+ x->x_gui.x_ldx - LABELHANDLE_WIDTH,
 						x->x_gui.x_obj.te_ypix + x->x_gui.x_ldy - LABELHANDLE_HEIGHT,
 						LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT,
@@ -280,8 +280,8 @@ void bng_draw_select(t_bng* x, t_glist* glist)
 		}
 		else
 		{
-		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
-		    sys_vgui(".x%lx.c itemconfigure %lxBUT -stroke #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
+		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n", canvas, x, IEM_GUI_COLOR_NORMAL);
+		    sys_vgui(".x%lx.c itemconfigure %lxBUT -stroke %s\n", canvas, x, IEM_GUI_COLOR_NORMAL);
 		    sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill #%6.6x\n", canvas, x, x->x_gui.x_lcol);
 			sys_vgui(".x%lx.c dtag %lxBNG selected\n", canvas, x);
 			sys_vgui("destroy %s\n", sh->h_pathname);
@@ -357,7 +357,7 @@ static void bng__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx, t_fl
 		{
 			sys_vgui("lower %s\n", sh->h_pathname);
 			sys_vgui(".x%x.c create prect %d %d %d %d\
-	 -stroke $select_color -strokewidth 1 -tags %s\n",
+	 -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
 				 x->x_gui.x_glist, x->x_gui.x_obj.te_xpix, x->x_gui.x_obj.te_ypix,
 					x->x_gui.x_obj.te_xpix + x->x_gui.x_w,
 					x->x_gui.x_obj.te_ypix + x->x_gui.x_h, sh->h_outlinetag);
diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 1143a6754dc7363bbd4138f62c321af4713295a3..15809adbc85a2336c4af4bc5b967e4cf6e7e841a 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -723,7 +723,7 @@ void canvas_draw_gop_resize_hooks(t_canvas* x)
 		sprintf(sh->h_pathname, ".x%lx.h%lx", (t_int)x, (t_int)sh);
 		sys_vgui("destroy %s\n", sh->h_pathname);	
 		sys_vgui(".x%lx.c delete GOP_resblob\n", x);	
-		sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+		sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 				 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
 		sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxGOP GOP_resblob}\n",
 				 x, x->gl_xmargin + x->gl_pixwidth - SCALEHANDLE_WIDTH - 1,
@@ -742,7 +742,7 @@ void canvas_draw_gop_resize_hooks(t_canvas* x)
 		sprintf(mh->h_pathname, ".x%lx.h%lx", (t_int)x, (t_int)mh);
 		sys_vgui("destroy %s\n", mh->h_pathname);
 		sys_vgui(".x%lx.c delete GOP_movblob\n", x);	
-		sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+		sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 				 mh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
 		sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxMOVE %lxGOP GOP_movblob}\n",
 				 x, x->gl_xmargin + 2 ,
@@ -959,9 +959,9 @@ static void canvas_drawlines(t_canvas *x)
 		if (!(pd_class(&t.tr_ob2->ob_g.g_pd) == preset_node_class && pd_class(&t.tr_ob->ob_g.g_pd) != message_class))
 			canvas_drawconnection(glist_getcanvas(x), t.tr_lx1, t.tr_ly1, t.tr_lx2, t.tr_ly2, (t_int)oc, issignal);
 		    /*sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %s -stroke %s \
-	-tags {l%lx all_cords}\n",
+	-tags {l%lx all_cords %s}\n",
 		             glist_getcanvas(x), t.tr_lx1, t.tr_ly1, t.tr_lx2, t.tr_ly2, 
-		             (issignal ? "$signal_cord_width" : "$msg_cord_width"), (issignal ? "$signal_cord" : "$msg_cord"),
+		             (issignal ? "$pd_colors(signal_cord_width)" : "$pd_colors(control_cord_width)"), (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
 		             oc);*/
     }
 }
@@ -2009,7 +2009,7 @@ void canvasgop__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx, t_flo
 			sys_vgui("lower %s\n", sh->h_pathname);
 			sys_vgui(".x%lx.c delete GOP \n",  x);							//delete GOP rect where it started from
 			sys_vgui(".x%x.c create rectangle %d %d %d %d\
-	 			-outline $select_color -width 1 -tags %s\n",\
+	 			-outline $pd_colors(selection) -width 1 -tags %s\n",\
 				 x, x->gl_xmargin, x->gl_ymargin,\
 					x->gl_xmargin + x->gl_pixwidth,\
 					x->gl_ymargin + x->gl_pixheight, sh->h_outlinetag);
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index a1f8a3b07006c187be69c38c8625a39ec57402f2..48ff581eae3889bc5d6aae87eda29cc324d6e91e 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -307,8 +307,8 @@ void canvas_check_nlet_highlights(t_glist *x)
 	{
 		sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
 		       	x, x->gl_editor->canvas_cnct_inlet_tag,
-				(last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")),
-				(inlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+				(last_inlet_filter ? "black" : (inlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+				(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 		if (objtooltip) {
 			objtooltip = 0;
 			sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -324,8 +324,8 @@ void canvas_check_nlet_highlights(t_glist *x)
 	{
 		sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
 		       	x, x->gl_editor->canvas_cnct_outlet_tag,
-				(last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")),
-				(outlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+				(last_outlet_filter ? "black" : (outlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+				(outlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 		if (objtooltip) {
 			objtooltip = 0;
 			sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -350,7 +350,7 @@ void glist_selectline(t_glist *x, t_outconnect *oc, int index1,
         x->gl_editor->e_selectline_index2 = index2;
         x->gl_editor->e_selectline_inno = inno;
         x->gl_editor->e_selectline_tag = oc;
-        sys_vgui(".x%lx.c itemconfigure l%lx -stroke $select_color\n",
+        sys_vgui(".x%lx.c itemconfigure l%lx -stroke $pd_colors(selection)\n",
             x, x->gl_editor->e_selectline_tag);
         sys_vgui(".x%lx.c addtag selected withtag l%lx\n",
             glist_getcanvas(x), x->gl_editor->e_selectline_tag);
@@ -377,7 +377,7 @@ void glist_deselectline(t_glist *x)
             issignal = 0;
         sys_vgui(".x%lx.c itemconfigure l%lx -stroke %s\n",
             x, x->gl_editor->e_selectline_tag,
-            (issignal ? "$signal_cord" : "$msg_cord"));
+            (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"));
         sys_vgui(".x%lx.c dtag l%lx selected\n",
             glist_getcanvas(x), glist_getcanvas(x)->gl_editor->e_selectline_tag);
 		canvas_draw_gop_resize_hooks(x);
@@ -2970,13 +2970,14 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
                         sys_vgui(
                         	/*".x%lx.c create polyline %d %d %d %d -stroke %s -strokewidth %s -tags x\n",
 									x, xpos, ypos, xpos, ypos,
-									(issignal ? "$signal_cord" : "$msg_cord"),
-                                    (issignal ? "$signal_cord_width" : "$msg_cord_width"));*/
+									(issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
+                                    (issignal ? "$pd_colors(signal_cord_width)" : "$pd_colors(control_cord_width)"));*/
 							// bezier is too slow for the time being
-			 			  ".x%lx.c create path \"M %d %d Q %d %d %d %d Q %d %d %d %d\" -stroke %s -strokewidth %s -tags x\n",
+			 			  ".x%lx.c create path \"M %d %d Q %d %d %d %d Q %d %d %d %d\" -stroke %s -strokewidth %s -tags {x all_cords %s}\n",
                                 x, xpos, ypos, xpos, ypos, xpos, ypos, xpos, ypos, xpos, ypos,
-									(issignal ? "$signal_cord" : "$msg_cord"),
-                                    (issignal ? "$signal_cord_width" : "$msg_cord_width"));
+									(issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
+                                    (issignal ? "$pd_colors(signal_cord_width)" : "$pd_colors(control_cord_width)"),
+                                    (issignal ? "signal" : "control"));
                     }   
     	    	    else
                     // jsarlo
@@ -2987,8 +2988,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
                         {
                             sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                                    	x, x->gl_editor->canvas_cnct_outlet_tag,
-									(last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")),
-									(outlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+									(last_outlet_filter ? "black" : (outlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+									(outlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
                         }
                         if (yr)
                         {
@@ -3046,8 +3047,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
                     {
                         sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                                	x, x->gl_editor->canvas_cnct_inlet_tag,
-								(last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")),
-								(inlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+								(last_inlet_filter ? "black" : (inlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+								(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
                     }
 
                     if (yr)
@@ -3125,8 +3126,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
                 {
                     sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                            	x, x->gl_editor->canvas_cnct_inlet_tag,
-							(last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")),
-							(inlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+							(last_inlet_filter ? "black" : (inlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+							(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 					if (objtooltip) {
 						objtooltip = 0;
 						sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -3138,8 +3139,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
                 {
                     sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                            	x, x->gl_editor->canvas_cnct_outlet_tag,
-							(last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")),
-							(outlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+							(last_outlet_filter ? "black" : (outlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+							(outlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 					if (objtooltip) {
 						objtooltip = 0;
 						sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -3231,8 +3232,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
 		        {
 					sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
 				   			x, x->gl_editor->canvas_cnct_inlet_tag,
-							(last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")),
-							(inlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+							(last_inlet_filter ? "black" : (inlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+							(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 					if (objtooltip) {
 						objtooltip = 0;
 						sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -3243,8 +3244,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
 		        {
 		            sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
 		                   	x, x->gl_editor->canvas_cnct_outlet_tag,
-							(last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")),
-							(outlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+							(last_outlet_filter ? "black" : (outlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+							(outlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 					if (objtooltip) {
 						objtooltip = 0;
 						sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -3261,8 +3262,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
     {
 		sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
        			x, x->gl_editor->canvas_cnct_inlet_tag,
-				(last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")),
-				(inlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+				(last_inlet_filter ? "black" : (inlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+				(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 		if (objtooltip) {
 			objtooltip = 0;
 			sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -3274,8 +3275,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
     {
         sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                	x, x->gl_editor->canvas_cnct_outlet_tag,
-				(last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")),
-				(outlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+				(last_outlet_filter ? "black" : (outlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+				(outlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 		if (objtooltip) {
 			objtooltip = 0;
 			sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -3300,7 +3301,7 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
 			//buf->u_redo = (t_undo_sel *)canvas_undo_set_selection(x);
 			//canvas_undo_add(x, 11, "selection", buf);
 		}
-        sys_vgui(".x%lx.c create prect %d %d %d %d -tags x -stroke $select_color\n",
+        sys_vgui(".x%lx.c create prect %d %d %d %d -tags x -stroke $pd_colors(selection_rectangle)\n",
               x, xpos, ypos, xpos, ypos);
         x->gl_editor->e_xwas = xpos;
         x->gl_editor->e_ywas = ypos;
@@ -3406,17 +3407,17 @@ void canvas_drawconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, t_in
 	if (yoff > ymax) yoff = ymax;
 	/*sys_vgui(".x%lx.c create polyline %d %d %d %d -stroke %s -strokewidth %s -tags {l%lx all_cords}\n",
         x, lx1, ly1, lx2, ly2,
-        (issignal ? "$signal_cord" : "$msg_cord"),
-        (issignal ? "$signal_cord_width" : "$msg_cord_width"), 
+        (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
+        (issignal ? "$pd_colors(signal_cord_width)" : "$pd_colors(control_cord_width)"), 
         tag);*/
 	//bezier curves FTW
-	sys_vgui(".x%lx.c create path \"M %d %d Q %d %d %d %d Q %d %d %d %d\" -stroke %s -strokewidth %s -tags {l%lx all_cords}\n",
+	sys_vgui(".x%lx.c create path \"M %d %d Q %d %d %d %d Q %d %d %d %d\" -stroke %s -strokewidth %s -tags {l%lx all_cords %s}\n",
         x, lx1, ly1,
 		lx1, ly1 + yoff, lx1 + halfx, ly1 + halfy,
 		lx2, ly2 - yoff, lx2, ly2,
-        (issignal ? "$signal_cord" : "$msg_cord"),
-        (issignal ? "$signal_cord_width" : "$msg_cord_width"), 
-        tag);
+        (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
+        (issignal ? "$pd_colors(signal_cord_width)" : "$pd_colors(control_cord_width)"), 
+        tag, (issignal ? "signal" : "control"));
 
 }
 
@@ -3533,15 +3534,15 @@ int canvas_doconnect_doit(t_canvas *x, t_gobj *y1, t_gobj *y2, int closest1, int
     /*sys_vgui(".x%lx.c create polyline %d %d %d %d -stroke %s -strokewidth %s -tags {l%lx all_cords}\n",
         glist_getcanvas(x),
             lx1, ly1, lx2, ly2,
-        (issignal ? "$signal_cord" : "$msg_cord"),
-        (issignal ? "$signal_cord_width" : "$msg_cord_width"), 
+        (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
+        (issignal ? "$pd_colors(signal_cord_width)" : "$pd_colors(control_cord_width)"), 
         oc);*/
     if (x->gl_editor->canvas_cnct_inlet_tag[0] != 0)
     {
         sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                	x, x->gl_editor->canvas_cnct_inlet_tag,
-				(last_inlet_filter ? "black" : (obj_issignalinlet(ob2, closest2) ? "$signal_cord" : "$msg_cord")),
-				(inlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+				(last_inlet_filter ? "black" : (obj_issignalinlet(ob2, closest2) ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+				(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 		if (objtooltip) {
 			objtooltip = 0;
 			sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -3552,8 +3553,8 @@ int canvas_doconnect_doit(t_canvas *x, t_gobj *y1, t_gobj *y2, int closest1, int
     {
         sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                	x, x->gl_editor->canvas_cnct_outlet_tag,
-				(last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")),
-				(outlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+				(last_outlet_filter ? "black" : (outlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+				(outlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 		if (objtooltip) {
 			objtooltip = 0;
 			sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -4023,8 +4024,8 @@ void canvas_doconnect(t_canvas *x, int xpos, int ypos, int which, int doit)
                 {
                     sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                            	x, x->gl_editor->canvas_cnct_inlet_tag,
-							(last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")),
-							(inlet_issignal ? "$signal_nlet" : "$msg_nlet"));                
+							(last_inlet_filter ? "black" : (inlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+							(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));                
                 }
                 if (y)
                 {
@@ -4058,8 +4059,8 @@ void canvas_doconnect(t_canvas *x, int xpos, int ypos, int which, int doit)
     {
         sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                	x, x->gl_editor->canvas_cnct_inlet_tag,
-				(last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")),
-				(inlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+				(last_inlet_filter ? "black" : (inlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+				(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 		if (objtooltip) {
 			objtooltip = 0;
 			sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x);
@@ -4245,15 +4246,15 @@ void canvas_mouseup(t_canvas *x,
 		{
 			sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
 				   	x, x->gl_editor->canvas_cnct_outlet_tag,
-					(last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")),
-					(outlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+					(last_outlet_filter ? "black" : (outlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+					(outlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 		}
 		if (x->gl_editor->canvas_cnct_inlet_tag[0] != 0)
 		{
 			sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
 		   			x, x->gl_editor->canvas_cnct_inlet_tag,
-					(last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")),
-					(inlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+					(last_inlet_filter ? "black" : (inlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+					(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
 			x->gl_editor->canvas_cnct_inlet_tag[0] = 0;                  
 		}
 
@@ -5812,8 +5813,8 @@ void canvas_connect(t_canvas *x, t_floatarg fwhoout, t_floatarg foutno,
 			canvas_drawconnection(x, 0, 0, 0, 0, (t_int)oc, obj_issignaloutlet(objsrc, outno));
 		    /*sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %s -stroke %s -tags {l%lx all_cords}\n",
 		        glist_getcanvas(x), 0, 0, 0, 0,
-		        (obj_issignaloutlet(objsrc, outno) ? "$signal_cord_width" : "$msg_cord_width"),
-		        (obj_issignaloutlet(objsrc, outno) ? "$signal_cord" : "$msg_cord"), oc);*/
+		        (obj_issignaloutlet(objsrc, outno) ? "$pd_colors(signal_cord_width)" : "$pd_colors(control_cord_width)"),
+		        (obj_issignaloutlet(objsrc, outno) ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"), oc);*/
 		    canvas_fixlinesfor(x, objsrc);
 		}
 	}
@@ -6430,16 +6431,16 @@ void canvas_editmode(t_canvas *x, t_floatarg fyesplease)
             {
                 sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                        	x, x->gl_editor->canvas_cnct_inlet_tag,
-						(last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")),
-						(inlet_issignal ? "$signal_nlet" : "$msg_nlet")); 
+						(last_inlet_filter ? "black" : (inlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+						(inlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)")); 
                 x->gl_editor->canvas_cnct_inlet_tag[0] = 0;                  
             }
             if (x->gl_editor->canvas_cnct_outlet_tag[0] != 0)
             {
                 sys_vgui(".x%x.c itemconfigure %s -stroke %s -fill %s -strokewidth 1\n",
                        	x, x->gl_editor->canvas_cnct_outlet_tag,
-						(last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")),
-						(outlet_issignal ? "$signal_nlet" : "$msg_nlet"));
+						(last_outlet_filter ? "black" : (outlet_issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")),
+						(outlet_issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"));
                 x->gl_editor->canvas_cnct_outlet_tag[0] = 0;                  
             }
 			if(x->gl_editor && x->gl_editor->gl_magic_glass) {
diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c
index b5cf87af72835694aab0ce1eddf20516d64cf92e..598a045a5a5aa75464772f3422c6c546c89a67f8 100644
--- a/pd/src/g_graph.c
+++ b/pd/src/g_graph.c
@@ -435,7 +435,7 @@ void canvas_resortinlets(t_canvas *x)
 		for (i = 0; i < ninlets; i++) {
             sys_vgui(".x%x.c itemconfigure %si%d -fill %s -width 1\n",
                      x, rtext_gettag(rt), i, 
-                     (obj_issignalinlet(ob, i) ? "$signal_nlet" : "$msg_nlet"));
+                     (obj_issignalinlet(ob, i) ? "$signal_nlet" : "$pd_colors_control_nlet)"));
 		}
 */
 		//glist_redraw(x);
@@ -817,7 +817,7 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
 	    if (vis && gobj_shouldvis(gr, parent_glist))
 	    {
 	        sys_vgui(".x%lx.c create ppolygon\
- %d %d %d %d %d %d %d %d %d %d -tags {%sfill} -fill $graph_outline -stroke $graph_outline\n",
+ %d %d %d %d %d %d %d %d %d %d -tags {%sfill graph} -fill $pd_colors(graph_border) -stroke $pd_colors(graph_border)\n",
 	            glist_getcanvas(x->gl_owner),
 				//parent_glist,
 	            x1, y1, x1, y2, x2, y2, x2, y1, x1, y1, tag);
@@ -841,13 +841,13 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
         t_garray *ga;
             /* draw a rectangle around the graph */
         /*sys_vgui(".x%lx.c create polyline\
-            %d %d %d %d %d %d %d %d %d %d -stroke $graph_outline -tags {%sR %s}\n",
+            %d %d %d %d %d %d %d %d %d %d -stroke $pd_colors(graph_border) -tags {%sR %s graph}\n",
             glist_getcanvas(x->gl_owner),
             x1, y1, x1, y2, x2, y2, x2, y1, x1, y1, tag, tag);*/
         sys_vgui(".x%lx.c create prect\
-            %d %d %d %d -stroke $graph_outline -tags {%sR}\n",
+            %d %d %d %d -stroke $pd_colors(graph_border) -fill $pd_colors(graph) -tags {%sR graph}\n",
             glist_getcanvas(x->gl_owner),
-            x1, y1, x2, y2, tag); // -fill $obj_box_fill
+            x1, y1, x2, y2, tag); // -fill $pd_colors(graph)
         
             /* if there's just one "garray" in the graph, write its name
                 along the top */
@@ -857,10 +857,10 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
         {
 			//i++;
             sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor nw\
-             -font {{%s} -%d %s} -tags {%s} -fill %s\n",
+             -font {{%s} %d %s} -tags {%s label graph} -fill %s\n",
              (long)glist_getcanvas(x),  x1+2, i, arrayname->s_name, sys_font,
                 sys_hostfontsize(glist_getfont(x)), sys_fontweight, tag,
-				(glist_isselected(x, gr) ? "$select_color" : "$graph_outline"));
+				(glist_isselected(x, gr) ? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
             i += sys_fontheight(glist_getfont(x));
         }
         
@@ -1217,19 +1217,19 @@ static void graph_select(t_gobj *z, t_glist *glist, int state)
 		}
 		if(glist_istoplevel(glist)) {
         	sys_vgui(".x%lx.c itemconfigure %sR -stroke %s\n", canvas, 
-                 rtext_gettag(y), (state? "$select_color" : "$graph_outline"));
+                 rtext_gettag(y), (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
 /*
         sys_vgui(".x%lx.c itemconfigure graph%lx -fill %s\n",
                  glist_getcanvas(glist), z, 
-                 (state? "$select_color" : "$graph_outline"));
+                 (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
 */
         	sys_vgui(".x%lx.c itemconfigure %sT -fill %s\n",
                  canvas, rtext_gettag(y), 
-                 (state? "$select_color" : "$graph_outline"));
+                 (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
 
         	sys_vgui(".x%lx.c itemconfigure %sfill -stroke %s -fill %s\n",
                  canvas, rtext_gettag(y), 
-                 (state? "$select_color" : "$graph_outline"), (state? "$select_color" : "$graph_outline"));
+                 (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"), (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
 		}
 
 		t_gobj *g;
diff --git a/pd/src/g_hdial.c b/pd/src/g_hdial.c
index 5cd5f158a53bdb9383043a8fbdbb9fd3bc90bdc6..27765959f32a6dfc80f4a21a332550ba77ab881e 100644
--- a/pd/src/g_hdial.c
+++ b/pd/src/g_hdial.c
@@ -75,10 +75,10 @@ void hradio_draw_new(t_hradio *x, t_glist *glist)
 
 		for(i=0; i<n; i++)
 		{
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -tags {%lxBASE%d %lxHRDO %s text}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_border) -fill #%6.6x -tags {%lxBASE%d %lxHRDO %s text iemgui border}\n",
 		             canvas, xx11, yy11, xx11+dx, yy12,
 		             x->x_gui.x_bcol, x, i, x, nlet_tag);
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x -tags {%lxBUT%d %lxHRDO %s text}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x -tags {%lxBUT%d %lxHRDO %s text iemgui}\n",
 		             canvas, xx21, yy21, xx22, yy22,
 		             (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol,
 		             (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol, x, i, x, nlet_tag);
@@ -88,16 +88,16 @@ void hradio_draw_new(t_hradio *x, t_glist *glist)
 		    x->x_drawn = x->x_on;
 		}
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxHRDO %s text}\n",
+		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxHRDO %s text iemgui}\n",
 		         canvas, xx11b+x->x_gui.x_ldx, yy11+x->x_gui.x_ldy,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 		         x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		         x->x_gui.x_lcol, x, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxHRDO%so%d %so%d %lxHRDO %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxHRDO%so%d %so%d %lxHRDO %s outlet iemgui}\n",
 		         canvas, xx11b, yy12-1, xx11b + IOWIDTH, yy12, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxHRDO%si%d %si%d %lxHRDO %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxHRDO%si%d %si%d %lxHRDO %s inlet iemgui}\n",
 		         canvas, xx11b, yy11, xx11b + IOWIDTH, yy11+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 	//}
 }
@@ -179,13 +179,13 @@ void hradio_draw_config(t_hradio* x, t_glist* glist)
 	/*
 	char color[64];
 	if (x->x_gui.x_fsf.x_selected)
-		sprintf(color, "$select_color");
+		sprintf(color, "$pd_colors(selection)");
 	else
 		sprintf(color, "#%6.6x", x->x_gui.x_lcol);
 	*/
 
 	if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas)
-	    sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $select_color -text {%s} \n",
+	    sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $pd_colors(selection) -text {%s} \n",
              canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
              strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
 	else
@@ -216,7 +216,7 @@ void hradio_draw_io(t_hradio* x, t_glist* glist, int old_snd_rcv_flags)
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
 		if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxHRDO%so%d %so%d %lxHRDO %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxHRDO%so%d %so%d %lxHRDO %s outlet iemgui}\n",
 		             canvas,
 		             xpos, ypos + x->x_gui.x_w-1,
 		             xpos + IOWIDTH, ypos + x->x_gui.x_w,
@@ -224,7 +224,7 @@ void hradio_draw_io(t_hradio* x, t_glist* glist, int old_snd_rcv_flags)
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able)
 		    sys_vgui(".x%lx.c delete %lxHRDO%so%d\n", canvas, x, nlet_tag, 0);
 		if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxHRDO%si%d %si%d %lxHRDO %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxHRDO%si%d %si%d %lxHRDO %s inlet iemgui}\n",
 		             canvas,
 		             xpos, ypos,
 		             xpos + IOWIDTH, ypos+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
@@ -252,18 +252,18 @@ void hradio_draw_select(t_hradio* x, t_glist* glist)
 
 				for(i=0; i<n; i++)
 				{
-				    sys_vgui(".x%lx.c itemconfigure %lxBASE%d -stroke $select_color\n", canvas, x, i);
+				    sys_vgui(".x%lx.c itemconfigure %lxBASE%d -stroke $pd_colors(selection)\n", canvas, x, i);
 				}
-				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $select_color\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $pd_colors(selection)\n", canvas, x);
 
 				if (x->x_gui.scale_vis) {
 					sys_vgui("destroy %s\n", sh->h_pathname);
 					sys_vgui(".x%lx.c delete %lxSCALE\n", canvas, x);
 				}
 
-				sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+				sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 					 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
-				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxHRDO %s}\n",
+				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxHRDO %s iemgui}\n",
 					 canvas, x->x_gui.x_obj.te_xpix + x->x_gui.x_w * x->x_number - SCALEHANDLE_WIDTH - 1,
 					 x->x_gui.x_obj.te_ypix + x->x_gui.x_h - SCALEHANDLE_HEIGHT - 1,
 					 SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT,
@@ -282,9 +282,9 @@ void hradio_draw_select(t_hradio* x, t_glist* glist)
 						sys_vgui(".x%lx.c delete %lxLABELH\n", canvas, x);
 					}
 
-					sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+					sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 						lh->h_pathname, LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT);
-					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxHRDO %s}\n",
+					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxHRDO %s iemgui}\n",
 						canvas, x->x_gui.x_obj.te_xpix+ x->x_gui.x_ldx - LABELHANDLE_WIDTH,
 						x->x_gui.x_obj.te_ypix + x->x_gui.x_ldy - LABELHANDLE_HEIGHT,
 						LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT,
@@ -306,7 +306,7 @@ void hradio_draw_select(t_hradio* x, t_glist* glist)
 			sys_vgui(".x%lx.c dtag %lxHRDO selected\n", canvas, x);
 		    for(i=0; i<n; i++)
 		    {
-		        sys_vgui(".x%lx.c itemconfigure %lxBASE%d -stroke #%6.6x\n", canvas, x, i,
+		        sys_vgui(".x%lx.c itemconfigure %lxBASE%d -stroke %s\n", canvas, x, i,
 		                 IEM_GUI_COLOR_NORMAL);
 		    }
 		    sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill #%6.6x\n", canvas, x,
@@ -382,7 +382,7 @@ static void hradio__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx, t
 		{
 			sys_vgui("lower %s\n", sh->h_pathname);
 			sys_vgui(".x%x.c create prect %d %d %d %d\
-	 -stroke $select_color -strokewidth 1 -tags %s\n",
+	 -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
 				 x->x_gui.x_glist, x->x_gui.x_obj.te_xpix, x->x_gui.x_obj.te_ypix,
 					x->x_gui.x_obj.te_xpix + (x->x_gui.x_w * x->x_number),
 					x->x_gui.x_obj.te_ypix + x->x_gui.x_h, sh->h_outlinetag);
diff --git a/pd/src/g_hslider.c b/pd/src/g_hslider.c
index 9f1da8bcd21e57512e904a4cdaef78dfea5835d1..cc22e944ec26650e9519e538d215db0aaf619db0 100644
--- a/pd/src/g_hslider.c
+++ b/pd/src/g_hslider.c
@@ -84,26 +84,26 @@ static void hslider_draw_new(t_hslider *x, t_glist *glist)
 
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-		sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -tags {%lxBASE %lxHSLDR %s text}\n",
+		sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_border) -fill #%6.6x -tags {%lxBASE %lxHSLDR %s text iemgui border}\n",
 		         canvas, xpos, ypos,
 		         xpos + x->x_gui.x_w+5, ypos + x->x_gui.x_h,
 		         x->x_gui.x_bcol, x, x, nlet_tag);
-		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth 3 -stroke #%6.6x -tags {%lxKNOB %lxHSLDR %s text}\n",
+		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth 3 -stroke #%6.6x -tags {%lxKNOB %lxHSLDR %s text iemgui}\n",
 		         canvas, r, ypos+2, r,
 		         ypos + x->x_gui.x_h-2, x->x_gui.x_fcol, x, x, nlet_tag);
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxHSLDR % text}\n",
+		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxHSLDR % text iemgui}\n",
 		         canvas, xpos+x->x_gui.x_ldx,
 		         ypos+x->x_gui.x_ldy,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 		         x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 				 x->x_gui.x_lcol, x, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxHSLDR%so%d %so%d %lxHSLDR %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxHSLDR%so%d %so%d %lxHSLDR %s outlet iemgui}\n",
 		         canvas, xpos, ypos + x->x_gui.x_h-1,
 		         xpos+7, ypos + x->x_gui.x_h, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxHSLDR%si%d %si%d %lxHSLDR %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxHSLDR%si%d %si%d %lxHSLDR %s inlet iemgui}\n",
 		         canvas, xpos, ypos,
 		         xpos+7, ypos+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 	//}
@@ -176,7 +176,7 @@ static void hslider_draw_config(t_hslider* x,t_glist* glist)
     t_canvas *canvas=glist_getcanvas(glist);
 
 	if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas)
-		sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $select_color -text {%s} \n",
+		sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $pd_colors(selection) -text {%s} \n",
 		         canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
 	else
@@ -199,13 +199,13 @@ static void hslider_draw_io(t_hslider* x,t_glist* glist, int old_snd_rcv_flags)
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
 		if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxHSLDR%so%d %so%d %lxHSLDR %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxHSLDR%so%d %so%d %lxHSLDR %s outlet iemgui}\n",
 		         canvas, xpos, ypos + x->x_gui.x_h-1,
 		         xpos+7, ypos + x->x_gui.x_h, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able)
 		    sys_vgui(".x%lx.c delete %lxHSLDR%so%d\n", canvas, x, nlet_tag, 0);
 		if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxHSLDR%si%d %si%d %lxHSLDR %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxHSLDR%si%d %si%d %lxHSLDR %s inlet iemgui}\n",
 		         canvas, xpos, ypos,
 		         xpos+7, ypos+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && x->x_gui.x_fsf.x_rcv_able)
@@ -229,15 +229,15 @@ static void hslider_draw_select(t_hslider* x,t_glist* glist)
 
 				char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-				sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $select_color\n", canvas, x);
-				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $select_color\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $pd_colors(selection)\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $pd_colors(selection)\n", canvas, x);
 
 				if (x->x_gui.scale_vis) {
 					sys_vgui("destroy %s\n", sh->h_pathname);
 					sys_vgui(".x%lx.c delete %lxSCALE\n", canvas, x);
 				}
 
-				sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+				sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 					 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
 				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxHSLDR %s}\n",
 					 canvas, x->x_gui.x_obj.te_xpix + x->x_gui.x_w + 5 - SCALEHANDLE_WIDTH - 1,
@@ -259,7 +259,7 @@ static void hslider_draw_select(t_hslider* x,t_glist* glist)
 						sys_vgui(".x%lx.c delete %lxLABELH\n", canvas, x);
 					}
 
-					sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+					sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 						lh->h_pathname, LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT);
 					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxHSLDR %s}\n",
 						canvas, x->x_gui.x_obj.te_xpix+ x->x_gui.x_ldx - LABELHANDLE_WIDTH,
@@ -280,7 +280,7 @@ static void hslider_draw_select(t_hslider* x,t_glist* glist)
 		}
 		else
 		{
-		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
+		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n", canvas, x, IEM_GUI_COLOR_NORMAL);
 		    sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill #%6.6x\n", canvas, x, x->x_gui.x_lcol);
 			sys_vgui(".x%lx.c dtag %lxHSLDR selected\n", canvas, x);
 			sys_vgui("destroy %s\n", sh->h_pathname);
@@ -361,7 +361,7 @@ static void hslider__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx,
 		{
 			sys_vgui("lower %s\n", sh->h_pathname);
 			sys_vgui(".x%x.c create prect %d %d %d %d\
-	 -stroke $select_color -strokewidth 1 -tags %s\n",
+	 -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
 				 x->x_gui.x_glist, x->x_gui.x_obj.te_xpix, x->x_gui.x_obj.te_ypix,
 					x->x_gui.x_obj.te_xpix + 5 + x->x_gui.x_w,
 					x->x_gui.x_obj.te_ypix + x->x_gui.x_h, sh->h_outlinetag);
diff --git a/pd/src/g_magicglass.c b/pd/src/g_magicglass.c
index 02eae00b02330143192e46d142fd74273fd4ee90..dc139f4f80f338d77a1f02b3cf40e50a47c52947 100644
--- a/pd/src/g_magicglass.c
+++ b/pd/src/g_magicglass.c
@@ -65,10 +65,10 @@ void magicGlass_updateText(t_magicGlass *x, int moved)
 		if (!moved) {
 			char *color;
 			if (x->x_issignal || strcmp(x->x_old_string, x->x_string)) {
-				color = "#ffffff";
+				color = "$pd_colors(magic_glass_text)";
 			}
 			else {
-				color = "#e87216";
+				color = "$pd_colors(magic_glass_flash)";
 				clock_delay(x->x_flashClock, MG_CLOCK_FLASH_DELAY);
 			}
 		    sys_vgui(".x%x.c itemconfigure magicGlassText -text {%s} -fill %s -font {{%s} -%d %s}\n",
@@ -112,11 +112,11 @@ void magicGlass_updateText(t_magicGlass *x, int moved)
 void magicGlass_drawNew(t_magicGlass *x)
 {
 	//fprintf(stderr,"magicglass_drawNew\n");
-    sys_vgui(".x%x.c create prect 0 0 0 0 -stroke #000000 -fill #000000 -tags magicGlassBg\n",
+    sys_vgui(".x%x.c create prect 0 0 0 0 -stroke $pd_colors(magic_glass_bg) -fill $pd_colors(magic_glass_bg) -tags magicGlassBg\n",
              x->x_c);
-    sys_vgui(".x%x.c create ppolygon 0 0 0 0 0 0 -fill #000000 -strokewidth 1 -tags magicGlassLine\n",
+    sys_vgui(".x%x.c create ppolygon 0 0 0 0 0 0 -fill $pd_colors(magic_glass_bd) -strokewidth 1 -tags magicGlassLine\n",
              x->x_c);
-    sys_vgui(".x%x.c create text 0 0 -text {} -anchor w -fill #e87216 -font {{%s} -%d %s} -tags magicGlassText\n",
+    sys_vgui(".x%x.c create text 0 0 -text {} -anchor w -fill $pd_colors(magic_glass_flash) -font {{%s} -%d %s} -tags magicGlassText\n",
              x->x_c, sys_font, x->x_display_font, sys_fontweight);
     sys_vgui(".x%x.c raise magicGlassBg\n",
              x->x_c);
@@ -137,7 +137,7 @@ void magicGlass_undraw(t_magicGlass *x)
 void magicGlass_flashText(t_magicGlass *x)
 {
 	//fprintf(stderr,"magicglass_flashText\n");
-    sys_vgui(".x%x.c itemconfigure magicGlassText -fill #ffffff\n",
+    sys_vgui(".x%x.c itemconfigure magicGlassText -fill $pd_colors(magic_glass_text)\n",
          x->x_c);
 }
 
diff --git a/pd/src/g_mycanvas.c b/pd/src/g_mycanvas.c
index 0a1a388d505e4935830af1b2407498f1a4a8aa48..f6b4d43dd6ef27319e8fdcc4f4a0310b70a822f9 100644
--- a/pd/src/g_mycanvas.c
+++ b/pd/src/g_mycanvas.c
@@ -50,16 +50,16 @@ void my_canvas_draw_new(t_my_canvas *x, t_glist *glist)
 	//if (glist_isvisible(glist)) {
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-		sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x -tags {%lxRECT %lxMYCNV %s text}\n",
+		sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x -tags {%lxRECT %lxMYCNV %s text iemgui}\n",
 		         canvas, xpos, ypos,
 		         xpos + x->x_vis_w, ypos + x->x_vis_h,
 		         x->x_gui.x_bcol, x->x_gui.x_bcol, x, x, nlet_tag);
-		sys_vgui(".x%lx.c create prect %d %d %d %d -stroke #%6.6x -tags {%lxBASE %lxMYCNV %s text}\n",
+		sys_vgui(".x%lx.c create prect %d %d %d %d -stroke #%6.6x -tags {%lxBASE %lxMYCNV %s text iemgui}\n",
 		         canvas, xpos, ypos,
 		         xpos + x->x_gui.x_w, ypos + x->x_gui.x_h,
 		         x->x_gui.x_bcol, x, x, nlet_tag);
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxMYCNV %s text}\n",
+		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxMYCNV %s text iemgui}\n",
 		         canvas, xpos+x->x_gui.x_ldx, ypos+x->x_gui.x_ldy,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 		         x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
@@ -117,7 +117,7 @@ void my_canvas_draw_config(t_my_canvas* x, t_glist* glist)
 	/*
 	char color[64];
 	if (x->x_gui.x_fsf.x_selected)
-		sprintf(color, "$select_color");
+		sprintf(color, "$pd_colors(selection)");
 	else
 		sprintf(color, "#%6.6x", x->x_gui.x_bcol);
 	*/
@@ -125,7 +125,7 @@ void my_canvas_draw_config(t_my_canvas* x, t_glist* glist)
     sys_vgui(".x%lx.c itemconfigure %lxRECT -fill #%6.6x -stroke #%6.6x\n", canvas, x,
              x->x_gui.x_bcol, x->x_gui.x_bcol);
 	if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas)
-    	sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $select_color\n", canvas, x);
+    	sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $pd_colors(selection)\n", canvas, x);
 	else
     	sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n", canvas, x,
              x->x_gui.x_bcol);
@@ -151,14 +151,14 @@ void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
 
 				char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-			    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $select_color\n", canvas, x);
+			    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $pd_colors(selection)\n", canvas, x);
 
 				if (x->x_gui.scale_vis) {
 					sys_vgui("destroy %s\n", sh->h_pathname);
 					sys_vgui(".x%lx.c delete %lxSCALE\n", canvas, x);
 				}
 
-				sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+				sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 					 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
 				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxMYCNV %s}\n",
 					 canvas, x->x_gui.x_obj.te_xpix + x->x_vis_w - SCALEHANDLE_WIDTH - 1,
@@ -180,7 +180,7 @@ void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
 						sys_vgui(".x%lx.c delete %lxLABELH\n", canvas, x);
 					}
 
-					sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+					sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 						lh->h_pathname, LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT);
 					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxMYCNV %s}\n",
 						canvas, x->x_gui.x_obj.te_xpix+ x->x_gui.x_ldx - LABELHANDLE_WIDTH,
@@ -278,7 +278,7 @@ static void my_canvas__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx
 		{
 			sys_vgui("lower %s\n", sh->h_pathname);
 			sys_vgui(".x%x.c create prect %d %d %d %d\
-	 -stroke $select_color -strokewidth 1 -tags %s\n",
+	 -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
 				 x->x_gui.x_glist, x->x_gui.x_obj.te_xpix, x->x_gui.x_obj.te_ypix,
 					x->x_gui.x_obj.te_xpix + x->x_vis_w,
 					x->x_gui.x_obj.te_ypix + x->x_vis_h, sh->h_outlinetag);
diff --git a/pd/src/g_numbox.c b/pd/src/g_numbox.c
index ef9330599c9237f778ab95a89173ffcba312a09a..d0aa6e67e87db6b3411a0f378f905888c19e27d1 100644
--- a/pd/src/g_numbox.c
+++ b/pd/src/g_numbox.c
@@ -173,7 +173,7 @@ static void my_numbox_draw_update(t_gobj *client, t_glist *glist)
         {
 			char color[64];
 			if (x->x_gui.x_fsf.x_selected)
-				sprintf(color, "$select_color");
+				sprintf(color, "$pd_colors(selection)");
 			else
 				sprintf(color, "#%6.6x", x->x_gui.x_fcol);
 
@@ -208,8 +208,8 @@ static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist)
 
 		if (x->x_hide_frame <= 1) {
 			sys_vgui(
-				".x%lx.c create ppolygon %d %d %d %d %d %d %d %d %d %d -stroke #%6.6x \
-					-fill #%6.6x -tags {%lxBASE1 %lxNUM %s text}\n",
+				".x%lx.c create ppolygon %d %d %d %d %d %d %d %d %d %d -stroke %s \
+					-fill #%6.6x -tags {%lxBASE1 %lxNUM %s text iemgui border}\n",
 				     canvas, xpos, ypos,
 				     xpos + x->x_numwidth-4, ypos,
 				     xpos + x->x_numwidth, ypos+4,
@@ -217,13 +217,13 @@ static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist)
 				     xpos, ypos + x->x_gui.x_h,
 				     IEM_GUI_COLOR_NORMAL, x->x_gui.x_bcol, x, x, nlet_tag);
 			if(!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist)
-				sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxNUM%so%d %so%d %lxNUM %s outlet}\n",
+				sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxNUM%so%d %so%d %lxNUM %s outlet iemgui}\n",
 				     canvas,
 				     xpos, ypos + x->x_gui.x_h-1,
 				     xpos+IOWIDTH, ypos + x->x_gui.x_h,
 				     x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 			if(!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist)
-				sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxNUM%si%d %si%d %lxNUM %s inlet}\n",
+				sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxNUM%si%d %si%d %lxNUM %s inlet iemgui}\n",
 				     canvas,
 				     xpos, ypos,
 				     xpos+IOWIDTH, ypos+1,
@@ -231,7 +231,7 @@ static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist)
 		} else {
 			sys_vgui(
 				".x%lx.c create ppolygon %d %d %d %d %d %d %d %d %d %d -stroke #%6.6x \
-					-fill #%6.6x -tags {%lxBASE1 %lxNUM %s text}\n",
+					-fill #%6.6x -tags {%lxBASE1 %lxNUM %s text iemgui}\n",
 				     canvas, xpos, ypos,
 				     xpos + x->x_numwidth-4, ypos,
 				     xpos + x->x_numwidth, ypos+4,
@@ -241,20 +241,20 @@ static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist)
 		}
 		if (!x->x_hide_frame || x->x_hide_frame == 2)
 			sys_vgui(
-				".x%lx.c create polyline %d %d %d %d %d %d -stroke #%6.6x -tags {%lxBASE2 %lxNUM %s text}\n",
+				".x%lx.c create polyline %d %d %d %d %d %d -stroke #%6.6x -tags {%lxBASE2 %lxNUM %s text iemgui}\n",
 				canvas, xpos, ypos,
 				xpos + half, ypos + half,
 				xpos, ypos + x->x_gui.x_h,
 				x->x_gui.x_fcol, x, x, nlet_tag);
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		    -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxNUM %s text}\n",
+		    -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxNUM %s text iemgui}\n",
 		    canvas, xpos+x->x_gui.x_ldx, ypos+x->x_gui.x_ldy,
 		    strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 		    x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		         x->x_gui.x_lcol, x, x, nlet_tag);
 		my_numbox_ftoa(x);
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		    -font {{%s} -%d %s} -fill #%6.6x -tags {%lxNUMBER %lxNUM %s noscroll text}\n",
+		    -font {{%s} -%d %s} -fill #%6.6x -tags {%lxNUMBER %lxNUM %s noscroll text iemgui}\n",
 		    canvas, xpos+half+2, ypos+half+d,
 		    x->x_buf, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		    x->x_gui.x_fcol, x, x, nlet_tag);
@@ -329,8 +329,8 @@ static void my_numbox_draw_config(t_my_numbox* x,t_glist* glist)
 	char color[64];
 	char lcolor[64];
 	if (x->x_gui.x_fsf.x_selected) {
-		sprintf(color, "$select_color");
-		sprintf(lcolor, "$select_color");
+		sprintf(color, "$pd_colors(selection)");
+		sprintf(lcolor, "$pd_colors(selection)");
 	}
 	else {
 		sprintf(color, "#%6.6x", x->x_gui.x_fcol);
@@ -339,15 +339,15 @@ static void my_numbox_draw_config(t_my_numbox* x,t_glist* glist)
 	*/
 
 	if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas) {
-		sys_vgui(" .x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $select_color -text {%s} \n .x%lx.c itemconfigure %lxNUMBER -font {{%s} -%d %s} -fill $select_color \n .x%lx.c itemconfigure %lxBASE2 -stroke $select_color\n",
+		sys_vgui(" .x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $pd_colors(selection) -text {%s} \n .x%lx.c itemconfigure %lxNUMBER -font {{%s} -%d %s} -fill $pd_colors(selection) \n .x%lx.c itemconfigure %lxBASE2 -stroke $pd_colors(selection)\n",
 		         canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 				 canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 				 canvas,x);
 		/*
-		sys_vgui(".x%lx.c itemconfigure %lxNUMBER -font {{%s} %d %s} -fill $select_color \n",
+		sys_vgui(".x%lx.c itemconfigure %lxNUMBER -font {{%s} %d %s} -fill $pd_colors(selection) \n",
 		         canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight);
-		sys_vgui(".x%lx.c itemconfigure %lxBASE2 -fill $select_color\n", canvas,
+		sys_vgui(".x%lx.c itemconfigure %lxBASE2 -fill $pd_colors(selection)\n", canvas,
 		         x);
 		*/
 	}
@@ -378,7 +378,7 @@ static void my_numbox_draw_io(t_my_numbox* x,t_glist* glist, int old_snd_rcv_fla
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
 		if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxNUM%so%d %so%d %lxNUM %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxNUM%so%d %so%d %lxNUM %s outlet iemgui}\n",
 		         canvas,
 		         xpos, ypos + x->x_gui.x_h-1,
 		         xpos+IOWIDTH, ypos + x->x_gui.x_h,
@@ -386,7 +386,7 @@ static void my_numbox_draw_io(t_my_numbox* x,t_glist* glist, int old_snd_rcv_fla
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able)
 		    sys_vgui(".x%lx.c delete %lxNUM%so%d\n", canvas, x, nlet_tag, 0);
 		if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxNUM%si%d %si%d %lxNUM %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxNUM%si%d %si%d %lxNUM %s inlet iemgui}\n",
 		         canvas,
 		         xpos, ypos,
 		         xpos+IOWIDTH, ypos+1,
@@ -421,13 +421,13 @@ static void my_numbox_draw_select(t_my_numbox *x, t_glist *glist)
 
 				char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-				sys_vgui(".x%lx.c itemconfigure %lxBASE1 -stroke $select_color\n",
+				sys_vgui(".x%lx.c itemconfigure %lxBASE1 -stroke $pd_colors(selection)\n",
 			    	canvas, x);
-				sys_vgui(".x%lx.c itemconfigure %lxBASE2 -stroke $select_color\n",
+				sys_vgui(".x%lx.c itemconfigure %lxBASE2 -stroke $pd_colors(selection)\n",
 					canvas, x);
-				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $select_color\n",
+				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $pd_colors(selection)\n",
 					canvas, x);
-				sys_vgui(".x%lx.c itemconfigure %lxNUMBER -fill $select_color\n",
+				sys_vgui(".x%lx.c itemconfigure %lxNUMBER -fill $pd_colors(selection)\n",
 					canvas, x);
 
 				if (x->x_gui.scale_vis) {
@@ -435,7 +435,7 @@ static void my_numbox_draw_select(t_my_numbox *x, t_glist *glist)
 					sys_vgui(".x%lx.c delete %lxSCALE\n", canvas, x);
 				}
 
-				sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+				sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 					 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
 				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxNUM %s}\n",
 					 canvas, x->x_gui.x_obj.te_xpix + x->x_numwidth - SCALEHANDLE_WIDTH - 1,
@@ -456,7 +456,7 @@ static void my_numbox_draw_select(t_my_numbox *x, t_glist *glist)
 						sys_vgui(".x%lx.c delete %lxLABELH\n", canvas, x);
 					}
 
-					sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+					sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 						lh->h_pathname, LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT);
 					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxNUM %s}\n",
 						canvas, x->x_gui.x_obj.te_xpix+ x->x_gui.x_ldx - LABELHANDLE_WIDTH,
@@ -480,7 +480,7 @@ static void my_numbox_draw_select(t_my_numbox *x, t_glist *glist)
 			sys_vgui(".x%lx.c dtag %lxNUM selected\n", canvas, x);
 
 			if (x->x_hide_frame <= 1)
-		    	sys_vgui(".x%lx.c itemconfigure %lxBASE1 -stroke #%6.6x\n",
+		    	sys_vgui(".x%lx.c itemconfigure %lxBASE1 -stroke %s\n",
 		        	canvas, x, IEM_GUI_COLOR_NORMAL);
 			else sys_vgui(".x%lx.c itemconfigure %lxBASE1 -stroke #%6.6x\n",
 		        	canvas, x, x->x_gui.x_bcol);
@@ -563,7 +563,7 @@ static void my_numbox__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx
 		{
 			sys_vgui("lower %s\n", sh->h_pathname);
 			sys_vgui(".x%x.c create prect %d %d %d %d\
-	 -stroke $select_color -strokewidth 1 -tags %s\n",
+	 -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
 				 x->x_gui.x_glist, x->x_gui.x_obj.te_xpix, x->x_gui.x_obj.te_ypix,
 					x->x_gui.x_obj.te_xpix + x->x_numwidth,
 					x->x_gui.x_obj.te_ypix + x->x_gui.x_h, sh->h_outlinetag);
diff --git a/pd/src/g_rtext.c b/pd/src/g_rtext.c
index 0968ad9757e050b1c72140822f07bbe51c7e1370..7e985850acb47be58dc07aa2e83dd8d24a2500ff 100644
--- a/pd/src/g_rtext.c
+++ b/pd/src/g_rtext.c
@@ -333,7 +333,7 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
 		        dispx + LMARGIN, dispy + TMARGIN,
 		        outchars_b, tempbuf, sys_hostfontsize(font),
 		        (glist_isselected(x->x_glist,
-		            &x->x_glist->gl_gobj)? "$select_color" : "$text_color"));
+		            &x->x_glist->gl_gobj)? "$pd_colors(selection)" : "$pd_colors(text)"));
 		}
 		else if (action == SEND_UPDATE)
 		{
@@ -500,7 +500,7 @@ void rtext_select(t_rtext *x, int state)
     t_canvas *canvas = glist_getcanvas(glist);
 	if (glist_istoplevel(glist))
 		sys_vgui(".x%lx.c itemconfigure %s -fill %s\n", canvas, 
-		    x->x_tag, (state? "$select_color" : "$text_color"));
+		    x->x_tag, (state? "$pd_colors(selection)" : "$pd_colors(text)"));
 	if (x->x_text->te_pd->c_wb && x->x_text->te_pd->c_wb->w_displacefnwtag) {
 		if (state)
 			sys_vgui(".x%lx.c addtag selected withtag %s\n",
diff --git a/pd/src/g_scalar.c b/pd/src/g_scalar.c
index 273ce6eb0a84e7b55ef0b910f61b8952eca7f50f..1d1d9472bfa3ed1866b7e51187e09d3026b6a3f5 100644
--- a/pd/src/g_scalar.c
+++ b/pd/src/g_scalar.c
@@ -208,7 +208,7 @@ static void scalar_drawselectrect(t_scalar *x, t_glist *glist, int state)
         x1--; x2++; y1--; y2++;
 		if (glist_istoplevel(glist))
 		    sys_vgui(".x%lx.c create polyline %d %d %d %d %d %d %d %d %d %d \
-		        -strokewidth 1 -stroke $select_color -tags {select%lx selected}\n",
+		        -strokewidth 1 -stroke $pd_colors(selection) -tags {select%lx selected}\n",
 		            glist_getcanvas(glist), x1, y1, x1, y2, x2, y2, x2, y1, x1, y1,
 		            x);
     }
diff --git a/pd/src/g_text.c b/pd/src/g_text.c
index 381cb9015633abad095d7abf70215bd3245aaedd..febe69afd53b47bfa84bb22e8f9eab214365bd94 100644
--- a/pd/src/g_text.c
+++ b/pd/src/g_text.c
@@ -34,7 +34,7 @@ void canvas_howputnew(t_canvas *x, int *connectp, int *xpixp, int *ypixp,
 void canvas_startmotion(t_canvas *x);
 t_widgetbehavior text_widgetbehavior;
 
-static char *invalid_fill = "\"#ffdddd\"";
+static char *invalid_fill = "$::pd_colors(dash_fill)";
 
 extern void canvas_apply_setundo(t_canvas *x, t_gobj *y);
 extern void canvas_setundo(t_canvas *x, t_undofn undofn, void *buf, const char *name);
@@ -744,7 +744,7 @@ static void gatom_retext(t_gatom *x, int senditup, int recolor)
 	t_rtext *y = glist_findrtext(x->a_glist, &x->a_text);
 	if (recolor)
 		sys_vgui(".x%lx.c itemconfigure %s -fill %s\n", canvas, 
-	    	rtext_gettag(y), "$text_color");
+	    	rtext_gettag(y), "$pd_colors(text)");
     binbuf_clear(x->a_text.te_binbuf);
     binbuf_add(x->a_text.te_binbuf, 1, &x->a_atom);
     if (senditup && glist_isvisible(x->a_glist))
@@ -1082,7 +1082,7 @@ static void gatom_vis(t_gobj *z, t_glist *glist, int vis)
                 (double)x1, (double)y1,
                 canvas_realizedollar(x->a_glist, x->a_label)->s_name,
                 sys_hostfontsize(glist_getfont(glist)),
-                "$text_color");
+                "$pd_colors(text)");
         }
         else sys_vgui(".x%lx.c delete %lx.l\n", glist_getcanvas(glist), x);
     }
@@ -1379,18 +1379,20 @@ static void text_select(t_gobj *z, t_glist *glist, int state)
 
     // text_class is either a comment or an object that failed to creates
     // so we distinguish between it and comment using T_TEXT type check
-    if (pd_class(&x->te_pd) == text_class && x->te_type != T_TEXT) {
-        outline = "$dash_outline";
-    } else
-        outline = "$box_outline";
+    if (pd_class(&x->te_pd) == text_class && x->te_type != T_TEXT)
+        outline = "$pd_colors(dash_outline)";
+    else if (z->g_pd == gatom_class)
+        outline = "$pd_colors(atom_box_border)";
+    else
+        outline = "$pd_colors(box_border)";
 	//fprintf(stderr,"text_select isvisible=%d shouldvis=%d istoplevel=%d\n", glist_isvisible(glist), gobj_shouldvis(&x->te_g, glist), glist_istoplevel(glist));
     if (gobj_shouldvis(&x->te_g, glist)) {
 		if (glist_istoplevel(glist)) {
 		    sys_vgui(".x%lx.c itemconfigure %sR -stroke %s\n", glist_getcanvas(glist), 
-		             rtext_gettag(y), (state? "$select_color" : outline));
+		             rtext_gettag(y), (state? "$pd_colors(selection)" : outline));
 			if (z->g_pd == gatom_class) {
 				sys_vgui(".x%lx.c itemconfigure %lx.l -fill %s\n", glist_getcanvas(glist), 
-					x, (state? "$select_color" : "$text_color"));
+					x, (state? "$pd_colors(selection)" : "$pd_colors(text)"));
 			}
 		}
 		if (z->g_pd->c_wb && z->g_pd->c_wb->w_displacefnwtag) {
@@ -1404,7 +1406,7 @@ static void text_select(t_gobj *z, t_glist *glist, int state)
 		    	    glist_getcanvas(glist), rtext_gettag(y));
 
 				if (pd_class(&x->te_pd) == text_class && glist_istoplevel(glist))
-	        		sys_vgui(".x%lx.c itemconfigure %sR -strokewidth 1 -fill $obj_box_fill\n",
+	        		sys_vgui(".x%lx.c itemconfigure %sR -strokewidth 1 -fill $pd_colors(box)\n",
 						glist_getcanvas(glist), rtext_gettag(y));
 
 				t_object *ob = pd_checkobject(&x->te_pd);
@@ -1534,7 +1536,7 @@ static int text_click(t_gobj *z, struct _glist *glist,
                 (t_floatarg)shift, (t_floatarg)0, (t_floatarg)alt);
 			//fprintf(stderr,"atom click\n");
 			sys_vgui(".x%lx.c itemconfigure %s -fill %s\n", canvas, 
-		    	rtext_gettag(y), "$select_color");
+		    	rtext_gettag(y), "$pd_colors(selection)");
 		}
         return (1);
     }
@@ -1680,11 +1682,12 @@ void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime,
 			//fprintf(stderr,"glist_drawiofor o firsttime\n");
             issignal = obj_issignaloutlet(ob,i);
             sys_vgui(".x%lx.c create prect %d %d %d %d \
-                      -fill %s -stroke %s -tags {%so%d %lx outlet}\n",
+                      -fill %s -stroke %s -tags {%so%d %lx outlet %s}\n",
                 glist_getcanvas(glist), onset, y2 - 2, onset + IOWIDTH, y2,
-                (issignal ? "$signal_nlet" : "$msg_nlet"),
-                (issignal ? "$signal_cord" : "$msg_cord"),
-                tag, i, tag);
+                (issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"),
+                (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
+                tag, i, tag,
+                (issignal ? "signal" : "control"));
         }
         else {
 			//fprintf(stderr,"glist_drawiofor o redraw\n");
@@ -1710,11 +1713,12 @@ void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime,
 			//fprintf(stderr,"glist_drawiofor i firsttime\n");
             issignal = obj_issignalinlet(ob,i);
             sys_vgui(".x%lx.c create prect %d %d %d %d \
-                      -fill %s -stroke %s -tags {%si%d %lx inlet}\n",
+                      -fill %s -stroke %s -tags {%si%d %lx inlet %s}\n",
                 glist_getcanvas(glist), onset, y1, onset + IOWIDTH, y1 + EXTRAPIX,
-                (issignal ? "$signal_nlet" : "$msg_nlet"),
-                (issignal ? "$signal_cord" : "$msg_cord"),
-                tag, i, tag);
+                (issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"),
+                (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
+                tag, i, tag,
+                (issignal ? "signal" : "control"));
         }
         else {
 			//fprintf(stderr,"glist_drawiofor i firsttime\n");
@@ -1752,8 +1756,8 @@ void glist_drawiofor_withtag(t_glist *glist, t_object *ob, int firsttime,
             sys_vgui(".x%lx.c create prect %d %d %d %d \
                       -fill %s -stroke %s -tags {%so%d %lx outlet}\n",
                 glist_getcanvas(glist), onset, y2 - 2, onset + IOWIDTH, y2,
-                (issignal ? "$signal_nlet" : "$msg_nlet"),
-                (issignal ? "$signal_cord" : "$msg_cord"),
+                (issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"),
+                (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
                 tag, i, tag);
         }
 /*
@@ -1777,8 +1781,8 @@ void glist_drawiofor_withtag(t_glist *glist, t_object *ob, int firsttime,
             sys_vgui(".x%lx.c create prect %d %d %d %d \
                       -fill %s -stroke %s -tags {%si%d %lx inlet}\n",
                 glist_getcanvas(glist), onset, y1, onset + IOWIDTH, y1 + EXTRAPIX,
-                (issignal ? "$signal_nlet" : "$msg_nlet"),
-                (issignal ? "$signal_cord" : "$msg_cord"),
+                (issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"),
+                (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"),
                 tag, i, tag);
         }
 /*		else
@@ -1790,8 +1794,8 @@ void glist_drawiofor_withtag(t_glist *glist, t_object *ob, int firsttime,
             sys_vgui(".x%lx.c itemconfigure %si%d \
                       -fill %s -outline %s\n",
                 glist_getcanvas(glist), tag, i,
-                (issignal ? "$signal_nlet" : "$msg_nlet"),
-                (issignal ? "$signal_cord" : "$msg_cord"));
+                (issignal ? "$pd_colors(signal_nlet)" : "$pd_colors(control_nlet)"),
+                (issignal ? "$pd_colors(signal_cord)" : "$pd_colors(control_cord)"));
 		}
 */
     }
@@ -1827,25 +1831,29 @@ void text_drawborder(t_text *x, t_glist *glist,
     if (x->te_type == T_OBJECT)
     {
         char *pattern; char *outline; char *fill;
+        /* tag to identify broken boxes from tcl/tk */
+        char *box_tag;
         if (pd_class(&x->te_pd) == text_class)
         {
             pattern = "-";
-            outline = "$dash_outline -strokewidth 2";
-			fill = invalid_fill;
+            outline = "$pd_colors(dash_outline) -strokewidth 2";
+            fill = invalid_fill;
+            box_tag = "broken box";
         }
         else
         {
             pattern = "\"\"";
-            outline = "$box_outline";
-			fill = "$obj_box_fill";
+            outline = "$pd_colors(box_border)";
+	    fill = "$pd_colors(box)";
+            box_tag = "box";
         }
         if (firsttime)
 		{
             sys_vgui(".x%lx.c create ppolygon %d %d %d %d %d %d %d %d %d %d \
-                      -stroke %s -fill %s -tags {%sR %lx text}\n", 
+                      -stroke %s -fill %s -tags {%sR %lx text %s}\n", 
                 glist_getcanvas(glist),
                      x1, y1,  x2, y1,  x2, y2,  x1, y2,  x1, y1,  
-                     outline, fill, tag, tag);
+                     outline, fill, tag, tag, box_tag);
 				//-dash %s -> pattern disabled for tkpath
         }
         else
@@ -1863,7 +1871,7 @@ void text_drawborder(t_text *x, t_glist *glist,
     {
         if (firsttime)
             sys_vgui(".x%lx.c create ppolygon\
- %d %d %d %d %d %d %d %d %d %d %d %d %d %d -stroke $box_outline -fill $msg_box_fill -tags {%sR %lx text}\n",
+ %d %d %d %d %d %d %d %d %d %d %d %d %d %d -stroke $pd_colors(msg_border) -fill $pd_colors(msg) -tags {%sR %lx text msg box}\n",
                 glist_getcanvas(glist),
                 x1, y1,  x2+4, y1,  x2, y1+4,  x2, y2-4,  x2+4, y2,
                 x1, y2,  x1, y1,
@@ -1879,7 +1887,7 @@ void text_drawborder(t_text *x, t_glist *glist,
     {
         if (firsttime)
             sys_vgui(".x%lx.c create ppolygon\
- %d %d %d %d %d %d %d %d %d %d %d %d -stroke $box_outline -fill $atom_box_fill -tags {%sR %lx text}\n",
+ %d %d %d %d %d %d %d %d %d %d %d %d -stroke $pd_colors(atom_box_border) -fill $pd_colors(atom_box) -tags {%sR %lx text atom box}\n",
                 glist_getcanvas(glist),
                 x1, y1,  x2-4, y1,  x2, y1+4,  x2, y2,  x1, y2,  x1, y1,
                     tag, tag);
@@ -1930,14 +1938,14 @@ void text_drawborder_withtag(t_text *x, t_glist *glist,
         if (pd_class(&x->te_pd) == text_class)
         {
             pattern = "-";
-            outline = "$dash_outline -strokewidth 2";
+            outline = "$pd_colors(dash_outline) -strokewidth 2";
 			fill = invalid_fill;
         }
         else
         {
             pattern = "\"\"";
-            outline = "$box_outline";
-			fill = "$obj_box_fill";
+            outline = "$pd_colors(box_border)";
+			fill = "$pd_colors(box)";
         }
         if (firsttime)
 		{
@@ -1956,7 +1964,7 @@ void text_drawborder_withtag(t_text *x, t_glist *glist,
         if (firsttime)
             sys_vgui(".x%lx.c create ppolygon \
                      %d %d %d %d %d %d %d %d %d %d %d %d %d %d \
-                     -stroke $box_outline -fill $msg_box_fill -tags {%sR %lx text}\n",
+                     -stroke $pd_colors(msg_border) -fill $pd_colors(msg) -tags {%sR %lx text msg box}\n",
                 glist_getcanvas(glist),
                      x1, y1,  x2+msg_draw_const, y1,  x2, y1+msg_draw_const,  
                      x2, y2-msg_draw_const,  x2+msg_draw_const, y2,  
@@ -1968,7 +1976,7 @@ void text_drawborder_withtag(t_text *x, t_glist *glist,
         atom_draw_const = ((y2-y1)/3);
         if (firsttime)
             sys_vgui(".x%lx.c create ppolygon %d %d %d %d %d %d %d %d %d %d %d %d \
-                     -stroke $box_outline -fill $atom_box_fill -tags {%sR %lx text}\n",
+                     -stroke $pd_colors(atom_box_border) -fill $pd_colors(atom_box) -tags {%sR %lx text atom box}\n",
                 glist_getcanvas(glist),
                      x1, y1,  x2-atom_draw_const, y1,  x2, y1+atom_draw_const,  
                      x2, y2,  x1, y2,  x1, y1, 
diff --git a/pd/src/g_toggle.c b/pd/src/g_toggle.c
index 2f7771627c634ab398ac21fe00e5e8b635bb3382..41992dcefd1d17349b551ad4912a1ccbca76dee5 100644
--- a/pd/src/g_toggle.c
+++ b/pd/src/g_toggle.c
@@ -72,27 +72,27 @@ void toggle_draw_new(t_toggle *x, t_glist *glist)
 		    w = 2;
 		if(x->x_gui.x_w >= 60)
 		    w = 3;
-		sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -tags {%lxBASE %lxTGL %s text}\n",
+		sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_border) -fill #%6.6x -tags {%lxBASE %lxTGL %s text iemgui border}\n",
 		         canvas, xx, yy, xx + x->x_gui.x_w, yy + x->x_gui.x_h,
 		         x->x_gui.x_bcol, x, x, nlet_tag);
-		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d -stroke #%6.6x -tags {%lxX1 %lxTGL %s text}\n",
+		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d -stroke #%6.6x -tags {%lxX1 %lxTGL %s text iemgui}\n",
 		         canvas, xx+w+1, yy+w+1, xx + x->x_gui.x_w-w-1, yy + x->x_gui.x_h-w-1, w,
 		         (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol, x, x, nlet_tag);
-		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d -stroke #%6.6x -tags {%lxX2 %lxTGL %s text}\n",
+		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d -stroke #%6.6x -tags {%lxX2 %lxTGL %s text iemgui}\n",
 		         canvas, xx+w+1, yy + x->x_gui.x_h-w-1, xx + x->x_gui.x_w-w-1, yy+w+1, w,
 		         (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol, x, x, nlet_tag);
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxTGL %s text}\n",
+		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxTGL %s text iemgui}\n",
 		         canvas, xx+x->x_gui.x_ldx,
 		         yy+x->x_gui.x_ldy,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 		         x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		         x->x_gui.x_lcol, x, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxTGL%so%d %so%d %lxTGL %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxTGL%so%d %so%d %lxTGL %s outlet iemgui}\n",
 		         canvas, xx, yy + x->x_gui.x_h-1, xx + IOWIDTH, yy + x->x_gui.x_h, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxTGL%si%d %si%d %lxTGL %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxTGL%si%d %si%d %lxTGL %s inlet iemgui}\n",
 		         canvas, xx, yy, xx + IOWIDTH, yy+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 	//}
 }
@@ -156,7 +156,7 @@ void toggle_draw_config(t_toggle* x, t_glist* glist)
 	/*
 	char color[64];
 	if (x->x_gui.x_fsf.x_selected)
-		sprintf(color, "$select_color");
+		sprintf(color, "$pd_colors(selection)");
 	else
 		sprintf(color, "#%6.6x", x->x_gui.x_lcol); 
 
@@ -167,7 +167,7 @@ void toggle_draw_config(t_toggle* x, t_glist* glist)
              strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
 	*/
 	if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas) {
-    	sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $select_color -text {%s} \n",
+    	sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $pd_colors(selection) -text {%s} \n",
              canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
              strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
 	}
@@ -200,14 +200,14 @@ void toggle_draw_io(t_toggle* x, t_glist* glist, int old_snd_rcv_flags)
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
 		if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxTGL%so%d %so%d %lxTGL %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxTGL%so%d %so%d %lxTGL %s outlet iemgui}\n",
 		         canvas, xpos,
 		         ypos + x->x_gui.x_h-1, xpos + IOWIDTH,
 		         ypos + x->x_gui.x_h, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able)
 		    sys_vgui(".x%lx.c delete %lxTGL%so%d\n", canvas, x, nlet_tag, 0);
 		if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxTGL%si%d %si%d %lxTGL %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxTGL%si%d %si%d %lxTGL %s inlet iemgui}\n",
 		         canvas, xpos, ypos,
 		         xpos + IOWIDTH, ypos+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && x->x_gui.x_fsf.x_rcv_able)
@@ -232,15 +232,15 @@ void toggle_draw_select(t_toggle* x, t_glist* glist)
 
 			char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $select_color\n", canvas, x);
-		    sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $select_color\n", canvas, x);
+		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $pd_colors(selection)\n", canvas, x);
+		    sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $pd_colors(selection)\n", canvas, x);
 
 				if (x->x_gui.scale_vis) {
 					sys_vgui("destroy %s\n", sh->h_pathname);
 					sys_vgui(".x%lx.c delete %lxSCALE\n", canvas, x);
 				}
 
-				sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+				sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 					 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
 				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxTGL %s}\n",
 					 canvas, x->x_gui.x_obj.te_xpix + x->x_gui.x_w - SCALEHANDLE_WIDTH - 1,
@@ -262,7 +262,7 @@ void toggle_draw_select(t_toggle* x, t_glist* glist)
 						sys_vgui(".x%lx.c delete %lxLABELH\n", canvas, x);
 					}
 
-					sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+					sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 						lh->h_pathname, LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT);
 					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxTGL %s}\n",
 						canvas, x->x_gui.x_obj.te_xpix+ x->x_gui.x_ldx - LABELHANDLE_WIDTH,
@@ -283,7 +283,7 @@ void toggle_draw_select(t_toggle* x, t_glist* glist)
 		}
 		else
 		{
-		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
+		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n", canvas, x, IEM_GUI_COLOR_NORMAL);
 		    sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill #%6.6x\n", canvas, x, x->x_gui.x_lcol);
 			sys_vgui(".x%lx.c dtag %lxTGL selected\n", canvas, x);
 			sys_vgui("destroy %s\n", sh->h_pathname);
@@ -359,7 +359,7 @@ static void toggle__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx, t
 		{
 			sys_vgui("lower %s\n", sh->h_pathname);
 			sys_vgui(".x%x.c create prect %d %d %d %d\
-	 -stroke $select_color -strokewidth 1 -tags %s\n",
+	 -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
 				 x->x_gui.x_glist, x->x_gui.x_obj.te_xpix, x->x_gui.x_obj.te_ypix,
 					x->x_gui.x_obj.te_xpix + x->x_gui.x_w,
 					x->x_gui.x_obj.te_ypix + x->x_gui.x_h, sh->h_outlinetag);
diff --git a/pd/src/g_vdial.c b/pd/src/g_vdial.c
index a9bc96ef21ec3bcc23b0e0a008260c34492ac8a5..d31eea5b0ada843fa497515b5c5f5d9ed06d10bb 100644
--- a/pd/src/g_vdial.c
+++ b/pd/src/g_vdial.c
@@ -73,10 +73,10 @@ void vradio_draw_new(t_vradio *x, t_glist *glist)
 
 		for(i=0; i<n; i++)
 		{
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -tags {%lxBASE%d %lxVRDO %s text}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_border) -fill #%6.6x -tags {%lxBASE%d %lxVRDO %s text iemgui border}\n",
 		             canvas, xx11, yy11, xx12, yy12,
 		             x->x_gui.x_bcol, x, i, x, nlet_tag);
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x -tags {%lxBUT%d %lxVRDO %s text}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x -tags {%lxBUT%d %lxVRDO %s text iemgui}\n",
 		             canvas, xx21, yy21, xx22, yy22,
 		             (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol,
 		             (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol, x, i, x, nlet_tag);
@@ -87,16 +87,16 @@ void vradio_draw_new(t_vradio *x, t_glist *glist)
 		    x->x_drawn = x->x_on;
 		}
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxVRDO %s text}\n",
+		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxVRDO %s text iemgui}\n",
 		         canvas, xx11+x->x_gui.x_ldx, yy11b+x->x_gui.x_ldy,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 		         x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		         x->x_gui.x_lcol, x, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVRDO%so%d %so%d %lxVRDO %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVRDO%so%d %so%d %lxVRDO %s outlet iemgui}\n",
 		         canvas, xx11, yy11-1, xx11 + IOWIDTH, yy11, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVRDO%si%d %si%d %lxVRDO %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVRDO%si%d %si%d %lxVRDO %s inlet iemgui}\n",
 		         canvas, xx11, yy11b, xx11 + IOWIDTH, yy11b+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 	//}
 }
@@ -165,13 +165,13 @@ void vradio_draw_config(t_vradio* x, t_glist* glist)
 	/*
 	char color[64];
 	if (x->x_gui.x_fsf.x_selected)
-		sprintf(color, "$select_color");
+		sprintf(color, "$pd_colors(selection)");
 	else
 		sprintf(color, "#%6.6x", x->x_gui.x_lcol);
 	*/
 
 	if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas)
-		sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $select_color -text {%s} \n",
+		sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $pd_colors(selection) -text {%s} \n",
 		         canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
 	else
@@ -202,7 +202,7 @@ void vradio_draw_io(t_vradio* x, t_glist* glist, int old_snd_rcv_flags)
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
 		if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVRDO%so%d %so%d %lxVRDO %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVRDO%so%d %so%d %lxVRDO %s outlet iemgui}\n",
 		             canvas, xpos,
 		             ypos+(x->x_number*x->x_gui.x_h)-1,
 		             xpos+ IOWIDTH,
@@ -210,7 +210,7 @@ void vradio_draw_io(t_vradio* x, t_glist* glist, int old_snd_rcv_flags)
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able)
 		    sys_vgui(".x%lx.c delete %lxVRDO%so%d\n", canvas, x, nlet_tag, 0);
 		if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVRDO%si%d %si%d %lxVRDO %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVRDO%si%d %si%d %lxVRDO %s inlet iemgui}\n",
 		             canvas, xpos, ypos,
 		             xpos+ IOWIDTH, ypos+1,
 		             x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
@@ -239,16 +239,16 @@ void vradio_draw_select(t_vradio* x, t_glist* glist)
 
 				for(i=0; i<n; i++)
 				{
-				    sys_vgui(".x%lx.c itemconfigure %lxBASE%d -stroke $select_color\n", canvas, x, i);
+				    sys_vgui(".x%lx.c itemconfigure %lxBASE%d -stroke $pd_colors(selection)\n", canvas, x, i);
 				}
-				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $select_color\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $pd_colors(selection)\n", canvas, x);
 
 				if (x->x_gui.scale_vis) {
 					sys_vgui("destroy %s\n", sh->h_pathname);
 					sys_vgui(".x%lx.c delete %lxSCALE\n", canvas, x);
 				}
 
-				sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+				sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 					 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
 				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxVRDO %s}\n",
 					 canvas, x->x_gui.x_obj.te_xpix + x->x_gui.x_w - SCALEHANDLE_WIDTH - 1,
@@ -270,7 +270,7 @@ void vradio_draw_select(t_vradio* x, t_glist* glist)
 						sys_vgui(".x%lx.c delete %lxLABELH\n", canvas, x);
 					}
 
-					sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+					sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 						lh->h_pathname, LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT);
 					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxVRDO %s}\n",
 						canvas, x->x_gui.x_obj.te_xpix+ x->x_gui.x_ldx - LABELHANDLE_WIDTH,
@@ -294,7 +294,7 @@ void vradio_draw_select(t_vradio* x, t_glist* glist)
 		    for(i=0; i<n; i++)
 		    {
 				sys_vgui(".x%lx.c dtag %lxVRDO selected\n", canvas, x);
-		        sys_vgui(".x%lx.c itemconfigure %lxBASE%d -stroke #%6.6x\n", canvas, x, i,
+		        sys_vgui(".x%lx.c itemconfigure %lxBASE%d -stroke %s\n", canvas, x, i,
 		                 IEM_GUI_COLOR_NORMAL);
 		    }
 		    sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill #%6.6x\n", canvas, x,
@@ -370,7 +370,7 @@ static void vradio__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx, t
 		{
 			sys_vgui("lower %s\n", sh->h_pathname);
 			sys_vgui(".x%x.c create prect %d %d %d %d\
-	 -stroke $select_color -strokewidth 1 -tags %s\n",
+	 -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
 				 x->x_gui.x_glist, x->x_gui.x_obj.te_xpix, x->x_gui.x_obj.te_ypix,
 					x->x_gui.x_obj.te_xpix + x->x_gui.x_w,
 					x->x_gui.x_obj.te_ypix + (x->x_gui.x_h * x->x_number), sh->h_outlinetag);
diff --git a/pd/src/g_vslider.c b/pd/src/g_vslider.c
index 1947d68b0c2b92ab43dfa1b5f7be720e212be3a0..51e626a42095959d471bb841fb59d41e1171e9ea 100644
--- a/pd/src/g_vslider.c
+++ b/pd/src/g_vslider.c
@@ -84,27 +84,27 @@ static void vslider_draw_new(t_vslider *x, t_glist *glist)
 
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-		sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -tags {%lxBASE %lxVSLDR %s text}\n",
+		sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_border) -fill #%6.6x -tags {%lxBASE %lxVSLDR %s text iemgui border}\n",
 		         canvas, xpos, ypos,
 		         xpos + x->x_gui.x_w, ypos + x->x_gui.x_h+5,
 		         x->x_gui.x_bcol, x, x, nlet_tag);
-		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth 3 -stroke #%6.6x -tags {%lxKNOB %lxVSLDR %s text}\n",
+		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth 3 -stroke #%6.6x -tags {%lxKNOB %lxVSLDR %s text iemgui}\n",
 		         canvas, xpos+2, r,
 		         xpos + x->x_gui.x_w-2, r, x->x_gui.x_fcol, x, x, nlet_tag);
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxVSLDR %s text}\n",
+		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxVSLDR %s text iemgui}\n",
 		         canvas, xpos+x->x_gui.x_ldx, ypos+x->x_gui.x_ldy,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 		         x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight, 
 		         x->x_gui.x_lcol, x, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVSLDR%so%d %so%d %lxVSLDR %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVSLDR%so%d %so%d %lxVSLDR %s outlet iemgui}\n",
 		         canvas,
 		         xpos, ypos + x->x_gui.x_h+4,
 		         xpos+7, ypos + x->x_gui.x_h+5,
 		         x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVSLDR%si%d %si%d %lxVSLDR %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVSLDR%si%d %si%d %lxVSLDR %s inlet iemgui}\n",
 		         canvas,
 		         xpos, ypos,
 		         xpos+7, ypos+1,
@@ -172,13 +172,13 @@ static void vslider_draw_config(t_vslider* x,t_glist* glist)
 	/*
 	char color[64];
 	if (x->x_gui.x_fsf.x_selected)
-		sprintf(color, "$select_color");
+		sprintf(color, "$pd_colors(selection)");
 	else
 		sprintf(color, "#%6.6x", x->x_gui.x_lcol);
 	*/
 
 	if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas)
-		sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $select_color -text {%s} \n",
+		sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $pd_colors(selection) -text {%s} \n",
 		         canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight, 
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
 	else
@@ -203,7 +203,7 @@ static void vslider_draw_io(t_vslider* x,t_glist* glist, int old_snd_rcv_flags)
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
 		if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVSLDR%so%d %so%d %lxVSLDR %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVSLDR%so%d %so%d %lxVSLDR %s outlet iemgui}\n",
 		         canvas,
 		         xpos, ypos + x->x_gui.x_h+4,
 		         xpos+7, ypos + x->x_gui.x_h+5,
@@ -211,7 +211,7 @@ static void vslider_draw_io(t_vslider* x,t_glist* glist, int old_snd_rcv_flags)
 		if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able)
 		    sys_vgui(".x%lx.c delete %lxVSLDR%so%d\n", canvas, x, nlet_tag, 0);
 		if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able)
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVSLDR%si%d %si%d %lxVSLDR %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVSLDR%si%d %si%d %lxVSLDR %s inlet iemgui}\n",
 		         canvas,
 		         xpos, ypos,
 		         xpos+7, ypos+1,
@@ -237,15 +237,15 @@ static void vslider_draw_select(t_vslider *x, t_glist *glist)
 
 				char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-				sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $select_color\n", canvas, x);
-				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $select_color\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $pd_colors(selection)\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $pd_colors(selection)\n", canvas, x);
 
 				if (x->x_gui.scale_vis) {
 					sys_vgui("destroy %s\n", sh->h_pathname);
 					sys_vgui(".x%lx.c delete %lxSCALE\n", canvas, x);
 				}
 
-				sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+				sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 					 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
 				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxVSLDR %s}\n",
 					 canvas, x->x_gui.x_obj.te_xpix + x->x_gui.x_w - SCALEHANDLE_WIDTH - 1,
@@ -267,7 +267,7 @@ static void vslider_draw_select(t_vslider *x, t_glist *glist)
 						sys_vgui(".x%lx.c delete %lxLABELH\n", canvas, x);
 					}
 
-					sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+					sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 						lh->h_pathname, LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT);
 					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxVSLDR %s}\n",
 						canvas, x->x_gui.x_obj.te_xpix+ x->x_gui.x_ldx - LABELHANDLE_WIDTH,
@@ -288,7 +288,7 @@ static void vslider_draw_select(t_vslider *x, t_glist *glist)
 		}
 		else
 		{
-		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
+		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n", canvas, x, IEM_GUI_COLOR_NORMAL);
 		    sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill #%6.6x\n", canvas, x, x->x_gui.x_lcol);
 			sys_vgui(".x%lx.c dtag %lxVSLDR selected\n", canvas, x);
 			sys_vgui("destroy %s\n", sh->h_pathname);
@@ -368,8 +368,8 @@ static void vslider__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx,
 		if (glist_isvisible(x->x_gui.x_glist))
 		{
 			sys_vgui("lower %s\n", sh->h_pathname);
-			sys_vgui(".x%x.c create prect %d %d %d %d\
-	 -stroke $select_color -strokewidth 1 -tags %s\n",
+			sys_vgui(".x%x.c create prect %d %d %d %d \
+	 -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
 				 x->x_gui.x_glist, x->x_gui.x_obj.te_xpix, x->x_gui.x_obj.te_ypix,
 					x->x_gui.x_obj.te_xpix + x->x_gui.x_w,
 					x->x_gui.x_obj.te_ypix + 5 + x->x_gui.x_h, sh->h_outlinetag);
diff --git a/pd/src/g_vumeter.c b/pd/src/g_vumeter.c
index 97d0c6b17ab2a40db3b4faa9acb4e4cd03f27ba7..974b1e21443898c406fad0d398e28cf42d860612 100644
--- a/pd/src/g_vumeter.c
+++ b/pd/src/g_vumeter.c
@@ -120,7 +120,7 @@ static void vu_draw_new(t_vu *x, t_glist *glist)
 
 		char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-		sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -tags {%lxBASE %lxVU %s text}\n",
+		sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_border) -fill #%6.6x -tags {%lxBASE %lxVU %s text iemgui border}\n",
 		         canvas, xpos, ypos,
 		         xpos+x->x_gui.x_w+2,
 		         ypos+x->x_gui.x_h+4, x->x_gui.x_bcol, x, x, nlet_tag);
@@ -128,11 +128,11 @@ static void vu_draw_new(t_vu *x, t_glist *glist)
 		{
 		    led_col = iemgui_vu_col[i];
 		    yyy = k4 + k1*(k2-i);
-		    sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d -stroke #%6.6x -tags {%lxRLED%d %lxVU %s text}\n",
+		    sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d -stroke #%6.6x -tags {%lxRLED%d %lxVU %s text iemgui}\n",
 		             canvas, quad1+1, yyy+2, quad3, yyy+2, x->x_led_size, iemgui_color_hex[led_col], x, i, x, nlet_tag);
 		    if(((i+2)&3) && (x->x_scale))
 		        sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		                 -font {{%s} -%d %s} -fill #%6.6x -tags {%lxSCALE%d %lxVU %s text}\n",
+		                 -font {{%s} -%d %s} -fill #%6.6x -tags {%lxSCALE%d %lxVU %s text iemgui}\n",
 		                 canvas, end+1, yyy+k3+2, iemgui_vu_scale_str[i], 
 						 x->x_gui.x_font, x->x_gui.x_fontsize,
 		                 sys_fontweight, x->x_gui.x_lcol, x, i, x, nlet_tag);
@@ -142,31 +142,31 @@ static void vu_draw_new(t_vu *x, t_glist *glist)
 		    i=IEM_VU_STEPS+1;
 		    yyy = k4 + k1*(k2-i);
 		    sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		             -font {{%s} -%d %s} -fill #%6.6x -tags {%lxSCALE%d %lxVU %s text}\n",
+		             -font {{%s} -%d %s} -fill #%6.6x -tags {%lxSCALE%d %lxVU %s text iemgui}\n",
 		             canvas, end+1, yyy+k3+2, iemgui_vu_scale_str[i], x->x_gui.x_font, 
 					 x->x_gui.x_fontsize, sys_fontweight,
 		             x->x_gui.x_lcol, x, i, x, nlet_tag);
 		}
-		sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x -tags {%lxRCOVER %lxVU %s text}\n",
+		sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x -tags {%lxRCOVER %lxVU %s text iemgui}\n",
 		         canvas, quad1+1, ypos+1, quad3,
 		         ypos+1 + k1*IEM_VU_STEPS, x->x_gui.x_bcol, x->x_gui.x_bcol, x, x, nlet_tag);
-		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d -fill #%6.6x -tags {%lxPLED %lxVU %s text}\n",
+		sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d -fill #%6.6x -tags {%lxPLED %lxVU %s text iemgui}\n",
 		         canvas, mid+1, ypos+12,
 		         mid+1, ypos+12, x->x_led_size, x->x_gui.x_bcol, x, x, nlet_tag);
 		sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
-		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxVU %s text}\n",
+		         -font {{%s} -%d %s} -fill #%6.6x -tags {%lxLABEL %lxVU %s text iemgui}\n",
 		         canvas, xpos+x->x_gui.x_ldx, ypos+x->x_gui.x_ldy,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
 		         x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		         x->x_gui.x_lcol, x, x, nlet_tag);
 		if(!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist)
 		{
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVU%so%d %so%d %lxVU %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVU%so%d %so%d %lxVU %s outlet iemgui}\n",
 		         canvas,
 		         xpos, ypos + x->x_gui.x_h+3,
 		         xpos + IOWIDTH, ypos + x->x_gui.x_h+4,
 		         x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVU%so%d %so%d %lxVU %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVU%so%d %so%d %lxVU %s outlet iemgui}\n",
 		         canvas,
 		         xpos+x->x_gui.x_w+2-IOWIDTH, ypos + x->x_gui.x_h+3,
 		         xpos+x->x_gui.x_w+2, ypos + x->x_gui.x_h+4,
@@ -174,12 +174,12 @@ static void vu_draw_new(t_vu *x, t_glist *glist)
 		}
 		if(!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist)
 		{
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVU%si%d %si%d %lxVU %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVU%si%d %si%d %lxVU %s inlet iemgui}\n",
 		         canvas,
 		         xpos, ypos,
 		         xpos + IOWIDTH, ypos+1,
 		         x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVU%si%d %si%d %lxVU %s inlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVU%si%d %si%d %lxVU %s inlet iemgui}\n",
 		         canvas,
 		         xpos+x->x_gui.x_w+2-IOWIDTH, ypos,
 		         xpos+x->x_gui.x_w+2, ypos+1,
@@ -284,7 +284,7 @@ static void vu_draw_config(t_vu* x, t_glist* glist)
 	/*
 	char color[64];
 	if (x->x_gui.x_fsf.x_selected)
-		sprintf(color, "$select_color");
+		sprintf(color, "$pd_colors(selection)");
 	else
 		sprintf(color, "#%6.6x", x->x_gui.x_lcol);
 	*/
@@ -295,7 +295,7 @@ static void vu_draw_config(t_vu* x, t_glist* glist)
                  x->x_led_size);
         if(((i+2)&3) && (x->x_scale))
 			if (x->x_gui.x_fsf.x_selected)
-            	sys_vgui(".x%lx.c itemconfigure %lxSCALE%d -text {%s} -font {{%s} -%d %s} -fill $select_color\n",
+            	sys_vgui(".x%lx.c itemconfigure %lxSCALE%d -text {%s} -font {{%s} -%d %s} -fill $pd_colors(selection)\n",
                      canvas, x, i, iemgui_vu_scale_str[i], x->x_gui.x_font, 
 					 x->x_gui.x_fontsize, sys_fontweight);
 			else
@@ -308,7 +308,7 @@ static void vu_draw_config(t_vu* x, t_glist* glist)
     {
         i=IEM_VU_STEPS+1;
 		if (x->x_gui.x_fsf.x_selected)
-		    sys_vgui(".x%lx.c itemconfigure %lxSCALE%d -text {%s} -font {{%s} -%d %s} -fill $select_color\n",
+		    sys_vgui(".x%lx.c itemconfigure %lxSCALE%d -text {%s} -font {{%s} -%d %s} -fill $pd_colors(selection)\n",
 		             canvas, x, i, iemgui_vu_scale_str[i], x->x_gui.x_font, 
 					 x->x_gui.x_fontsize, sys_fontweight);
 		else
@@ -318,7 +318,7 @@ static void vu_draw_config(t_vu* x, t_glist* glist)
 		             x->x_gui.x_lcol);
     }
 	if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas)
-		sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $select_color -text {%s} \n",
+		sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} -fill $pd_colors(selection) -text {%s} \n",
 		         canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
 		         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
 	else
@@ -349,12 +349,12 @@ static void vu_draw_io(t_vu* x, t_glist* glist, int old_snd_rcv_flags)
 
 		if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
 		{
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVU%so%d %so%d %lxVU %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVU%so%d %so%d %lxVU %s outlet}\n",
 		         canvas,
 		         xpos, ypos + x->x_gui.x_h+3,
 		         xpos + IOWIDTH, ypos + x->x_gui.x_h+4,
 		         x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
-		    sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%lxVU%so%d %so%d %lxVU %s outlet}\n",
+		    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke $pd_colors(iemgui_nlet) -tags {%lxVU%so%d %so%d %lxVU %s outlet}\n",
 		         canvas,
 		         xpos+x->x_gui.x_w+2-IOWIDTH, ypos + x->x_gui.x_h+3,
 		         xpos+x->x_gui.x_w+2, ypos + x->x_gui.x_h+4,
@@ -403,27 +403,27 @@ static void vu_draw_select(t_vu* x,t_glist* glist)
 
 				char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
-				sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $select_color\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke $pd_colors(selection)\n", canvas, x);
 				for(i=1; i<=IEM_VU_STEPS; i++)
 				{
 				    if(((i+2)&3) && (x->x_scale))
-				        sys_vgui(".x%lx.c itemconfigure %lxSCALE%d -fill $select_color\n",
+				        sys_vgui(".x%lx.c itemconfigure %lxSCALE%d -fill $pd_colors(selection)\n",
 				                 canvas, x, i);
 				}
 				if(x->x_scale)
 				{
 				    i=IEM_VU_STEPS+1;
-				    sys_vgui(".x%lx.c itemconfigure %lxSCALE%d -fill $select_color\n",
+				    sys_vgui(".x%lx.c itemconfigure %lxSCALE%d -fill $pd_colors(selection)\n",
 				             canvas, x, i);
 				}
-				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $select_color\n", canvas, x);
+				sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill $pd_colors(selection)\n", canvas, x);
 
 				if (x->x_gui.scale_vis) {
 					sys_vgui("destroy %s\n", sh->h_pathname);
 					sys_vgui(".x%lx.c delete %lxSCALE\n", canvas, x);
 				}
 
-				sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor bottom_right_corner\n",
+				sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor bottom_right_corner\n",
 					 sh->h_pathname, SCALEHANDLE_WIDTH, SCALEHANDLE_HEIGHT);
 				sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxSCALE %lxVU %s}\n",
 					 canvas, x->x_gui.x_obj.te_xpix + x->x_gui.x_w + 2 - SCALEHANDLE_WIDTH - 1,
@@ -444,7 +444,7 @@ static void vu_draw_select(t_vu* x,t_glist* glist)
 						sys_vgui(".x%lx.c delete %lxLABELH\n", canvas, x);
 					}
 
-					sys_vgui("canvas %s -width %d -height %d -bg $select_color -bd 0 -cursor crosshair\n",
+					sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 -cursor crosshair\n",
 						lh->h_pathname, LABELHANDLE_WIDTH, LABELHANDLE_HEIGHT);
 					sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d -window %s -tags {%lxLABEL %lxLABELH %lxVU %s}\n",
 						canvas, x->x_gui.x_obj.te_xpix+ x->x_gui.x_ldx - LABELHANDLE_WIDTH,
@@ -466,7 +466,7 @@ static void vu_draw_select(t_vu* x,t_glist* glist)
 		else
 		{
 			sys_vgui(".x%lx.c dtag %lxVU selected\n", canvas, x);
-		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
+		    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n", canvas, x, IEM_GUI_COLOR_NORMAL);
 		    for(i=1; i<=IEM_VU_STEPS; i++)
 		    {
 		        if(((i+2)&3) && (x->x_scale))
@@ -552,7 +552,7 @@ static void vu__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx, t_flo
 		{
 			sys_vgui("lower %s\n", sh->h_pathname);
 			sys_vgui(".x%x.c create prect %d %d %d %d\
-	 -stroke $select_color -strokewidth 1 -tags %s\n",
+	 -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
 				 x->x_gui.x_glist, x->x_gui.x_obj.te_xpix, x->x_gui.x_obj.te_ypix,
 					x->x_gui.x_obj.te_xpix + x->x_gui.x_w + 2,
 					x->x_gui.x_obj.te_ypix + x->x_gui.x_h + 4, sh->h_outlinetag);
diff --git a/pd/src/pd.tk b/pd/src/pd.tk
index bc015c70719c26e4bfd17a34e50a20f050afb59d..241b254bc387f8bd64aa59ba73cb517ee8fbd343 100644
--- a/pd/src/pd.tk
+++ b/pd/src/pd.tk
@@ -354,18 +354,19 @@ set k12_saveas_on_new 0
 
 # Only can be enabled at startup (cannot be toggled afterwards)
 proc pdtk_enable_k12_mode {extra_dir} {
+pdtk_post "fucking truckin!\n\n\n\n"
 	global k12_mode
 	global signal_cord_width
 	global autotips
 	global signal_cord_highlight
-	global signal_cord
+#	global signal_cord
 	global highlight_width
 
 	set k12_mode 1
 	set signal_cord_width 5
 	set autotips 1
 	set signal_cord_highlight "#474"
-	set signal_cord "#2ca7d4"
+#	set signal_cord "#2ca7d4"
 	set highlight_width 7
 
 	image create photo i.wii_connect -file $extra_dir/K12/icons/wii_connect_on.png
@@ -543,29 +544,58 @@ set pd_array_listview_entry(0) 0
 set pd_array_listview_page(0) 0
 # end jsarlo
 
+# Prefences Dialog
+# dialog_prefs.tcl must come first because dialog_gui.tcl depends on it
+# This is an ugly hack-- it should just be loaded as tcl packages like
+# in 0.43...
+source [file join [file dirname [info script]] dialog_prefs.tcl]
+source [file join [file dirname [info script]] dialog_gui.tcl]
+source [file join [file dirname [info script]] dialog_midi.tcl]
+source [file join [file dirname [info script]] dialog_audio.tcl]
+
+# Add a trace for the color array. This way any gui-plugin can make
+# color changes simply by changing one of the elements of the pd_colors
+# array, and all the preference dialog stuff and open patches will
+# magically update
+trace add variable pd_colors write ::dialog_prefs::set_color
+
+# ... and a trace for the ::gui_preset variable.  There's probably
+# a way to do this inside the dropdown code, which would be better...
+trace add variable gui_preset write "::dialog_gui::set_gui_preset"
+
+# Now that we've got a trace for the colors, we can set a
+# color scheme (defined in dialog_gui.tcl)
+set gui_preset L2ork
+
+# todo: find a home for these:
+set ::pd_colors(signal_cord_width) 3
+set ::pd_colors(control_cord_width) 1
+
 # color scheme
-set canvas_fill "white"
-set text_color "#000"
-set select_color "#e87216"
-set dash_outline "#f00"
-set dash_fill "#f7f7f7"
-set box_outline "#ccc"
-set graph_outline "#777"
-set atom_box_fill "#eee"
-set msg_box_fill "#f8f8f6"
-set obj_box_fill "#f6f8f8"
-set signal_cord_highlight "#58a"
-set signal_cord "#808095"
-set signal_nlet $signal_cord
-set signal_cord_width 3
-set msg_cord_highlight "#474"
-set msg_cord "#565"
-set msg_nlet "white"
-set mixed_nlet "#88aaff"
-set msg_cord_width 1
+# set canvas_fill "white"
+# set text_color "#000"
+# set select_color "#e87216"
+# set dash_outline "#f00"
+# set dash_fill "#f7f7f7"
+# set box_outline "#ccc"
+# set graph_outline "#777"
+# set atom_box_fill "#eee"
+# set msg_box_fill "#f8f8f6"
+# set obj_box_fill "#f6f8f8"
+# Doesn't look like signal_cord_highlight is used
+# set signal_cord_highlight "#58a"
+# set signal_cord "#808095"
+# set signal_nlet $signal_cord
+# Todo: make sure these work in k12 mode
+# set signal_cord_width 3
+# set msg_cord_highlight "#474"
+# set msg_cord "#565"
+# set msg_nlet "white"
+# set mixed_nlet "#88aaff"
+# set msg_cord_width 1
 
 #nlet highlighting stuff
-set select_nlet_color $select_color
+set select_nlet_color $pd_colors(selection)
 set highlight_width 5
 
 if {$pd_nt == 1} {
@@ -1486,24 +1516,24 @@ proc menu_addstd {mbar} {
         -command {menu_audio 1} 
     $mbar.audio add command -label {Audio OFF} -accelerator [accel_munge "Ctrl+."] \
         -command {menu_audio 0} 
-	match_linux_wm [list $mbar.audio add separator]
-	$mbar.audio add command -label {Audio Settings} -state disabled
-    for {set x 1} {$x<[llength $pd_apilist]} {incr x} {
-        $mbar.audio add radiobutton -label [concat [lindex [lindex $pd_apilist $x] 0] Driver] \
-            -command {menu_audio 0} -variable pd_whichapi \
-            -value [lindex [lindex $pd_apilist $x] 1]\
-			-selectcolor "#dddddd" \
-            -command {pd [concat pd audio-setapi $pd_whichapi \;]}
-    }
-	match_linux_wm [list $mbar.audio add separator]
-	$mbar.audio add command -label {MIDI Settings} -state disabled
-    for {set x 0} {$x<[llength $pd_midiapilist]} {incr x} {
-        $mbar.audio add radiobutton -label [concat [lindex [lindex $pd_midiapilist $x] 0] Driver]\
-            -command {menu_midi 0} -variable pd_whichmidiapi \
-            -value [lindex [lindex $pd_midiapilist $x] 1]\
-			-selectcolor "#dddddd" \
-            -command {pd [concat pd midi-setapi $pd_whichmidiapi \;]}
-    }
+#	match_linux_wm [list $mbar.audio add separator]
+#	$mbar.audio add command -label {Audio Settings} -state disabled
+#    for {set x 1} {$x<[llength $pd_apilist]} {incr x} {
+#        $mbar.audio add radiobutton -label [concat [lindex [lindex $pd_apilist $x] 0] Driver] \
+#            -command {menu_audio 0} -variable pd_whichapi \
+#            -value [lindex [lindex $pd_apilist $x] 1]\
+#			-selectcolor "#dddddd" \
+#            -command {pd [concat pd audio-setapi $pd_whichapi \;]}
+#    }
+#	match_linux_wm [list $mbar.audio add separator]
+#	$mbar.audio add command -label {MIDI Settings} -state disabled
+#    for {set x 0} {$x<[llength $pd_midiapilist]} {incr x} {
+#        $mbar.audio add radiobutton -label [concat [lindex [lindex $pd_midiapilist $x] 0] Driver]\
+#            -command {menu_midi 0} -variable pd_whichmidiapi \
+#            -value [lindex [lindex $pd_midiapilist $x] 1]\
+#			-selectcolor "#dddddd" \
+#            -command {pd [concat pd midi-setapi $pd_whichmidiapi \;]}
+#    }
     #if {$pd_nt != 2} {
 	#	$mbar.audio add separator
     #    $mbar.audio add command -label {Audio settings...} \
@@ -1689,6 +1719,9 @@ match_linux_wm [list .mbar.edit add separator]
     	-state disabled
 .mbar.edit add command -label {Edit mode} -accelerator [accel_munge "Ctrl+e"] \
     -state disabled
+match_linux_wm [list .mbar.edit add separator]
+.mbar.edit add command -label {Preferences...} \
+    -command {::dialog_prefs::open_prefs_dialog .}
 
 #################### the "Find" menu for the Pd window ##############
 
@@ -2379,7 +2412,7 @@ proc pdtk_canvas_new {name width height geometry editable} {
     global pd_tearoff put_tearoff
     global pd_nt
     global tcl_version
-    global canvas_fill
+#    global canvas_fill
 	global colors
 	global global_clipboard
 	global global_selection
@@ -2399,8 +2432,14 @@ proc pdtk_canvas_new {name width height geometry editable} {
 	if {![info exists ::menu($name)]} {
 		set ::menu($name) 1
 	}
-	if {![info exists ::canvas_color($name)]} {
-		set ::canvas_color($name) $canvas_fill
+        # attempt at getting global presets to play
+        # well with local settings.
+        set my_canvas_color {}
+#        set ::canvas_color($name) orange
+	if {[info exists ::canvas_color($name)]} {
+            set my_canvas_color $::canvas_color($name)
+        } else {
+            set my_canvas_color $::pd_colors(canvas_color)
 	}
 	if {![info exists ::topmost($name)]} {
 		set ::topmost($name) 0
@@ -2807,8 +2846,7 @@ proc pdtk_canvas_new {name width height geometry editable} {
 		# ---------------------------------------- NOW PACK THEM ALL -----------------------------------------
 		pack $name.k12frame.edit $name.k12frame.datasound $name.k12frame.wii $name.k12frame.wii2 $name.k12frame.arduino $name.k12frame.math_1 $name.k12frame.math_2 $name.k12frame.math_3 $name.k12frame.logic $name.k12frame.other -side top -expand 0 -fill x
 	}
-
-    tkp::canvas $name.c -width $width -height $height -background $::canvas_color($name) \
+    tkp::canvas $name.c -width $width -height $height -background $my_canvas_color \
 		-highlightthickness 0 -bd 0
         #-yscrollcommand "$name.scrollvert set" \
         #-xscrollcommand "$name.scrollhort set" \
@@ -2836,7 +2874,7 @@ proc pdtk_canvas_new {name width height geometry editable} {
 		wm minsize $name 580 407
 	}
     wm geometry $name $geometry
-    # the file menu
+    # the "File" menu
 	
     # The menus are instantiated here for the patch windows.
     # For the main window, they are created on load, at the 
@@ -2907,7 +2945,7 @@ proc pdtk_canvas_new {name width height geometry editable} {
 			-accelerator [accel_munge "Ctrl+q"]
 	}
 
-    # the edit menu
+    # the "Edit" menu
     match_linux_wm [list menu $name.m.edit -postcommand [concat menu_fixeditmenu $name] -tearoff $pd_tearoff]
     $name.m add cascade -label Edit -menu $name.m.edit
     
@@ -3039,6 +3077,11 @@ proc pdtk_canvas_new {name width height geometry editable} {
         -indicatoron false -selectcolor black \
         -command [concat menu_editmode $name] \
         -accelerator [accel_munge "Ctrl+e"]
+    if {$k12_mode == 0} {
+    	match_linux_wm [list $name.m.edit add separator]
+        $name.m.edit add command -label {Preferences...} \
+        -command {::dialog_prefs::open_prefs_dialog .}
+    }
 
 	if { $editable == 1 } {
     	$name.m.edit entryconfigure "Edit mode" -background "#7dd37d" -foreground black
@@ -3062,7 +3105,7 @@ proc pdtk_canvas_new {name width height geometry editable} {
 
 	if { $k12_mode == 0 } {
 
-		# the put menu
+		# the "Put" menu
 		match_linux_wm [list menu $name.m.put -tearoff $put_tearoff]
 		$name.m add cascade -label Put -menu $name.m.put
 
@@ -3189,7 +3232,7 @@ proc pdtk_canvas_new {name width height geometry editable} {
 		    $name.m add cascade -label "Apple" -menu $name.m.apple 
 		}
 
-		# the help menu
+		# the "Help" menu
 
 		match_linux_wm [list menu $name.m.help -tearoff $pd_tearoff]
 		$name.m add cascade -label Help -menu $name.m.help
@@ -6798,7 +6841,6 @@ proc pdtk_canvas_update_paste_menu {value} {
 proc pdtk_text_new {canvasname myname x y text font color} {
     #    if {$font < 13} {set fontname [format -*-courier-bold----%d-* $font]}
     #    if {$font >= 13} {set fontname [format -*-courier-----%d-* $font]}
-
     global pd_fontlist pd_nt
 #    switch -- $font {
 #        8  { set typeface [lindex $pd_fontlist 0] }
@@ -7267,7 +7309,7 @@ proc audio_popup {name buttonname varname devlist} {
 # opening several devices; if not, we get an extra button to turn longform
 # on and restart the dialog.
 
-proc pdtk_audio_dialog {id indev1 indev2 indev3 indev4 \
+proc old_audio_dialog {id indev1 indev2 indev3 indev4 \
         inchan1 inchan2 inchan3 inchan4 \
         outdev1 outdev2 outdev3 outdev4 \
         outchan1 outchan2 outchan3 outchan4 sr advance multi callback \
@@ -7575,7 +7617,7 @@ proc midi_popup {name buttonname varname devlist} {
 # start a dialog window to select midi devices.  "longform" asks us to make
 # controls for opening several devices; if not, we get an extra button to
 # turn longform on and restart the dialog.
-proc pdtk_midi_dialog {id indev1 indev2 indev3 indev4 \
+proc pdtk_midi_dialog_old {id indev1 indev2 indev3 indev4 \
         outdev1 outdev2 outdev3 outdev4 longform} {
     global midi_indev1 midi_indev2 midi_indev3 midi_indev4 
     global midi_outdev1 midi_outdev2 midi_outdev3 midi_outdev4
@@ -7714,7 +7756,7 @@ proc pdtk_midi_dialog {id indev1 indev2 indev3 indev4 \
     }
 }
 
-proc pdtk_alsa_midi_dialog {id indev1 indev2 indev3 indev4 \
+proc pdtk_alsa_midi_dialog_old {id indev1 indev2 indev3 indev4 \
         outdev1 outdev2 outdev3 outdev4 longform alsa} {
     global midi_indev1 midi_indev2 midi_indev3 midi_indev4 
     global midi_outdev1 midi_outdev2 midi_outdev3 midi_outdev4
@@ -8654,7 +8696,7 @@ proc pdtk_canvas_enteritem_gettags {tkcanvas x y item} {
 		if { $object ne "text" } {
 			set nlet_color [$tkcanvas itemcget [lindex $tags 0] -stroke]
 		} else {
-			set nlet_color $select_color
+			set nlet_color $::pd_colors(selection)
 		}
 
         pd [concat $mytoplevel enter $object \
@@ -8766,8 +8808,8 @@ proc pdtk_tip {w fromc show args} {
 		}
     } else {
 		set tooltip_visible 1
-		if { $nlet_color == 0 } { set nlet_color $select_color }
-		if { $nlet_color ne $select_color } {
+		if { $nlet_color == 0 } { set nlet_color $::pd_colors(selection) }
+		if { $nlet_color ne $::pd_colors(selection) } {
 			set fg "#ffffff"
 		} else {
 			set fg "#000000"
@@ -9020,3 +9062,34 @@ source [file join [file dirname [info script]] search-plugin.tcl]
 
 # Tcl/tk code for drawimage and drawsprite
 source [file join [file dirname [info script]] pdtk_drawimage.tcl]
+
+# Ugly, ugly hack to send off to procs in dialog_audio.tcl and
+# dialog_midi.tcl.  Should just load the packages properly instead...
+
+proc pdtk_audio_dialog {mytoplevel indev1 indev2 indev3 indev4 \
+        inchan1 inchan2 inchan3 inchan4 \
+        outdev1 outdev2 outdev3 outdev4 \
+        outchan1 outchan2 outchan3 outchan4 sr advance multi callback \
+        longform} {
+    set blocksize 64
+    ::dialog_audio::pdtk_audio_dialog \
+        $mytoplevel $indev1 $indev2 $indev3 $indev4 \
+        $inchan1 $inchan2 $inchan3 $inchan4 \
+        $outdev1 $outdev2 $outdev3 $outdev4 \
+        $outchan1 $outchan2 $outchan3 $outchan4 $sr $advance $multi $callback \
+        $longform $blocksize
+}
+
+proc pdtk_midi_dialog {id indev1 indev2 indev3 indev4 \
+        outdev1 outdev2 outdev3 outdev4 longform} {
+    ::dialog_midi::pdtk_midi_dialog \
+        $id $indev1 $indev2 $indev3 $indev4 \
+        $outdev1 $outdev2 $outdev3 $outdev4 $longform
+}
+
+proc pdtk_alsa_midi_dialog {id indev1 indev2 indev3 indev4 \
+        outdev1 outdev2 outdev3 outdev4 longform alsa} {
+    ::dialog_midi::pdtk_alsa_midi_dialog \
+        $id $indev1 $indev2 $indev3 $indev4 \
+        $outdev1 $outdev2 $outdev3 $outdev4 $longform $alsa
+}
diff --git a/pd/src/search-plugin.tcl b/pd/src/search-plugin.tcl
index 39e96e1813ec8d89d24bc414fa88622005008279..48ce1702f076e42a747f7bd9e760cb6eb9a44b73 100644
--- a/pd/src/search-plugin.tcl
+++ b/pd/src/search-plugin.tcl
@@ -103,8 +103,6 @@ proc ::dialog_search::resultstext_search {w key} {
     }
     set resultstext .search.resultstext
     $resultstext tag remove sel 1.0 end
-    pdtk_post "key is $key\n"
-    pdtk_post "[$w get]\n"
     set fff_string [$w get]
     set offset 1
     if {$::dialog_search::fff_direction eq "backwards"} {
@@ -115,12 +113,10 @@ proc ::dialog_search::resultstext_search {w key} {
         "[$resultstext index insert] + $offset display chars"
     }
     set insert [$resultstext index insert]
-    pdtk_post "insert is [$resultstext index insert]\n"
     set count ""
     set match ""
     set match [$resultstext search -$::dialog_search::fff_direction \
         -nocase -count count -- $fff_string $insert]
-    pdtk_post "coutn is $count\n"
     if {$match ne ""} {
         $resultstext see $match
         $resultstext tag add sel $match "$match + $count display chars"
@@ -133,7 +129,6 @@ proc ::dialog_search::toggle_fff_bar {mytoplevel} {
     # widgets for the fff bar
     set f $mytoplevel.fff
     set e $f.e
-    pdtk_post "grid slaves is [grid slaves $mytoplevel]\n"
     if {[lsearch -exact [grid slaves $mytoplevel] $f] ne -1} {
         grid forget $f
         focus .search.f.searchtextentry
@@ -169,6 +164,22 @@ proc ::dialog_search::fff_navigate {w dir} {
     resultstext_search $w 36
 }
 
+# this is stolen from pd_bindings.tcl
+proc ::dialog_search::dialog_bindings {mytoplevel dialogname} {
+    variable modifier
+
+    bind $mytoplevel <KeyPress-Escape> "dialog_${dialogname}::cancel $mytoplevel"
+    bind $mytoplevel <KeyPress-Return> "dialog_${dialogname}::ok $mytoplevel"
+    bind $mytoplevel <$::modifier-Key-w> "dialog_${dialogname}::cancel $mytoplevel"
+    # these aren't supported in the dialog, so alert the user, then break so
+    # that no other key bindings are run
+    bind $mytoplevel <$::modifier-Key-s>       {bell; break}
+    bind $mytoplevel <$::modifier-Shift-Key-S> {bell; break}
+    bind $mytoplevel <$::modifier-Key-p>       {bell; break}
+
+    wm protocol $mytoplevel WM_DELETE_WINDOW "dialog_${dialogname}::cancel $mytoplevel"
+}
+
 proc ::dialog_search::create_dialog {mytoplevel} {
     global pd_nt
     global linux_wm_hlcolor
@@ -220,13 +231,16 @@ proc ::dialog_search::create_dialog {mytoplevel} {
     ttk::combobox $mytoplevel.f.genrebox -values $genres -state readonly\
 	-style "Genre.TCombobox" -takefocus 1
     $mytoplevel.f.genrebox current 0
-    ttk::label $mytoplevel.f.advancedlabel -text [_ "Help"] -foreground $linux_wm_hlcolor \
+    ttk::label $mytoplevel.f.advancedlabel -text [_ "Help"] -foreground $pd_colors(link) \
 	-anchor center -style Foo.TLabel
-    text $mytoplevel.navtext -font "$searchfont -12" -height 1 -bd 0 -highlightthickness 0\
-	-padx 8 -pady 3 -bg white -fg black
-    text $mytoplevel.resultstext -yscrollcommand "$mytoplevel.yscrollbar set" \
-        -bg white -highlightcolor blue -height 30 -wrap word -state disabled \
-	-padx 8 -pady 3 -spacing3 2 -bd 0 -highlightthickness 0 -fg black
+    text $mytoplevel.navtext -font "$searchfont -12" -height 1 -bd 0 \
+        -highlightthickness 0 -bg $::pd_colors(canvas_color) \
+	-padx 8 -pady 3 -fg $::pd_colors(text)
+    text $mytoplevel.resultstext \
+        -yscrollcommand "$mytoplevel.yscrollbar set" \
+        -bg $::pd_colors(canvas_color) -fg $::pd_colors(text) \
+        -highlightcolor blue -height 30 -wrap word -state disabled \
+	-padx 8 -pady 3 -spacing3 2 -bd 0 -highlightthickness 0
     ttk::scrollbar $mytoplevel.yscrollbar -command "$mytoplevel.resultstext yview" \
         -takefocus 0
     ttk::label $mytoplevel.statusbar -text [_ "Pd-L2Ork Search"] -justify left \
@@ -278,7 +292,7 @@ proc ::dialog_search::create_dialog {mytoplevel} {
     $mytoplevel.resultstext tag configure intro_libdirs -font "$searchfont -12"
     # make tags for both the results and the nav text widgets
     foreach textwidget [list "$mytoplevel.resultstext" "$mytoplevel.navtext"] {
-        $textwidget tag configure link -foreground $linux_wm_hlcolor
+        $textwidget tag configure link -foreground $::pd_colors(link)
         $textwidget tag bind link <Enter> "$textwidget configure \
             -cursor hand2"
         $textwidget tag bind link <Leave> "$textwidget configure \
@@ -400,9 +414,10 @@ proc ::dialog_search::create_dialog {mytoplevel} {
 	{menu_doc_open doc/5.reference all_about_finding_objects.pd}
     bind $mytoplevel.f.advancedlabel <Return> \
     {menu_doc_open doc/5.reference all_about_finding_objects.pd}
-#   Right now we're suppressing dialog bindings because helpbrowser namespace
-#   doesn't work unless all procs are prefixed with dialog_
-#    ::pd_bindings::dialog_bindings $mytoplevel "search"
+    # hardcoded this into ::dialog_search namespace from 0.43's
+    # pd_bindings.tcl.  But really l2ork just needs to use 0.43's
+    # API
+    ::dialog_search::dialog_bindings $mytoplevel "search"
 #    bind $mytoplevel <KeyPress-Escape> "search::cancel $mytoplevel"
 #    bind $mytoplevel <KeyPress-Return> "search::ok $mytoplevel"
 #    bind $mytoplevel <$::modifier-Key-w> "search::cancel $mytoplevel"
@@ -1518,7 +1533,7 @@ proc ::dialog_search::print_navbar {foo} {
     set separator /
     set text .search.navtext
     $text configure -state normal
-    $text delet 1.0 end
+    $text delete 1.0 end
     $text insert 1.0 [_ "Home"] "link intro navbar"
     if {[llength $navbar] == 0} {
 	$text configure -state disabled