diff --git a/src/main/java/org/apache/log4j/LoggerRepositoryExImpl.java b/src/main/java/org/apache/log4j/LoggerRepositoryExImpl.java
index c2f5aaf..5235246 100644
--- a/src/main/java/org/apache/log4j/LoggerRepositoryExImpl.java
+++ b/src/main/java/org/apache/log4j/LoggerRepositoryExImpl.java
@@ -74,11 +74,11 @@
     /**
      * List of repository event listeners.
      */
-  private final ArrayList repositoryEventListeners = new ArrayList();
+  private final ArrayList<LoggerRepositoryEventListener> repositoryEventListeners = new ArrayList<>();
     /**
      * Map of HierarchyEventListener keyed by LoggingEventListener.
      */
-  private final Map loggerEventListeners = new HashMap();
+  private final Map<LoggerEventListener, HierarchyEventListenerProxy> loggerEventListeners = new HashMap<>();
     /**
      * Name of hierarchy.
      */
@@ -90,7 +90,7 @@
     /**
      * Properties.
      */
-  private final Map properties = new Hashtable();
+  private final Map<String, String> properties = new Hashtable<>();
     /**
      * Scheduler.
      */
@@ -99,13 +99,13 @@
   /** The repository can also be used as an object store
    * for various objects used by log4j components.
    */
-  private Map objectMap = new HashMap();
+  private Map<String, Object> objectMap = new HashMap<>();
 
 
     /**
      * Error list.
      */
-  private List errorList = new Vector();
+  private List<ErrorItem> errorList = new Vector<>();
 
     /**
      * True if hierarchy has not been modified.
@@ -206,7 +206,7 @@
   public void removeLoggerEventListener(final LoggerEventListener listener) {
     synchronized (loggerEventListeners) {
       HierarchyEventListenerProxy proxy =
-              (HierarchyEventListenerProxy) loggerEventListeners.get(listener);
+              loggerEventListeners.get(listener);
       if (proxy == null) {
         LogLog.warn(
           "Ignoring attempt to remove a non-registered LoggerEventListener.");
@@ -262,7 +262,7 @@
   /**
    * {@inheritDoc}
    */
-  public Map getProperties() {
+  public Map<String, String> getProperties() {
     return properties;
   }
 
@@ -270,7 +270,7 @@
    * {@inheritDoc}
    */
   public String getProperty(final String key) {
-     return (String) properties.get(key);
+     return properties.get(key);
   }
 
   /**
@@ -418,7 +418,7 @@
    * Return the the list of previously encoutered {@link ErrorItem error items}.
    * @return list of errors
    */
-  public List getErrorList() {
+  public List<ErrorItem> getErrorList() {
     return errorList;
   }
 
diff --git a/src/main/java/org/apache/log4j/chainsaw/AbstractPreferencePanel.java b/src/main/java/org/apache/log4j/chainsaw/AbstractPreferencePanel.java
index 722e8a3..810f319 100644
--- a/src/main/java/org/apache/log4j/chainsaw/AbstractPreferencePanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/AbstractPreferencePanel.java
@@ -107,11 +107,11 @@
     add(mainPanel, BorderLayout.CENTER);
   
     Box buttonBox = Box.createHorizontalBox();
-    List buttons = SwingHelper.orderOKCancelButtons(okButton, cancelButton);
+    List<JButton> buttons = SwingHelper.orderOKCancelButtons(okButton, cancelButton);
     buttonBox.add(Box.createHorizontalGlue());
-    buttonBox.add((JButton)buttons.get(0));
+    buttonBox.add(buttons.get(0));
     buttonBox.add(Box.createHorizontalStrut(10));
-    buttonBox.add((JButton)buttons.get(1));
+    buttonBox.add(buttons.get(1));
   
     add(buttonBox, BorderLayout.SOUTH);
   
diff --git a/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java b/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
index 7d1b46f..dc11119 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
@@ -59,7 +59,7 @@
     /**
      * If not 'empty', this property will be used as the URL to load log4j configuration at startup
      */
-    private Vector configurationURLs=new Vector();
+    private Vector<String> configurationURLs=new Vector<>();
 
     private String configurationURL = "";
 
@@ -209,7 +209,7 @@
       setShowSplash(model.isShowSplash());
       setToolTipDisplayMillis(model.getToolTipDisplayMillis());
       setCyclicBufferSize(model.getCyclicBufferSize());
-      Vector configurationURLs = model.getConfigurationURLs();
+      Vector<String> configurationURLs = model.getConfigurationURLs();
       if (configurationURLs != null) {
         setConfigurationURLs(configurationURLs);
       }
@@ -297,11 +297,11 @@
       return statusBar;
     }
 
-    public Vector getConfigurationURLs() {
+    public Vector<String> getConfigurationURLs() {
         return configurationURLs;
     }
 
-    public void setConfigurationURLs(Vector urls) {
+    public void setConfigurationURLs(Vector<String> urls) {
         if (urls != null) {
             configurationURLs = urls;
         }
diff --git a/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java b/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
index 5981cd4..9e440c6 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
@@ -69,7 +69,7 @@
   private JTextField identifierExpression;
   private JTextField toolTipDisplayMillis;
   private JTextField cyclicBufferSize;    
-  private JComboBox configurationURL;
+  private JComboBox<String> configurationURL;
   private final Logger logger;
   private GeneralAllPrefPanel generalAllPrefPanel;
 
@@ -355,7 +355,7 @@
     private final JSlider responsiveSlider =
       new JSlider(SwingConstants.HORIZONTAL, 1, 4, 2);
     private final JCheckBox confirmExit = new JCheckBox(" Confirm Exit ");
-    Dictionary sliderLabelMap = new Hashtable();
+    Dictionary<Integer, JLabel> sliderLabelMap = new Hashtable<>();
     
     private final JCheckBox okToRemoveSecurityManager = new JCheckBox(" Ok to remove SecurityManager ");
 
@@ -368,7 +368,7 @@
     private void initComponents() {
       setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
 
-      configurationURL = new JComboBox(new DefaultComboBoxModel(committedPreferenceModel.getConfigurationURLs()));
+      configurationURL = new JComboBox<>(new DefaultComboBoxModel<>(committedPreferenceModel.getConfigurationURLs()));
       configurationURL.setEditable(true);
       configurationURL.setPrototypeDisplayValue("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
       configurationURL.setPreferredSize(new Dimension(375, 13));
diff --git a/src/main/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java b/src/main/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java
index b4d670f..bbdc7bc 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java
@@ -54,7 +54,7 @@
       .getInstance();
   private PropertyChangeSupport propertySupport = new PropertyChangeSupport(
       this);
-  private Map customExpressionRules = new HashMap();
+  private Map<String, Rule> customExpressionRules = new HashMap<>();
 
   /**
    * NOTE: This variable needs to be physically located LAST, because
@@ -141,7 +141,7 @@
         return null;
       }
 
-      public void receiveEventBatch(String identifier, List events) {
+      public void receiveEventBatch(String identifier, List<LoggingEvent> events) {
         System.out.println("received " + events.size());
       }
     });
@@ -216,7 +216,7 @@
    * events accumulated during that time..
    */
   class WorkQueue {
-    final ArrayList queue = new ArrayList();
+    final ArrayList<LoggingEvent> queue = new ArrayList<>();
     Thread workerThread;
 
     protected WorkQueue() {
@@ -249,7 +249,7 @@
       }
 
       public void run() {
-        List innerList = new ArrayList();
+        List<LoggingEvent> innerList = new ArrayList<>();
         while (true) {
           long timeStart = System.currentTimeMillis();
           synchronized (mutex) {
@@ -267,10 +267,10 @@
           }
           int size = innerList.size();
           if (size > 0) {
-            Iterator iter = innerList.iterator();
+            Iterator<LoggingEvent> iter = innerList.iterator();
             ChainsawEventBatch eventBatch = new ChainsawEventBatch();
             while (iter.hasNext()) {
-              LoggingEvent e = (LoggingEvent) iter.next();
+              LoggingEvent e = iter.next();
               // attempt to set the host name (without port), from
               // remoteSourceInfo
               // if 'hostname' property not provided
@@ -329,9 +329,9 @@
       private void dispatchEventBatch(ChainsawEventBatch eventBatch) {
         EventBatchListener[] listeners = listenerList
             .getListeners(EventBatchListener.class);
-        for (Iterator iter = eventBatch.identifierIterator(); iter.hasNext();) {
-          String identifier = (String) iter.next();
-          List eventList = null;
+        for (Iterator<String> iter = eventBatch.identifierIterator(); iter.hasNext();) {
+          String identifier = iter.next();
+          List<LoggingEvent> eventList = null;
           for (EventBatchListener listener : listeners) {
             if ((listener.getInterestedIdentifier() == null)
                     || listener.getInterestedIdentifier().equals(identifier)) {
diff --git a/src/main/java/org/apache/log4j/chainsaw/ChainsawColumns.java b/src/main/java/org/apache/log4j/chainsaw/ChainsawColumns.java
index 1cfa8d1..faff682 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ChainsawColumns.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ChainsawColumns.java
@@ -33,7 +33,7 @@
  *
  */
 public class ChainsawColumns {
-  private static final List columnNames = new ArrayList();
+  private static final List<String> columnNames = new ArrayList<>();
 
   static {
     columnNames.add(ChainsawConstants.LOGGER_COL_NAME);
@@ -77,7 +77,7 @@
   private ChainsawColumns() {
   }
 
-  public static List getColumnsNames() {
+  public static List<String> getColumnsNames() {
     return columnNames;
   }
 
diff --git a/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java b/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
index e659f87..a33b3e3 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
@@ -72,7 +72,7 @@
   private boolean currentSortAscending;
   private int currentSortColumn;
   private final EventListenerList eventListenerList = new EventListenerList();
-  private final List columnNames = new ArrayList(ChainsawColumns.getColumnsNames());
+  private final List<String> columnNames = new ArrayList<>(ChainsawColumns.getColumnsNames());
   private boolean sortEnabled = false;
   private boolean reachedCapacity = false;
   private final Logger logger = LogManager.getLogger(ChainsawCyclicBufferTableModel.class);
@@ -116,8 +116,8 @@
     }
   }
 
-  public List getMatchingEvents(Rule rule) {
-    List list = new ArrayList();
+  public List<LoggingEventWrapper> getMatchingEvents(Rule rule) {
+    List<LoggingEventWrapper> list = new ArrayList<>();
     List unfilteredCopy;
     synchronized (mutex) {
         unfilteredCopy = new ArrayList(unfilteredList);
@@ -489,7 +489,7 @@
   }
 
   public String getColumnName(int column) {
-      return (String) columnNames.get(column);
+      return columnNames.get(column);
   }
 
   public LoggingEventWrapper getRow(int row) {
@@ -584,7 +584,7 @@
         String result = event.getProperty(columnNames.get(columnIndex).toString());
         if (result == null) {
             String lowerColName = columnNames.get(columnIndex).toString().toLowerCase(Locale.ENGLISH);
-            Set entrySet = event.getProperties().entrySet();
+            Set<Map.Entry> entrySet = event.getProperties().entrySet();
             for (Object anEntrySet : entrySet) {
                 Map.Entry thisEntry = (Map.Entry) anEntrySet;
                 if (thisEntry.getKey().toString().equalsIgnoreCase(lowerColName)) {
diff --git a/src/main/java/org/apache/log4j/chainsaw/ChainsawEventBatch.java b/src/main/java/org/apache/log4j/chainsaw/ChainsawEventBatch.java
index 56388f3..bf1a538 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ChainsawEventBatch.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ChainsawEventBatch.java
@@ -34,7 +34,7 @@
  *
  */
 class ChainsawEventBatch {
-  private Map identEventMap = new HashMap();
+  private Map<String, List<LoggingEvent>> identEventMap = new HashMap<>();
 
   ChainsawEventBatch() {
   }
@@ -44,10 +44,10 @@
    * @param e
    */
   void addEvent(String ident, LoggingEvent e) {
-    List events = (List)identEventMap.get(ident);
+    List<LoggingEvent> events = identEventMap.get(ident);
 
     if (events == null) {
-      events = new ArrayList();
+      events = new ArrayList<>();
       identEventMap.put(ident, events);
     }
 
@@ -61,7 +61,7 @@
    *
    * @return Iterator
    */
-  Iterator identifierIterator() {
+  Iterator<String> identifierIterator() {
     return identEventMap.keySet().iterator();
   }
 
@@ -71,7 +71,7 @@
    * @param identifier
    * @return Collection of LoggingEvent instances
    */
-  List entrySet(String identifier) {
-    return (List) identEventMap.get(identifier);
+  List<LoggingEvent> entrySet(String identifier) {
+    return identEventMap.get(identifier);
   }
 }
diff --git a/src/main/java/org/apache/log4j/chainsaw/ChainsawSplash.java b/src/main/java/org/apache/log4j/chainsaw/ChainsawSplash.java
index 4385dc7..ee0e882 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ChainsawSplash.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ChainsawSplash.java
@@ -57,7 +57,7 @@
     String[] preferredFontNames =
       new String[] { "Arial", "Helvetica", "SansSerif" };
 
-    Set availableFontNames = new HashSet();
+    Set<String> availableFontNames = new HashSet<>();
     Font[] allFonts =
       GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
 
diff --git a/src/main/java/org/apache/log4j/chainsaw/EventBatchListener.java b/src/main/java/org/apache/log4j/chainsaw/EventBatchListener.java
index e7140fe..354bee2 100644
--- a/src/main/java/org/apache/log4j/chainsaw/EventBatchListener.java
+++ b/src/main/java/org/apache/log4j/chainsaw/EventBatchListener.java
@@ -44,5 +44,5 @@
    * @param events List of LoggingEvent instances
    * @param identifier the identifier this list of LoggingEvents is associated with
    */
-  void receiveEventBatch(String identifier, List events);
+  void receiveEventBatch(String identifier, List<org.apache.log4j.spi.LoggingEvent> events);
 }
diff --git a/src/main/java/org/apache/log4j/chainsaw/EventContainer.java b/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
index db7ef82..179ec96 100644
--- a/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
+++ b/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
@@ -64,7 +64,7 @@
    */
   void clearModel();
 
-  List getMatchingEvents(Rule rule);
+  List<LoggingEventWrapper> getMatchingEvents(Rule rule);
 
   /**
    * Configures this model to use Cyclic or non-cyclic models.
diff --git a/src/main/java/org/apache/log4j/chainsaw/Generator.java b/src/main/java/org/apache/log4j/chainsaw/Generator.java
index 65228f3..e735e95 100644
--- a/src/main/java/org/apache/log4j/chainsaw/Generator.java
+++ b/src/main/java/org/apache/log4j/chainsaw/Generator.java
@@ -57,7 +57,7 @@
   private LoggingEvent createEvent(
     Level level, Logger logger, String msg, Throwable t) {
       ThrowableInformation ti = new ThrowableInformation(t);
-      Map properties = new HashMap();
+      Map<String, String> properties = new HashMap<>();
       properties.put(Constants.APPLICATION_KEY, getName());
       properties.put(Constants.HOSTNAME_KEY, "localhost");
       LocationInfo li = new LocationInfo("file", logger.getClass().getName(), "method", "123");
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java b/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
index 6357835..032c267 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
@@ -148,7 +148,7 @@
         return buffer.toString();
     }
 
-  public static Map getAppenderConfiguration(File file) {
+  public static Map<String, Map<String, String>> getAppenderConfiguration(File file) {
     try {
       return getXMLFileAppenderConfiguration(file);
     } catch (IOException | SAXException | ParserConfigurationException e) {
@@ -160,11 +160,11 @@
       //ignore
     }
     //don't return null
-    return new HashMap();
+    return new HashMap<>();
   }
 
-  public static Map getPropertiesFileAppenderConfiguration(File propertyFile) throws IOException {
-    Map result = new HashMap();
+  public static Map<String, Map<String, String>> getPropertiesFileAppenderConfiguration(File propertyFile) throws IOException {
+    Map<String, Map<String, String>> result = new HashMap<>();
     String appenderPrefix = "log4j.appender";
     Properties props = new Properties();
     FileInputStream inputStream = null;
@@ -172,7 +172,7 @@
       inputStream = new FileInputStream(propertyFile);
       props.load(inputStream);
       Enumeration propertyNames = props.propertyNames();
-      Map appenders = new HashMap();
+      Map<String, String> appenders = new HashMap<>();
       while (propertyNames.hasMoreElements()) {
         String propertyName = propertyNames.nextElement().toString();
         if (propertyName.startsWith(appenderPrefix)) {
@@ -193,7 +193,7 @@
                     String conversion = props.getProperty(appenderPrefix + "." + appenderName + ".layout.ConversionPattern");
                     String file = props.getProperty(appenderPrefix + "." + appenderName + ".File");
                     if (conversion != null && file != null) {
-                        Map entry = new HashMap();
+                        Map<String, String> entry = new HashMap<>();
                         entry.put("file", file.trim());
                         entry.put("conversion", conversion.trim());
                         result.put(appenderName, entry);
@@ -222,8 +222,8 @@
     return result;
   }
 
-  private static Map getXMLFileAppenderConfiguration(File file) throws IOException, ParserConfigurationException, SAXException {
-      Map result = new HashMap();
+  private static Map<String, Map<String, String>> getXMLFileAppenderConfiguration(File file) throws IOException, ParserConfigurationException, SAXException {
+      Map<String, Map<String, String>> result = new HashMap<>();
       try (InputStream stream = file.toURI().toURL().openStream()) {
           InputSource src = new InputSource(stream);
           src.setSystemId(file.toURI().toURL().toString());
@@ -245,7 +245,7 @@
                   if (appenderClass.getNodeValue().toLowerCase(Locale.ENGLISH).endsWith("fileappender")) {
                       String appenderName = appenderAttributes.getNamedItem("name").getNodeValue();
                       //subclass of FileAppender - add it
-                      Map entry = new HashMap();
+                      Map<String, String> entry = new HashMap<>();
                       NodeList appenderChildren = appender.getChildNodes();
                       for (int j = 0; j < appenderChildren.getLength(); j++) {
                           Node appenderChild = appenderChildren.item(j);
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
index a7f8109..dcf16a0 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
@@ -278,7 +278,7 @@
    * @param identifier used to load and save settings
    */
   public LogPanel(final ChainsawStatusBar statusBar, final String identifier, int cyclicBufferSize,
-                  Map allColorizers, final ApplicationPreferenceModel applicationPreferenceModel) {
+                  Map<String, RuleColorizer> allColorizers, final ApplicationPreferenceModel applicationPreferenceModel) {
     this.identifier = identifier;
     this.statusBar = statusBar;
     this.applicationPreferenceModel = applicationPreferenceModel;
@@ -298,7 +298,7 @@
     findCombo.setPrototypeDisplayValue(prototypeValue);
     buildCombo(findCombo, false, filterCombo.model);
 
-    final Map columnNameKeywordMap = new HashMap();
+    final Map<Object, String> columnNameKeywordMap = new HashMap<>();
     columnNameKeywordMap.put(ChainsawConstants.CLASS_COL_NAME, LoggingEventFieldResolver.CLASS_FIELD);
     columnNameKeywordMap.put(ChainsawConstants.FILE_COL_NAME, LoggingEventFieldResolver.FILE_FIELD);
     columnNameKeywordMap.put(ChainsawConstants.LEVEL_COL_NAME, LoggingEventFieldResolver.LEVEL_FIELD);
@@ -2033,7 +2033,7 @@
    * @param ident identifier shared by events
    * @param events list of LoggingEvent objects
    */
-  public void receiveEventBatch(String ident, final List events) {
+  public void receiveEventBatch(String ident, final List<LoggingEvent> events) {
 
     SwingHelper.invokeOnEDT(() -> {
       /*
@@ -2275,9 +2275,9 @@
     preferenceModel.setHiddenExpression(logTreePanel.getHiddenExpression());
     preferenceModel.setAlwaysDisplayExpression(logTreePanel.getAlwaysDisplayExpression());
     List visibleOrder = new ArrayList();
-    Enumeration cols = table.getColumnModel().getColumns();
+    Enumeration<TableColumn> cols = table.getColumnModel().getColumns();
     while (cols.hasMoreElements()) {
-    	TableColumn c = (TableColumn)cols.nextElement();
+    	TableColumn c = cols.nextElement();
     	visibleOrder.add(c);
     }
     preferenceModel.setVisibleColumnOrder(visibleOrder);
@@ -2409,7 +2409,7 @@
   	return tableModel.getFilteredEvents();
   }
   
-  List getMatchingEvents(Rule rule) {
+  List<LoggingEventWrapper> getMatchingEvents(Rule rule) {
     return tableModel.getMatchingEvents(rule);
   }
 
@@ -3015,8 +3015,8 @@
     TableColumnModel columnModel = table.getColumnModel();
     TableColumnModel searchColumnModel = searchTable.getColumnModel();
 
-    Map columnNameMap = new HashMap();
-    Map searchColumnNameMap = new HashMap();
+    Map<String, TableColumn> columnNameMap = new HashMap<>();
+    Map<String, TableColumn> searchColumnNameMap = new HashMap<>();
 
     for (int i = 0; i < columnModel.getColumnCount(); i++) {
       columnNameMap.put(table.getColumnName(i).toUpperCase(), columnModel.getColumn(i));
@@ -3028,7 +3028,7 @@
 
     int index;
     StringTokenizer tok = new StringTokenizer(columnOrder, ",");
-    List sortedColumnList = new ArrayList();
+    List<TableColumn> sortedColumnList = new ArrayList<>();
 
     /*
        remove all columns from the table that exist in the model
@@ -3037,7 +3037,7 @@
      **/
     while (tok.hasMoreElements()) {
       String element = tok.nextElement().toString().trim().toUpperCase();
-      TableColumn column = (TableColumn) columnNameMap.get(element);
+      TableColumn column = columnNameMap.get(element);
 
       if (column != null) {
         sortedColumnList.add(column);
@@ -3607,7 +3607,7 @@
     private class MarkerCellEditor implements TableCellEditor {
       JTable currentTable;
       JTextField textField = new JTextField();
-      Set cellEditorListeners = new HashSet();
+      Set<CellEditorListener> cellEditorListeners = new HashSet<>();
       private LoggingEventWrapper currentLoggingEventWrapper;
       private final Object mutex = new Object();
 
@@ -3642,9 +3642,9 @@
             }
 
             ChangeEvent event = new ChangeEvent(currentTable);
-            Set cellEditorListenersCopy;
+            Set<CellEditorListener> cellEditorListenersCopy;
             synchronized(mutex) {
-                cellEditorListenersCopy = new HashSet(cellEditorListeners);
+                cellEditorListenersCopy = new HashSet<>(cellEditorListeners);
             }
 
           for (Object aCellEditorListenersCopy : cellEditorListenersCopy) {
@@ -3658,9 +3658,9 @@
 
         public void cancelCellEditing()
         {
-            Set cellEditorListenersCopy;
+            Set<CellEditorListener> cellEditorListenersCopy;
             synchronized(mutex) {
-                cellEditorListenersCopy = new HashSet(cellEditorListeners);
+                cellEditorListenersCopy = new HashSet<>(cellEditorListeners);
             }
 
            ChangeEvent event = new ChangeEvent(currentTable);
@@ -3889,8 +3889,8 @@
     }
 
     abstract class AbstractEventMatchThumbnail extends JPanel {
-        protected List primaryList = new ArrayList();
-        protected List secondaryList = new ArrayList();
+        protected List<ThumbnailLoggingEventWrapper> primaryList = new ArrayList<>();
+        protected List<ThumbnailLoggingEventWrapper> secondaryList = new ArrayList<>();
         protected final int maxEventHeight = 6;
 
         AbstractEventMatchThumbnail() {
@@ -3956,15 +3956,15 @@
                 } else if (e.getType() == TableModelEvent.DELETE) {
                     //find each eventwrapper with an id in the deleted range and remove it...
 //                        System.out.println("delete- current warnings: " + warnings.size() + ", errors: " + errors.size() + ", first row: " + firstRow + ", last row: " + lastRow + ", displayed event count: " + displayedEvents.size() );
-                    for (Iterator iter = secondaryList.iterator();iter.hasNext();) {
-                        ThumbnailLoggingEventWrapper wrapper = (ThumbnailLoggingEventWrapper)iter.next();
+                    for (Iterator<ThumbnailLoggingEventWrapper> iter = secondaryList.iterator(); iter.hasNext();) {
+                        ThumbnailLoggingEventWrapper wrapper = iter.next();
                         if ((wrapper.rowNum >= firstRow) && (wrapper.rowNum <= lastRow)) {
 //                                System.out.println("deleting find: " + wrapper);
                             iter.remove();
                         }
                     }
-                    for (Iterator iter = primaryList.iterator();iter.hasNext();) {
-                        ThumbnailLoggingEventWrapper wrapper = (ThumbnailLoggingEventWrapper)iter.next();
+                    for (Iterator<ThumbnailLoggingEventWrapper> iter = primaryList.iterator(); iter.hasNext();) {
+                        ThumbnailLoggingEventWrapper wrapper = iter.next();
                         if ((wrapper.rowNum >= firstRow) && (wrapper.rowNum <= lastRow)) {
 //                                System.out.println("deleting error: " + wrapper);
                             iter.remove();
@@ -3976,15 +3976,15 @@
                 } else if (e.getType() == TableModelEvent.UPDATE) {
 //                        System.out.println("update - about to delete old warnings in range: " + firstRow + " to " + lastRow + ", current warnings: " + warnings.size() + ", errors: " + errors.size());
                     //find each eventwrapper with an id in the deleted range and remove it...
-                    for (Iterator iter = secondaryList.iterator();iter.hasNext();) {
-                        ThumbnailLoggingEventWrapper wrapper = (ThumbnailLoggingEventWrapper)iter.next();
+                    for (Iterator<ThumbnailLoggingEventWrapper> iter = secondaryList.iterator(); iter.hasNext();) {
+                        ThumbnailLoggingEventWrapper wrapper = iter.next();
                         if ((wrapper.rowNum >= firstRow) && (wrapper.rowNum <= lastRow)) {
 //                                System.out.println("update - deleting warning: " + wrapper);
                             iter.remove();
                         }
                     }
-                    for (Iterator iter = primaryList.iterator();iter.hasNext();) {
-                        ThumbnailLoggingEventWrapper wrapper = (ThumbnailLoggingEventWrapper)iter.next();
+                    for (Iterator<ThumbnailLoggingEventWrapper> iter = primaryList.iterator(); iter.hasNext();) {
+                        ThumbnailLoggingEventWrapper wrapper = iter.next();
                         if ((wrapper.rowNum >= firstRow) && (wrapper.rowNum <= lastRow)) {
 //                                System.out.println("update - deleting error: " + wrapper);
                             iter.remove();
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogPanelLoggerTreeModel.java b/src/main/java/org/apache/log4j/chainsaw/LogPanelLoggerTreeModel.java
index 0c98207..6ce8bdf 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogPanelLoggerTreeModel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogPanelLoggerTreeModel.java
@@ -42,7 +42,7 @@
  */
 class LogPanelLoggerTreeModel extends DefaultTreeModel
   implements LoggerNameListener {
-  private Map fullPackageMap = new HashMap();
+  private Map<String, LogPanelTreeNode> fullPackageMap = new HashMap<>();
   private final Logger logger = LogManager.getLogger(LogPanelLoggerTreeModel.class);
 
   LogPanelLoggerTreeModel() {
@@ -144,7 +144,7 @@
 
   LogPanelTreeNode lookupLogger(String newLogger) {
     if (fullPackageMap.containsKey(newLogger)) {
-      return (LogPanelTreeNode) fullPackageMap.get(newLogger);
+      return fullPackageMap.get(newLogger);
     }else{
         logger.debug("No logger found matching '" + newLogger + "'");
         logger.debug("Map Dump: " + fullPackageMap);
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java b/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
index 360820c..47187da 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
@@ -51,7 +51,7 @@
     Properties properties = SettingsManager.getInstance().getDefaultSettings();
 
       for (Map.Entry<Object, Object> objectObjectEntry : properties.entrySet()) {
-          Map.Entry entry = objectObjectEntry;
+          Map.Entry<Object, Object> entry = objectObjectEntry;
 
           if (entry.getKey().toString().startsWith("DateFormat")) {
               list.add(entry.getValue());
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogUI.java b/src/main/java/org/apache/log4j/chainsaw/LogUI.java
index cbaee9a..8ace4fd 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogUI.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogUI.java
@@ -156,8 +156,8 @@
   private ApplicationPreferenceModelPanel applicationPreferenceModelPanel;
   private final Map tableModelMap = new HashMap();
   private final Map tableMap = new HashMap();
-  private final List filterableColumns = new ArrayList();
-  private final Map panelMap = new HashMap();
+  private final List<String> filterableColumns = new ArrayList<>();
+  private final Map<String, Component> panelMap = new HashMap<>();
   ChainsawAppenderHandler handler;
   private ChainsawToolBarAndMenus tbms;
   private ChainsawAbout aboutBox;
@@ -165,7 +165,7 @@
   private final JFrame tutorialFrame = new JFrame("Chainsaw Tutorial");
   private JSplitPane mainReceiverSplitPane;
   private double lastMainReceiverSplitLocation = DEFAULT_MAIN_RECEIVER_SPLIT_LOCATION;
-  private final List identifierPanels = new ArrayList();
+  private final List<LogPanel> identifierPanels = new ArrayList<>();
   private int dividerSize;
   private int cyclicBufferSize;
   private static Logger logger;
@@ -199,7 +199,7 @@
   
   private PluginRegistry pluginRegistry;
   //map of tab names to rulecolorizers
-  private Map allColorizers = new HashMap();
+  private Map<String, RuleColorizer> allColorizers = new HashMap<>();
   private ReceiverConfigurationPanel receiverConfigurationPanel = new ReceiverConfigurationPanel();
 
   /**
@@ -585,8 +585,8 @@
 //    cc.activateOptions();
     
     try {
-        Class pluginClass = Class.forName("org.apache.log4j.chainsaw.zeroconf.ZeroConfPlugin");
-        Plugin plugin = (Plugin) pluginClass.newInstance();
+        Class<? extends Plugin> pluginClass = Class.forName("org.apache.log4j.chainsaw.zeroconf.ZeroConfPlugin").asSubclass(Plugin.class);
+        Plugin plugin = pluginClass.newInstance();
         pluginRegistry.addPlugin(plugin);
         plugin.activateOptions();
         MessageCenter.getInstance().getLogger().info("Looks like ZeroConf is available... WooHoo!");
@@ -705,7 +705,7 @@
 
     event.saveSetting(LogUI.MAIN_WINDOW_WIDTH, getWidth());
     event.saveSetting(LogUI.MAIN_WINDOW_HEIGHT, getHeight());
-    RuleColorizer colorizer = (RuleColorizer) allColorizers.get(ChainsawConstants.DEFAULT_COLOR_RULE_NAME);
+    RuleColorizer colorizer = allColorizers.get(ChainsawConstants.DEFAULT_COLOR_RULE_NAME);
     colorizer.saveColorSettings(ChainsawConstants.DEFAULT_COLOR_RULE_NAME);
     if (receiverConfigurationPanel.getModel().getLogFormat() != null ) {
       event.saveSetting("SavedConfig.logFormat", receiverConfigurationPanel.getModel().getLogFormat());
@@ -1360,7 +1360,7 @@
                           }
                           applicationPreferenceModel.setShowNoReceiverWarning(!receiverConfigurationPanel.isDontWarnMeAgain());
                           //remove existing plugins
-                          List plugins = pluginRegistry.getPlugins();
+                          List<Plugin> plugins = pluginRegistry.getPlugins();
                           for (Object plugin1 : plugins) {
                               Plugin plugin = (Plugin) plugin1;
                               //don't stop ZeroConfPlugin if it is registered
@@ -1374,8 +1374,8 @@
                               int port = receiverConfigurationPanel.getModel().getNetworkReceiverPort();
 
                               try {
-                                  Class receiverClass = receiverConfigurationPanel.getModel().getNetworkReceiverClass();
-                                  Receiver networkReceiver = (Receiver) receiverClass.newInstance();
+                                  Class<? extends Receiver> receiverClass = receiverConfigurationPanel.getModel().getNetworkReceiverClass();
+                                  Receiver networkReceiver = receiverClass.newInstance();
                                   networkReceiver.setName(receiverClass.getSimpleName() + "-" + port);
 
                                   Method portMethod =
@@ -1399,7 +1399,7 @@
                               File log4jConfigFile = receiverConfigurationPanel.getModel().getLog4jConfigFile();
                               if (log4jConfigFile != null) {
                                   try {
-                                      Map entries = LogFilePatternLayoutBuilder.getAppenderConfiguration(log4jConfigFile);
+                                      Map<String, Map<String, String>> entries = LogFilePatternLayoutBuilder.getAppenderConfiguration(log4jConfigFile);
                                       for (Object o : entries.entrySet()) {
                                           try {
                                               Map.Entry entry = (Map.Entry) o;
@@ -1568,7 +1568,7 @@
 
   Map getPanels() {
     Map m = new HashMap();
-    Set panelSet = getPanelMap().entrySet();
+    Set<Map.Entry<String, Component>> panelSet = getPanelMap().entrySet();
 
       for (Object aPanelSet : panelSet) {
           Map.Entry entry = (Map.Entry) aPanelSet;
@@ -1582,7 +1582,7 @@
   }
 
   void displayPanel(String panelName, boolean display) {
-    Component p = (Component)getPanelMap().get(panelName);
+    Component p = getPanelMap().get(panelName);
 
     int index = getTabbedPane().indexOfTab(panelName);
 
@@ -1779,7 +1779,7 @@
    *
    * @return DOCUMENT ME!
    */
-  public Map getPanelMap() {
+  public Map<String, Component> getPanelMap() {
     return panelMap;
   }
 
@@ -1801,7 +1801,7 @@
    *
    * @return DOCUMENT ME!
    */
-  public List getFilterableColumns() {
+  public List<String> getFilterableColumns() {
     return filterableColumns;
   }
 
@@ -1893,7 +1893,7 @@
   }
 
   private void buildLogPanel(
-      boolean customExpression, final String ident, final List events)
+      boolean customExpression, final String ident, final List<LoggingEvent> events)
       throws IllegalArgumentException {
       final LogPanel thisPanel = new LogPanel(getStatusBar(), ident, cyclicBufferSize, allColorizers, applicationPreferenceModel);
 
@@ -1971,7 +1971,7 @@
   public void createCustomExpressionLogPanel(String ident) {
     //collect events matching the rule from all of the tabs
     try {
-      List list = new ArrayList();
+      List<LoggingEvent> list = new ArrayList<>();
       Rule rule = ExpressionRule.getRule(ident);
 
         for (Object identifierPanel : identifierPanels) {
@@ -2062,7 +2062,7 @@
          * @param events
          */
     public void receiveEventBatch(
-      final String ident, final List events) {
+      final String ident, final List<LoggingEvent> events) {
       if (events.size() == 0) {
         return;
       }
diff --git a/src/main/java/org/apache/log4j/chainsaw/LoggerNameModelSupport.java b/src/main/java/org/apache/log4j/chainsaw/LoggerNameModelSupport.java
index 5d682d4..2a835a6 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LoggerNameModelSupport.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LoggerNameModelSupport.java
@@ -34,7 +34,7 @@
  */
 public class LoggerNameModelSupport implements LoggerNameModel {
   
-  private Set loggerNameSet = new HashSet();
+  private Set<String> loggerNameSet = new HashSet<>();
   private EventListenerList listenerList = new EventListenerList();
   
 
diff --git a/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java b/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
index b65ec41..24081ec 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
@@ -1245,7 +1245,7 @@
         break;
       }
 
-      List depths = new ArrayList();
+      List<Integer> depths = new ArrayList<>();
 
       while (depthEnum.hasMoreElements()) {
         depths.add(
@@ -1255,7 +1255,7 @@
       Collections.sort(depths);
       Collections.reverse(depths);
 
-      int maxDepth = (Integer) depths.get(0);
+      int maxDepth = depths.get(0);
 
       if (maxDepth > WARN_DEPTH) {
         logger.warn("Should warn user, depth=" + maxDepth);
diff --git a/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java b/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java
index 7244179..be19870 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java
@@ -46,6 +46,7 @@
 import org.apache.log4j.chainsaw.prefs.SettingsManager;
 import org.apache.log4j.net.SocketReceiver;
 import org.apache.log4j.net.UDPReceiver;
+import org.apache.log4j.plugins.Receiver;
 
 
 /**
@@ -59,10 +60,10 @@
     private final PanelModel panelModel = new PanelModel();
 
     //network receiver widgets
-    private JComboBox networkReceiverPortComboBox;
-    private JComboBox networkReceiverClassNameComboBox;
-    private DefaultComboBoxModel networkReceiverClassNameComboBoxModel;
-    private DefaultComboBoxModel networkReceiverPortComboBoxModel;
+    private JComboBox<String> networkReceiverPortComboBox;
+    private JComboBox<String> networkReceiverClassNameComboBox;
+    private DefaultComboBoxModel<String> networkReceiverClassNameComboBoxModel;
+    private DefaultComboBoxModel<String> networkReceiverPortComboBoxModel;
 
     //log4j config receiver widgets
     private JButton browseLog4jConfigButton;
@@ -70,18 +71,18 @@
 
     //logfile receiver widgets
     private JButton browseLogFileButton;
-    private JComboBox logFileFormatTypeComboBox;
+    private JComboBox<String> logFileFormatTypeComboBox;
 
-    private JComboBox logFileFormatComboBox;
-    private JComboBox logFileFormatTimestampFormatComboBox;
+    private JComboBox<String> logFileFormatComboBox;
+    private JComboBox<String> logFileFormatTimestampFormatComboBox;
     private JTextField logFileURLTextField;
-    private DefaultComboBoxModel logFileFormatComboBoxModel;
-    private DefaultComboBoxModel logFileFormatTimestampFormatComboBoxModel;
+    private DefaultComboBoxModel<String> logFileFormatComboBoxModel;
+    private DefaultComboBoxModel<String> logFileFormatTimestampFormatComboBoxModel;
 
     //use existing configuration widgets
     private JButton browseForAnExistingConfigurationButton;
-    private DefaultComboBoxModel existingConfigurationComboBoxModel;
-    private JComboBox existingConfigurationComboBox;
+    private DefaultComboBoxModel<String> existingConfigurationComboBoxModel;
+    private JComboBox<String> existingConfigurationComboBox;
 
     //don't warn again widgets
     private JCheckBox dontwarnIfNoReceiver;
@@ -215,20 +216,20 @@
         okButton = new JButton(" OK ");
         cancelButton = new JButton(" Cancel ");
 
-        List okCancelButtons = SwingHelper.orderOKCancelButtons(okButton, cancelButton);
+        List<JButton> okCancelButtons = SwingHelper.orderOKCancelButtons(okButton, cancelButton);
 
         c = new GridBagConstraints();
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 2;
         c.gridy = 0;
         c.insets = new Insets(0, 0, 0, 10);
-        panel.add((JButton)okCancelButtons.get(0), c);
+        panel.add(okCancelButtons.get(0), c);
 
         c = new GridBagConstraints();
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 3;
         c.gridy = 0;
-        panel.add((JButton)okCancelButtons.get(1), c);
+        panel.add(okCancelButtons.get(1), c);
 
         cancelButton.addActionListener(new ActionListener()
         {
@@ -292,19 +293,19 @@
     }
 
     private JPanel buildNetworkReceiverPanel() {
-        networkReceiverPortComboBoxModel = new DefaultComboBoxModel();
+        networkReceiverPortComboBoxModel = new DefaultComboBoxModel<>();
         networkReceiverPortComboBoxModel.addElement("4445");
         networkReceiverPortComboBoxModel.addElement("4560");
 
-        networkReceiverPortComboBox = new JComboBox(networkReceiverPortComboBoxModel);
+        networkReceiverPortComboBox = new JComboBox<>(networkReceiverPortComboBoxModel);
         networkReceiverPortComboBox.setEditable(true);
         networkReceiverPortComboBox.setOpaque(false);
 
-        networkReceiverClassNameComboBoxModel = new DefaultComboBoxModel();
+        networkReceiverClassNameComboBoxModel = new DefaultComboBoxModel<>();
         networkReceiverClassNameComboBoxModel.addElement(SocketReceiver.class.getName());
         networkReceiverClassNameComboBoxModel.addElement(UDPReceiver.class.getName());
 
-        networkReceiverClassNameComboBox = new JComboBox(networkReceiverClassNameComboBoxModel);
+        networkReceiverClassNameComboBox = new JComboBox<>(networkReceiverClassNameComboBoxModel);
 
         networkReceiverClassNameComboBox.setEditable(false);
         networkReceiverClassNameComboBox.setOpaque(false);
@@ -426,11 +427,11 @@
         c.insets = new Insets(0, 0, 5, 5);
         panel.add(new JLabel(" Log file format type "), c);
 
-        DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel();
+        DefaultComboBoxModel<String> comboBoxModel = new DefaultComboBoxModel<>();
         comboBoxModel.addElement("LogFilePatternReceiver LogFormat");
         comboBoxModel.addElement("PatternLayout format");
 
-        logFileFormatTypeComboBox = new JComboBox(comboBoxModel);
+        logFileFormatTypeComboBox = new JComboBox<>(comboBoxModel);
         logFileFormatTypeComboBox.setOpaque(false);
 
         c = new GridBagConstraints();
@@ -447,9 +448,9 @@
         c.insets = new Insets(0, 5, 5, 5);
         panel.add(new JLabel(" Log file format "), c);
 
-        logFileFormatComboBoxModel = new DefaultComboBoxModel();
+        logFileFormatComboBoxModel = new DefaultComboBoxModel<>();
         seedLogFileFormatComboBoxModel();
-        logFileFormatComboBox = new JComboBox(logFileFormatComboBoxModel);
+        logFileFormatComboBox = new JComboBox<>(logFileFormatComboBoxModel);
         logFileFormatComboBox.setEditable(true);
         logFileFormatComboBox.setOpaque(false);
         logFileFormatComboBox.setSelectedIndex(0);
@@ -469,9 +470,9 @@
         c.insets = new Insets(0, 5, 5, 5);
         panel.add(new JLabel(" Log file timestamp format "), c);
 
-        logFileFormatTimestampFormatComboBoxModel = new DefaultComboBoxModel();
+        logFileFormatTimestampFormatComboBoxModel = new DefaultComboBoxModel<>();
         seedLogFileFormatTimestampComboBoxModel();
-        logFileFormatTimestampFormatComboBox = new JComboBox(logFileFormatTimestampFormatComboBoxModel);
+        logFileFormatTimestampFormatComboBox = new JComboBox<>(logFileFormatTimestampFormatComboBoxModel);
         logFileFormatTimestampFormatComboBox.setEditable(true);
         logFileFormatTimestampFormatComboBox.setOpaque(false);
 
@@ -513,9 +514,9 @@
     }
 
     private JPanel buildUseExistingConfigurationPanel() {
-        existingConfigurationComboBoxModel = new DefaultComboBoxModel();
+        existingConfigurationComboBoxModel = new DefaultComboBoxModel<>();
 
-        existingConfigurationComboBox = new JComboBox(existingConfigurationComboBoxModel);
+        existingConfigurationComboBox = new JComboBox<>(existingConfigurationComboBoxModel);
         existingConfigurationComboBox.setOpaque(false);
         existingConfigurationComboBox.setToolTipText("Previously loaded configurations can be chosen here");
         existingConfigurationComboBox.setEditable(true);
@@ -708,8 +709,8 @@
             return Integer.parseInt(networkReceiverPortComboBoxModel.getSelectedItem().toString());
         }
 
-        Class getNetworkReceiverClass() throws ClassNotFoundException {
-            return Class.forName(networkReceiverClassNameComboBoxModel.getSelectedItem().toString());
+        Class<? extends Receiver> getNetworkReceiverClass() throws ClassNotFoundException {
+            return Class.forName(networkReceiverClassNameComboBoxModel.getSelectedItem().toString()).asSubclass(Receiver.class);
         }
 
         boolean isLoadConfig() {
diff --git a/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java b/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
index 1b20aec..3b6a662 100644
--- a/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
+++ b/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
@@ -78,7 +78,7 @@
  */
 public class TableColorizingRenderer extends DefaultTableCellRenderer {
   private static final DateFormat DATE_FORMATTER = new SimpleDateFormat(Constants.SIMPLE_TIME_PATTERN);
-  private static final Map iconMap = LevelIconFactory.getInstance().getLevelToIconMap();
+  private static final Map<String, Icon> iconMap = LevelIconFactory.getInstance().getLevelToIconMap();
   private RuleColorizer colorizer;
   private boolean levelUseIcons = false;
   private boolean wrap = false;
@@ -371,7 +371,7 @@
     case ChainsawColumns.INDEX_LEVEL_COL_NAME:
       if (levelUseIcons) {
         levelTextPane.setText("");
-        levelTextPane.insertIcon((Icon) iconMap.get(value.toString()));
+        levelTextPane.insertIcon(iconMap.get(value.toString()));
         if (!toolTipsVisible) {
           levelTextPane.setToolTipText(value.toString());
         }
diff --git a/src/main/java/org/apache/log4j/chainsaw/ThresholdSlider.java b/src/main/java/org/apache/log4j/chainsaw/ThresholdSlider.java
index a91bae9..f6fed76 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ThresholdSlider.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ThresholdSlider.java
@@ -65,7 +65,7 @@
       new DefaultBoundedRangeModel(
         priorityList.indexOf(Level.TRACE), 0, 0, priorityList.size() - 1));
 
-    Hashtable labelMap = new Hashtable();
+    Hashtable<Integer, JLabel> labelMap = new Hashtable<>();
 
       for (Object aPriorityList : priorityList) {
           Level item = (Level) aPriorityList;
diff --git a/src/main/java/org/apache/log4j/chainsaw/WelcomePanel.java b/src/main/java/org/apache/log4j/chainsaw/WelcomePanel.java
index b74c3ef..0fef5ca 100644
--- a/src/main/java/org/apache/log4j/chainsaw/WelcomePanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/WelcomePanel.java
@@ -48,7 +48,7 @@
  * @author Scott Deboy &lt;sdeboy@apache.org&gt;
  */
 public class WelcomePanel extends JPanel {
-  private Stack urlStack = new Stack();
+  private Stack<URL> urlStack = new Stack<>();
   private final JEditorPane textInfo = new JEditorPane();
   private final URLToolbar urlToolbar = new URLToolbar();
 
@@ -113,7 +113,7 @@
             return;
           }
 
-          setURL((URL) urlStack.pop());
+          setURL(urlStack.pop());
         }
       };
 
diff --git a/src/main/java/org/apache/log4j/chainsaw/color/ColorPanel.java b/src/main/java/org/apache/log4j/chainsaw/color/ColorPanel.java
index 41bdcf5..3d0789b 100644
--- a/src/main/java/org/apache/log4j/chainsaw/color/ColorPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/color/ColorPanel.java
@@ -92,27 +92,27 @@
   private JTable table;
   private ActionListener closeListener;
   private JLabel statusBar;
-  private Vector columns;
+  private Vector<String> columns;
   private final String noTab = "None";
   private DefaultComboBoxModel logPanelColorizersModel;
-  private Map allLogPanelColorizers;
+  private Map<String, RuleColorizer> allLogPanelColorizers;
   private RuleColorizer currentLogPanelColorizer;
   private JTable searchTable;
   private DefaultTableModel searchTableModel;
-  private Vector searchColumns;
-  private Vector searchDataVector;
-  private Vector searchDataVectorEntry;
+  private Vector<String> searchColumns;
+  private Vector<Vector<Color>> searchDataVector;
+  private Vector<Color> searchDataVectorEntry;
 
   private JTable alternatingColorTable;
   private DefaultTableModel alternatingColorTableModel;
-  private Vector alternatingColorColumns;
-  private Vector alternatingColorDataVector;
-  private Vector alternatingColorDataVectorEntry;
+  private Vector<String> alternatingColorColumns;
+  private Vector<Vector<Color>> alternatingColorDataVector;
+  private Vector<Color> alternatingColorDataVectorEntry;
   private ApplicationPreferenceModel applicationPreferenceModel;
   private JCheckBox bypassSearchColorsCheckBox;
 
   public ColorPanel(final RuleColorizer currentLogPanelColorizer, final FilterModel filterModel,
-                      final Map allLogPanelColorizers, final ApplicationPreferenceModel applicationPreferenceModel) {
+                    final Map<String, RuleColorizer> allLogPanelColorizers, final ApplicationPreferenceModel applicationPreferenceModel) {
     super(new BorderLayout());
 
     this.currentLogPanelColorizer = currentLogPanelColorizer;
@@ -139,29 +139,29 @@
     alternatingColorTable.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT);
     alternatingColorTable.setPreferredScrollableViewportSize(new Dimension(30, 30));
 
-    columns = new Vector();
+    columns = new Vector<>();
     columns.add("Expression");
     columns.add("Background");
     columns.add("Foreground");
 
-    searchColumns = new Vector();
+    searchColumns = new Vector<>();
     searchColumns.add("Background");
     searchColumns.add("Foreground");
 
-    alternatingColorColumns = new Vector();
+    alternatingColorColumns = new Vector<>();
     alternatingColorColumns.add("Background");
     alternatingColorColumns.add("Foreground");
 
     //searchtable contains only a single-entry vector containing a two-item vector (foreground, background)
-    searchDataVector = new Vector();
-    searchDataVectorEntry = new Vector();
+    searchDataVector = new Vector<>();
+    searchDataVectorEntry = new Vector<>();
     searchDataVectorEntry.add(applicationPreferenceModel.getSearchBackgroundColor());
     searchDataVectorEntry.add(applicationPreferenceModel.getSearchForegroundColor());
     searchDataVector.add(searchDataVectorEntry);
     searchTableModel.setDataVector(searchDataVector, searchColumns);
 
-    alternatingColorDataVector = new Vector();
-    alternatingColorDataVectorEntry = new Vector();
+    alternatingColorDataVector = new Vector<>();
+    alternatingColorDataVectorEntry = new Vector<>();
     alternatingColorDataVectorEntry.add(applicationPreferenceModel.getAlternatingColorBackgroundColor());
     alternatingColorDataVectorEntry.add(applicationPreferenceModel.getAlternatingColorForegroundColor());
     alternatingColorDataVector.add(alternatingColorDataVectorEntry);
@@ -170,7 +170,7 @@
     table.setPreferredScrollableViewportSize(new Dimension(525, 200));
     tableScrollPane = new JScrollPane(table);
 
-    Vector data = getColorizerVector();
+    Vector<Vector<java.io.Serializable>> data = getColorizerVector();
     tableModel.setDataVector(data, columns);
 
     table.sizeColumnsToFit(0);
@@ -256,7 +256,7 @@
               tableModel.getDataVector().clear();
               Object selectedItem = loadPanelColorizersComboBox.getSelectedItem();
               if (selectedItem != null) {
-                RuleColorizer sourceColorizer = (RuleColorizer) allLogPanelColorizers.get(selectedItem.toString());
+                RuleColorizer sourceColorizer = allLogPanelColorizers.get(selectedItem.toString());
                 colorizer.setRules(sourceColorizer.getRules());
                 updateColors();
               }
@@ -344,8 +344,8 @@
     tableModel.fireTableDataChanged();
   }
   
-  private Vector getColorizerVector() {
-      Vector data = new Vector();
+  private Vector<Vector<java.io.Serializable>> getColorizerVector() {
+      Vector<Vector<java.io.Serializable>> data = new Vector<>();
       Map map = colorizer.getRules();
       for (Object o1 : map.entrySet()) {
           Map.Entry entry = (Map.Entry) o1;
@@ -354,7 +354,7 @@
 
               for (Object o : ((List) entry.getValue())) {
                   ColorRule rule = (ColorRule) o;
-                  Vector v = new Vector();
+                  Vector<java.io.Serializable> v = new Vector<>();
                   v.add(rule.getExpression());
                   v.add(rule.getBackgroundColor());
                   v.add(rule.getForegroundColor());
@@ -510,7 +510,7 @@
     saveAsDefaultButton.addActionListener(
       new AbstractAction() {
         public void actionPerformed(ActionEvent evt) {
-          RuleColorizer defaultColorizer = (RuleColorizer) allLogPanelColorizers.get(ChainsawConstants.DEFAULT_COLOR_RULE_NAME);
+          RuleColorizer defaultColorizer = allLogPanelColorizers.get(ChainsawConstants.DEFAULT_COLOR_RULE_NAME);
           applyRules(currentRuleSet, defaultColorizer);
         }
     });
@@ -669,7 +669,7 @@
       new AbstractAction() {
         public void actionPerformed(ActionEvent evt) {
           int currentRow = table.getSelectedRow();
-          Vector v = new Vector();
+          Vector<java.io.Serializable> v = new Vector<>();
           v.add("");
           v.add(Color.white);
           v.add(Color.black);
diff --git a/src/main/java/org/apache/log4j/chainsaw/dnd/FileDnDTarget.java b/src/main/java/org/apache/log4j/chainsaw/dnd/FileDnDTarget.java
index d1c00d0..9bd1078 100644
--- a/src/main/java/org/apache/log4j/chainsaw/dnd/FileDnDTarget.java
+++ b/src/main/java/org/apache/log4j/chainsaw/dnd/FileDnDTarget.java
@@ -58,7 +58,7 @@
     private List fileList;
 
     private JComponent guiTarget;
-    private Map dropTargets = new HashMap();
+    private Map<JComponent, DropTarget> dropTargets = new HashMap<>();
     
     
     private PropertyChangeSupport propertySupport = new PropertyChangeSupport(this);
diff --git a/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java b/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java
index 561230c..37c8885 100644
--- a/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java
+++ b/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java
@@ -35,15 +35,15 @@
  *
  */
 public class EventTypeEntryContainer {
-  private Set ColumnNames = new HashSet();
-  private Set Methods = new HashSet();
-  private Set Classes = new HashSet();
-  private Set NDCs = new HashSet();
+  private Set<String> ColumnNames = new HashSet<>();
+  private Set<String> Methods = new HashSet<>();
+  private Set<String> Classes = new HashSet<>();
+  private Set<String> NDCs = new HashSet<>();
   private Set Levels = new HashSet();
-  private Set Loggers = new HashSet();
-  private Set Threads = new HashSet();
-  private Set FileNames = new HashSet();
-  private DefaultListModel columnNameListModel = new DefaultListModel();
+  private Set<String> Loggers = new HashSet<>();
+  private Set<String> Threads = new HashSet<>();
+  private Set<String> FileNames = new HashSet<>();
+  private DefaultListModel<String> columnNameListModel = new DefaultListModel<>();
   private DefaultListModel methodListModel = new DefaultListModel();
   private DefaultListModel classesListModel = new DefaultListModel();
   private DefaultListModel propListModel = new DefaultListModel();
diff --git a/src/main/java/org/apache/log4j/chainsaw/help/HelpLocator.java b/src/main/java/org/apache/log4j/chainsaw/help/HelpLocator.java
index 03d6983..2597d51 100644
--- a/src/main/java/org/apache/log4j/chainsaw/help/HelpLocator.java
+++ b/src/main/java/org/apache/log4j/chainsaw/help/HelpLocator.java
@@ -36,7 +36,7 @@
  *         &lt;psmith@apache.org&gt;
  */
 class HelpLocator {
-  private List classLoaders = new ArrayList();
+  private List<ClassLoader> classLoaders = new ArrayList<>();
   private static Logger logger = LogManager.getLogger(HelpLocator.class);
   HelpLocator() {
   }
diff --git a/src/main/java/org/apache/log4j/chainsaw/helper/SwingHelper.java b/src/main/java/org/apache/log4j/chainsaw/helper/SwingHelper.java
index 052c693..f0882f1 100644
--- a/src/main/java/org/apache/log4j/chainsaw/helper/SwingHelper.java
+++ b/src/main/java/org/apache/log4j/chainsaw/helper/SwingHelper.java
@@ -96,8 +96,8 @@
     return System.getProperty("os.name").toLowerCase(Locale.ENGLISH).startsWith("mac os x");
   }
 
-  public static List orderOKCancelButtons(JButton okButton, JButton cancelButton) {
-    List result = new ArrayList();
+  public static List<JButton> orderOKCancelButtons(JButton okButton, JButton cancelButton) {
+    List<JButton> result = new ArrayList<>();
     if (isMacOSX()) {
       result.add(cancelButton);
       result.add(okButton);
diff --git a/src/main/java/org/apache/log4j/chainsaw/helper/TableCellEditorFactory.java b/src/main/java/org/apache/log4j/chainsaw/helper/TableCellEditorFactory.java
index 3f00f78..50dd1e8 100644
--- a/src/main/java/org/apache/log4j/chainsaw/helper/TableCellEditorFactory.java
+++ b/src/main/java/org/apache/log4j/chainsaw/helper/TableCellEditorFactory.java
@@ -36,7 +36,7 @@
    */ 
   public static final TableCellEditor createBooleanTableCellEditor() {
   
-    JComboBox comboBox = new JComboBox(new Boolean[] {Boolean.TRUE, Boolean.FALSE});
+    JComboBox<Boolean> comboBox = new JComboBox<>(new Boolean[] {Boolean.TRUE, Boolean.FALSE});
     return new DefaultCellEditor(comboBox);
     
   }
@@ -53,7 +53,7 @@
    */
   public static Object createLevelTableCellEditor()
   {
-    JComboBox comboBox = new JComboBox(new Level[] {Level.TRACE, Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL, Level.OFF, Level.ALL});
+    JComboBox<Level> comboBox = new JComboBox<>(new Level[] {Level.TRACE, Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL, Level.OFF, Level.ALL});
     return new DefaultCellEditor(comboBox); 
   }
 
diff --git a/src/main/java/org/apache/log4j/chainsaw/icons/LevelIconFactory.java b/src/main/java/org/apache/log4j/chainsaw/icons/LevelIconFactory.java
index fd28b47..1de2fda 100644
--- a/src/main/java/org/apache/log4j/chainsaw/icons/LevelIconFactory.java
+++ b/src/main/java/org/apache/log4j/chainsaw/icons/LevelIconFactory.java
@@ -30,7 +30,7 @@
  */
 public class LevelIconFactory {
   private static final LevelIconFactory instance = new LevelIconFactory();
-  private final Map iconMap = new HashMap();
+  private final Map<String, javax.swing.Icon> iconMap = new HashMap<>();
 
   private LevelIconFactory() {
     //reuse ERROR icon for FATAL level
@@ -69,7 +69,7 @@
     return instance;
   }
 
-  public Map getLevelToIconMap() {
+  public Map<String, javax.swing.Icon> getLevelToIconMap() {
     return iconMap;
   }
 }
diff --git a/src/main/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java b/src/main/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java
index a1801ff..82e0f74 100644
--- a/src/main/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java
+++ b/src/main/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java
@@ -185,7 +185,7 @@
     if (event.locationInformationExists()) {
         li = formatLocationInfo(event);
     }
-    Hashtable properties = formatProperties(event);
+    Hashtable<String, String> properties = formatProperties(event);
     LoggingEvent copy = new LoggingEvent(null,
 	   logger, event.getTimeStamp(),
 	   event.getLevel(),
@@ -234,9 +234,9 @@
    * @param event
    * @return
    */
-  private static Hashtable formatProperties(LoggingEvent event) {
+  private static Hashtable<String, String> formatProperties(LoggingEvent event) {
     Set keySet = event.getPropertyKeySet();
-    Hashtable hashTable = new Hashtable();
+    Hashtable<String, String> hashTable = new Hashtable<>();
 
       for (Object key : keySet) {
           Object value = event.getProperty(key.toString());
diff --git a/src/main/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java b/src/main/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java
index 37fd3d6..a95635b 100644
--- a/src/main/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java
+++ b/src/main/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java
@@ -166,7 +166,7 @@
       *
       */
   private void createEvent() {
-    Hashtable hashTable = new Hashtable();
+    Hashtable<String, String> hashTable = new Hashtable<>();
     hashTable.put("key1", "val1");
     hashTable.put("key2", "val2");
     hashTable.put("key3", "val3");
diff --git a/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java b/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java
index ba782a1..f2751ee 100644
--- a/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java
+++ b/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java
@@ -73,7 +73,7 @@
   private static final MessageCenter instance = new MessageCenter();
   private final Logger logger = Logger.getLogger(MessageCenter.class);
   private Layout layout = new TTCCLayout();
-  private final JList messageList = new JList();
+  private final JList<org.apache.log4j.spi.LoggingEvent> messageList = new JList<>();
   private final ListModelAppender appender = new ListModelAppender();
   private ListCellRenderer listCellRenderer =
     new LayoutListCellRenderer(layout);
@@ -176,7 +176,7 @@
     return componentPanel;
   }
 
-  public ListModel getModel() {
+  public ListModel<org.apache.log4j.spi.LoggingEvent> getModel() {
     return messageList.getModel();
   }
 
diff --git a/src/main/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java b/src/main/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java
index 06a7505..a96dd15 100644
--- a/src/main/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java
+++ b/src/main/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java
@@ -72,7 +72,7 @@
         String[] strings = pluginDirectory.list((dir, name) -> name.toUpperCase().endsWith(".JAR"));
         
       
-        List list = new ArrayList();
+        List<URL> list = new ArrayList<>();
         // add the plugin directory as a resource loading path
         try {
 			list.add(pluginDirectory.toURI().toURL());
diff --git a/src/main/java/org/apache/log4j/chainsaw/prefs/LoadSettingsEvent.java b/src/main/java/org/apache/log4j/chainsaw/prefs/LoadSettingsEvent.java
index d0b8f0b..2a848da 100644
--- a/src/main/java/org/apache/log4j/chainsaw/prefs/LoadSettingsEvent.java
+++ b/src/main/java/org/apache/log4j/chainsaw/prefs/LoadSettingsEvent.java
@@ -66,7 +66,7 @@
     Collection c = new ArrayList();
 
       for (Map.Entry<Object, Object> objectObjectEntry : properties.entrySet()) {
-          Map.Entry entry = objectObjectEntry;
+          Map.Entry<Object, Object> entry = objectObjectEntry;
           if (entry.getKey().toString().startsWith(string)) {
               c.add(entry.getValue());
           }
diff --git a/src/main/java/org/apache/log4j/chainsaw/prefs/MRUFileList.java b/src/main/java/org/apache/log4j/chainsaw/prefs/MRUFileList.java
index 258918f..f93f163 100644
--- a/src/main/java/org/apache/log4j/chainsaw/prefs/MRUFileList.java
+++ b/src/main/java/org/apache/log4j/chainsaw/prefs/MRUFileList.java
@@ -35,7 +35,7 @@
     private static MRUFileList log4jList = new MRUFileList();
     private static final int DEFAULT_MRU_SIZE = 5;
     
-    private List fileList = new ArrayList();
+    private List<URL> fileList = new ArrayList<>();
     private int size = DEFAULT_MRU_SIZE;
     
     private static transient EventListenerList listeners = new EventListenerList();
diff --git a/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiverTreeCellRenderer.java b/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiverTreeCellRenderer.java
index c1b41dc..8e4645a 100644
--- a/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiverTreeCellRenderer.java
+++ b/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiverTreeCellRenderer.java
@@ -95,8 +95,8 @@
 
       if (t.getThreshold() != null) {
         levelLabel.setIcon(
-          (Icon) LevelIconFactory.getInstance().getLevelToIconMap().get(
-            t.getThreshold().toString()));
+                LevelIconFactory.getInstance().getLevelToIconMap().get(
+                  t.getThreshold().toString()));
 
         if (levelLabel.getIcon() == null) {
           levelLabel.setText(t.getThreshold().toString());
diff --git a/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java b/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java
index 5912aa1..18ac3a6 100644
--- a/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java
+++ b/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java
@@ -65,7 +65,7 @@
     private static final ReceiversHelper instance = new ReceiversHelper();
 
     private final Logger logger = LogManager.getLogger(ReceiversHelper.class);
-    private List receiverClassList = new ArrayList();
+    private List<Class> receiverClassList = new ArrayList<>();
     /**
      *
      */
@@ -134,8 +134,8 @@
   public void saveReceiverConfiguration(File file) {
     LoggerRepository repo = LogManager.getLoggerRepository();
     PluginRegistry pluginRegistry = ((LoggerRepositoryEx) repo).getPluginRegistry();
-    List fullPluginList = pluginRegistry.getPlugins();
-    List pluginList = new ArrayList();
+    List<Plugin> fullPluginList = pluginRegistry.getPlugins();
+    List<Plugin> pluginList = new ArrayList<>();
       for (Object aFullPluginList : fullPluginList) {
           Plugin thisPlugin = (Plugin) aFullPluginList;
           if (thisPlugin instanceof Receiver) {
@@ -169,7 +169,7 @@
                 pluginElement.setAttribute("class", receiver.getClass().getName());
 
                 BeanInfo beanInfo = Introspector.getBeanInfo(receiver.getClass());
-                List list = new ArrayList(Arrays.asList(beanInfo.getPropertyDescriptors()));
+                List<PropertyDescriptor> list = new ArrayList<>(Arrays.asList(beanInfo.getPropertyDescriptors()));
 
                 for (Object aList : list) {
                     PropertyDescriptor d = (PropertyDescriptor) aList;
diff --git a/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java b/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
index d206fa5..aaa4642 100644
--- a/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
@@ -801,11 +801,11 @@
 
     private JRadioButtonMenuItem createLevelRadioButton(
       final Receiver r, final Level l) {
-      Map levelIconMap = LevelIconFactory.getInstance().getLevelToIconMap();
+      Map<String, Icon> levelIconMap = LevelIconFactory.getInstance().getLevelToIconMap();
 
       Action action =
         new AbstractAction(
-          l.toString(), (Icon) levelIconMap.get(l.toString())) {
+          l.toString(), levelIconMap.get(l.toString())) {
           public void actionPerformed(ActionEvent e) {
             if (r != null) {
               r.setThreshold(l);
diff --git a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfDeviceModel.java b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfDeviceModel.java
index f5ffe5d..27572b7 100644
--- a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfDeviceModel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfDeviceModel.java
@@ -27,7 +27,7 @@
 
 public class ZeroConfDeviceModel extends AbstractTableModel implements ServiceListener {
 
-    private List deviceList = new ArrayList();
+    private List<ServiceInfo> deviceList = new ArrayList<>();
     private ZeroConfPreferenceModel zeroConfPreferenceModel;
     private transient ZeroConfPlugin plugin;
     
@@ -43,10 +43,10 @@
     }
 
     public ServiceInfo getServiceInfoAtRow(int row) {
-        return (ServiceInfo) deviceList.get(row);
+        return deviceList.get(row);
     }
     public Object getValueAt(int rowIndex, int columnIndex) {
-        ServiceInfo info = (ServiceInfo) deviceList.get(rowIndex);
+        ServiceInfo info = deviceList.get(rowIndex);
         if(info == null) {
             return "";
         }
@@ -73,8 +73,8 @@
     }
 
     public void serviceRemoved(ServiceEvent event) {
-        for (Iterator iter = deviceList.iterator(); iter.hasNext();) {
-            ServiceInfo info = (ServiceInfo) iter.next();
+        for (Iterator<ServiceInfo> iter = deviceList.iterator(); iter.hasNext();) {
+            ServiceInfo info = iter.next();
             if(info.getName().equals(event.getName())) {
                 iter.remove();
             }
diff --git a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
index 93b69f9..7f08c25 100644
--- a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
+++ b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
@@ -88,7 +88,7 @@
 
     private ZeroConfPreferenceModel preferenceModel;
     
-    private final Map serviceInfoToReceiveMap = new HashMap();
+    private final Map<ServiceInfo, Plugin> serviceInfoToReceiveMap = new HashMap<>();
 
     private JMenu connectToMenu = new JMenu("Connect to");
     private JMenuItem helpItem = new JMenuItem(new AbstractAction("Learn more about ZeroConf...",
@@ -169,8 +169,8 @@
             public void pluginStopped(PluginEvent e) {
                 Plugin plugin = e.getPlugin();
                 synchronized(serviceInfoToReceiveMap) {
-                    for (Iterator iter = serviceInfoToReceiveMap.entrySet().iterator(); iter.hasNext();) {
-                        Map.Entry entry = (Map.Entry) iter.next();
+                    for (Iterator<Map.Entry<ServiceInfo, Plugin>> iter = serviceInfoToReceiveMap.entrySet().iterator(); iter.hasNext();) {
+                        Map.Entry<ServiceInfo, Plugin> entry = iter.next();
                         if(entry.getValue() == plugin) {
                                 iter.remove();
                         }
@@ -198,7 +198,7 @@
 
     private void registerServiceListenersForAppenders()
     {
-        Set serviceNames = new HashSet();
+        Set<String> serviceNames = new HashSet<>();
         serviceNames.add(MULTICAST_APPENDER_SERVICE_NAME);
         serviceNames.add(SOCKET_APPENDER_SERVICE_NAME);
         serviceNames.add(SOCKETHUB_APPENDER_SERVICE_NAME);
@@ -422,7 +422,7 @@
         }
         Plugin plugin;
         synchronized (serviceInfoToReceiveMap) {
-            plugin = (Plugin) serviceInfoToReceiveMap.get(info);
+            plugin = serviceInfoToReceiveMap.get(info);
         }
         ((LoggerRepositoryEx)LogManager.getLoggerRepository()).getPluginRegistry().stopPlugin(plugin.getName());
         
diff --git a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPreferenceModel.java b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPreferenceModel.java
index 1ac13c4..4b31690 100644
--- a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPreferenceModel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPreferenceModel.java
@@ -23,8 +23,8 @@
 
 public class ZeroConfPreferenceModel {
 
-    private List monitoredZones = new ArrayList();
-    private Set autoConnectDevices = new HashSet();
+    private List<String> monitoredZones = new ArrayList<>();
+    private Set<String> autoConnectDevices = new HashSet<>();
     
 //   TODO expose addPropertyChangeListener
     
@@ -38,19 +38,19 @@
         monitoredZones.add(zone);
     }
 
-    public Set getAutoConnectDevices() {
+    public Set<String> getAutoConnectDevices() {
         return autoConnectDevices;
     }
 
-    public void setAutoConnectDevices(Set autoConnectDevices) {
+    public void setAutoConnectDevices(Set<String> autoConnectDevices) {
         this.autoConnectDevices = autoConnectDevices;
     }
 
-    public List getMonitoredZones() {
+    public List<String> getMonitoredZones() {
         return monitoredZones;
     }
 
-    public void setMonitoredZones(List monitoredZones) {
+    public void setMonitoredZones(List<String> monitoredZones) {
         this.monitoredZones = monitoredZones;
     }
 
diff --git a/src/main/java/org/apache/log4j/db/CustomSQLDBReceiver.java b/src/main/java/org/apache/log4j/db/CustomSQLDBReceiver.java
index 55ade75..dc7fcce 100644
--- a/src/main/java/org/apache/log4j/db/CustomSQLDBReceiver.java
+++ b/src/main/java/org/apache/log4j/db/CustomSQLDBReceiver.java
@@ -294,13 +294,13 @@
                 String threadName;
                 Object message;
                 String ndc;
-                Hashtable mdc;
+                Hashtable<String, String> mdc;
                 String[] throwable;
                 String className;
                 String methodName;
                 String fileName;
                 String lineNumber;
-                Hashtable properties;
+                Hashtable<String, String> properties;
 
                 String currentSQLStatement;
                 if (whereExists) {
@@ -335,7 +335,7 @@
                     ndc = rs.getString("NDC");
 
                     String mdcString = rs.getString("MDC");
-                    mdc = new Hashtable();
+                    mdc = new Hashtable<>();
 
                     if (mdcString != null) {
                         // support MDC being wrapped in {{name, value}}
@@ -369,7 +369,7 @@
                     // property
                     // are set)
                     String propertiesString = rs.getString("PROPERTIES");
-                    properties = new Hashtable();
+                    properties = new Hashtable<>();
 
                     if (propertiesString != null) {
                         // support properties being wrapped in {{name,
diff --git a/src/main/java/org/apache/log4j/db/DBReceiverJob.java b/src/main/java/org/apache/log4j/db/DBReceiverJob.java
index 30139b4..80af7cc 100644
--- a/src/main/java/org/apache/log4j/db/DBReceiverJob.java
+++ b/src/main/java/org/apache/log4j/db/DBReceiverJob.java
@@ -203,7 +203,7 @@
       statement.setLong(1, id);
       ResultSet rs = statement.executeQuery();
 
-      Vector v = new Vector();
+      Vector<String> v = new Vector<>();
 
       while (rs.next()) {
         //int i = rs.getShort(1);
@@ -213,7 +213,7 @@
       int len = v.size();
       String[] strRep = new String[len];
       for (int i = 0; i < len; i++) {
-        strRep[i] = (String) v.get(i);
+        strRep[i] = v.get(i);
       }
       // we've filled strRep, we now attach it to the event
       return new ThrowableInformation(strRep);
diff --git a/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java b/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
index b15fbca..4fec74d 100644
--- a/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
+++ b/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
@@ -168,8 +168,8 @@
      * Gets list of supported levels.
      * @return  list of supported levels.
      */
-    public static List getAllPossibleLevels() {
-        ArrayList list = new ArrayList();
+    public static List<UtilLoggingLevel> getAllPossibleLevels() {
+        ArrayList<UtilLoggingLevel> list = new ArrayList<>();
         list.add(FINE);
         list.add(FINER);
         list.add(FINEST);
diff --git a/src/main/java/org/apache/log4j/net/MulticastAppender.java b/src/main/java/org/apache/log4j/net/MulticastAppender.java
index c74f467..2e4cff8 100644
--- a/src/main/java/org/apache/log4j/net/MulticastAppender.java
+++ b/src/main/java/org/apache/log4j/net/MulticastAppender.java
@@ -121,7 +121,7 @@
     }
       
     if (advertiseViaMulticastDNS) {
-        Map properties = new HashMap();
+        Map<String, String> properties = new HashMap<>();
         properties.put("multicastAddress", remoteHost);
         zeroConf = new ZeroConfSupport(ZONE, port, getName(), properties);
         zeroConf.advertise();
diff --git a/src/main/java/org/apache/log4j/net/MulticastReceiver.java b/src/main/java/org/apache/log4j/net/MulticastReceiver.java
index f0a542f..69b33ec 100644
--- a/src/main/java/org/apache/log4j/net/MulticastReceiver.java
+++ b/src/main/java/org/apache/log4j/net/MulticastReceiver.java
@@ -174,7 +174,7 @@
     }
 
     class MulticastHandlerThread extends Thread {
-    private final List list = new ArrayList();
+    private final List<String> list = new ArrayList<>();
 
     public MulticastHandlerThread() {
       setDaemon(true);
@@ -188,7 +188,7 @@
     }
 
     public void run() {
-      ArrayList list2 = new ArrayList();
+      ArrayList<String> list2 = new ArrayList<>();
 
       while (isAlive()) {
         synchronized (list) {
@@ -209,7 +209,7 @@
 
             for (Object aList2 : list2) {
                 String data = (String) aList2;
-                List v = decoderImpl.decodeEvents(data.trim());
+                List<LoggingEvent> v = decoderImpl.decodeEvents(data.trim());
 
                 if (v != null) {
 
diff --git a/src/main/java/org/apache/log4j/net/SocketReceiver.java b/src/main/java/org/apache/log4j/net/SocketReceiver.java
index 821935f..29725ab 100644
--- a/src/main/java/org/apache/log4j/net/SocketReceiver.java
+++ b/src/main/java/org/apache/log4j/net/SocketReceiver.java
@@ -53,7 +53,7 @@
     /**
      * socket map.
      */
-  private Map socketMap = new HashMap();
+  private Map<Socket, SocketNode13> socketMap = new HashMap<>();
     /**
      * Paused.
      */
@@ -73,7 +73,7 @@
     /**
      * Socket list.
      */
-  private Vector socketList = new Vector();
+  private Vector<Socket> socketList = new Vector<>();
 
   /**
    * The MulticastDNS zone advertised by a SocketReceiver
@@ -332,15 +332,15 @@
    * been responsible for creating.
    * @return Vector of SocketDetails
    */
-  public Vector getConnectedSocketDetails() {
-    Vector details = new Vector(socketList.size());
+  public Vector<SocketDetail> getConnectedSocketDetails() {
+    Vector<SocketDetail> details = new Vector<>(socketList.size());
 
-    for (Enumeration enumeration = socketList.elements();
+    for (Enumeration<Socket> enumeration = socketList.elements();
          enumeration.hasMoreElements();
             ) {
-      Socket socket = (Socket) enumeration.nextElement();
+      Socket socket = enumeration.nextElement();
       details.add(
-        new SocketDetail(socket, (SocketNode13) socketMap.get(socket)));
+        new SocketDetail(socket, socketMap.get(socket)));
     }
 
     return details;
diff --git a/src/main/java/org/apache/log4j/net/UDPReceiver.java b/src/main/java/org/apache/log4j/net/UDPReceiver.java
index 562d495..fefab1e 100644
--- a/src/main/java/org/apache/log4j/net/UDPReceiver.java
+++ b/src/main/java/org/apache/log4j/net/UDPReceiver.java
@@ -171,7 +171,7 @@
   }
 
   class UDPHandlerThread extends Thread {
-    private final List list = new ArrayList();
+    private final List<String> list = new ArrayList<>();
 
     public UDPHandlerThread() {
       setDaemon(true);
@@ -194,7 +194,7 @@
     }
 
     public void run() {
-      ArrayList list2 = new ArrayList();
+      ArrayList<String> list2 = new ArrayList<>();
 
       while (!UDPReceiver.this.closed) {
         synchronized (list) {
@@ -215,7 +215,7 @@
 
             for (Object aList2 : list2) {
                 String data = (String) aList2;
-                List v = decoderImpl.decodeEvents(data);
+                List<LoggingEvent> v = decoderImpl.decodeEvents(data);
 
                 if (v != null) {
 
diff --git a/src/main/java/org/apache/log4j/net/XMLSocketNode.java b/src/main/java/org/apache/log4j/net/XMLSocketNode.java
index b6b0c53..99d1fe0 100644
--- a/src/main/java/org/apache/log4j/net/XMLSocketNode.java
+++ b/src/main/java/org/apache/log4j/net/XMLSocketNode.java
@@ -131,7 +131,7 @@
               "no bytes read from stream - closing connection.");
             break;
           }
-          List v = decoder.decodeEvents(new String(b, 0, length));
+          List<LoggingEvent> v = decoder.decodeEvents(new String(b, 0, length));
 
           if (v != null) {
 
diff --git a/src/main/java/org/apache/log4j/net/XMLSocketReceiver.java b/src/main/java/org/apache/log4j/net/XMLSocketReceiver.java
index ad60a89..104b2f7 100644
--- a/src/main/java/org/apache/log4j/net/XMLSocketReceiver.java
+++ b/src/main/java/org/apache/log4j/net/XMLSocketReceiver.java
@@ -55,7 +55,7 @@
   //default to log4j xml decoder
   protected String decoder = "org.apache.log4j.xml.XMLDecoder";
   private ServerSocket serverSocket;
-  private List socketList = new Vector();
+  private List<Socket> socketList = new Vector<>();
   private Thread rThread;
   public static final int DEFAULT_PORT = 4448;
   protected int port = DEFAULT_PORT;
diff --git a/src/main/java/org/apache/log4j/plugins/PluginRegistry.java b/src/main/java/org/apache/log4j/plugins/PluginRegistry.java
index 5b22529..72909c1 100644
--- a/src/main/java/org/apache/log4j/plugins/PluginRegistry.java
+++ b/src/main/java/org/apache/log4j/plugins/PluginRegistry.java
@@ -40,7 +40,7 @@
      * The pluginMap is keyed by plugin name and contains plugins as values.
      * key=plugin.getName, value=plugin
      */
-    private final Map pluginMap;
+    private final Map<String, Plugin> pluginMap;
     /**
      * Logger repository.
      */
@@ -62,7 +62,7 @@
      */
     public PluginRegistry(final LoggerRepositoryEx repository) {
         super();
-        pluginMap = new HashMap();
+        pluginMap = new HashMap<>();
         this.loggerRepository = repository;
         this.loggerRepository.addLoggerRepositoryEventListener(listener);
     }
@@ -106,7 +106,7 @@
             // make sure the plugin has reference to repository
             plugin.setLoggerRepository(getLoggerRepository());
 
-            Plugin existingPlugin = (Plugin) pluginMap.get(name);
+            Plugin existingPlugin = pluginMap.get(name);
             if (existingPlugin != null) {
                 existingPlugin.shutdown();
             }
@@ -161,9 +161,9 @@
      *
      * @return List list of plugins from the repository.
      */
-    public List getPlugins() {
+    public List<Plugin> getPlugins() {
         synchronized (pluginMap) {
-            List pluginList = new ArrayList(pluginMap.size());
+            List<Plugin> pluginList = new ArrayList<>(pluginMap.size());
 
             pluginList.addAll(pluginMap.values());
             return pluginList;
@@ -201,7 +201,7 @@
      */
     public Plugin stopPlugin(final String pluginName) {
         synchronized (pluginMap) {
-            Plugin plugin = (Plugin) pluginMap.get(pluginName);
+            Plugin plugin = pluginMap.get(pluginName);
 
             if (plugin == null) {
                 return null;
diff --git a/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java b/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java
index 5c2686e..9cff769 100644
--- a/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java
+++ b/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java
@@ -46,7 +46,7 @@
      * @param props
      */
     public void setProperties(String props) {
-        Map hashTable = new HashMap();
+        Map<String, String> hashTable = new HashMap<>();
         StringTokenizer pairs = new StringTokenizer(props, ",");
         while (pairs.hasMoreTokens()) {
             StringTokenizer entry = new StringTokenizer(pairs.nextToken(), "=");
diff --git a/src/main/java/org/apache/log4j/scheduler/Scheduler.java b/src/main/java/org/apache/log4j/scheduler/Scheduler.java
index 906dcc4..92c5e3e 100644
--- a/src/main/java/org/apache/log4j/scheduler/Scheduler.java
+++ b/src/main/java/org/apache/log4j/scheduler/Scheduler.java
@@ -35,7 +35,7 @@
     /**
      * Job list.
      */
-    List jobList;
+    List<ScheduledJobEntry> jobList;
     /**
      * If set true, scheduler has or should shut down.
      */
@@ -46,7 +46,7 @@
      */
     public Scheduler() {
         super();
-        jobList = new Vector();
+        jobList = new Vector<>();
     }
 
     /**
@@ -60,7 +60,7 @@
 
         int i = 0;
         for (; i < size; i++) {
-            ScheduledJobEntry se = (ScheduledJobEntry) jobList.get(i);
+            ScheduledJobEntry se = jobList.get(i);
             if (se.job == job) {
                 found = true;
                 break;
@@ -88,7 +88,7 @@
         }
         int i = findIndex(job);
         if (i != -1) {
-            ScheduledJobEntry se = (ScheduledJobEntry) jobList.remove(i);
+            ScheduledJobEntry se = jobList.remove(i);
             if (se.job != job) { // this should never happen
                 new IllegalStateException("Internal programming error");
             }
@@ -152,7 +152,7 @@
         if (i == -1) {
             return false;
         } else {
-            ScheduledJobEntry se = (ScheduledJobEntry) jobList.get(i);
+            ScheduledJobEntry se = jobList.get(i);
             se.period = newPeriod;
             return true;
         }
@@ -174,7 +174,7 @@
         int i = 0;
         for (; i < max; i++) {
 
-            ScheduledJobEntry sje = (ScheduledJobEntry) jobList.get(i);
+            ScheduledJobEntry sje = jobList.get(i);
 
             if (desiredExecutionTime < sje.desiredExecutionTime) {
                 break;
@@ -202,7 +202,7 @@
             if (jobList.isEmpty()) {
                 linger();
             } else {
-                ScheduledJobEntry sje = (ScheduledJobEntry) jobList.get(0);
+                ScheduledJobEntry sje = jobList.get(0);
                 long now = System.currentTimeMillis();
                 if (now >= sje.desiredExecutionTime) {
                     executeInABox(sje.job);
diff --git a/src/main/java/org/apache/log4j/spi/Decoder.java b/src/main/java/org/apache/log4j/spi/Decoder.java
index d4686ad..c1096d0 100644
--- a/src/main/java/org/apache/log4j/spi/Decoder.java
+++ b/src/main/java/org/apache/log4j/spi/Decoder.java
@@ -38,7 +38,7 @@
      * @param document document to decode.
      * @return list of LoggingEvent instances.
      */
-  Vector decodeEvents(String document);
+  Vector<LoggingEvent> decodeEvents(String document);
 
     /**
      * Decode event from string.
@@ -53,7 +53,7 @@
      * @return list of LoggingEvent instances.
      * @throws IOException if IO error resolving document.
      */
-  Vector decode(URL url) throws IOException;
+  Vector<LoggingEvent> decode(URL url) throws IOException;
 
     /**
      * Sets additional properties.
diff --git a/src/main/java/org/apache/log4j/spi/LoggerRepositoryEx.java b/src/main/java/org/apache/log4j/spi/LoggerRepositoryEx.java
index c079a2c..ae30e4b 100644
--- a/src/main/java/org/apache/log4j/spi/LoggerRepositoryEx.java
+++ b/src/main/java/org/apache/log4j/spi/LoggerRepositoryEx.java
@@ -134,7 +134,7 @@
    * Get the properties specific for this repository.
    * @return property map.
    */
-  Map getProperties();
+  Map<String, String> getProperties();
 
   /**
    * Get the property of this repository.
@@ -155,7 +155,7 @@
    *
    * @return List
    */
-  List getErrorList();
+  List<ErrorItem> getErrorList();
 
   /**
    * Errors which cannot be logged, go to the error list.
diff --git a/src/main/java/org/apache/log4j/varia/ListModelAppender.java b/src/main/java/org/apache/log4j/varia/ListModelAppender.java
index ccbc9be..46ab7fc 100644
--- a/src/main/java/org/apache/log4j/varia/ListModelAppender.java
+++ b/src/main/java/org/apache/log4j/varia/ListModelAppender.java
@@ -36,7 +36,7 @@
     /**
      * Default list model.
      */
-  private final DefaultListModel model = new DefaultListModel();
+  private final DefaultListModel<LoggingEvent> model = new DefaultListModel<>();
 
   /**
    * Constructs a ListModelAppender.
@@ -50,7 +50,7 @@
    *
    * @return the list model
    */
-  public ListModel getModel() {
+  public ListModel<LoggingEvent> getModel() {
     return model;
   }
 
diff --git a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
index a73ab59..8aa53bc 100644
--- a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
+++ b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
@@ -137,7 +137,7 @@
  *@author Scott Deboy
  */
 public class LogFilePatternReceiver extends Receiver {
-  private final List keywords = new ArrayList();
+  private final List<String> keywords = new ArrayList<>();
 
   private static final String PROP_START = "PROP(";
   private static final String PROP_END = ")";
@@ -189,8 +189,8 @@
   private Rule expressionRule;
 
   private Map currentMap;
-  private List additionalLines;
-  private List matchingKeywords;
+  private List<String> additionalLines;
+  private List<String> matchingKeywords;
 
   private String regexp;
   private Reader reader;
@@ -201,7 +201,7 @@
   private boolean useCurrentThread;
   public static final int MISSING_FILE_RETRY_MILLIS = 10000;
   private boolean appendNonMatches;
-  private final Map customLevelDefinitionMap = new HashMap();
+  private final Map<String, Level> customLevelDefinitionMap = new HashMap<>();
 
   //default to one line - this number is incremented for each (NL) found in the logFormat
   private int lineCount = 1;
@@ -410,7 +410,7 @@
    */
   private int getExceptionLine() {
     for (int i = 0; i < additionalLines.size(); i++) {
-      Matcher exceptionMatcher = exceptionPattern.matcher((String)additionalLines.get(i));
+      Matcher exceptionMatcher = exceptionPattern.matcher(additionalLines.get(i));
       if (exceptionMatcher.matches()) {
         return i;
       }
@@ -463,7 +463,7 @@
     }
     String[] exception = new String[additionalLines.size() - exceptionLine - 1];
     for (int i = 0; i < exception.length; i++) {
-      exception[i] = (String) additionalLines.get(i + exceptionLine);
+      exception[i] = additionalLines.get(i + exceptionLine);
     }
     return exception;
   }
@@ -672,8 +672,8 @@
 	}
 
     currentMap = new HashMap();
-    additionalLines = new ArrayList();
-    matchingKeywords = new ArrayList();
+    additionalLines = new ArrayList<>();
+    matchingKeywords = new ArrayList<>();
 
     if (timestampFormat != null) {
       dateFormat = new SimpleDateFormat(quoteTimeStampChars(timestampFormat));
@@ -689,7 +689,7 @@
       getLogger().warn("Invalid filter expression: " + filterExpression, e);
     }
 
-    List buildingKeywords = new ArrayList();
+    List<String> buildingKeywords = new ArrayList<>();
 
     String newPattern = logFormat;
 
@@ -707,7 +707,7 @@
     String current = newPattern;
     //build a list of property names and temporarily replace the property with an empty string,
     //we'll rebuild the pattern later
-    List propertyNames = new ArrayList();
+    List<String> propertyNames = new ArrayList<>();
     index = 0;
     while (index > -1) {
         if (current.contains(PROP_START) && current.contains(PROP_END)) {
@@ -771,7 +771,7 @@
     newPattern = newPattern.replaceAll(Pattern.quote(PATTERN_WILDCARD), REGEXP_DEFAULT_WILDCARD);
     //use buildingKeywords here to ensure correct order
     for (int i = 0;i<buildingKeywords.size();i++) {
-      String keyword = (String) buildingKeywords.get(i);
+      String keyword = buildingKeywords.get(i);
       //make the final keyword greedy (we're assuming it's the message)
       if (i == (buildingKeywords.size() - 1)) {
         newPattern = singleReplace(newPattern, String.valueOf(i), GREEDY_GROUP);
@@ -950,7 +950,7 @@
         levelImpl = Level.DEBUG;
     } else {
         //first try to resolve against custom level definition map, then fall back to regular levels
-        levelImpl = (Level) customLevelDefinitionMap.get(level);
+        levelImpl = customLevelDefinitionMap.get(level);
         if (levelImpl == null) {
             levelImpl = Level.toLevel(level.trim());
             if (!level.equals(levelImpl.toString())) {
diff --git a/src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java b/src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java
index c725467..921a036 100644
--- a/src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java
+++ b/src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java
@@ -259,7 +259,7 @@
         shutdown();
     }
 
-    private void processEvents(Collection c) {
+    private void processEvents(Collection<LoggingEvent> c) {
         if (c == null) {
             return;
         }
diff --git a/src/main/java/org/apache/log4j/xml/UtilLoggingXMLDecoder.java b/src/main/java/org/apache/log4j/xml/UtilLoggingXMLDecoder.java
index a217415..00d6f7c 100644
--- a/src/main/java/org/apache/log4j/xml/UtilLoggingXMLDecoder.java
+++ b/src/main/java/org/apache/log4j/xml/UtilLoggingXMLDecoder.java
@@ -179,7 +179,7 @@
    * @return Vector of LoggingEvents
    * @throws IOException if IO error during processing.
    */
-  public Vector decode(final URL url) throws IOException {
+  public Vector<LoggingEvent> decode(final URL url) throws IOException {
     LineNumberReader reader;
     boolean isZipFile = url.getPath().toLowerCase().endsWith(".zip");
     InputStream inputStream;
@@ -198,10 +198,10 @@
     } else {
         reader = new LineNumberReader(new InputStreamReader(inputStream, ENCODING));
     }
-    Vector v = new Vector();
+    Vector<LoggingEvent> v = new Vector<>();
 
       String line;
-      Vector events;
+      Vector<LoggingEvent> events;
       try {
           while ((line = reader.readLine()) != null) {
               StringBuilder buffer = new StringBuilder(line);
@@ -232,7 +232,7 @@
    * @param document to decode events from
    * @return Vector of LoggingEvents
    */
-  public Vector decodeEvents(final String document) {
+  public Vector<LoggingEvent> decodeEvents(final String document) {
 
       if (document != null) {
 
@@ -290,10 +290,10 @@
       return null;
     }
 
-    Vector events = decodeEvents(document);
+    Vector<LoggingEvent> events = decodeEvents(document);
 
     if (events.size() > 0) {
-      return (LoggingEvent) events.firstElement();
+      return events.firstElement();
     }
 
     return null;
@@ -304,8 +304,8 @@
    * @param document XML document
    * @return Vector of LoggingEvents
    */
-  private Vector decodeEvents(final Document document) {
-    Vector events = new Vector();
+  private Vector<LoggingEvent> decodeEvents(final Document document) {
+    Vector<LoggingEvent> events = new Vector<>();
 
     NodeList eventList = document.getElementsByTagName("record");
 
@@ -371,7 +371,7 @@
         }
 
         if (tagName.equalsIgnoreCase("exception")) {
-          ArrayList exceptionList = new ArrayList();
+          ArrayList<String> exceptionList = new ArrayList<>();
           NodeList exList = list.item(y).getChildNodes();
           int exlistLength = exList.getLength();
 
diff --git a/src/main/java/org/apache/log4j/xml/XMLDecoder.java b/src/main/java/org/apache/log4j/xml/XMLDecoder.java
index 6395a23..52a3146 100644
--- a/src/main/java/org/apache/log4j/xml/XMLDecoder.java
+++ b/src/main/java/org/apache/log4j/xml/XMLDecoder.java
@@ -177,7 +177,7 @@
    * @return Vector of LoggingEvents
    * @throws IOException if IO error during processing.
    */
-  public Vector decode(final URL url) throws IOException {
+  public Vector<LoggingEvent> decode(final URL url) throws IOException {
     LineNumberReader reader;
     boolean isZipFile = url.getPath().toLowerCase().endsWith(".zip");
     InputStream inputStream;
@@ -197,10 +197,10 @@
         reader = new LineNumberReader(new InputStreamReader(inputStream, ENCODING));
     }
 
-    Vector v = new Vector();
+    Vector<LoggingEvent> v = new Vector<>();
 
     String line;
-    Vector events;
+    Vector<LoggingEvent> events;
     try {
         while ((line = reader.readLine()) != null) {
             StringBuilder buffer = new StringBuilder(line);
@@ -231,7 +231,7 @@
      * @param document to decode events from
      * @return Vector of LoggingEvents
      */
-  public Vector decodeEvents(final String document) {
+  public Vector<LoggingEvent> decodeEvents(final String document) {
     if (document != null) {
       if (document.trim().equals("")) {
         return null;
@@ -286,10 +286,10 @@
       return null;
     }
 
-    Vector events = decodeEvents(document);
+    Vector<LoggingEvent> events = decodeEvents(document);
 
     if (events.size() > 0) {
-      return (LoggingEvent) events.firstElement();
+      return events.firstElement();
     }
 
     return null;
@@ -300,8 +300,8 @@
    * @param document XML document
    * @return Vector of LoggingEvents
    */
-  private Vector decodeEvents(final Document document) {
-    Vector events = new Vector();
+  private Vector<LoggingEvent> decodeEvents(final Document document) {
+    Vector<LoggingEvent> events = new Vector<>();
 
     Logger logger;
     long timeStamp;
diff --git a/src/test/java/org/apache/log4j/VectorAppender.java b/src/test/java/org/apache/log4j/VectorAppender.java
index 52026d0..b0de7c4 100644
--- a/src/test/java/org/apache/log4j/VectorAppender.java
+++ b/src/test/java/org/apache/log4j/VectorAppender.java
@@ -25,13 +25,13 @@
    @author Ceki  G&uuml;lc&uuml;
 */
 public class VectorAppender extends AppenderSkeleton {
-  public Vector vector;
+  public Vector<LoggingEvent> vector;
 
   long delay = 0;
   
   public VectorAppender() {
     super(true);
-    vector = new Vector();
+    vector = new Vector<>();
   }
 
 
@@ -50,7 +50,7 @@
    * Returns a vector of {@link LoggingEvent}.
    * @return a vector of {@link LoggingEvent}.
    */
-  public Vector getVector() {
+  public Vector<LoggingEvent> getVector() {
     return vector;
   }
 
diff --git a/src/test/java/org/apache/log4j/db/FullCycleDBTest.java b/src/test/java/org/apache/log4j/db/FullCycleDBTest.java
index bbac287..7107f11 100644
--- a/src/test/java/org/apache/log4j/db/FullCycleDBTest.java
+++ b/src/test/java/org/apache/log4j/db/FullCycleDBTest.java
@@ -58,7 +58,7 @@
 public class FullCycleDBTest
        extends TestCase {
   
-  Vector witnessEvents;
+  Vector<LoggingEvent> witnessEvents;
   Hierarchy lrWrite;
   LoggerRepository lrRead;
   String appendConfigFile = null;
@@ -74,7 +74,7 @@
     appendConfigFile = "append-with-drivermanager1.xml";
     readConfigFile = "read-with-drivermanager1.xml";
 
-    witnessEvents = new Vector();
+    witnessEvents = new Vector<LoggingEvent>();
     lrWrite = new Hierarchy(new RootLogger(Level.DEBUG));
     lrRead = new LoggerRepositoryExImpl(new Hierarchy(new RootLogger(Level.DEBUG)));
 
@@ -224,19 +224,19 @@
     // wait a little to allow events to be read
     try { Thread.sleep(3100); } catch(Exception e) {}
     VectorAppender va = (VectorAppender) lrRead.getRootLogger().getAppender("VECTOR");
-    Vector returnedEvents = getRelevantEventsFromVA(va, startTime);
+    Vector<LoggingEvent> returnedEvents = getRelevantEventsFromVA(va, startTime);
     
     compareEvents(witnessEvents, returnedEvents);
     
   }
   
-  void compareEvents(Vector l, Vector r) {
+  void compareEvents(Vector<LoggingEvent> l, Vector<LoggingEvent> r) {
     assertNotNull("left vector of events should not be null");
     assertEquals(l.size(), r.size());
     
     for(int i = 0; i < r.size(); i++) {
-      LoggingEvent le = (LoggingEvent) l.get(i);
-      LoggingEvent re = (LoggingEvent) r.get(i);
+      LoggingEvent le = l.get(i);
+      LoggingEvent re = r.get(i);
       assertEquals(le.getMessage(),        re.getMessage());
       assertEquals(le.getLoggerName(),     re.getLoggerName());
       assertEquals(le.getLevel(),          re.getLevel());
@@ -286,10 +286,10 @@
     }
   }
   
-  Vector getRelevantEventsFromVA(VectorAppender va, long startTime) {
+  Vector<LoggingEvent> getRelevantEventsFromVA(VectorAppender va, long startTime) {
     assertNotNull(va);
-    Vector v = va.getVector();
-    Vector r = new Vector();
+    Vector<LoggingEvent> v = va.getVector();
+    Vector<LoggingEvent> r = new Vector<LoggingEvent>();
     // remove all elements older than startTime
       for (Object aV : v) {
           LoggingEvent event = (LoggingEvent) aV;
diff --git a/src/test/java/org/apache/log4j/rewrite/RewriteAppenderTest.java b/src/test/java/org/apache/log4j/rewrite/RewriteAppenderTest.java
index 4328dc9..442b205 100644
--- a/src/test/java/org/apache/log4j/rewrite/RewriteAppenderTest.java
+++ b/src/test/java/org/apache/log4j/rewrite/RewriteAppenderTest.java
@@ -61,7 +61,7 @@
         logger.info("Message 0");
         MDC.put("p1", "Hola");
 
-        Map msg = new TreeMap();
+        Map<String, String> msg = new TreeMap<>();
         msg.put("p1", "Hello");
         msg.put("p2", "World");
         msg.put("x1", "Mundo");
diff --git a/src/test/java/org/apache/log4j/util/Compare.java b/src/test/java/org/apache/log4j/util/Compare.java
index b68ea31..958d74a 100644
--- a/src/test/java/org/apache/log4j/util/Compare.java
+++ b/src/test/java/org/apache/log4j/util/Compare.java
@@ -33,7 +33,7 @@
   static final int B2_NULL = -2;
 
   private static final InputStream open(
-          final Class testClass,
+          final Class<org.apache.log4j.rewrite.RewriteAppenderTest> testClass,
           final String fileName) throws IOException {
       String resourceName = fileName;
       if (fileName.startsWith("witness/")) {
@@ -52,7 +52,7 @@
       return is;
   }
 
-  public static boolean compare(Class testClass,
+  public static boolean compare(Class<org.apache.log4j.rewrite.RewriteAppenderTest> testClass,
                                 final String file1,
                                 final String file2)
     throws IOException {
@@ -64,7 +64,7 @@
   }
     
  public static boolean compare(
-         Class testClass, String file1, String file2, BufferedReader in1, BufferedReader in2) throws IOException {
+         Class<org.apache.log4j.rewrite.RewriteAppenderTest> testClass, String file1, String file2, BufferedReader in1, BufferedReader in2) throws IOException {
 
     String s1;
     int lineCounter = 0;
@@ -105,7 +105,7 @@
    * Prints file on the console.
    *
    */
-  private static void outputFile(Class testClass, String file)
+  private static void outputFile(Class<org.apache.log4j.rewrite.RewriteAppenderTest> testClass, String file)
     throws IOException {
     InputStream is = open(testClass, file);
     BufferedReader in1 = new BufferedReader(new InputStreamReader(is));
@@ -135,7 +135,7 @@
   }
 
 
-    public static boolean gzCompare(final Class testClass,
+    public static boolean gzCompare(final Class<org.apache.log4j.rewrite.RewriteAppenderTest> testClass,
                                     final String actual,
                                     final String expected)
       throws IOException {
@@ -155,7 +155,7 @@
         }
     }
 
-    public static boolean gzCompare(Class testClass, String file1, String file2, BufferedReader in1, BufferedReader in2) throws IOException {
+    public static boolean gzCompare(Class<org.apache.log4j.rewrite.RewriteAppenderTest> testClass, String file1, String file2, BufferedReader in1, BufferedReader in2) throws IOException {
 
       String s1;
       int lineCounter = 0;
diff --git a/src/test/java/org/apache/log4j/xml/XMLDecoderTest.java b/src/test/java/org/apache/log4j/xml/XMLDecoderTest.java
index bd9e7bc..59cba7f 100644
--- a/src/test/java/org/apache/log4j/xml/XMLDecoderTest.java
+++ b/src/test/java/org/apache/log4j/xml/XMLDecoderTest.java
@@ -58,28 +58,28 @@
     public void testDecodeEventsString1() throws Exception {
         String xmlStr = getStringFromResource("xmlLayout.1.xml", 10000);
         XMLDecoder decoder = new XMLDecoder();
-        Vector events = decoder.decodeEvents(xmlStr);
+        Vector<org.apache.log4j.spi.LoggingEvent> events = decoder.decodeEvents(xmlStr);
         assertEquals(17, events.size());
     }
 
   public void testDecodeEventsString2() throws Exception {
       String xmlStr = getStringFromResource("xsltLayout.1.xml", 10000);
       XMLDecoder decoder = new XMLDecoder();
-      Vector events = decoder.decodeEvents(xmlStr);
+      Vector<org.apache.log4j.spi.LoggingEvent> events = decoder.decodeEvents(xmlStr);
       assertEquals(15, events.size());
   }
 
     public void testDecodeEventsURL1() throws Exception {
         URL resource = XMLDecoderTest.class.getResource("xmlLayout.1.xml");
         XMLDecoder decoder = new XMLDecoder();
-        Vector events = decoder.decode(resource);
+        Vector<org.apache.log4j.spi.LoggingEvent> events = decoder.decode(resource);
         assertEquals(17, events.size());
     }
 
     public void testDecodeEventsURL2() throws Exception {
         URL resource = XMLDecoderTest.class.getResource("xsltLayout.1.xml");
         XMLDecoder decoder = new XMLDecoder();
-        Vector events = decoder.decode(resource);
+        Vector<org.apache.log4j.spi.LoggingEvent> events = decoder.decode(resource);
         assertEquals(15, events.size());
     }
 
