diff --git a/gracedb/translator.py b/gracedb/translator.py
index 1e649b0ddc87b15aeded466543b6784cc29b1e98..390e8b5f0f486d81fefa83a13cf690a9abaccd5e 100644
--- a/gracedb/translator.py
+++ b/gracedb/translator.py
@@ -237,17 +237,31 @@ def handle_uploaded_data(event, datafilename,
 
         event.save()
     elif event.analysisType == 'CWB':
-        try:
-            f = open(datafilename, "r")
-            for line in f.readlines():
-                if line.startswith("time:"):
-                    times = line.split()
-                    event.gpstime = int(float(times[1]))
-                    event.save()
-                    break
-            f.close()
-        except:
-            pass
+
+        data = CwbData(datafilename)
+
+        # XXX Refactor
+        # the following should be common if/when the other analyses get a Translator class.
+
+        data.populateEvent(event)
+        event.save()
+
+        outputDataDir = os.path.dirname(datafilename)
+
+        if data.writeCoincFile( os.path.join(outputDataDir, "coinc.xml") ):
+            log = EventLog(event=event,
+                           filename="coinc.xml",
+                           issuer=event.submitter,
+                           comment="Coinc Table Created")
+            log.save()
+
+        if data.writeLogfile( os.path.join(outputDataDir, "event.log") ):
+            log = EventLog(event=event,
+                           filename="event.log",
+                           issuer=event.submitter,
+                           comment="Log File Created" )
+            log.save()
+
     elif event.analysisType == 'HWINJ':
         try:
             f = open(datafilename, "r")
@@ -265,3 +279,122 @@ def handle_uploaded_data(event, datafilename,
         pass
 
     return temp_data_loc
+
+# Let's try to:
+#
+#    - get ligolw stuff out of gracedb client.
+#    - re-factor this stuff to be easier to read/maintain/update
+#
+# We shall start with cWB
+#
+
+def val_or_dashes(val):
+    if val is None:
+        return "---"
+    return val
+
+class Translator(object):
+    pass
+
+class CwbData(Translator):
+    CWB_IFO_MAP = {
+        '1' : 'L1',
+        '2' : 'H1',
+        '3' : 'H2',
+        '4' : 'G1',
+        '5' : 'T1',
+        '6' : 'V1',
+        '7' : 'A1',
+    }
+
+    def __init__(self, datafile):
+        print "Got datafile", datafile
+        self.datafile = datafile
+        self.data = None
+
+    def getData(self):
+        if not self.data:
+            self.data = self._readData(self.datafile)
+        return self.data
+
+    def _readData(self, datafile):
+        if isinstance(datafile, str) or isinstance(datafile, unicode):
+            datafile = open(datafile, "r")
+
+        # cWB data look like
+        #
+        # key0: value value*
+        # ...
+        # keyN: value value*
+        # piles of other data not containing ':'
+        rawdata = {}
+
+        for line in datafile:
+            line = line.split(':',1)
+            if len(line) == 1:
+                break
+            key, val = line
+            rawdata[key] = val.split()
+
+        data = {}
+        data['rawdata'] = rawdata
+        data['gpstime']    = rawdata.get('time',[None])[0]
+        data['likelihood'] = rawdata.get('likelihood',[None])[0]
+        data['far']        = rawdata.get('far',[None])[0]
+
+        ifos = []
+        for ifo in rawdata.get('ifo',[]):
+            ifos.append(self.CWB_IFO_MAP[ifo])
+        ifos.sort()
+        data['instruments'] = ','.join(ifos)
+
+        self._castData(data)
+
+        return data
+
+    def _castData(self, data):
+        # convert ints to ints
+        for key in ['gpstime', 'likelihood']:
+            if data[key]:
+                data[key] = int(float(data[key]))
+
+        # convert floats to floats
+        for key in ['far']:
+            if data[key]:
+                data[key] = float(data[key])
+
+
+    def populateEvent(self, event):
+        data = self.getData()
+
+        event.gpstime = data.get('gpstime')
+        event.likelihood = data.get('likelihood')
+        event.instruments = data.get('instruments')
+        event.far = data.get('far')
+
+        event.save()
+
+    def logData(self):
+        data = self.getData()
+        logdata = []
+        logdata.append("Event Type: cWB")
+        logdata.append("Time: %s" % data.get('gpstime', '---'))
+        logdata.append("Frequency: %s" % data['rawdata'].get('frequency',[None])[0])
+        logdata.append("RA: %s" % data['rawdata'].get('phi',[None,None,None])[2])
+        logdata.append("Dec: %s" % data['rawdata'].get('theta',[None,None,None])[2])
+        logdata.append("Effective SNR: %s" % data['rawdata'].get('rho',[None])[0])
+        logdata.append("IFOs: %s" % val_or_dashes(data.get('instruments')))
+        logdata.append("FAR: %s" % val_or_dashes(data.get('far')))
+        return "\n".join(logdata)
+
+    def writeCoincFile(self, path):
+        pass
+
+    def writeLogfile(self, path):
+        data = self.logData()
+        if data:
+            f = open(path, 'w')
+            f.write(data)
+            f.close()
+        return True
+