From f7b6578f4e02f0a954ec2f4be010848bb2e25bde Mon Sep 17 00:00:00 2001
From: illuminatedwax <dranger@gmail.com>
Date: Tue, 8 Mar 2011 22:36:05 -0600
Subject: [PATCH 1/7] fdsafds

---
 TODO                        | 1 +
 pesterchum.js               | 2 +-
 themes/trollian2.5/style.js | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/TODO b/TODO
index 9ff12b0..e024b18 100644
--- a/TODO
+++ b/TODO
@@ -3,6 +3,7 @@ Bugs:
 * Issues with connecting? Client not closing connection right? People keep getting "nick taken" messages
 * Windows XP SP2: sometimes mouse clicks dont register? must be some kinda crash
 * don't save pesterClientXXX names
+* enamel doesnt have time arrows
 
 Mac Bugs:
 * Mac doesn't show tabs right, display gifs, highlighting thing?
diff --git a/pesterchum.js b/pesterchum.js
index 74afc9e..0b88a45 100644
--- a/pesterchum.js
+++ b/pesterchum.js
@@ -1 +1 @@
-{"hideOfflineChums": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file
+{"hideOfflineChums": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file
diff --git a/themes/trollian2.5/style.js b/themes/trollian2.5/style.js
index cf3c96e..d478374 100644
--- a/themes/trollian2.5/style.js
+++ b/themes/trollian2.5/style.js
@@ -180,7 +180,7 @@
                     },
              "buttons": { "style": "color: black; font: bold; border: 2px solid #780000; font: bold; font-size: 12px; background: #e5000f; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" }
           },
-
+   "tabwindow": { "style": ""; }
    "tabs": {
        "style": "",
        "selectedstyle": "",

From fdcc146b206d9ee013359cd2ee16a43258378160 Mon Sep 17 00:00:00 2001
From: illuminatedwax <dranger@gmail.com>
Date: Sun, 13 Mar 2011 01:07:25 -0600
Subject: [PATCH 2/7] fds

---
 TODO          | 6 +++++-
 pesterchum.js | 2 +-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/TODO b/TODO
index b0cdd42..3a00ffb 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,5 @@
-o Bugs:
+Bugs:
+* multiline msgs breaks shit
 * Windows doesn't show style sheet sometimes?? Maybe related to themes.
 * Issues with connecting? Client not closing connection right? People keep getting "nick taken" messages
 * Windows XP SP2: sometimes mouse clicks dont register? must be some kinda crash
@@ -14,6 +15,9 @@ SS: but the memo one doesn't resize
 SS: and the arrows next to the time thing overlap the CLOSE button
 
 Features:
+* OOC
+* random pesters
+* # of users in each memo
 * copy quirks between profiles?
 * help button on quirks menu?
 * chum list groups
diff --git a/pesterchum.js b/pesterchum.js
index 059e892..41cd47e 100644
--- a/pesterchum.js
+++ b/pesterchum.js
@@ -1 +1 @@
-{"hideOfflineChums": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed"], "defaultprofile": "ghostDunk", "block": []}
+{"hideOfflineChums": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file

From 39e859e2f5d8ae1bbbf191a3f4a0ebe17607b7b1 Mon Sep 17 00:00:00 2001
From: illuminatedwax <dranger@gmail.com>
Date: Fri, 1 Apr 2011 00:53:22 -0500
Subject: [PATCH 3/7] fds

---
 pesterchum.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pesterchum.js b/pesterchum.js
index 41cd47e..9e037b8 100644
--- a/pesterchum.js
+++ b/pesterchum.js
@@ -1 +1 @@
-{"hideOfflineChums": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file
+{"hideOfflineChums": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file

From d17d4f1189adaf959a07d8f5d4c0c3c4d2a549ef Mon Sep 17 00:00:00 2001
From: illuminatedwax <dranger@gmail.com>
Date: Wed, 6 Apr 2011 11:39:05 -0500
Subject: [PATCH 4/7] derp

---
 pesterchum.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pesterchum.js b/pesterchum.js
index 9e037b8..618a8ae 100644
--- a/pesterchum.js
+++ b/pesterchum.js
@@ -1 +1 @@
-{"hideOfflineChums": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file
+{"hideOfflineChums": false, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars", "alGore"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file

From a19e5d1df5cb8a27dec4ec26037b94969f3f7967 Mon Sep 17 00:00:00 2001
From: illuminatedwax <dranger@gmail.com>
Date: Fri, 8 Apr 2011 02:39:19 -0500
Subject: [PATCH 5/7] merges, bugfixes

---
 CHANGELOG.mkdn             |  10 +-
 TODO                       |  24 +--
 dataobjs.py                |  15 +-
 generic.py                 |   7 -
 logviewer.py               |   6 +-
 memos.py                   |  30 +--
 menus.py                   |  13 --
 parsetools.py              |   6 +-
 pesterchum.js              |   2 +-
 pesterchum.py              | 425 ++++++-------------------------------
 themes/enamel/style.js     | 186 ++++++++--------
 themes/gold/style.js       | 206 +++++++++---------
 themes/pesterchum/style.js | 160 +++++++-------
 themes/trollian/style.js   |  69 +++---
 themes/typewriter/style.js |  78 ++++---
 15 files changed, 449 insertions(+), 788 deletions(-)

diff --git a/CHANGELOG.mkdn b/CHANGELOG.mkdn
index 193c47f..058a066 100644
--- a/CHANGELOG.mkdn
+++ b/CHANGELOG.mkdn
@@ -7,12 +7,16 @@ Visit https://github.com/illuminatedwax/pesterchum for git access and source cod
 
 CHANGELOG
 ---------
-### 3.14b (idk on version number scheme)
+### 3.14.2
 * Pesterchum 3.14 - illuminatedwax [ghostDunk]
 * Art - Grimlive [aquaMarinist]
 * Quirks lower() function - Kiooeht [evacipatedBox]
 * Quirks scrabble() function - Kiooeht [evacipatedBox]
 * Timestamps - Kiooeht [evacipatedBox]
 * Logviewer - Kiooeht [evacipatedBox]
-* Chum list groups - Kiooeht [evacipatedBox]
-* Chum list bug fixes - Kiooeht [evacipatedBox]
+* Quirk ordering - alGore
+* # of users in a memo
+
+BUG FIXES:
+* incorrect characters in memos no longer break log file names
+* memos now do not break on case-sensitivity
diff --git a/TODO b/TODO
index 16da57f..7945cd4 100644
--- a/TODO
+++ b/TODO
@@ -2,14 +2,22 @@ Bugs:
 * multiline msgs breaks shit
 * REGEXP: \b(\S)(\S*)(\S)\b REPLACE WITH: upper(\1)\2upper(\3) <--
    this regexp, when used as a quirk and then typed in breaks
-* import modified.tar
 * channels aren't case sensitive! get the real name of a channel
 * Windows doesn't show style sheet sometimes?? Maybe related to themes.
 * Issues with connecting? Client not closing connection right? People keep getting "nick taken" messages
 * Windows XP SP2: sometimes mouse clicks dont register? must be some kinda crash
-* don't save pesterClientXXX names
 * enamel doesnt have time arrows
-* need to make it so "/" in a memo doesn't mess up the logs
+
+Features:
+* OOC
+* log viewer needs to have BBCode/HTML/Text copy modes
+* random pesters
+* copy quirks between profiles?
+* chum list groups
+* More complex quirks: by-sound
+* Theme checking
+* Spy mode
+* Animated
 
 Mac Bugs:
 * Mac doesn't show tabs right, display gifs, highlighting thing?
@@ -18,13 +26,3 @@ SS: in the one-on-one pester it resizes with the window
 SS: but the memo one doesn't resize
 SS: and the arrows next to the time thing overlap the CLOSE button
 
-Features:
-* OOC
-* random pesters
-* # of users in each memo
-* copy quirks between profiles?
-* help button on quirks menu?
-* More complex quirks: by-sound
-* Theme checking
-* Spy mode
-* Animated
diff --git a/dataobjs.py b/dataobjs.py
index b6459fc..94d8797 100644
--- a/dataobjs.py
+++ b/dataobjs.py
@@ -10,6 +10,7 @@ from mispeller import mispeller
 _upperre = re.compile(r"upper\(([\w\\]+)\)")
 _lowerre = re.compile(r"lower\(([\w\\]+)\)")
 _scramblere = re.compile(r"scramble\(([\w\\]+)\)")
+_reversere = re.compile(r"reverse\(([\w\\]+)\)")
 
 class Mood(object):
     moods = ["chummy", "rancorous", "offline", "pleasant", "distraught",
@@ -68,9 +69,12 @@ class pesterQuirk(object):
                     return mo.expand(m.group(1)).lower()
                 def scramblerep(m):
                     return "".join(random.sample(mo.expand(m.group(1)), len(mo.expand(m.group(1)))))
+                def reverserep(m):
+                    return mo.expand(m.group(1))[::-1]
                 to = _upperre.sub(upperrep, to)
                 to = _lowerre.sub(lowerrep, to)
                 to = _scramblere.sub(scramblerep, to)
+                to = _reversere.sub(reverserep, to)
                 return mo.expand(to)
             return re.sub(fr, regexprep, string)
         elif self.type == "random":
@@ -181,7 +185,7 @@ class pesterQuirks(object):
             yield q
 
 class PesterProfile(object):
-    def __init__(self, handle, color=None, mood=Mood("offline"), group=None, chumdb=None):
+    def __init__(self, handle, color=None, mood=Mood("offline"), chumdb=None):
         self.handle = handle
         if color is None:
             if chumdb:
@@ -190,12 +194,6 @@ class PesterProfile(object):
                 color = QtGui.QColor("black")
         self.color = color
         self.mood = mood
-        if group is None:
-            if chumdb:
-                group = chumdb.getGroup(handle, "Chums")
-            else:
-                group = "Chums"
-        self.group = group
     def initials(self, time=None):
         handle = self.handle
         caps = [l for l in handle if l.isupper()]
@@ -225,8 +223,7 @@ class PesterProfile(object):
     def plaindict(self):
         return (self.handle, {"handle": self.handle,
                               "mood": self.mood.name(),
-                              "color": unicode(self.color.name()),
-                              "group": unicode(self.group)})
+                              "color": unicode(self.color.name())})
     def blocked(self, config):
         return self.handle in config.getBlocklist()
 
diff --git a/generic.py b/generic.py
index 2c0f265..fd77ad6 100644
--- a/generic.py
+++ b/generic.py
@@ -37,13 +37,6 @@ class RightClickList(QtGui.QListWidget):
             self.setCurrentItem(listing)
             self.optionsMenu.popup(event.globalPos())
 
-class RightClickTree(QtGui.QTreeWidget):
-    def contextMenuEvent(self, event):
-        if event.reason() == QtGui.QContextMenuEvent.Mouse:
-            listing = self.itemAt(event.pos())
-            self.setCurrentItem(listing)
-            self.optionsMenu.popup(event.globalPos())
-
 class MultiTextDialog(QtGui.QDialog):
     def __init__(self, title, parent, *queries):
         QtGui.QDialog.__init__(self, parent)
diff --git a/logviewer.py b/logviewer.py
index b543731..b1c9474 100644
--- a/logviewer.py
+++ b/logviewer.py
@@ -3,7 +3,7 @@ import codecs
 import re
 from time import strftime, strptime
 from PyQt4 import QtGui, QtCore
-from generic import RightClickList, RightClickTree
+from generic import RightClickList
 from parsetools import convertTags
 from convo import PesterText
 
@@ -138,8 +138,7 @@ class PesterLogViewer(QtGui.QDialog):
             self.logList.sort()
             self.logList.reverse()
 
-            self.tree = RightClickTree()
-            self.tree.optionsMenu = QtGui.QMenu(self)
+            self.tree = QtGui.QTreeWidget()
             self.tree.setFixedSize(260, 300)
             self.tree.header().hide()
             if theme.has_key("convo/scrollbar"):
@@ -149,7 +148,6 @@ class PesterLogViewer(QtGui.QDialog):
             self.connect(self.tree, QtCore.SIGNAL('itemSelectionChanged()'),
                              self, QtCore.SLOT('loadSelectedLog()'))
             self.tree.setSortingEnabled(False)
-
             child_1 = None
             last = ["",""]
             for (i,l) in enumerate(self.logList):
diff --git a/memos.py b/memos.py
index 36066e1..66aff11 100644
--- a/memos.py
+++ b/memos.py
@@ -218,10 +218,10 @@ class MemoTabWindow(PesterTabWindow):
     def __init__(self, mainwindow, parent=None):
         PesterTabWindow.__init__(self, mainwindow, parent, "memos")
     def addChat(self, convo):
-        self.convos[convo.channel] = convo
+        self.convos[convo.channel.upper()] = convo
         # either addTab or setCurrentIndex will trigger changed()
-        newindex = self.tabs.addTab(convo.channel)
-        self.tabIndices[convo.channel] = newindex
+        newindex = self.tabs.addTab(convo.channel.upper())
+        self.tabIndices[convo.channel.upper()] = newindex
         self.tabs.setCurrentIndex(newindex)
         self.tabs.setTabIcon(newindex, PesterIcon(self.mainwindow.theme["memos/memoicon"]))
     def updateBlocked(self):
@@ -291,16 +291,16 @@ class MemoText(PesterText):
             grammar = time.getGrammar()
             joinmsg = chum.memojoinmsg(systemColor, time.getTime(), grammar, window.theme["convo/text/joinmemo"])
             self.append(convertTags(joinmsg))
-            parent.mainwindow.chatlog.log(parent.channel, joinmsg)
+            parent.mainwindow.chatlog.log(parent.channel.upper(), joinmsg)
             time.openCurrentTime()
 
         if type(lexmsg[0]) is mecmd:
             memsg = chum.memsg(systemColor, lexmsg, time=time.getGrammar())
-            window.chatlog.log(parent.channel, memsg)
+            window.chatlog.log(parent.channel.upper(), memsg)
             self.append(convertTags(memsg))
         else:
             self.append(convertTags(lexmsg))
-            window.chatlog.log(parent.channel, lexmsg)
+            window.chatlog.log(parent.channel.upper(), lexmsg)
         
     def changeTheme(self, theme):
         self.initTheme(theme)
@@ -417,7 +417,7 @@ class PesterMemo(PesterConvo):
         msg = p.memoopenmsg(systemColor, self.time.getTime(), timeGrammar, self.mainwindow.theme["convo/text/openmemo"], self.channel)
         self.time.openCurrentTime()
         self.textArea.append(convertTags(msg))
-        self.mainwindow.chatlog.log(self.channel, msg)
+        self.mainwindow.chatlog.log(self.channel.upper(), msg)
 
         self.op = False
         self.newmessage = False
@@ -425,7 +425,7 @@ class PesterMemo(PesterConvo):
         self.applyquirks = True
 
     def title(self):
-        return self.channel
+        return self.channel.upper()
     def icon(self):
         return PesterIcon(self.mainwindow.theme["memos/memoicon"])
 
@@ -555,7 +555,7 @@ class PesterMemo(PesterConvo):
                     self.times[handle].removeTime(close)
                     msg = chum.memoclosemsg(systemColor, grammar, window.theme["convo/text/closememo"])
                     self.textArea.append(convertTags(msg))
-                    self.mainwindow.chatlog.log(self.channel, msg)
+                    self.mainwindow.chatlog.log(self.channel.upper(), msg)
             elif timed not in self.times[handle]:
                 self.times[handle].addTime(timed)
             else:
@@ -601,7 +601,7 @@ class PesterMemo(PesterConvo):
         namesdb = self.mainwindow.namesdb
         # reload names
         self.userlist.clear()
-        for n in self.mainwindow.namesdb[self.channel]:
+        for n in self.mainwindow.namesdb[self.channel.upper()]:
             self.addUser(n)
 
     @QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString)
@@ -635,7 +635,7 @@ class PesterMemo(PesterConvo):
                     grammar = t.getGrammar()
                     msg = chum.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"])
                     self.textArea.append(convertTags(msg))
-                    self.mainwindow.chatlog.log(self.channel, msg)
+                    self.mainwindow.chatlog.log(self.channel.upper(), msg)
                     self.times[h].removeTime(t.getTime())
                 if update == "nick":
                     self.addUser(newnick)
@@ -663,7 +663,7 @@ class PesterMemo(PesterConvo):
                     opgrammar = TimeGrammar("CURRENT", "C", "RIGHT NOW")
                 msg = chum.memobanmsg(opchum, opgrammar, systemColor, grammar)
                 self.textArea.append(convertTags(msg))
-                self.mainwindow.chatlog.log(self.channel, msg)
+                self.mainwindow.chatlog.log(self.channel.upper(), msg)
                 ttracker.removeTime(ttracker.getTime())
 
             if chum is self.mainwindow.profile():
@@ -682,10 +682,10 @@ class PesterMemo(PesterConvo):
                     self.time.openCurrentTime()
                     msg = me.memoopenmsg(systemColor, self.time.getTime(), self.time.getGrammar(), self.mainwindow.theme["convo/text/openmemo"], self.channel)
                     self.textArea.append(convertTags(msg))
-                    self.mainwindow.chatlog.log(self.channel, msg)
+                    self.mainwindow.chatlog.log(self.channel.upper(), msg)
                 elif ret == QtGui.QMessageBox.Cancel:
                     if self.parent():
-                        i = self.parent().tabIndices[self.channel]
+                        i = self.parent().tabIndices[self.channel.upper()]
                         self.parent().tabClose(i)
                     else:
                         self.close()
@@ -749,7 +749,7 @@ class PesterMemo(PesterConvo):
             systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"])
             msg = me.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"])
             self.textArea.append(convertTags(msg))
-            self.mainwindow.chatlog.log(self.channel, msg)
+            self.mainwindow.chatlog.log(self.channel.upper(), msg)
 
         newtime = self.time.getTime()
         if newtime is None:
diff --git a/menus.py b/menus.py
index 551caa0..1ffe9ef 100644
--- a/menus.py
+++ b/menus.py
@@ -544,10 +544,6 @@ class PesterOptions(QtGui.QDialog):
         self.theme = theme
         self.setStyleSheet(self.theme["main/defaultwindow/style"])
 
-        hr = QtGui.QFrame()
-        hr.setFrameShape(QtGui.QFrame.HLine)
-        hr.setFrameShadow(QtGui.QFrame.Sunken)
-
         self.tabcheck = QtGui.QCheckBox("Tabbed Conversations", self)
         if self.config.tabs():
             self.tabcheck.setChecked(True)
@@ -574,12 +570,6 @@ class PesterOptions(QtGui.QDialog):
         if self.config.showSeconds():
             self.secondscheck.setChecked(True)
 
-        # Will add ability to turn off groups later
-        #self.groupscheck = QtGui.QCheckBox("Use Groups", self)
-        #self.groupscheck.setChecked(self.config.useGroups())
-        self.showemptycheck = QtGui.QCheckBox("Show Empty Groups", self)
-        self.showemptycheck.setChecked(self.config.showEmptyGroups())
-
         self.ok = QtGui.QPushButton("OK", self)
         self.ok.setDefault(True)
         self.connect(self.ok, QtCore.SIGNAL('clicked()'),
@@ -595,9 +585,6 @@ class PesterOptions(QtGui.QDialog):
         layout_0.addWidget(self.tabcheck)
         layout_0.addWidget(self.soundcheck)
         layout_0.addWidget(self.hideOffline)
-        #layout_0.addWidget(self.groupscheck)
-        layout_0.addWidget(self.showemptycheck)
-        layout_0.addWidget(hr)
         layout_0.addWidget(self.timestampcheck)
         layout_0.addWidget(self.timestampBox)
         layout_0.addWidget(self.secondscheck)
diff --git a/parsetools.py b/parsetools.py
index 67f79da..c70beb7 100644
--- a/parsetools.py
+++ b/parsetools.py
@@ -216,7 +216,7 @@ def timeDifference(td):
     elif atd < timedelta(0,3600):
         if minutes == 1:
             timetext = "%d MINUTE %s" % (minutes, when)
-        else:
+        else: 
             timetext = "%d MINUTES %s" % (minutes, when)
     elif atd < timedelta(0,3600*100):
         if hours == 1 and leftoverminutes == 0:
@@ -235,7 +235,7 @@ def img2smiley(string):
     return string
 
 smiledict = {
-    ":rancorous:": "pc_rancorous.gif",
+    ":rancorous:": "pc_rancorous.gif",  
     ":apple:": "apple.gif",
     ":bathearst:": "bathearst.gif",
     ":cathearst:": "cathearst.png",
@@ -245,7 +245,7 @@ smiledict = {
     ":blueghost:": "blueslimer.gif",
     ":slimer:": "slimer.gif",
     ":candycorn:": "candycorn.gif",
-    ":cheer:": "cheer.gif",
+    ":cheer:": "cheer.gif", 
     ":duhjohn:": "confusedjohn.gif",
     ":datrump:": "datrump.gif",
     ":facepalm:": "facepalm.gif",
diff --git a/pesterchum.js b/pesterchum.js
index 618a8ae..6ef578a 100644
--- a/pesterchum.js
+++ b/pesterchum.js
@@ -1 +1 @@
-{"hideOfflineChums": false, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars", "alGore"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file
+{"hideOfflineChums": false, "time12Format": true, "tabs": true, "showSeconds": false, "server": "irc.mindfang.org", "soundon": true, "showTimeStamps": false, "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars", "alGore"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file
diff --git a/pesterchum.py b/pesterchum.py
index 1282cf1..5965023 100644
--- a/pesterchum.py
+++ b/pesterchum.py
@@ -18,7 +18,7 @@ from menus import PesterChooseQuirks, PesterChooseTheme, \
     PesterChooseProfile, PesterOptions, PesterUserlist, PesterMemoList, \
     LoadingScreen, AboutPesterchum
 from dataobjs import PesterProfile, Mood, pesterQuirk, pesterQuirks
-from generic import PesterIcon, RightClickList, RightClickTree, MultiTextDialog, PesterList
+from generic import PesterIcon, RightClickList, MultiTextDialog, PesterList
 from convo import PesterTabWindow, PesterText, PesterInput, PesterConvo
 from parsetools import convertTags, addTimeInitial
 from memos import PesterMemo, MemoTabWindow, TimeTracker
@@ -78,10 +78,13 @@ class PesterLog(object):
             self.logpath = _datadir+"logs"
 
     def log(self, handle, msg):
-        time = strftime("[%H:%M:%S] ")
-        bbcodemsg = time + convertTags(msg, "bbcode")
-        html = time + convertTags(msg, "html")+"<br />"
-        msg = time + convertTags(msg, "text")
+        #watch out for illegal characters
+        handle = re.sub(r'[<>:"/\\|?*]', "_", handle)
+        #time = strftime("[%H:%M:%S] ")
+        # no time codes in logs
+        bbcodemsg = convertTags(msg, "bbcode")
+        html = convertTags(msg, "html")+"<br />"
+        msg = convertTags(msg, "text")
         modes = {"bbcode": bbcodemsg, "html": html, "text": msg}
         if not self.convos.has_key(handle):
             time = datetime.now().strftime("%Y-%m-%d.%H.%M")
@@ -131,14 +134,7 @@ class PesterProfileDB(dict):
             json.dump(chumdict, fp)
             fp.close()
 
-        u = []
-        for (handle, c) in chumdict.iteritems():
-            try:
-                g = c['group']
-                u.append((handle, PesterProfile(handle, color=QtGui.QColor(c['color']), mood=Mood(c['mood']), group=g)))
-            except KeyError:
-                u.append((handle, PesterProfile(handle, color=QtGui.QColor(c['color']), mood=Mood(c['mood']))))
-        converted = dict(u)
+        converted = dict([(handle, PesterProfile(handle, color=QtGui.QColor(c['color']), mood=Mood(c['mood']))) for (handle, c) in chumdict.iteritems()])
         self.update(converted)
 
     def save(self):
@@ -159,17 +155,6 @@ class PesterProfileDB(dict):
             self[handle].color = color
         else:
             self[handle] = PesterProfile(handle, color)
-    def getGroup(self, handle, default="Chums"):
-        if not self.has_key(handle):
-            return default
-        else:
-            return self[handle].group
-    def setGroup(self, handle, theGroup):
-        if self.has_key(handle):
-            self[handle].group = theGroup
-        else:
-            self[handle] = PesterProfile(handle, group=theGroup)
-        self.save()
     def __setitem__(self, key, val):
         dict.__setitem__(self, key, val)
         self.save()
@@ -282,18 +267,6 @@ class userConfig(object):
         if not self.config.has_key('showSeconds'):
             self.set("showSeconds", False)
         return self.config.get('showSeconds', False)
-    def useGroups(self):
-        if not self.config.has_key('useGroups'):
-            self.set("useGroups", False)
-        return self.config.get('useGroups', False)
-    def openDefaultGroup(self):
-        if not self.config.has_key('openDefaultGroup'):
-            self.set("openDefaultGroup", True)
-        return self.config.get('openDefaultGroup', True)
-    def showEmptyGroups(self):
-        if not self.config.has_key('emptyGroups'):
-            self.set("emptyGroups", False)
-        return self.config.get('emptyGroups', False)
     def addChum(self, chum):
         if chum.handle not in self.chums():
             fp = open(self.filename) # what if we have two clients open??
@@ -321,25 +294,6 @@ class userConfig(object):
         l = self.getBlocklist()
         l.pop(l.index(handle))
         self.set('block', l)
-    def getGroups(self):
-        if not self.config.has_key('groups'):
-            self.set('groups', [])
-        return self.config.get('groups', [])
-    def addGroup(self, group, open=False):
-        l = self.getGroups()
-        if group not in l:
-            l.append([group,open])
-            l.sort()
-            self.set('groups', l)
-    def delGroup(self, group):
-        l = self.getGroups()
-        i = 0
-        for g in l:
-            if g[0] == group: break
-            i = i+1
-        l.pop(i)
-        l.sort()
-        self.set('groups', l)
     def server(self):
         return self.config.get('server', 'irc.mindfang.org')
     def port(self):
@@ -428,6 +382,9 @@ class userProfile(object):
         return self.theme
     def save(self):
         handle = self.chat.handle
+        if handle[0:12] == "pesterClient":
+            # dont save temp profiles
+            return
         try:
             jsonoutput = json.dumps(self.userprofile)
         except ValueError, e:
@@ -453,9 +410,9 @@ class WMButton(QtGui.QPushButton):
         self.setStyleSheet("QPushButton { padding: 0px; }")
         self.setAutoDefault(False)
 
-class chumListing(QtGui.QTreeWidgetItem):
+class chumListing(QtGui.QListWidgetItem):
     def __init__(self, chum, window):
-        QtGui.QTreeWidgetItem.__init__(self, [chum.handle])
+        QtGui.QListWidgetItem.__init__(self, chum.handle)
         self.mainwindow = window
         self.chum = chum
         self.handle = chum.handle
@@ -469,44 +426,32 @@ class chumListing(QtGui.QTreeWidgetItem):
         mood = self.chum.mood
         self.mood = mood
         icon = self.mood.icon(self.mainwindow.theme)
-        self.setIcon(0, icon)
+        self.setIcon(icon)
         try:
-            self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"]))
+            self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"]))
         except KeyError:
-            self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"]))
+            self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"]))
     def changeTheme(self, theme):
         icon = self.mood.icon(theme)
-        self.setIcon(0, icon)
+        self.setIcon(icon)
         try:
-            self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"]))
+            self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"]))
         except KeyError:
-            self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"]))
+            self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"]))
     def __lt__(self, cl):
         h1 = self.handle.lower()
         h2 = cl.handle.lower()
         return (h1 < h2)
 
-class chumArea(RightClickTree):
+class chumArea(RightClickList):
     def __init__(self, chums, parent=None):
-        QtGui.QTreeWidget.__init__(self, parent)
+        QtGui.QListWidget.__init__(self, parent)
         self.mainwindow = parent
         theme = self.mainwindow.theme
         self.chums = chums
-        gTemp = self.mainwindow.config.getGroups()
-        self.groups = [g[0] for g in gTemp]
-        self.openGroups = [g[1] for g in gTemp]
-        # quick hack to sort saved groups
-        self.mainwindow.config.addGroup("f3rskv9dssag[%3ffvsla09iv34G#$v")
-        self.mainwindow.config.delGroup("f3rskv9dssag[%3ffvsla09iv34G#$v")
-        # end quick hack
-        self.showAllGroups()
         if not self.mainwindow.config.hideOfflineChums():
             self.showAllChums()
-        if not self.mainwindow.config.showEmptyGroups():
-            self.hideEmptyGroups()
-        self.chumoptions = QtGui.QMenu(self)
-        self.groupoptions = QtGui.QMenu(self)
-        self.optionsMenu = self.chumoptions
+        self.optionsMenu = QtGui.QMenu(self)
         self.pester = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/pester"], self)
         self.connect(self.pester, QtCore.SIGNAL('triggered()'),
                      self, QtCore.SLOT('activateChum()'))
@@ -519,83 +464,13 @@ class chumArea(RightClickTree):
         self.logchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/viewlog"], self)
         self.connect(self.logchum, QtCore.SIGNAL('triggered()'),
                      self, QtCore.SLOT('openChumLogs()'))
-
-        self.removegroup = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/removegroup"], self)
-        self.connect(self.removegroup, QtCore.SIGNAL('triggered()'),
-                     self, QtCore.SLOT('removeGroup()'))
-        self.renamegroup = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/renamegroup"], self)
-        self.connect(self.renamegroup, QtCore.SIGNAL('triggered()'),
-                     self, QtCore.SLOT('renameGroup()'))
-        self.chumoptions.addAction(self.pester)
-        self.chumoptions.addAction(self.logchum)
-        self.chumoptions.addAction(self.blockchum)
-        self.chumoptions.addAction(self.removechum)
-        self.moveMenu = QtGui.QMenu(self.mainwindow.theme["main/menus/rclickchumlist/movechum"], self)
-        self.chumoptions.addMenu(self.moveMenu)
-        self.moveGroupMenu()
-
-        self.groupoptions.addAction(self.renamegroup)
-        self.groupoptions.addAction(self.removegroup)
+        self.optionsMenu.addAction(self.pester)
+        self.optionsMenu.addAction(self.logchum)
+        self.optionsMenu.addAction(self.blockchum)
+        self.optionsMenu.addAction(self.removechum)
 
         self.initTheme(theme)
-        #self.sortItems()
-        #self.sortItems(1, QtCore.Qt.AscendingOrder)
-        self.setSortingEnabled(False)
-        self.header().hide()
-        self.setDropIndicatorShown(False)
-        self.setIndentation(0)
-        self.setDragEnabled(True)
-        self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
-
-        self.connect(self, QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem *, int)'),
-                     self, QtCore.SLOT('expandGroup()'))
-
-    def dropEvent(self, event):
-        item = self.itemAt(event.pos())
-        if item:
-            if item.text(0) == "Chums" or item.text(0) in self.groups:
-                group = item.text(0)
-            else:
-                group = item.parent().text(0)
-            chumLabel = event.source().currentItem()
-            chumLabel.chum.group = group
-            self.mainwindow.chumdb.setGroup(chumLabel.chum.handle, group)
-            self.takeItem(chumLabel)
-            self.addItem(chumLabel)
-
-    def chumoptionsmenu(self):
-        self.optionsMenu = self.chumoptions
-    def groupoptionsmenu(self):
-        self.optionsMenu = self.groupoptions
-    def moveGroupMenu(self):
-        currentGroup = self.currentItem()
-        if currentGroup:
-            currentGroup = currentGroup.parent().text(0)
-        self.moveMenu.clear()
-        actGroup = QtGui.QActionGroup(self)
-
-        groups = self.groups[:]
-        groups.insert(0, "Chums")
-        for gtext in groups:
-            if gtext == currentGroup:
-                continue
-            movegroup = self.moveMenu.addAction(gtext)
-            actGroup.addAction(movegroup)
-        self.connect(actGroup, QtCore.SIGNAL('triggered(QAction *)'),
-                     self, QtCore.SLOT('moveToGroup(QAction *)'))
-    def contextMenuEvent(self, event):
-        #fuckin Qt
-        if event.reason() == QtGui.QContextMenuEvent.Mouse:
-            listing = self.itemAt(event.pos())
-            self.setCurrentItem(listing)
-            if self.currentItem().text(0) == "Chums" or \
-               self.currentItem().text(0) in self.groups:
-                self.groupoptionsmenu()
-            else:
-                self.chumoptionsmenu()
-                self.moveGroupMenu()
-            self.optionsMenu.popup(event.globalPos())
-
+        self.sortItems()
     def addChum(self, chum):
         if len([c for c in self.chums if c.handle == chum.handle]) != 0:
             return
@@ -604,95 +479,29 @@ class chumArea(RightClickTree):
                 chum.mood.name() == "offline"):
             chumLabel = chumListing(chum, self.mainwindow)
             self.addItem(chumLabel)
-            #self.topLevelItem(0).addChild(chumLabel)
-            #self.topLevelItem(0).sortChildren(0, QtCore.Qt.AscendingOrder)
+            self.sortItems()
 
     def getChums(self, handle):
-        chums = self.findItems(handle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive)
+        chums = self.findItems(handle, QtCore.Qt.MatchFlags(0))
         return chums
 
     def showAllChums(self):
         for c in self.chums:
             chandle = c.handle
-            if not len(self.findItems(chandle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive)):
+            if not self.findItems(chandle, QtCore.Qt.MatchFlags(0)):
                 chumLabel = chumListing(c, self.mainwindow)
                 self.addItem(chumLabel)
-        #self.sortItems()
+        self.sortItems()
     def hideOfflineChums(self):
-        for j in range(self.topLevelItemCount()):
-            i = 0
-            listing = self.topLevelItem(j).child(i)
-            while listing is not None:
-                if listing.chum.mood.name() == "offline":
-                    self.topLevelItem(j).takeChild(i)
-                else:
-                    i += 1
-                listing = self.topLevelItem(j).child(i)
-            self.topLevelItem(j).sortChildren(0, QtCore.Qt.AscendingOrder)
-    def showAllGroups(self):
-        curgroups = []
-        for i in range(self.topLevelItemCount()):
-            curgroups.append(self.topLevelItem(i).text(0))
-        if "Chums" not in curgroups:
-            child_1 = QtGui.QTreeWidgetItem(["Chums"])
-            self.addTopLevelItem(child_1)
-            if self.mainwindow.config.openDefaultGroup():
-                child_1.setExpanded(True)
-        for i,g in enumerate(self.groups):
-            if g not in curgroups:
-                child_1 = QtGui.QTreeWidgetItem(["%s" % (g)])
-                self.addTopLevelItem(child_1)
-                if self.openGroups[i]:
-                    child_1.setExpanded(True)
-    def hideEmptyGroups(self):
         i = 0
-        listing = self.topLevelItem(i)
+        listing = self.item(i)
         while listing is not None:
-            if listing.childCount() == 0:
-                self.takeTopLevelItem(i)
+            if listing.chum.mood.name() == "offline":
+                self.takeItem(i)
             else:
                 i += 1
-            listing = self.topLevelItem(i)
-    @QtCore.pyqtSlot()
-    def expandGroup(self):
-        item = self.currentItem()
-        if item.text(0) in self.groups:
-            self.mainwindow.config.delGroup(str(item.text(0)))
-            expand = item.isExpanded()
-            self.mainwindow.config.addGroup(str(item.text(0)), not expand)
-        elif item.text(0) == "Chums":
-            self.mainwindow.config.set("openDefaultGroup", not item.isExpanded())
-    def addItem(self, chumLabel):
-        if hasattr(self, 'groups'):
-            if chumLabel.chum.group not in self.groups:
-                self.topLevelItem(0).addChild(chumLabel)
-                self.topLevelItem(0).sortChildren(0, QtCore.Qt.AscendingOrder)
-            else:
-                if not self.findItems(chumLabel.handle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive):
-                    if not self.findItems(chumLabel.chum.group, QtCore.Qt.MatchFlags(0)):
-                        child_1 = QtGui.QTreeWidgetItem(["%s" % (chumLabel.chum.group)])
-                        self.addTopLevelItem(child_1)
-                        if self.openGroups[self.groups.index("%s" % (chumLabel.chum.group))]:
-                            child_1.setExpanded(True)
-                    for i in range(self.topLevelItemCount()):
-                        if self.topLevelItem(i).text(0) == chumLabel.chum.group:
-                            break
-                    self.topLevelItem(i).addChild(chumLabel)
-                    self.topLevelItem(i).sortChildren(0, QtCore.Qt.AscendingOrder)
-        else: # usually means this is now the trollslum
-            if not self.findItems(chumLabel.handle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive):
-                self.topLevelItem(0).addChild(chumLabel)
-                self.topLevelItem(0).sortChildren(0, QtCore.Qt.AscendingOrder)
-    def takeItem(self, chumLabel):
-        r = None
-        for i in range(self.topLevelItemCount()):
-            for j in range(self.topLevelItem(i).childCount()):
-                if self.topLevelItem(i).child(j).text(0) == chumLabel.chum.handle:
-                    r = self.topLevelItem(i).takeChild(j)
-                    break
-        if not self.mainwindow.config.showEmptyGroups():
-            self.hideEmptyGroups()
-        return r
+            listing = self.item(i)
+        self.sortItems()
     def updateMood(self, handle, mood):
         hideoff = self.mainwindow.config.hideOfflineChums()
         chums = self.getChums(handle)
@@ -703,7 +512,7 @@ class chumArea(RightClickTree):
                     handle in [p.handle for p in self.chums]:
                 newLabel = chumListing([p for p in self.chums if p.handle == handle][0], self.mainwindow)
                 self.addItem(newLabel)
-                #self.sortItems()
+                self.sortItems()
                 chums = [newLabel]
             elif mood.name() == "offline" and \
                     len(chums) > 0:
@@ -729,27 +538,14 @@ class chumArea(RightClickTree):
         self.removechum.setText(theme["main/menus/rclickchumlist/removechum"])
         self.blockchum.setText(theme["main/menus/rclickchumlist/blockchum"])
         self.logchum.setText(theme["main/menus/rclickchumlist/viewlog"])
-        self.removegroup.setText(theme["main/menus/rclickchumlist/removegroup"])
-        self.renamegroup.setText(theme["main/menus/rclickchumlist/renamegroup"])
-        self.moveMenu.setTitle(theme["main/menus/rclickchumlist/movechum"])
     def changeTheme(self, theme):
         self.initTheme(theme)
-        chumlistings = []
-        for i in range(self.topLevelItemCount()):
-            for j in range(self.topLevelItem(i).childCount()):
-                chumlistings.append(self.topLevelItem(i).child(j))
-        #chumlistings = [self.item(i) for i in range(0, self.count())]
+        chumlistings = [self.item(i) for i in range(0, self.count())]
         for c in chumlistings:
             c.changeTheme(theme)
-
-    def count(self):
-        c = 0
-        for i in range(self.topLevelItemCount()):
-            c = c + self.topLevelItem(i).childCount()
-        return c
     @QtCore.pyqtSlot()
     def activateChum(self):
-        self.itemActivated.emit(self.currentItem(), 0)
+        self.itemActivated.emit(self.currentItem())
     @QtCore.pyqtSlot()
     def removeChum(self, handle = None):
         if handle:
@@ -761,7 +557,7 @@ class chumArea(RightClickTree):
         currentChum = self.currentItem().chum
         self.chums = [c for c in self.chums if c.handle != currentChum.handle]
         self.removeChumSignal.emit(self.currentItem().chum.handle)
-        oldlist = self.takeItem(self.currentItem())
+        oldlist = self.takeItem(self.currentRow())
         del oldlist
     @QtCore.pyqtSlot()
     def blockChum(self):
@@ -771,7 +567,7 @@ class chumArea(RightClickTree):
         self.blockChumSignal.emit(self.currentItem().chum.handle)
     @QtCore.pyqtSlot()
     def openChumLogs(self):
-        currentChum = self.currentItem().text(0)
+        currentChum = self.currentItem().text()
         if not currentChum:
             return
         self.pesterlogviewer = PesterLogViewer(currentChum, self.mainwindow.config, self.mainwindow.theme, self.mainwindow)
@@ -786,59 +582,20 @@ class chumArea(RightClickTree):
         self.pesterlogviewer = None
     @QtCore.pyqtSlot()
     def renameGroup(self):
-        if not hasattr(self, 'renamegroupdialog'):
-            self.renamegroupdialog = None
-        if not self.renamegroupdialog:
-            (gname, ok) = QtGui.QInputDialog.getText(self, "Rename Group", "Enter a new name for the group:")
-            if ok:
-                gname = unicode(gname)
-                currentGroup = self.currentItem()
-                if not currentGroup:
-                    return
-                index = self.indexOfTopLevelItem(currentGroup)
-                if index != -1:
-                    expanded = currentGroup.isExpanded()
-                    self.mainwindow.config.delGroup(str(currentGroup.text(0)))
-                    self.mainwindow.config.addGroup(gname, expanded)
-                    gTemp = self.mainwindow.config.getGroups()
-                    self.groups = [g[0] for g in gTemp]
-                    self.openGroups = [g[1] for g in gTemp]
-                    for i in range(currentGroup.childCount()):
-                        currentGroup.child(i).chum.group = gname
-                        self.mainwindow.chumdb.setGroup(currentGroup.child(i).chum.handle, gname)
-                    currentGroup.setText(0, gname)
-        self.renamegroupdialog = None
+        (gname, ok) = QtGui.QInputDialog.getText(self, "Rename Group", "Enter a new name for the group:")
+        if ok:
+            pass
+            #rename group
+
     @QtCore.pyqtSlot()
     def removeGroup(self):
-        currentGroup = self.currentItem()
-        if not currentGroup:
-            return
-        self.mainwindow.config.delGroup(currentGroup.text(0))
-        gTemp = self.mainwindow.config.getGroups()
-        self.groups = [g[0] for g in gTemp]
-        self.openGroups = [g[1] for g in gTemp]
-        for i in range(self.topLevelItemCount()):
-            if self.topLevelItem(i).text(0) == currentGroup.text(0):
-                break
-        while self.topLevelItem(i) and self.topLevelItem(i).child(0):
-            chumLabel = self.topLevelItem(i).child(0)
-            chumLabel.chum.group = "Chums"
-            self.mainwindow.chumdb.setGroup(chumLabel.chum.handle, "Chums")
-            self.takeItem(chumLabel)
-            self.addItem(chumLabel)
-        self.takeTopLevelItem(i)
+        pass
+        #remove group
+
     @QtCore.pyqtSlot(QtGui.QAction)
     def moveToGroup(self, item):
-        if not item:
-            return
-        group = str(item.text())
-        chumLabel = self.currentItem()
-        if not chumLabel:
-            return
-        chumLabel.chum.group = group
-        self.mainwindow.chumdb.setGroup(chumLabel.chum.handle, group)
-        self.takeItem(chumLabel)
-        self.addItem(chumLabel)
+        pass
+        #move to group
 
     removeChumSignal = QtCore.pyqtSignal(QtCore.QString)
     blockChumSignal = QtCore.pyqtSignal(QtCore.QString)
@@ -850,34 +607,19 @@ class trollSlum(chumArea):
         theme = self.mainwindow.theme
         self.setStyleSheet(theme["main/trollslum/chumroll/style"])
         self.chums = trolls
-        child_1 = QtGui.QTreeWidgetItem([""])
-        self.addTopLevelItem(child_1)
-        child_1.setExpanded(True)
         for c in self.chums:
             chandle = c.handle
             if not self.findItems(chandle, QtCore.Qt.MatchFlags(0)):
                 chumLabel = chumListing(c, self.mainwindow)
                 self.addItem(chumLabel)
 
-        self.setSortingEnabled(False)
-        self.header().hide()
-        self.setDropIndicatorShown(False)
-        self.setIndentation(0)
-
         self.optionsMenu = QtGui.QMenu(self)
         self.unblockchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self)
         self.connect(self.unblockchum, QtCore.SIGNAL('triggered()'),
                      self, QtCore.SIGNAL('unblockChumSignal()'))
         self.optionsMenu.addAction(self.unblockchum)
 
-        #self.sortItems()
-    def contextMenuEvent(self, event):
-        #fuckin Qt
-        if event.reason() == QtGui.QContextMenuEvent.Mouse:
-            listing = self.itemAt(event.pos())
-            self.setCurrentItem(listing)
-            if self.currentItem().text(0) != "":
-                self.optionsMenu.popup(event.globalPos())
+        self.sortItems()
     def changeTheme(self, theme):
         self.setStyleSheet(theme["main/trollslum/chumroll/style"])
         self.removechum.setText(theme["main/menus/rclickchumlist/removechum"])
@@ -1094,10 +836,6 @@ class PesterWindow(MovingWindow):
         self.logv = logv
         self.connect(logv, QtCore.SIGNAL('triggered()'),
                      self, QtCore.SLOT('openLogv()'))
-        grps = QtGui.QAction(self.theme["main/menus/client/addgroup"], self)
-        self.grps = grps
-        self.connect(grps, QtCore.SIGNAL('triggered()'),
-                     self, QtCore.SLOT('addGroupWindow()'))
         opts = QtGui.QAction(self.theme["main/menus/client/options"], self)
         self.opts = opts
         self.connect(opts, QtCore.SIGNAL('triggered()'),
@@ -1134,7 +872,6 @@ class PesterWindow(MovingWindow):
         filemenu.addAction(logv)
         filemenu.addAction(userlistaction)
         filemenu.addAction(self.idleaction)
-        filemenu.addAction(grps)
         filemenu.addAction(self.importaction)
         filemenu.addAction(self.reconnectAction)
         filemenu.addAction(exitaction)
@@ -1195,7 +932,7 @@ class PesterWindow(MovingWindow):
         chums = [PesterProfile(c, chumdb=self.chumdb) for c in set(self.config.chums())]
         self.chumList = chumArea(chums, self)
         self.connect(self.chumList,
-                     QtCore.SIGNAL('itemActivated(QTreeWidgetItem *, int)'),
+                     QtCore.SIGNAL('itemActivated(QListWidgetItem *)'),
                      self,
                      QtCore.SLOT('pesterSelectedChum()'))
         self.connect(self.chumList,
@@ -1301,10 +1038,10 @@ class PesterWindow(MovingWindow):
             else:
                 self.alarm.play()
     def newMemoMsg(self, chan, handle, msg):
-        if not self.memos.has_key(chan):
+        if not self.memos.has_key(chan.upper()):
             # silently ignore in case we forgot to /part
             return
-        memo = self.memos[chan]
+        memo = self.memos[chan.upper()]
         msg = unicode(msg)
         if not memo.times.has_key(handle):
             # new chum! time current
@@ -1362,8 +1099,8 @@ class PesterWindow(MovingWindow):
     def newMemo(self, channel, timestr, secret=False):
         if channel == "#pesterchum":
             return
-        if self.memos.has_key(channel):
-            self.memos[channel].showChat()
+        if self.memos.has_key(channel.upper()):
+            self.memos[channel.upper()].showChat()
             return
         # do slider dialog then set
         if self.config.tabs():
@@ -1384,7 +1121,7 @@ class PesterWindow(MovingWindow):
                      QtCore.SIGNAL('userPresentSignal(QString, QString, QString)'),
                      memoWindow, QtCore.SLOT('userPresentChange(QString, QString, QString)'))
         # chat client send memo open
-        self.memos[channel] = memoWindow
+        self.memos[channel.upper()] = memoWindow
         self.joinChannel.emit(channel) # race condition?
         self.secret = secret
         if self.secret:
@@ -1431,7 +1168,6 @@ class PesterWindow(MovingWindow):
         # menus
         self.menu.move(*theme["main/menu/loc"])
         self.logv.setText(theme["main/menus/client/logviewer"])
-        self.grps.setText(theme["main/menus/client/addgroup"])
         self.opts.setText(theme["main/menus/client/options"])
         self.exitaction.setText(theme["main/menus/client/exit"])
         self.userlistaction.setText(theme["main/menus/client/userlist"])
@@ -1586,9 +1322,7 @@ class PesterWindow(MovingWindow):
     def pesterSelectedChum(self):
         curChum = self.chumList.currentItem()
         if curChum:
-            if curChum.text(0) not in self.chumList.groups and \
-               curChum.text(0) != "Chums":
-                self.newConversationWindow(curChum)
+            self.newConversationWindow(curChum)
     @QtCore.pyqtSlot(QtGui.QListWidgetItem)
     def newConversationWindow(self, chumlisting):
         # check chumdb
@@ -1612,7 +1346,7 @@ class PesterWindow(MovingWindow):
         c = unicode(channel)
         self.chatlog.finish(c)
         self.leftChannel.emit(channel)
-        del self.memos[c]
+        del self.memos[c.upper()]
     @QtCore.pyqtSlot()
     def tabsClosed(self):
         del self.tabconvo
@@ -1644,19 +1378,19 @@ class PesterWindow(MovingWindow):
     @QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString)
     def timeCommand(self, chan, handle, command):
         (c, h, cmd) = (unicode(chan), unicode(handle), unicode(command))
-        if self.memos[c]:
-            self.memos[c].timeUpdate(h, cmd)
+        if self.memos[c.upper()]:
+            self.memos[c.upper()].timeUpdate(h, cmd)
 
     @QtCore.pyqtSlot(QtCore.QString, PesterList)
     def updateNames(self, channel, names):
-        c = unicode(channel)
+        c = unicode(channel).upper()
         # update name DB
         self.namesdb[c] = names
         # warn interested party of names
         self.namesUpdated.emit()
     @QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString)
     def userPresentUpdate(self, handle, channel, update):
-        c = unicode(channel)
+        c = unicode(channel).upper()
         n = unicode(handle)
         if update == "nick":
             l = n.split(":")
@@ -1929,25 +1663,6 @@ class PesterWindow(MovingWindow):
     def closeLogUsers(self):
         self.logusermenu.close()
         self.logusermenu = None
-
-    @QtCore.pyqtSlot()
-    def addGroupWindow(self):
-        if not hasattr(self, 'addgroupdialog'):
-            self.addgroupdialog = None
-        if not self.addgroupdialog:
-            (gname, ok) = QtGui.QInputDialog.getText(self, "Add Group", "Enter a name for the new group:")
-            if ok:
-                gname = unicode(gname)
-                self.config.addGroup(gname)
-                gTemp = self.config.getGroups()
-                self.chumList.groups = [g[0] for g in gTemp]
-                self.chumList.openGroups = [g[1] for g in gTemp]
-                self.chumList.showAllGroups()
-                if not self.config.showEmptyGroups():
-                    self.chumList.hideEmptyGroups()
-
-            self.addgroupdialog = None
-
     @QtCore.pyqtSlot()
     def openOpts(self):
         if not hasattr(self, 'optionmenu'):
@@ -2029,16 +1744,6 @@ class PesterWindow(MovingWindow):
           self.config.set("time12Format", False)
         secondssetting = self.optionmenu.secondscheck.isChecked()
         self.config.set("showSeconds", secondssetting)
-        # groups
-        #groupssetting = self.optionmenu.groupscheck.isChecked()
-        #self.config.set("useGroups", groupssetting)
-        emptygroupssetting = self.optionmenu.showemptycheck.isChecked()
-        curemptygroup = self.config.showEmptyGroups()
-        if curemptygroup and not emptygroupssetting:
-            self.chumList.hideEmptyGroups()
-        elif emptygroupssetting and not curemptygroup:
-            self.chumList.showAllGroups()
-        self.config.set("emptyGroups", emptygroupssetting)
         self.optionmenu = None
 
     @QtCore.pyqtSlot()
diff --git a/themes/enamel/style.js b/themes/enamel/style.js
index 6536989..07f8b06 100644
--- a/themes/enamel/style.js
+++ b/themes/enamel/style.js
@@ -20,10 +20,9 @@
                        "memos": "Memos",
                        "logviewer": "Pesterlogs",
                        "userlist": "Userlist",
-                       "addgroup": "Add Group",
                        "import": "Import",
                        "reconnect": "Reconnect",
-                                           "idle": "Idle",
+					   "idle": "Idle",
                        "exit": "Exit"},
             "profile": {"_name": "Profile",
                         "switch": "Switch",
@@ -39,9 +38,6 @@
                                "addchum": "Add Chum",
                                "viewlog": "View Pesterlog",
                                "unblockchum": "Unblock",
-                               "removegroup": "Remove Group",
-                               "renamegroup": "Rename Group",
-                               "movechum": "Move To",
                                "banuser": "Ban User",
                                "opuser": "Make OP",
                                "quirksoff": "Quirks Off"
@@ -58,7 +54,7 @@
              "loc": [440, 211],
              "size": [289, 275],
              "userlistcolor": "black",
-             "moods": {
+             "moods": { 
 
                  "chummy": { "icon": "$path/chummy.gif", "color": "black" },
 
@@ -66,7 +62,7 @@
 
                  "offline": { "icon": "$path/offline.gif", "color": "#9d9d9d"},
 
-
+			     
                  "pleasant": { "icon": "$path/pleasant.gif", "color": "black" },
 
                  "distraught": { "icon": "$path/distraught.gif", "color": "black" },
@@ -94,7 +90,7 @@
                  "devious": { "icon": "$path/devious.gif", "color": "red" },
 
                  "sleek": { "icon": "$path/sleek.gif", "color": "red" },
-
+			     
                  "detestful": { "icon": "$path/detestful.gif", "color": "red" },
 
                  "mirthful": { "icon": "$path/mirthful.gif", "color": "red" },
@@ -113,7 +109,7 @@
 
              }
            },
-  "trollslum": {
+  "trollslum": { 
       "style": "background: #fdb302; border:2px solid yellow; font-family: 'Century Gothic'",
       "size": [195, 200],
       "label": { "text": "TROLLSLUM",
@@ -131,7 +127,7 @@
                                      "text": "" },
                     "currentMood": [1500, 1500]
                   },
-  "defaultwindow": { "style": "background: #fdb302; font-family:'Century Gothic';font:bold;selection-background-color:#919191; "
+  "defaultwindow": { "style": "background: #fdb302; font-family:'Century Gothic';font:bold;selection-background-color:#919191; " 
                    },
   "addchum":  { "style": "background: rgba(255, 255, 0, 0%); border:0px; color: rgba(0, 0, 0, 0%);",
               "loc": [443,144],
@@ -151,82 +147,82 @@
            },
   "defaultmood": 0,
   "moodlabel": { "style": "",
-                                 "loc": [20, 430],
-                                 "text": ""
-                           },
+				 "loc": [20, 430],
+				 "text": ""
+			   },
   "moods": [
-      { "style": "background-image:url($path/mood1.png); border:0px;",
-                "selected": "background-image:url($path/mood1c.png); border:0px;",
-                "loc": [0, 258],
-                "size": [100,110],
-                 "text": "",
-                "icon": "",
-                "mood": 0
-          },
-      { "style": "background-image:url($path/mood2.png); border:0px;",
-                "selected": "background-image:url($path/mood2c.png); border:0px;",
-                "loc": [106, 258],
-                "size": [100, 110],
-                 "text": "",
-                "icon": "",
-                "mood": 19
-          },
-      { "style": "background-image:url($path/mood3.png); border:0px;",
-                "selected": "background-image:url($path/mood3c.png); border:0px;",
-                "loc": [212, 258],
-                "size": [100, 110],
-                 "text": "",
-                "icon": "",
-                "mood": 22
-          },
-      { "style": "background-image:url($path/mood4.png); border:0px;",
-                "selected": "background-image:url($path/mood4c.png); border:0px;",
-                "loc": [318, 258],
-                "size": [100, 110],
-                 "text": "",
-                "icon": "",
-                "mood": 4
-          },
-      { "style": "background-image:url($path/mood5.png); border:0px;",
-                "selected": "background-image:url($path/mood5c.png); border:0px;",
-                "loc": [0, 382],
-                "size": [100, 110],
-                 "text": "",
-                "icon": "",
-                "mood": 3
-          },
-      { "style": "background-image:url($path/mood6.png); border:0px;",
-                "selected": "background-image:url($path/mood6c.png); border:0px;",
-                "loc": [106, 382],
-                "size": [100, 110],
-                 "text": "",
-                "icon": "",
-                "mood": 20
-          },
-      { "style": "background-image:url($path/mood7.png); border:0px;",
-                "selected": "background-image:url($path/mood7c.png); border:0px;",
-                "loc": [212, 382],
-                "size": [100, 110],
-                 "text": "",
-                "icon": "",
-                "mood": 5
-          },
-      { "style": "background-image:url($path/mood8.png); border:0px;",
-                "selected": "background-image:url($path/mood8c.png); border:0px;",
-                "loc": [318, 382],
-                "size": [100, 110],
-                 "text": "",
-                "icon": "",
-                "mood": 1
-          },
-      { "style": "border:0px;",
-                "selected": "border:0px;",
-                "loc": [0, 0],
-                "size": [100, 100],
-                 "text": "",
-                "icon": "",
-                "mood": 2
-          }
+      { "style": "background-image:url($path/mood1.png); border:0px;", 
+		"selected": "background-image:url($path/mood1c.png); border:0px;",
+		"loc": [0, 258],
+		"size": [100,110],
+	   	 "text": "",
+		"icon": "",
+		"mood": 0
+	  },
+      { "style": "background-image:url($path/mood2.png); border:0px;", 
+		"selected": "background-image:url($path/mood2c.png); border:0px;",
+		"loc": [106, 258],
+		"size": [100, 110],
+	   	 "text": "",
+		"icon": "",
+		"mood": 19
+	  },
+      { "style": "background-image:url($path/mood3.png); border:0px;", 
+		"selected": "background-image:url($path/mood3c.png); border:0px;",
+		"loc": [212, 258],
+		"size": [100, 110],
+	   	 "text": "",
+		"icon": "",
+		"mood": 22
+	  },
+      { "style": "background-image:url($path/mood4.png); border:0px;", 
+		"selected": "background-image:url($path/mood4c.png); border:0px;",
+		"loc": [318, 258],
+		"size": [100, 110],
+	   	 "text": "",
+		"icon": "",
+		"mood": 4
+	  },
+      { "style": "background-image:url($path/mood5.png); border:0px;", 
+		"selected": "background-image:url($path/mood5c.png); border:0px;",
+		"loc": [0, 382],
+		"size": [100, 110],
+	   	 "text": "",
+		"icon": "",
+		"mood": 3
+	  },
+      { "style": "background-image:url($path/mood6.png); border:0px;", 
+		"selected": "background-image:url($path/mood6c.png); border:0px;",
+		"loc": [106, 382],
+		"size": [100, 110],
+	   	 "text": "",
+		"icon": "",
+		"mood": 20
+	  },
+      { "style": "background-image:url($path/mood7.png); border:0px;", 
+		"selected": "background-image:url($path/mood7c.png); border:0px;",
+		"loc": [212, 382],
+		"size": [100, 110],
+	   	 "text": "",
+		"icon": "",
+		"mood": 5
+	  },
+      { "style": "background-image:url($path/mood8.png); border:0px;", 
+		"selected": "background-image:url($path/mood8c.png); border:0px;",
+		"loc": [318, 382],
+		"size": [100, 110],
+	   	 "text": "",
+		"icon": "",
+		"mood": 1
+	  },
+      { "style": "border:0px;", 
+		"selected": "border:0px;",
+		"loc": [0, 0],
+		"size": [100, 100],
+	   	 "text": "",
+		"icon": "",
+		"mood": 2
+	  }
   ]
  },
  "convo":
@@ -234,7 +230,7 @@
   "tabstyle": "background-color: #fdb302; font-family: 'Century Gothic'",
   "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background:  rgba(255, 255, 0, 0%); border:0px;",
                  "handle": "border-width: 5px; border-image:url($path/scrollbg.png) 5px; min-height:60px;",
-                 "downarrow": "height:17px;border:0px solid #c48a00;",
+                 "downarrow": "height:17px;border:0px solid #c48a00;", 
                  "darrowstyle": "image:url($path/downarrow.png);",
                  "uparrow": "height:17px;border:0px solid #c48a00;",
                  "uarrowstyle": "image:url($path/uparrow.png);"
@@ -262,12 +258,12 @@
       "ceasepester": "ceased pestering",
       "blocked": "blocked",
       "unblocked": "unblocked",
-          "blockedmsg": "did not receive message from",
+	  "blockedmsg": "did not receive message from",
       "openmemo": "opened memo on board",
       "joinmemo": "responded to memo",
       "closememo": "ceased responding to memo",
       "kickedmemo": "You have been banned from this memo!",
-          "idle": "is now an idle chum!"
+	  "idle": "is now an idle chum!"
   },
   "systemMsgColor": "#646464"
  },
@@ -282,7 +278,7 @@
   },
   "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background:  rgba(255, 255, 0, 0%); border:0px;",
                  "handle": "border-width: 5px; border-image:url($path/scrollbg.png) 5px; min-height:60px;",
-                 "downarrow": "height:17px;border:0px;",
+                 "downarrow": "height:17px;border:0px;", 
                  "darrowstyle": "image:url();",
                  "uparrow": "height:17px;border:0px;",
                  "uarrowstyle": "image:url();"
@@ -299,20 +295,20 @@
   "userlist": { "width": 150,
                 "style": "border:2px solid #c48a00; background: white; font-family: 'Century Gothic';selection-background-color:#646464; font-size: 14px;  margin-left:0px; margin-right:10px;"
               },
-  "time": { "text": { "width": 75,
-                      "style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Century Gothic';font:bold;"
+  "time": { "text": { "width": 75, 
+                      "style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Century Gothic';font:bold;" 
                     },
             "slider": { "style": "border: 0px;",
                         "groove": "",
                         "handle": ""
                       },
-            "buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" },
-            "arrows": { "left": "$path/leftarrow.png",
+            "buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" }, 
+            "arrows": { "left": "$path/leftarrow.png", 
                         "right": "$path/rightarrow.png",
-                        "style": " border:0px; margin-top: 5px; margin-right:10px;"
+                        "style": " border:0px; margin-top: 5px; margin-right:10px;" 
                       }
           },
   "systemMsgColor": "#646464",
   "op": { "icon": "$path/smooth.png" }
  }
-}
+}
\ No newline at end of file
diff --git a/themes/gold/style.js b/themes/gold/style.js
index d5cefa4..c7fb706 100644
--- a/themes/gold/style.js
+++ b/themes/gold/style.js
@@ -16,16 +16,15 @@
              "loc": [150,22]
            },
   "sounds": { "alertsound": "$path/alarm.wav",
-                          "ceasesound": "$path/cease.wav" },
+			  "ceasesound": "$path/cease.wav" },
   "menus": {"client": {"_name": "Client",
                        "options": "Options",
                        "memos": "Memos",
                        "logviewer": "Pesterlogs",
                        "userlist": "Userlist",
-                       "addgroup": "Add Group",
                        "import": "Import",
-                                           "reconnect": "Reconnect",
-                                           "idle": "Idle",
+					   "reconnect": "Reconnect",
+					   "idle": "Idle",
                        "exit": "Exit"},
             "profile": {"_name": "Profile",
                         "switch": "Switch",
@@ -41,9 +40,6 @@
                                "addchum": "Add Chum",
                                "viewlog": "View Pesterlog",
                                "unblockchum": "Unblock",
-                               "removegroup": "Remove Group",
-                               "renamegroup": "Rename Group",
-                               "movechum": "Move To",
                                "banuser": "Ban User",
                                "opuser": "Make OP",
                                "quirksoff": "Quirks Off"
@@ -53,7 +49,7 @@
              "loc": [123, 88],
              "size": [190, 65],
              "userlistcolor": "white",
-             "moods": {
+             "moods": { 
 
                  "chummy": { "icon": "$path/chummy.png", "color": "white" },
 
@@ -61,7 +57,7 @@
 
                  "offline": { "icon": "$path/offline.png", "color": "#bebebe"},
 
-
+			     
                  "pleasant": { "icon": "$path/pleasant.png", "color": "white" },
 
                  "distraught": { "icon": "$path/distraught.png", "color": "white" },
@@ -89,7 +85,7 @@
                  "devious": { "icon": "$path/devious.png", "color": "red" },
 
                  "sleek": { "icon": "$path/sleek.png", "color": "red" },
-
+			     
                  "detestful": { "icon": "$path/detestful.png", "color": "red" },
 
                  "mirthful": { "icon": "$path/mirthful.png", "color": "red" },
@@ -108,7 +104,7 @@
 
              }
            },
-  "trollslum": {
+  "trollslum": { 
       "style": "background: #fdb302; border:2px solid yellow; font-family: 'Arial'",
       "size": [195, 200],
       "label": { "text": "TROLLSLUM",
@@ -126,7 +122,7 @@
                                      "text": "" },
                     "currentMood": [129, 176]
                   },
-  "defaultwindow": { "style": "background: #fdb302; font-family:'Arial';font:bold;selection-background-color:#919191; "
+  "defaultwindow": { "style": "background: #fdb302; font-family:'Arial';font:bold;selection-background-color:#919191; " 
                    },
   "addchum":  { "style": "background: rgba(255, 255, 0, 0%); border:0px; color: rgba(0, 0, 0, 0%);",
               "loc": [25,0],
@@ -146,90 +142,90 @@
            },
   "defaultmood": 0,
   "moodlabel": { "style": "",
-                                 "loc": [20, 430],
-                                 "text": "MOODS"
-                           },
+				 "loc": [20, 430],
+				 "text": "MOODS"
+			   },
   "moods": [
-      { "style": "border:0px;",
-                "selected": "background-image:url($path/moodcheck1.png); border:0px;",
-                "loc": [13, 204],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 0
-          },
-      { "style": "border:0px;",
-                "selected": "background-image:url($path/moodcheck2.png); border:0px;",
-                "loc": [13, 231],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 19
-          },
-      { "style": "border:0px;",
-                "selected": "background-image:url($path/moodcheck3.png); border:0px;",
-                "loc": [13, 258],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 20
-          },
-      { "style": "border:0px;",
-                "selected": "background-image:url($path/moodcheck4.png); border:0px;",
-                "loc": [116, 204],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 21
-          },
-      { "style": "border:0px;",
-                "selected": "background-image:url($path/moodcheck5.png); border:0px;",
-                "loc": [116, 231],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 22
-          },
-      { "style": "border:0px;",
-                "selected": "background-image:url($path/moodcheck6.png); border:0px;",
-                "loc": [116, 258],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 5
-          },
-      { "style": "border:0px;",
-                "selected": "background-image:url($path/moodcheck7.png); border:0px;",
-                "loc": [219, 204],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 6
-          },
-      { "style": "border:0px;",
-                "selected": "background-image:url($path/moodcheck8.png); border:0px;",
-                "loc": [219, 231],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 3
-          },
-      { "style": "border:0px;",
-                "selected": "background-image:url($path/moodcheck9.png); border:0px;",
-                "loc": [219, 258],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 1
-          },
-      { "style": "border:0px;",
-                "selected": "border:0px;",
-                "loc": [13, 175],
-                "size": [101, 27],
-                 "text": "",
-                "icon": "",
-                "mood": 2
-          }
+      { "style": "border:0px;", 
+		"selected": "background-image:url($path/moodcheck1.png); border:0px;",
+		"loc": [13, 204],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 0
+	  },
+      { "style": "border:0px;", 
+		"selected": "background-image:url($path/moodcheck2.png); border:0px;",
+		"loc": [13, 231],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 19
+	  },
+      { "style": "border:0px;", 
+		"selected": "background-image:url($path/moodcheck3.png); border:0px;",
+		"loc": [13, 258],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 20
+	  },
+      { "style": "border:0px;", 
+		"selected": "background-image:url($path/moodcheck4.png); border:0px;",
+		"loc": [116, 204],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 21
+	  },
+      { "style": "border:0px;", 
+		"selected": "background-image:url($path/moodcheck5.png); border:0px;",
+		"loc": [116, 231],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 22
+	  },
+      { "style": "border:0px;", 
+		"selected": "background-image:url($path/moodcheck6.png); border:0px;",
+		"loc": [116, 258],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 5
+	  },
+      { "style": "border:0px;", 
+		"selected": "background-image:url($path/moodcheck7.png); border:0px;",
+		"loc": [219, 204],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 6
+	  },
+      { "style": "border:0px;", 
+		"selected": "background-image:url($path/moodcheck8.png); border:0px;",
+		"loc": [219, 231],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 3
+	  },
+      { "style": "border:0px;", 
+		"selected": "background-image:url($path/moodcheck9.png); border:0px;",
+		"loc": [219, 258],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 1
+	  },
+      { "style": "border:0px;", 
+		"selected": "border:0px;",
+		"loc": [13, 175],
+		"size": [101, 27],
+	   	 "text": "",
+		"icon": "",
+		"mood": 2
+	  }
   ]
  },
  "convo":
@@ -237,7 +233,7 @@
   "tabstyle": "background-color: #fdb302; font-family: 'Arial'",
   "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background:  rgba(255, 255, 0, 0%); border:0px;",
                  "handle": "background-color:#c48a00;min-height:20px;",
-                 "downarrow": "height:17px;border:0px solid #c48a00;",
+                 "downarrow": "height:17px;border:0px solid #c48a00;", 
                  "darrowstyle": "image:url($path/downarrow.png);",
                  "uparrow": "height:17px;border:0px solid #c48a00;",
                  "uarrowstyle": "image:url($path/uparrow.png);"
@@ -267,12 +263,12 @@
       "ceasepester": "ceased pestering",
       "blocked": "blocked",
       "unblocked": "unblocked",
-          "blockedmsg": "did not receive message from",
+	  "blockedmsg": "did not receive message from",
       "openmemo": "opened memo on board",
       "joinmemo": "responded to memo",
       "closememo": "ceased responding to memo",
       "kickedmemo": "You have been banned from this memo!",
-          "idle": "is now an idle chum!"
+	  "idle": "is now an idle chum!"
   },
   "systemMsgColor": "#646464"
  },
@@ -288,7 +284,7 @@
   },
   "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background:  rgba(255, 255, 0, 0%); border:0px;",
                  "handle": "background-color:#c48a00;min-height:20px;",
-                 "downarrow": "height:17px;border:0px solid #c48a00;",
+                 "downarrow": "height:17px;border:0px solid #c48a00;", 
                  "darrowstyle": "image:url($path/downarrow.png);",
                  "uparrow": "height:17px;border:0px solid #c48a00;",
                  "uarrowstyle": "image:url($path/uparrow.png);"
@@ -305,20 +301,20 @@
   "userlist": { "width": 150,
                 "style": "border:2px solid #c48a00; background: white; font-family: 'Arial';selection-background-color:#646464; font-size: 14px;  margin-left:0px; margin-right:10px;"
               },
-  "time": { "text": { "width": 75,
-                      "style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Arial';font:bold;"
+  "time": { "text": { "width": 75, 
+                      "style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Arial';font:bold;" 
                     },
             "slider": { "style": "border: 0px;",
                         "groove": "",
                         "handle": ""
                       },
-            "buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" },
-            "arrows": { "left": "$path/leftarrow.png",
+            "buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" }, 
+            "arrows": { "left": "$path/leftarrow.png", 
                         "right": "$path/rightarrow.png",
-                        "style": " border:0px; margin-top: 5px; margin-right:10px;"
+                        "style": " border:0px; margin-top: 5px; margin-right:10px;" 
                       }
           },
   "systemMsgColor": "#646464",
   "op": { "icon": "$path/smooth.png" }
  }
-}
+}
\ No newline at end of file
diff --git a/themes/pesterchum/style.js b/themes/pesterchum/style.js
index e000af4..eb6e9db 100644
--- a/themes/pesterchum/style.js
+++ b/themes/pesterchum/style.js
@@ -16,16 +16,15 @@
              "loc": [10,0]
            },
   "sounds": { "alertsound": "$path/alarm.wav",
-                          "ceasesound": "$path/cease.wav" },
+			  "ceasesound": "$path/cease.wav" },
   "menus": {"client": {"_name": "CLIENT",
                        "options": "OPTIONS",
                        "memos": "MEMOS",
                        "logviewer": "PESTERLOGS",
                        "userlist": "USERLIST",
-                       "addgroup": "ADD GROUP",
                        "import": "IMPORT",
                        "reconnect": "RECONNECT",
-                                           "idle": "IDLE",
+					   "idle": "IDLE",
                        "exit": "EXIT"},
             "profile": {"_name": "PROFILE",
                         "switch": "SWITCH",
@@ -41,9 +40,6 @@
                                "addchum": "ADD CHUM",
                                "viewlog": "VIEW PESTERLOG",
                                "unblockchum": "UNBLOCK",
-                               "removegroup": "REMOVE GROUP",
-                               "renamegroup": "RENAME GROUP",
-                               "movechum": "MOVE TO",
                                "banuser": "BAN USER",
                                "opuser": "MAKE OP",
                                "quirksoff": "QUIRKS OFF"
@@ -53,7 +49,7 @@
              "loc": [12, 117],
              "size": [209, 82],
              "userlistcolor": "white",
-             "moods": {
+             "moods": { 
 
                  "chummy": { "icon": "$path/chummy.png", "color": "white" },
 
@@ -61,7 +57,7 @@
 
                  "offline": { "icon": "$path/offline.png", "color": "#646464"},
 
-
+			     
                  "pleasant": { "icon": "$path/pleasant.png", "color": "white" },
 
                  "distraught": { "icon": "$path/distraught.png", "color": "white" },
@@ -89,7 +85,7 @@
                  "devious": { "icon": "$path/devious.png", "color": "red" },
 
                  "sleek": { "icon": "$path/sleek.png", "color": "red" },
-
+			     
                  "detestful": { "icon": "$path/detestful.png", "color": "red" },
 
                  "mirthful": { "icon": "$path/mirthful.png", "color": "red" },
@@ -108,7 +104,7 @@
 
              }
            },
-  "trollslum": {
+  "trollslum": { 
       "style": "background: #fdb302; border:2px solid yellow; font-family: 'Courier'",
       "size": [195, 200],
       "label": { "text": "TROLLSLUM",
@@ -126,7 +122,7 @@
                                      "text": "" },
                     "currentMood": [18, 249]
                   },
-  "defaultwindow": { "style": "background: #fdb302; font-family:'Courier';font:bold;selection-background-color:#919191; "
+  "defaultwindow": { "style": "background: #fdb302; font-family:'Courier';font:bold;selection-background-color:#919191; " 
                    },
   "addchum":  { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(0, 0, 0, 0%); font-family:'Courier';",
                 "pressed" : "background: rgb(255, 255, 255, 30%);",
@@ -140,7 +136,7 @@
               "size": [71, 22],
               "text": ""
             },
-  "block": { "style": "background:  rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color:  rgba(255, 255, 0, 0%); font-family:'Courier';",
+  "block": { "style": "background:  rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color:  rgba(255, 255, 0, 0%); font-family:'Courier';",          
              "pressed" : "background: rgb(255, 255, 255, 30%);",
              "loc": [81,202],
              "size": [71, 22],
@@ -148,73 +144,73 @@
            },
   "defaultmood": 0,
   "moodlabel": { "style": "",
-                                 "loc": [20, 430],
-                                 "text": "MOODS"
-                           },
+				 "loc": [20, 430],
+				 "text": "MOODS"
+			   },
   "moods": [
-      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
-                "selected": "text-align:left; background-image:url($path/moodcheck1.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
-                "loc": [12, 288],
-                "size": [104, 22],
-            "text": "CHUMMY",
-                "icon": "$path/chummy.png",
-                "mood": 0
-          },
-      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
-                "selected": "text-align:left; background-image:url($path/moodcheck2.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
-                "loc": [12, 308],
-                "size": [104, 22],
-                "text": "PALSY",
-                "icon": "$path/chummy.png",
-                "mood": 3
-          },
-      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
-                "selected": "text-align:left; background-image:url($path/moodcheck3.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
-                "loc": [12, 328],
-                "size": [104, 22],
-                "text": "CHIPPER",
-                "icon": "$path/chummy.png",
-                "mood": 4
-          },
-      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
-                "selected": "text-align:left; background-image:url($path/moodcheck2.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
-                "loc": [117, 288],
-                "size": [104, 22],
-                "text": "BULLY",
-                "icon": "$path/chummy.png",
-                "mood": 5
-          },
-      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
-                "selected": "text-align:left; background-image:url($path/moodcheck2.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
-                "loc": [117, 308],
-                "size": [104, 22],
-                "text": "PEPPY",
-                "icon": "$path/chummy.png",
-                "mood": 6
-          },
-      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
-                "selected": "text-align:left; background-image:url($path/moodcheck4.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
-                "loc": [117, 328],
-                "size": [104, 22],
-                "text": "RANCOROUS",
-                "icon": "$path/rancorous.png",
-                "mood": 1
-          },
-      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
-                "selected": "text-align:left; background-image:url($path/moodcheck5.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
-                "loc": [12, 348],
-                "size": [209, 22],
-                "text": "ABSCOND",
-                "icon": "",
-                "mood": 2
-          }
+      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", 
+		"selected": "text-align:left; background-image:url($path/moodcheck1.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
+		"loc": [12, 288],
+		"size": [104, 22],
+	    "text": "CHUMMY",
+		"icon": "$path/chummy.png",
+		"mood": 0
+	  },
+      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", 
+		"selected": "text-align:left; background-image:url($path/moodcheck2.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
+		"loc": [12, 308],
+		"size": [104, 22],
+		"text": "PALSY",
+		"icon": "$path/chummy.png",
+		"mood": 3
+	  },
+      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", 
+		"selected": "text-align:left; background-image:url($path/moodcheck3.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
+		"loc": [12, 328],
+		"size": [104, 22],
+		"text": "CHIPPER",
+		"icon": "$path/chummy.png",
+		"mood": 4
+	  },
+      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", 
+		"selected": "text-align:left; background-image:url($path/moodcheck2.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
+		"loc": [117, 288],
+		"size": [104, 22],
+		"text": "BULLY",
+		"icon": "$path/chummy.png",
+		"mood": 5
+	  },
+      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", 
+		"selected": "text-align:left; background-image:url($path/moodcheck2.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
+		"loc": [117, 308],
+		"size": [104, 22],
+		"text": "PEPPY",
+		"icon": "$path/chummy.png",
+		"mood": 6
+	  },
+      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", 
+		"selected": "text-align:left; background-image:url($path/moodcheck4.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
+		"loc": [117, 328],
+		"size": [104, 22],
+		"text": "RANCOROUS",
+		"icon": "$path/rancorous.png",
+		"mood": 1
+	  },
+      { "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", 
+		"selected": "text-align:left; background-image:url($path/moodcheck5.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
+		"loc": [12, 348],
+		"size": [209, 22],
+		"text": "ABSCOND",
+		"icon": "",
+		"mood": 2
+	  }
   ]
  },
  "convo":
  {"style": "background-color: #fdb302;background-image:url($path/convobg.png);background-repeat: no-repeat; border:2px solid yellow; font-family: 'Courier'",
   "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: white; border:2px solid #c48a00;",
                  "handle": "background-color:#c48a00;min-height:20px;",
-                 "downarrow": "height:17px;border:0px solid #c48a00;",
+                 "downarrow": "height:17px;border:0px solid #c48a00;", 
                  "darrowstyle": "image:url($path/downarrow.png);",
                  "uparrow": "height:17px;border:0px solid #c48a00;",
                  "uarrowstyle": "image:url($path/uparrow.png);"
@@ -234,7 +230,7 @@
       "style": "background: white; border:2px solid #c48a00;margin-top:5px; margin-right:10px; margin-left:10px; font-size: 12px;font-family: 'Courier'"
   },
   "tabwindow" : {
-          "style": "background-color:#fdb302;border:0px"
+	  "style": "background-color:#fdb302;border:0px"
   },
   "tabs": {
       "style": "background-color: #7f7f7f; font-family: 'Courier';font:bold;font-size:12px;min-height:25px;",
@@ -247,12 +243,12 @@
       "ceasepester": "ceased pestering",
       "blocked": "blocked",
       "unblocked": "unblocked",
-          "blockedmsg": "did not receive message from",
+	  "blockedmsg": "did not receive message from",
       "openmemo": "opened memo on board",
       "joinmemo": "responded to memo",
       "closememo": "ceased responding to memo",
       "kickedmemo": "You have been banned from this memo!",
-          "idle": "is now an idle chum!"
+	  "idle": "is now an idle chum!"
   },
   "systemMsgColor": "#646464"
  },
@@ -268,7 +264,7 @@
   },
   "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background:  rgba(255, 255, 0, 0%); border:0px;",
                  "handle": "background-color:#c48a00;min-height:20px;",
-                 "downarrow": "height:17px;border:0px solid #c48a00;",
+                 "downarrow": "height:17px;border:0px solid #c48a00;", 
                  "darrowstyle": "image:url($path/downarrow.png);",
                  "uparrow": "height:17px;border:0px solid #c48a00;",
                  "uarrowstyle": "image:url($path/uparrow.png);"
@@ -285,20 +281,20 @@
   "userlist": { "width": 150,
                 "style": "border:2px solid #c48a00; background: white;font: bold;font-family: 'Courier';selection-background-color:#646464; font-size: 12px;  margin-left:0px; margin-right:10px;"
               },
-  "time": { "text": { "width": 75,
-                      "style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Courier';font:bold;"
+  "time": { "text": { "width": 75, 
+                      "style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Courier';font:bold;" 
                     },
             "slider": { "style": "border: 0px;",
                         "groove": "",
                         "handle": ""
                       },
-            "buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font: bold; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" },
-            "arrows": { "left": "$path/leftarrow.png",
+            "buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font: bold; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" }, 
+            "arrows": { "left": "$path/leftarrow.png", 
                         "right": "$path/rightarrow.png",
-                        "style": " border:0px; margin-top: 5px; margin-right:10px;"
+                        "style": " border:0px; margin-top: 5px; margin-right:10px;" 
                       }
           },
   "systemMsgColor": "#646464",
   "op": { "icon": "$path/op.png" }
  }
-}
+}
\ No newline at end of file
diff --git a/themes/trollian/style.js b/themes/trollian/style.js
index 86f4902..0ec8137 100644
--- a/themes/trollian/style.js
+++ b/themes/trollian/style.js
@@ -21,10 +21,8 @@
                        "memos": "Memos",
                        "logviewer": "Pesterlogs",
                        "userlist": "Fresh Targets",
-                       "addgroup": "Add Group",
                        "import": "import U2;",
-                       "reconnect": "Reconnect",
-       "idle": "Idle",
+	     "idle": "Idle",
                        "exit": "Abscond"},
             "profile": {"_name": "View",
                         "switch": "Trolltag",
@@ -40,9 +38,6 @@
                                "addchum": "Add Chump",
                                "viewlog": "View Pesterlog",
                                "unblockchum": "Mercy",
-                               "removegroup": "Remove Group",
-                               "renamegroup": "Rename Group",
-                               "movechum": "Move To",
                                "banuser": "Ban",
                                "opuser": "Promote",
                                "quirksoff": "Quirks Off" }
@@ -59,50 +54,50 @@
              "size": [171, 357],
              "userlistcolor": "black",
              "moods": {
-
+                 
                  "chummy": { "icon": "$path/chummy.png", "color": "#63ea00" },
-
+                 
                  "rancorous": { "icon": "$path/rancorous.png", "color": "#7f7f7f" },
-
+                 
                  "offline": { "icon": "$path/offline.png", "color": "black"},
-
-
+                 
+                 
                  "pleasant": { "icon": "$path/pleasant.png", "color": "#d69df8" },
-
+                 
                  "distraught": { "icon": "$path/distraught.png", "color": "#706eba" },
-
+                 
                  "pranky": { "icon": "$path/pranky.png", "color": "blue" },
-
-
+                 
+                 
                  "smooth": { "icon": "$path/smooth.png", "color": "red" },
-
-
+                 
+                 
                  "ecstatic": { "icon": "$path/ecstatic.png", "color": "#99004d" },
-
+                 
                  "relaxed": { "icon": "$path/relaxed.png", "color": "#078446" },
-
+                 
                  "discontent": { "icon": "$path/discontent.png", "color": "#a75403" },
-
+                 
                  "devious": { "icon": "$path/devious.png", "color": "#008282" },
-
+                 
                  "sleek": { "icon": "$path/sleek.png", "color": "#a1a100" },
-
+                 
                  "detestful": { "icon": "$path/detestful.png", "color": "#6a006a" },
-
+                 
                  "mirthful": { "icon": "$path/mirthful.png", "color": "#450077" },
-
+                 
                  "manipulative": { "icon": "$path/manipulative.png", "color": "#004182" },
-
+                 
                  "vigorous": { "icon": "$path/vigorous.png", "color": "#0021cb" },
-
+                 
                  "perky": { "icon": "$path/perky.png", "color": "#406600" },
-
+                 
                  "acceptant": { "icon": "$path/acceptant.png", "color": "#a10000" },
-
+                 
                  "protective": { "icon": "$path/protective.png", "color": "white" },
-
+                 
                  "blocked": { "icon": "$path/blocked.png", "color": "black" }
-
+                 
              }
            },
   "trollslum": {
@@ -241,7 +236,7 @@
         "icon": "",
         "mood": 7
       },
-
+      
       { "style": "border:0px;color: rgba(0, 0, 0, 0%);",
         "selected": "border:0px; color: rgba(0, 0, 0, 0%);",
         "loc": [12, 117],
@@ -271,7 +266,7 @@
       "style": "background: white;margin-top:5px; border:1px solid #c2c2c2; margin-right: 54px; font-size: 12px; height: 19px;"
   },
   "tabwindow" : {
-    "style": "background: rgb(190, 19, 4); font-family: 'Arial'"
+	  "style": "background: rgb(190, 19, 4); font-family: 'Arial'"
   },
   "tabs": {
       "style": "",
@@ -317,15 +312,15 @@
   "userlist": { "width": 125,
                 "style": "font-size: 12px; background: white; margin-left: 5px; margin-bottom: 5px; border:2px solid #c2c2c2; padding: 5px; font-family: 'Arial';selection-background-color:rgb(200,200,200);"
               },
-  "time": { "text": { "width": 75,
-                      "style": "color: black; font:bold;  border:1px solid #c2c2c2; background: white; height: 19px;"
+  "time": { "text": { "width": 75, 
+                      "style": "color: black; font:bold;  border:1px solid #c2c2c2; background: white; height: 19px;" 
                     },
             "slider": { "style": " border:1px solid #c2c2c2;",
                         "groove": "border-image:url($path/timeslider.png);",
                         "handle": "image:url($path/acceptant.png);"
                       },
-            "buttons": { "style": "border:1px solid #a68168; height: 17px; width: 50px; color: #cd8f9d; font-family: 'Arial'; background: rgb(190, 19, 4); margin-left: 2px;" },
-            "arrows": { "left": "$path/leftarrow.png",
+            "buttons": { "style": "border:1px solid #a68168; height: 17px; width: 50px; color: #cd8f9d; font-family: 'Arial'; background: rgb(190, 19, 4); margin-left: 2px;" }, 
+            "arrows": { "left": "$path/leftarrow.png", 
                         "right": "$path/rightarrow.png",
                         "style": "width: 19px; height: 19px; border:0px; margin-left: 2px;"
                       }
@@ -333,4 +328,4 @@
   "systemMsgColor": "#646464",
   "op": { "icon": "$path/op.png" }
  }
-}
+}
\ No newline at end of file
diff --git a/themes/typewriter/style.js b/themes/typewriter/style.js
index 996c106..d141d74 100644
--- a/themes/typewriter/style.js
+++ b/themes/typewriter/style.js
@@ -16,16 +16,15 @@
              "loc": [43,220]
            },
   "sounds": { "alertsound": "$path/alarm.wav",
-        "ceasesound": "$path/cease.wav" },
+			  "ceasesound": "$path/cease.wav" },
   "menus": {"client": {"_name": "Typewriter",
                        "options": "Preferences",
                        "memos": "Bulletin Boards",
                        "logviewer": "Pesterlogs",
                        "userlist": "Userlist",
-                       "addgroup": "Add Group",
                        "import": "Import",
-             "idle": "Idle",
-             "reconnect": "Reconnect",
+					   "idle": "Idle",
+					   "reconnect": "Reconnect",
                        "exit": "Cease"},
             "profile": {"_name": "Ink",
                         "switch": "Alias",
@@ -41,9 +40,6 @@
                                "addchum": "Add User",
                                "viewlog": "View Pesterlog",
                                "unblockchum": "Forgive",
-                               "removegroup": "Remove Group",
-                               "renamegroup": "Rename Group",
-                               "movechum": "Move To",
                                "banuser": "Expel User",
                                "opuser": "Promote",
                                "quirksoff": "Quirks Off"
@@ -53,7 +49,7 @@
              "loc": [70, 20],
              "size": [175,100],
              "userlistcolor": "black",
-             "moods": {
+             "moods": { 
 
                  "chummy": { "icon": "$path/chummy.png", "color": "black" },
 
@@ -61,7 +57,7 @@
 
                  "offline": { "icon": "$path/offline.png", "color": "#646464"},
 
-
+			     
                  "pleasant": { "icon": "$path/pleasant.png", "color": "black" },
 
                  "distraught": { "icon": "$path/distraught.png", "color": "black" },
@@ -89,7 +85,7 @@
                  "devious": { "icon": "$path/devious.png", "color": "red" },
 
                  "sleek": { "icon": "$path/sleek.png", "color": "red" },
-
+			     
                  "detestful": { "icon": "$path/detestful.png", "color": "red" },
 
                  "mirthful": { "icon": "$path/mirthful.png", "color": "red" },
@@ -108,7 +104,7 @@
 
              }
            },
-  "trollslum": {
+  "trollslum": { 
       "style": "background: #bebebe; border:2px solid black; font-family: 'Courier'",
       "size": [195, 200],
       "label": { "text": "Ruffians",
@@ -126,7 +122,7 @@
                                      "text": "" },
                     "currentMood": [0, 0]
                   },
-  "defaultwindow": { "style": "background: #bebebe; font-family:'Courier';font:bold;selection-background-color: black; "
+  "defaultwindow": { "style": "background: #bebebe; font-family:'Courier';font:bold;selection-background-color: black; " 
                    },
   "addchum":  { "style": "background: rgba(255, 255, 0, 0%); border:0px solid #c48a00; font: bold; color: rgba(0, 0, 0, 0%); font-family:'Courier';",
                 "pressed" : "background: rgb(255, 255, 255, 30%);",
@@ -140,7 +136,7 @@
               "size": [70, 15],
               "text": ""
             },
-  "block": { "style": "background:  rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color:  rgba(255, 255, 0, 0%); font-family:'Courier';",
+  "block": { "style": "background:  rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color:  rgba(255, 255, 0, 0%); font-family:'Courier';",          
              "pressed" : "background: rgb(255, 255, 255, 30%);",
              "loc": [0,0],
              "size": [0, 0],
@@ -148,26 +144,26 @@
            },
   "defaultmood": 18,
   "moodlabel": { "style": "",
-         "loc": [20, 430],
-         "text": "MOODS"
-         },
+				 "loc": [20, 430],
+				 "text": "MOODS"
+			   },
   "moods": [
-      { "style": "text-align:left; border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
-    "selected": "text-align:left; background-image:url($path/moodcheck1.png); border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
-    "loc": [95, 323],
-    "size": [62, 9],
-      "text": "",
-    "icon": "",
-    "mood": 18
-    },
-      { "style": "text-align:left; border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
-    "selected": "text-align:left; background-image:url($path/moodcheck2.png); border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
-    "loc": [165, 323],
-    "size": [70, 9],
-    "text": "",
-    "icon": "",
-    "mood": 2
-    }
+      { "style": "text-align:left; border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", 
+		"selected": "text-align:left; background-image:url($path/moodcheck1.png); border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
+		"loc": [95, 323],
+		"size": [62, 9],
+	    "text": "",
+		"icon": "",
+		"mood": 18
+	  },
+      { "style": "text-align:left; border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", 
+		"selected": "text-align:left; background-image:url($path/moodcheck2.png); border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
+		"loc": [165, 323],
+		"size": [70, 9],
+		"text": "",
+		"icon": "",
+		"mood": 2
+	  }
   ]
  },
  "convo":
@@ -198,12 +194,12 @@
       "ceasepester": "ceased pestering",
       "blocked": "blocked",
       "unblocked": "unblocked",
-    "blockedmsg": "did not receive message from",
+	  "blockedmsg": "did not receive message from",
       "openmemo": "opened memo on board",
       "joinmemo": "responded to memo",
       "closememo": "ceased responding to memo",
       "kickedmemo": "You have been banned from this memo!",
-    "idle": "is now an idle chum!"
+	  "idle": "is now an idle chum!"
   },
   "systemMsgColor": "#646464"
  },
@@ -219,7 +215,7 @@
   },
   "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background:  rgba(255, 255, 0, 0%); border:0px;",
                  "handle": "background-color:black;min-height:20px;",
-                 "downarrow": "height:17px;border:0px;",
+                 "downarrow": "height:17px;border:0px;", 
                  "darrowstyle": "image:url($path/downarrow.png);",
                  "uparrow": "height:17px;border:0px;",
                  "uarrowstyle": "image:url($path/uparrow.png);"
@@ -236,20 +232,20 @@
   "userlist": { "width": 150,
                 "style": "border:2px solid black; background: white;font: bold;font-family: 'Courier';selection-background-color:black; font-size: 12px;  margin-left:0px; margin-right:10px;"
               },
-  "time": { "text": { "width": 75,
-                      "style": " border: 2px solid black; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Courier';font:bold;"
+  "time": { "text": { "width": 75, 
+                      "style": " border: 2px solid black; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Courier';font:bold;" 
                     },
             "slider": { "style": "border: 0px;",
                         "groove": "",
                         "handle": ""
                       },
-            "buttons": { "style": "color: black; font: bold; border: 2px solid black; font: bold; font-size: 12px; background: white; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" },
-            "arrows": { "left": "$path/leftarrow.png",
+            "buttons": { "style": "color: black; font: bold; border: 2px solid black; font: bold; font-size: 12px; background: white; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" }, 
+            "arrows": { "left": "$path/leftarrow.png", 
                         "right": "$path/rightarrow.png",
-                        "style": " border:0px; margin-top: 5px; margin-right:10px;"
+                        "style": " border:0px; margin-top: 5px; margin-right:10px;" 
                       }
           },
   "systemMsgColor": "#646464",
   "op": { "icon": "$path/protective.png" }
  }
-}
+}
\ No newline at end of file

From ea14290ea4822afe0ad13ce0e7664185827ba0ec Mon Sep 17 00:00:00 2001
From: illuminatedwax <dranger@gmail.com>
Date: Fri, 8 Apr 2011 04:08:31 -0500
Subject: [PATCH 6/7] derp

---
 pesterchum.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pesterchum.js b/pesterchum.js
index 6ef578a..1f3a778 100644
--- a/pesterchum.js
+++ b/pesterchum.js
@@ -1 +1 @@
-{"hideOfflineChums": false, "time12Format": true, "tabs": true, "showSeconds": false, "server": "irc.mindfang.org", "soundon": true, "showTimeStamps": false, "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars", "alGore"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file
+{"hideOfflineChums": true, "time12Format": true, "tabs": true, "showSeconds": false, "server": "irc.mindfang.org", "soundon": true, "showTimeStamps": false, "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars", "alGore", "evacipatedBox"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file

From a02790f9b13384ac37c9ac19979828834854e2bc Mon Sep 17 00:00:00 2001
From: illuminatedwax <dranger@gmail.com>
Date: Sun, 10 Apr 2011 04:22:06 -0500
Subject: [PATCH 7/7] bug fixes

---
 CHANGELOG.mkdn |  8 +++++++-
 TODO           |  5 +----
 convo.py       | 22 +++++++++++++---------
 dataobjs.py    | 10 ++++++----
 irc.py         |  4 ++--
 parsetools.py  | 37 +++++++++++++++++++++++++++++++++++++
 pesterchum.js  |  2 +-
 7 files changed, 67 insertions(+), 21 deletions(-)

diff --git a/CHANGELOG.mkdn b/CHANGELOG.mkdn
index 058a066..f3f52da 100644
--- a/CHANGELOG.mkdn
+++ b/CHANGELOG.mkdn
@@ -12,11 +12,17 @@ CHANGELOG
 * Art - Grimlive [aquaMarinist]
 * Quirks lower() function - Kiooeht [evacipatedBox]
 * Quirks scrabble() function - Kiooeht [evacipatedBox]
+* Quirks reverse() function - illuminatedwax [ghostDunk]
 * Timestamps - Kiooeht [evacipatedBox]
 * Logviewer - Kiooeht [evacipatedBox]
 * Quirk ordering - alGore
-* # of users in a memo
+* # of users in a memo - alGore
 
 BUG FIXES:
+* mixer bug fixed
+* "flags" bug fixed
 * incorrect characters in memos no longer break log file names
 * memos now do not break on case-sensitivity
+* fixed QDB address
+* now lines too long to send in a single message are split up correctly
+* quirk replace bug fixed
\ No newline at end of file
diff --git a/TODO b/TODO
index 7945cd4..a865abd 100644
--- a/TODO
+++ b/TODO
@@ -1,8 +1,5 @@
 Bugs:
-* multiline msgs breaks shit
-* REGEXP: \b(\S)(\S*)(\S)\b REPLACE WITH: upper(\1)\2upper(\3) <--
-   this regexp, when used as a quirk and then typed in breaks
-* channels aren't case sensitive! get the real name of a channel
+* weird memo time bug
 * Windows doesn't show style sheet sometimes?? Maybe related to themes.
 * Issues with connecting? Client not closing connection right? People keep getting "nick taken" messages
 * Windows XP SP2: sometimes mouse clicks dont register? must be some kinda crash
diff --git a/convo.py b/convo.py
index 2a6ddac..4c2b02b 100644
--- a/convo.py
+++ b/convo.py
@@ -9,7 +9,7 @@ from PyQt4 import QtGui, QtCore
 
 from dataobjs import PesterProfile, Mood, PesterHistory
 from generic import PesterIcon, RightClickList
-from parsetools import convertTags, lexMessage, mecmd, colorBegin, colorEnd, img2smiley
+from parsetools import convertTags, lexMessage, splitMessage, mecmd, colorBegin, colorEnd, img2smiley
 
 class PesterTabWindow(QtGui.QFrame):
     def __init__(self, mainwindow, parent=None, convo="convo"):
@@ -350,7 +350,7 @@ class PesterText(QtGui.QTextEdit):
                    "Accept": "text/plain"}
         try:
             pass
-            hconn = httplib.HTTPConnection('luke.violentlemon.com', 80,
+            hconn = httplib.HTTPConnection('qdb.pesterchum.net', 80,
                                            timeout=15)
             hconn.request("POST", "/index.php", params, headers)
             response = hconn.getresponse()
@@ -599,13 +599,17 @@ class PesterConvo(QtGui.QFrame):
         lexmsg = lexMessage(text)
         if type(lexmsg[0]) is not mecmd and self.applyquirks:
             lexmsg = quirks.apply(lexmsg)
-        serverMsg = copy(lexmsg)
-        self.addMessage(lexmsg, True)
-        # if ceased, rebegin
-        if hasattr(self, 'chumopen') and not self.chumopen:
-            self.mainwindow.newConvoStarted.emit(QtCore.QString(self.title()), True)
-        text = convertTags(serverMsg, "ctag")
-        self.messageSent.emit(text, self.title())
+        lexmsgs = splitMessage(lexmsg)
+
+        for lm in lexmsgs:
+            serverMsg = copy(lm)
+            self.addMessage(lm, True)
+            # if ceased, rebegin
+            if hasattr(self, 'chumopen') and not self.chumopen:
+                self.mainwindow.newConvoStarted.emit(QtCore.QString(self.title()), True)
+                self.setChumOpen(True)
+            text = convertTags(serverMsg, "ctag")
+            self.messageSent.emit(text, self.title())
         self.textInput.setText("")
 
     @QtCore.pyqtSlot()
diff --git a/dataobjs.py b/dataobjs.py
index 94d8797..38d071f 100644
--- a/dataobjs.py
+++ b/dataobjs.py
@@ -7,10 +7,11 @@ from generic import PesterIcon
 from parsetools import timeDifference, convertTags, lexMessage
 from mispeller import mispeller
 
-_upperre = re.compile(r"upper\(([\w\\]+)\)")
-_lowerre = re.compile(r"lower\(([\w\\]+)\)")
-_scramblere = re.compile(r"scramble\(([\w\\]+)\)")
-_reversere = re.compile(r"reverse\(([\w\\]+)\)")
+_groupre = re.compile(r"\\([0-9]+)")
+_upperre = re.compile(r"upper\(([\w<>\\]+)\)")
+_lowerre = re.compile(r"lower\(([\w<>\\]+)\)")
+_scramblere = re.compile(r"scramble\(([\w<>\\]+)\)")
+_reversere = re.compile(r"reverse\(([\w<>\\]+)\)")
 
 class Mood(object):
     moods = ["chummy", "rancorous", "offline", "pleasant", "distraught",
@@ -63,6 +64,7 @@ class pesterQuirk(object):
                 return string
             def regexprep(mo):
                 to = self.quirk["to"]
+                to = _groupre.sub(r"\\g<\1>", to)
                 def upperrep(m):
                     return mo.expand(m.group(1)).upper()
                 def lowerrep(m):
diff --git a/irc.py b/irc.py
index a30294d..c0a9e08 100644
--- a/irc.py
+++ b/irc.py
@@ -97,8 +97,8 @@ class PesterIRC(QtCore.QThread):
                 space = l[0].rfind(" ", 0,400)
                 if space == -1:
                     space = 400
-                a = l[0][0:space]
-                b = l[0][space:]
+                a = l[0][0:space+1]
+                b = l[0][space+1:]
                 if len(b) > 0:
                     return [a] + splittext([b])
                 else:
diff --git a/parsetools.py b/parsetools.py
index c70beb7..a495c93 100644
--- a/parsetools.py
+++ b/parsetools.py
@@ -131,6 +131,8 @@ def lexMessage(string):
                (hyperlink, _urlre), (memolex, _memore),
                (smiley, _smilere)]
 
+    string = unicode(string)
+    string = string.replace("\n", " ").replace("\r", " ")
     lexed = lexer(unicode(string), lexlist)
 
     balanced = []
@@ -176,6 +178,41 @@ def convertTags(lexed, format="html"):
 
     return escaped
 
+def splitMessage(msg, format="ctag"):
+    """Splits message if it is too long."""
+    okmsg = []
+    cbegintags = []
+    output = []
+    for o in msg:
+        okmsg.append(o)
+        if type(o) is colorBegin:
+            cbegintags.append(o)
+        elif type(o) is colorEnd:
+            cbegintags.pop()
+        # yeah normally i'd do binary search but im lazy
+        msglen = len(convertTags(okmsg, format)) + 4*(len(cbegintags))
+        if msglen > 400:
+            okmsg.pop()
+            if len(okmsg) == 0:
+                output.append([o])
+            else:
+                tmp = []
+                for color in cbegintags:
+                    okmsg.append(colorEnd("</c>"))
+                    tmp.append(color)
+                output.append(okmsg)
+                if type(o) is colorBegin:
+                    cbegintags.append(o)
+                elif type(o) is colorEnd:
+                    cbegintags.pop()
+                tmp.append(o)
+                okmsg = tmp
+
+    if len(okmsg) > 0:
+        output.append(okmsg)
+    return output
+            
+    
 
 def addTimeInitial(string, grammar):
     endofi = string.find(":")
diff --git a/pesterchum.js b/pesterchum.js
index 1f3a778..984b9eb 100644
--- a/pesterchum.js
+++ b/pesterchum.js
@@ -1 +1 @@
-{"hideOfflineChums": true, "time12Format": true, "tabs": true, "showSeconds": false, "server": "irc.mindfang.org", "soundon": true, "showTimeStamps": false, "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars", "alGore", "evacipatedBox"], "defaultprofile": "ghostDunk", "block": []}
\ No newline at end of file
+{"hideOfflineChums": false, "time12Format": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "showSeconds": false, "showTimeStamps": false, "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars", "alGore", "evacipatedBox", "acrylicEmulator", "prettyGemmaiden"], "defaultprofile": "testProfile", "block": []}
\ No newline at end of file