diff --git a/Makefile b/Makefile
index 61e97b0..eaa7324 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,5 @@
 CXX ?= $(CROSS_COMPILE)g++
 
-TESTER      = testit
-TESTER_OBJ  = testit.o oemhandler.o
-
 LIB_OEM_OBJ = oemhandler.o
 LIB_OEM     = liboemhandler.so
 
@@ -10,17 +7,13 @@
 CXXFLAGS += -fPIC -Wall
 
 
-all:  $(TESTER) $(LIB_OEM)
+all:  $(LIB_OEM)
 
 %.o: %.C
 	$(CXX) -c $< $(CXXFLAGS) -o $@
 
-
 $(LIB_OEM): $(LIB_OEM_OBJ)
 	$(CXX) $^ -shared $(LDFLAGS) -o $@
 
-$(TESTER): $(TESTER_OBJ)
-	$(CXX) $^ $(LDFLAGS) $(LIB_FLAG) -o $@ -ldl
-
 clean:
-	$(RM) $(LIB_OEM_OBJ) $(LIB_OEM) $(TESTER_OBJ) $(TESTER)
+	$(RM) $(LIB_OEM_OBJ) $(LIB_OEM)
diff --git a/oemhandler.C b/oemhandler.C
index ae3f506..f577d67 100644
--- a/oemhandler.C
+++ b/oemhandler.C
@@ -5,7 +5,7 @@
 
 void register_netfn_oem_partial_esel() __attribute__((constructor));
 
-const char *g_esel_path = "/tmp/";
+const char *g_esel_path = "/tmp/esel";
 uint16_t g_record_id = 0x0001;
 
 
@@ -16,7 +16,7 @@
 // of 0xDF and Event Message format of 0x04. The returned
 // Record ID should be used for all partial eSEL adds.
 //
-// This function creates a /tmp/esel# file to store the
+// This function creates a /tmp/esel file to store the
 // incoming partial esel.  It is the role of some other
 // function to commit the error log in to long term
 // storage.  Likely via the ipmi add_sel command.
@@ -25,62 +25,55 @@
                                      ipmi_request_t request, ipmi_response_t response,
                                      ipmi_data_len_t data_len, ipmi_context_t context)
 {
-    esel_request_t *reqptr = (esel_request_t*) request;
-    FILE *fp;
-    // TODO: Issue 5: This is not endian-safe.
-    short *recid  =  (short*) &reqptr->selrecordls;
-    short *offset =  (short*) &reqptr->offsetls;
-    uint8_t rlen;
-    ipmi_ret_t rc = IPMI_CC_OK;
-    char string[64];
-    const char *pio;
+	esel_request_t *reqptr = (esel_request_t*) request;
+	FILE *fp;
+	// TODO: Issue 5: This is not endian-safe.
+	short *recid  =  (short*) &reqptr->selrecordls;
+	short *offset =  (short*) &reqptr->offsetls;
+	uint8_t rlen;
+	ipmi_ret_t rc = IPMI_CC_OK;
+	const char *pio;
 
+	// OpenPOWER Host Interface spec says if RecordID and Offset are
+	// 0 then then this is a new request
+	if (!*recid && !*offset)
+		pio = "wb";
+	else
+		pio = "rb+";
 
-    if (!*recid && !*offset) {
-        // OpenPOWER Host Interface spec says if RecordID and Offset are
-        // 0 then then this is a new request
-        pio = "wb";
-        snprintf(string, sizeof(string), "%s%s%04x", g_esel_path, "esel", g_record_id);
-    } else {
-        pio = "rb+";
-        snprintf(string, sizeof(string), "%s%s%02x%02x", g_esel_path, "esel", reqptr->selrecordms, reqptr->selrecordls);
-    }
+	rlen = (*data_len) - (uint8_t) (sizeof(esel_request_t));
 
-    rlen = (*data_len) - (uint8_t) (sizeof(esel_request_t));
+	printf("IPMI PARTIAL ESEL for %s  Offset = %d Length = %d\n",
+		g_esel_path, *offset, rlen);
 
+	if ((fp = fopen(g_esel_path, pio)) != NULL) {
+		fseek(fp, *offset, SEEK_SET);
+		fwrite(reqptr+1,rlen,1,fp);
+		fclose(fp);
 
-    printf("IPMI PARTIAL ESEL for %s  Offset = %d Length = %d\n",
-        string, *offset, rlen);
+		*data_len = sizeof(g_record_id);
+		memcpy(response, &g_record_id, *data_len);
+	} else {
+		fprintf(stderr, "Error trying to perform %s for esel%s\n",pio, g_esel_path);
+		rc = IPMI_CC_INVALID;
+		*data_len     = 0;
+	}
 
+	// The first bit prepresents that this is the last partial packet
+	// coming down.  If that is the case advance the record id so we
+	// don't overlap logs.  This allows anyone to establish a log
+	// directory system.
+	if (reqptr->progress & 1 ) {
+		g_record_id++;
+	}
 
-    if ((fp = fopen(string, pio)) != NULL) {
-        fseek(fp, *offset, SEEK_SET);
-        fwrite(reqptr+1,rlen,1,fp);
-        fclose(fp);
-
-        *data_len = sizeof(g_record_id);
-        memcpy(response, &g_record_id, *data_len);
-    } else {
-        fprintf(stderr, "Error trying to perform %s for esel%s\n",pio, string);
-        rc = IPMI_CC_INVALID;
-        *data_len     = 0;
-    }
-
-    // The first bit prepresents that this is the last partial packet
-    // coming down.  If that is the case advance the record id so we
-    // don't overlap logs.  This allows anyone to establish a log
-    // directory system.
-    if (reqptr->progress & 1 ) {
-        g_record_id++;
-    }
-
-    return rc;
+	return rc;
 }
 
 
 void register_netfn_oem_partial_esel()
 {
-    printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_OEM, IPMI_CMD_PESEL);
-    ipmi_register_callback(NETFUN_OEM, IPMI_CMD_PESEL, NULL, ipmi_ibm_oem_partial_esel);
-    return;
+	printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_OEM, IPMI_CMD_PESEL);
+	ipmi_register_callback(NETFUN_OEM, IPMI_CMD_PESEL, NULL, ipmi_ibm_oem_partial_esel);
+	return;
 }
diff --git a/testit.C b/testit.C
deleted file mode 100644
index 79dfd6a..0000000
--- a/testit.C
+++ /dev/null
@@ -1,141 +0,0 @@
-#include <cstdlib>
-#include <cstring>
-#include <fstream>
-#include <iostream>
-#include <vector>
-#include <host-ipmid/ipmid-api.h>
-#include "oemhandler.h"
-
-using namespace std;
-
-const char* g_filepath = "/tmp/";
-
-const char * getFilePath(void) {    return g_filepath; }
-
-// Number of bytes without the IPMI completion code
-#define MAXRESPONSE 2
-
-
-
-// Returns the length of the file
-std::ifstream::pos_type filesize(const char* filename)
-{
-    std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
-    return in.tellg();
-}
-
-
-// Compares a string to the data in a file.
-// Returns 0 if complete match
-int compareData(const char *filename, const char *string, size_t len)
-{
-
-    std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
-    std::streamsize size =  in.tellg();
-
-    std::vector<char>      buffer(size);
-
-    in.read(buffer.data(), size);
-
-    if (!std::memcmp(string, buffer.data(), len))
-        return -1;
-
-
-    return 0;
-}
-
-
-void test_multiwrite(unsigned int segment, const char *pString) {
-
-    uint8_t request[1024];
-    uint8_t response[MAXRESPONSE];
-    size_t len, totalString;
-    ipmi_ret_t rc;
-    uint16_t i=0, j;
-
-    esel_request_t  requestheader[]  = {0,0,0,0,0,0};
-    esel_request_t  *pReqHdr = requestheader;
-    uint8_t firstime[] = { 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x20,
-                           0x00, 0x04, 0x0c, 0x1e, 0x07, 0xaa, 0x00, 0x00};
-
-    ipmi_request_t  pRequest  = request;
-    ipmi_response_t pResponse = response;
-    ipmi_data_len_t pLen      = &len;
-
-    totalString = strlen(pString);
-
-    std::memcpy(pRequest, requestheader, sizeof(requestheader));
-    std::memcpy(&request[sizeof(requestheader)], firstime, sizeof(firstime));
-
-    *pLen = sizeof(requestheader) + sizeof(firstime);
-
-    rc = ipmi_ibm_oem_partial_esel(0x3E, 0xF0, pRequest, pResponse, pLen, NULL);
-    if (rc  != IPMI_CC_OK) { printf("Error completion code returned %d\n", rc);}
-    if (len != 2)          { printf("Error data buffer length failed len\n");}
-
-    pReqHdr->selrecordls = response[0];
-    pReqHdr->selrecordms = response[1];
-
-
-    for (i=0; i<totalString; i+=segment) {
-
-        pReqHdr->offsetls = (i&0x00FF);
-        pReqHdr->offsetms = ((i&0xFF00) >> 8);
-
-        // printf("Record id msls 0x%02x%02x\n", pReqHdr->selrecordms, pReqHdr->selrecordls);
-        // printf("Offset 0x%04x , msls = 0x%02x%02x\n", i, pReqHdr->offsetms , pReqHdr->offsetls);
-
-        if (i+segment > totalString) {
-            j = totalString-i;
-        } else {
-            j = segment;
-        }
-
-        std::memcpy(pRequest, requestheader, sizeof(requestheader));
-        std::memcpy(&request[sizeof(requestheader)], pString+i, j);
-        len = sizeof(*requestheader) + j;
-
-        rc = ipmi_ibm_oem_partial_esel(0x3E, 0xF0, pRequest, pResponse, pLen, NULL);
-
-        if (rc  != IPMI_CC_OK) { printf("Error completion code returned %d\n", rc);}
-        if (len != 2)          { printf("Error data buffer length failed\n");}
-
-        pReqHdr->selrecordls = response[0];
-        pReqHdr->selrecordms = response[1];
-
-
-    }
-
-
-    if (filesize("/tmp/esel0100") !=  (unsigned int) strlen(pString)) { printf("Error fileszie mismatch\n");}
-
-    // /tmp/esel000 should be identical to the incoming string
-    rc = compareData("/tmp/esel0100",pString,strlen(pString));
-    if (rc != 0) {printf("Data miscompare %d\n",rc);}
-
-    return;
-}
-
-
-
-// Method that gets called by shared libraries to get their command handlers registered
-void ipmi_register_callback(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
-                       ipmi_context_t context, ipmid_callback_t handler)
-{
-}
-
-
-int main()
-{
-
-    const char* shortstring = "C";
-    const char* longstring  = "The President is very much a figurehead - he wields no real power whatsoever. He is apparently chosen by the government, but the qualities he is required to display are not those of leadership but those of finely judged outrage. For this reason the President is always a controversial choice, always an infuriating but fascinating character. His job is not to wield power but to draw attention away from it.";
-
-    test_multiwrite(1,  shortstring);
-
-    test_multiwrite(10, longstring);
-    test_multiwrite(1, longstring);
-    test_multiwrite(100, longstring);
-
-    return 0;
-}
