diff --git a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditEventFormat.java b/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditEventFormat.java
deleted file mode 100644
index cb07193..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditEventFormat.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.auditsl4j;
-
-import com.google.gerrit.audit.AuditEvent;
-import com.google.gerrit.audit.SshAuditEvent;
-
-public class AuditEventFormat implements AuditFormatter<SshAuditEvent> {
-  public static final Class<?> CLASS = AuditEvent.class;
-
-  @Override
-  public String format(SshAuditEvent result) {
-    return "";
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditFormatter.java
deleted file mode 100644
index 67c2589..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditFormatter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.auditsl4j;
-
-public interface AuditFormatter<T> {
-
-  String format(T result);
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditFormatters.java b/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditFormatters.java
deleted file mode 100644
index 4e3798b..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditFormatters.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2018 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.auditsl4j;
-
-import java.text.SimpleDateFormat;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-class AuditFormatters {
-  private static final SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss.SSSS");
-
-  @SuppressWarnings("serial")
-  private static final Map<Class<?>, AuditFormatter<?>> AUDIT_FORMATTERS =
-      Collections.unmodifiableMap(
-          new HashMap<Class<?>, AuditFormatter<? extends Object>>() {
-            {
-              put(HttpAuditEventFormat.CLASS, new HttpAuditEventFormat());
-              put(RpcAuditEventFormat.CLASS, new RpcAuditEventFormat());
-              put(SshAuditEventFormat.CLASS, new SshAuditEventFormat());
-              put(AuditEventFormat.CLASS, new AuditEventFormat());
-            }
-          });
-
-  public static <T> String getFormattedAuditSingle(T result) {
-    if (result == null) return "";
-
-    @SuppressWarnings("unchecked")
-    AuditFormatter<T> fmt = (AuditFormatter<T>) AUDIT_FORMATTERS.get(result.getClass());
-    if (fmt == null) return result.toString();
-
-    return fmt.format(result);
-  }
-
-  public static synchronized String getFormattedTS(long when) {
-    return dateFmt.format(new Date(when));
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditRendererToCsv.java b/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditRendererToCsv.java
index 041f846..1fec09b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditRendererToCsv.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/AuditRendererToCsv.java
@@ -14,17 +14,73 @@
 
 package com.googlesource.gerrit.plugins.auditsl4j;
 
-import static com.googlesource.gerrit.plugins.auditsl4j.AuditFormatters.getFormattedAuditSingle;
-import static com.googlesource.gerrit.plugins.auditsl4j.AuditFormatters.getFormattedTS;
-
 import com.google.common.collect.Multimap;
 import com.google.gerrit.audit.AuditEvent;
+import com.google.gerrit.audit.ExtendedHttpAuditEvent;
+import com.google.gerrit.audit.HttpAuditEvent;
+import com.google.gerrit.audit.RpcAuditEvent;
+import com.google.gerrit.audit.SshAuditEvent;
+
+import java.text.SimpleDateFormat;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.TreeSet;
 
 public class AuditRendererToCsv implements AuditRenderer {
+  
+  private static final SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss.SSSS");
+
+  @SuppressWarnings("serial")
+  private static final Map<Class<?>, CsvFieldFormatter<?>> FIELD_CSV_FORMATTERS =
+      Collections.unmodifiableMap(
+          new HashMap<Class<?>, CsvFieldFormatter<? extends Object>>() {
+            {
+              put(HttpAuditEvent.class, new HttpAuditEventFormat());
+              put(ExtendedHttpAuditEvent.class, new HttpAuditEventFormat());
+              put(RpcAuditEvent.class, new RpcAuditEventFormat());
+              put(SshAuditEvent.class, new SshAuditEventFormat());
+              put(AuditEvent.class, new AuditEventFormat());
+            }
+          });
+  
+  interface CsvFieldFormatter<T> {
+    String formatToCsv(T result);
+  }
+  
+  static class RpcAuditEventFormat implements CsvFieldFormatter<RpcAuditEvent> {
+    @Override
+    public String formatToCsv(RpcAuditEvent result) {
+      return "RPC-" + result.httpMethod + ", Status:" + result.httpStatus;
+    }
+  }
+  
+  static class HttpAuditEventFormat implements CsvFieldFormatter<HttpAuditEvent> {
+
+    @Override
+    public String formatToCsv(HttpAuditEvent result) {
+      return "HTTP-" + result.httpMethod + ", Status:" + result.httpStatus;
+    }
+  }
+  
+  static class SshAuditEventFormat implements CsvFieldFormatter<SshAuditEvent> {
+    @Override
+    public String formatToCsv(SshAuditEvent result) {
+      return "SSH";
+    }
+  }
+  
+  static class AuditEventFormat implements CsvFieldFormatter<SshAuditEvent> {
+
+    @Override
+    public String formatToCsv(SshAuditEvent result) {
+      return "";
+    }
+  }
 
   @Override
   public String render(AuditEvent auditEvent) {
@@ -33,11 +89,11 @@
         auditEvent.uuid.uuid(),
         getFormattedTS(auditEvent.when),
         auditEvent.sessionId,
-        getFormattedAuditSingle(auditEvent.who),
-        getFormattedAuditSingle(auditEvent),
+        getFieldAsCsv(auditEvent.who),
+        getFieldAsCsv(auditEvent),
         auditEvent.what,
         getFormattedAuditList(auditEvent.params),
-        getFormattedAuditSingle(auditEvent.result),
+        getFieldAsCsv(auditEvent.result),
         getFormattedTS(auditEvent.timeAtStart),
         auditEvent.elapsed);
   }
@@ -79,7 +135,7 @@
       if (numValues > 0) {
         out.append(",");
       }
-      out.append(getFormattedAuditSingle(object));
+      out.append(getFieldAsCsv(object));
       numValues++;
     }
 
@@ -88,4 +144,19 @@
     }
     return out.toString();
   }
+  
+
+  public static <T> String getFieldAsCsv(T result) {
+    if (result == null) return "";
+
+    @SuppressWarnings("unchecked")
+    CsvFieldFormatter<T> fmt = (CsvFieldFormatter<T>) FIELD_CSV_FORMATTERS.get(result.getClass());
+    if (fmt == null) return result.toString();
+
+    return fmt.formatToCsv(result);
+  }
+
+  public static synchronized String getFormattedTS(long when) {
+    return dateFmt.format(new Date(when));
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/HttpAuditEventFormat.java b/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/HttpAuditEventFormat.java
deleted file mode 100644
index 6551725..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/HttpAuditEventFormat.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.auditsl4j;
-
-import com.google.gerrit.audit.HttpAuditEvent;
-
-public class HttpAuditEventFormat implements AuditFormatter<HttpAuditEvent> {
-  protected static final Class<?> CLASS = HttpAuditEvent.class;
-
-  @Override
-  public String format(HttpAuditEvent result) {
-    return "HTTP-" + result.httpMethod + ", Status:" + result.httpStatus;
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/RpcAuditEventFormat.java b/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/RpcAuditEventFormat.java
deleted file mode 100644
index 053f302..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/RpcAuditEventFormat.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.auditsl4j;
-
-import com.google.gerrit.audit.RpcAuditEvent;
-
-public class RpcAuditEventFormat implements AuditFormatter<RpcAuditEvent> {
-  protected static final Class<?> CLASS = RpcAuditEvent.class;
-
-  @Override
-  public String format(RpcAuditEvent result) {
-    return "RPC-" + result.httpMethod + ", Status:" + result.httpStatus;
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/SshAuditEventFormat.java b/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/SshAuditEventFormat.java
deleted file mode 100644
index 9a15f77..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/auditsl4j/SshAuditEventFormat.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.auditsl4j;
-
-import com.google.gerrit.audit.SshAuditEvent;
-
-public class SshAuditEventFormat implements AuditFormatter<SshAuditEvent> {
-  protected static final Class<?> CLASS = SshAuditEvent.class;
-
-  @Override
-  public String format(SshAuditEvent result) {
-    return "SSH";
-  }
-}
