First stab at generifying the API

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/sanselan/trunk@1221504 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index c36f889..fcaa0fc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,8 +61,8 @@
   </prerequisites>
 
   <properties>
-    <maven.compile.source>1.4</maven.compile.source>
-    <maven.compile.target>1.4</maven.compile.target>
+    <maven.compile.source>1.5</maven.compile.source>
+    <maven.compile.target>1.5</maven.compile.target>
     <commons.componentid>sanselan</commons.componentid>
     <commons.release.version>0.98</commons.release.version>
     <commons.jira.id>SANSELAN</commons.jira.id>
diff --git a/src/main/java/org/apache/commons/sanselan/FormatCompliance.java b/src/main/java/org/apache/commons/sanselan/FormatCompliance.java
index 7ae9ac9..230ca17 100644
--- a/src/main/java/org/apache/commons/sanselan/FormatCompliance.java
+++ b/src/main/java/org/apache/commons/sanselan/FormatCompliance.java
@@ -26,7 +26,7 @@
 {
     private final boolean failOnError;
     private final String description;
-    private final List comments = new ArrayList();
+    private final List<String> comments = new ArrayList<String>();
 
     public FormatCompliance(String description)
     {
diff --git a/src/main/java/org/apache/commons/sanselan/ImageInfo.java b/src/main/java/org/apache/commons/sanselan/ImageInfo.java
index 0d83385..11fa62b 100644
--- a/src/main/java/org/apache/commons/sanselan/ImageInfo.java
+++ b/src/main/java/org/apache/commons/sanselan/ImageInfo.java
@@ -30,7 +30,7 @@
     private final String formatDetails; // ie version
 
     private final int bitsPerPixel;
-    private final List comments;
+    private final List<String> comments;
 
     private final ImageFormat format;
     private final String formatName;
@@ -72,7 +72,7 @@
     private final String compressionAlgorithm;
 
     public ImageInfo(String formatDetails, int bitsPerPixel,
-            List comments, ImageFormat format, String formatName,
+            List<String> comments, ImageFormat format, String formatName,
             int height, String mimeType, int numberOfImages,
             int physicalHeightDpi, float physicalHeightInch,
             int physicalWidthDpi, float physicalWidthInch, int width,
@@ -116,9 +116,9 @@
      * Returns a list of comments from the image file. <p/> This is mostly
      * obsolete.
      */
-    public List getComments()
+    public List<String> getComments()
     {
-        return new ArrayList(comments);
+        return new ArrayList<String>(comments);
     }
 
     /**
@@ -317,7 +317,7 @@
         pw.println("Comments: " + comments.size());
         for (int i = 0; i < comments.size(); i++)
         {
-            String s = (String) comments.get(i);
+            String s = comments.get(i);
             pw.println("\t" + i + ": '" + s + "'");
 
         }
diff --git a/src/main/java/org/apache/commons/sanselan/ImageParser.java b/src/main/java/org/apache/commons/sanselan/ImageParser.java
index 772e772..48c5ca0 100644
--- a/src/main/java/org/apache/commons/sanselan/ImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/ImageParser.java
@@ -159,25 +159,25 @@
         return getFormatCompliance(new ByteSourceFile(file));
     }
 
-    public List getAllBufferedImages(ByteSource byteSource)
+    public List<BufferedImage> getAllBufferedImages(ByteSource byteSource)
             throws ImageReadException, IOException
     {
         BufferedImage bi = getBufferedImage(byteSource, null);
 
-        List result = new ArrayList();
+        List<BufferedImage> result = new ArrayList<BufferedImage>();
 
         result.add(bi);
 
         return result;
     }
 
-    public final List getAllBufferedImages(byte bytes[])
+    public final List<BufferedImage> getAllBufferedImages(byte bytes[])
             throws ImageReadException, IOException
     {
         return getAllBufferedImages(new ByteSourceArray(bytes));
     }
 
-    public final List getAllBufferedImages(File file)
+    public final List<BufferedImage> getAllBufferedImages(File file)
             throws ImageReadException, IOException
     {
         if (!canAcceptExtension(file))
diff --git a/src/main/java/org/apache/commons/sanselan/Sanselan.java b/src/main/java/org/apache/commons/sanselan/Sanselan.java
index 279b7ef..f95a73b 100644
--- a/src/main/java/org/apache/commons/sanselan/Sanselan.java
+++ b/src/main/java/org/apache/commons/sanselan/Sanselan.java
@@ -1073,7 +1073,7 @@
      *            Filename associated with image data (optional).
      * @return A vector of BufferedImages.
      */
-    public static List getAllBufferedImages(InputStream is, String filename)
+    public static List<BufferedImage> getAllBufferedImages(InputStream is, String filename)
             throws ImageReadException, IOException {
         return getAllBufferedImages(new ByteSourceInputStream(is, filename));
     }
@@ -1089,7 +1089,7 @@
      *            Byte array containing an image file.
      * @return A vector of BufferedImages.
      */
-    public static List getAllBufferedImages(byte bytes[])
+    public static List<BufferedImage> getAllBufferedImages(byte bytes[])
             throws ImageReadException, IOException {
         return getAllBufferedImages(new ByteSourceArray(bytes));
     }
@@ -1105,12 +1105,12 @@
      *            File containing image data.
      * @return A vector of BufferedImages.
      */
-    public static List getAllBufferedImages(File file)
+    public static List<BufferedImage> getAllBufferedImages(File file)
             throws ImageReadException, IOException {
         return getAllBufferedImages(new ByteSourceFile(file));
     }
 
-    private static List getAllBufferedImages(ByteSource byteSource)
+    private static List<BufferedImage> getAllBufferedImages(ByteSource byteSource)
             throws ImageReadException, IOException {
         ImageParser imageParser = getImageParser(byteSource);
 
diff --git a/src/main/java/org/apache/commons/sanselan/common/BasicCParser.java b/src/main/java/org/apache/commons/sanselan/common/BasicCParser.java
index 33c2e86..75d48e9 100644
--- a/src/main/java/org/apache/commons/sanselan/common/BasicCParser.java
+++ b/src/main/java/org/apache/commons/sanselan/common/BasicCParser.java
@@ -112,7 +112,7 @@
     }
 
     public static ByteArrayOutputStream preprocess(InputStream is,
-            StringBuilder firstComment, Map defines)
+            StringBuilder firstComment, Map<String, String> defines)
             throws IOException, ImageReadException
     {
         boolean inString = false;
diff --git a/src/main/java/org/apache/commons/sanselan/common/IImageMetadata.java b/src/main/java/org/apache/commons/sanselan/common/IImageMetadata.java
index d7dc9ae..0ede174 100644
--- a/src/main/java/org/apache/commons/sanselan/common/IImageMetadata.java
+++ b/src/main/java/org/apache/commons/sanselan/common/IImageMetadata.java
@@ -22,7 +22,7 @@
 {
     public String toString(String prefix);
 
-    public List getItems();
+    public List<? extends IImageMetadataItem> getItems();
 
     public interface IImageMetadataItem
     {
diff --git a/src/main/java/org/apache/commons/sanselan/common/ImageMetadata.java b/src/main/java/org/apache/commons/sanselan/common/ImageMetadata.java
index 2747753..87c9a79 100644
--- a/src/main/java/org/apache/commons/sanselan/common/ImageMetadata.java
+++ b/src/main/java/org/apache/commons/sanselan/common/ImageMetadata.java
@@ -21,8 +21,7 @@
 
 public class ImageMetadata implements IImageMetadata
 {
-
-    private final List items = new ArrayList();
+    private final List<IImageMetadataItem> items = new ArrayList<IImageMetadataItem>();
 
     public void add(String keyword, String text)
     {
@@ -34,13 +33,12 @@
         items.add(item);
     }
 
-    public List getItems()
+    public List<? extends IImageMetadataItem> getItems()
     {
-        return new ArrayList(items);
+        return new ArrayList<IImageMetadataItem>(items);
     }
 
-    protected static final String newline = System
-            .getProperty("line.separator");
+    protected static final String newline = System.getProperty("line.separator");
 
     public String toString()
     {
@@ -60,7 +58,7 @@
             //            if (null != prefix)
             //                result.append(prefix);
 
-            ImageMetadata.IImageMetadataItem item = (ImageMetadata.IImageMetadataItem) items
+            ImageMetadata.IImageMetadataItem item = items
                     .get(i);
             result.append(item.toString(prefix + "\t"));
 
diff --git a/src/main/java/org/apache/commons/sanselan/common/itu_t4/HuffmanTree.java b/src/main/java/org/apache/commons/sanselan/common/itu_t4/HuffmanTree.java
index 3ae171d..84f4874 100644
--- a/src/main/java/org/apache/commons/sanselan/common/itu_t4/HuffmanTree.java
+++ b/src/main/java/org/apache/commons/sanselan/common/itu_t4/HuffmanTree.java
@@ -30,7 +30,7 @@
         boolean isEmpty = true;
         Object value = null;
     }
-    private List nodes = new ArrayList();
+    private List<Node> nodes = new ArrayList<Node>();
 
     public final void insert(String pattern, Object value) throws HuffmanTreeException {
         int position = 0;
@@ -57,14 +57,14 @@
         while (position >= nodes.size()) {
             nodes.add(new Node());
         }
-        Node node = (Node) nodes.get(position);
+        Node node = nodes.get(position);
         node.isEmpty = false;
         return node;
     }
     
     public final Object decode(BitInputStreamFlexible bitStream) throws HuffmanTreeException {
         int position = 0;
-        Node node = (Node) nodes.get(0);
+        Node node = nodes.get(0);
         while (node.value == null) {
             int nextBit;
             try {
@@ -80,7 +80,7 @@
             if (position >= nodes.size()) {
                 throw new HuffmanTreeException("Invalid bit pattern");
             }
-            node = (Node) nodes.get(position);
+            node = nodes.get(position);
             if (node.isEmpty) {
                 throw new HuffmanTreeException("Invalid bit pattern");
             }
diff --git a/src/main/java/org/apache/commons/sanselan/common/mylzw/MyLzwCompressor.java b/src/main/java/org/apache/commons/sanselan/common/mylzw/MyLzwCompressor.java
index 4481bec..35a014a 100644
--- a/src/main/java/org/apache/commons/sanselan/common/mylzw/MyLzwCompressor.java
+++ b/src/main/java/org/apache/commons/sanselan/common/mylzw/MyLzwCompressor.java
@@ -60,7 +60,7 @@
         InitializeStringTable();
     }
 
-    private final Map map = new HashMap();
+    private final Map<Object, Integer> map = new HashMap<Object, Integer>();
 
     private final void InitializeStringTable()
     {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/bmp/BmpImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/bmp/BmpImageParser.java
index 7908439..855761e 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/bmp/BmpImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/bmp/BmpImageParser.java
@@ -607,7 +607,7 @@
         int height = bhi.height;
         int width = bhi.width;
 
-        List comments = new ArrayList();
+        List<String> comments = new ArrayList<String>();
         // TODO: comments...
 
         int bitsPerPixel = bhi.bitsPerPixel;
diff --git a/src/main/java/org/apache/commons/sanselan/formats/dcx/DcxImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/dcx/DcxImageParser.java
index 2d69d17..a511b37 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/dcx/DcxImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/dcx/DcxImageParser.java
@@ -139,7 +139,7 @@
         {
             is = byteSource.getInputStream();
             int id = read4Bytes("Id", is, "Not a Valid DCX File");
-            List pageTable = new ArrayList(1024);
+            List<Integer> pageTable = new ArrayList<Integer>(1024);
             for (int i = 0; i < 1024; i++)
             {
                 int pageOffset = read4Bytes("PageTable", is, "Not a Valid DCX File");
@@ -185,17 +185,17 @@
     public final BufferedImage getBufferedImage(ByteSource byteSource,
             Map params) throws ImageReadException, IOException
     {
-        List list = getAllBufferedImages(byteSource);
+        List<BufferedImage> list = getAllBufferedImages(byteSource);
         if (list.isEmpty())
             return null;
-        return (BufferedImage) list.get(0);
+        return list.get(0);
     }
 
-    public List getAllBufferedImages(ByteSource byteSource)
+    public List<BufferedImage> getAllBufferedImages(ByteSource byteSource)
             throws ImageReadException, IOException
     {
         DcxHeader dcxHeader = readDcxHeader(byteSource);
-        List images = new ArrayList();
+        List<BufferedImage> images = new ArrayList<BufferedImage>();
         PcxImageParser pcxImageParser = new PcxImageParser();
         for (int i = 0; i < dcxHeader.pageTable.length; i++)
         {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/gif/GenericGifBlock.java b/src/main/java/org/apache/commons/sanselan/formats/gif/GenericGifBlock.java
index 780c8fe..c6460a5 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/gif/GenericGifBlock.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/gif/GenericGifBlock.java
@@ -22,9 +22,9 @@
 
 class GenericGifBlock extends GifBlock
 {
-    public final List subblocks;
+    public final List<byte[]> subblocks;
 
-    public GenericGifBlock(int blockCode, List subblocks)
+    public GenericGifBlock(int blockCode, List<byte[]> subblocks)
     {
         super(blockCode);
 
@@ -43,7 +43,7 @@
 
         for (int i = 0; i < subblocks.size(); i++)
         {
-            byte subblock[] = (byte[]) subblocks.get(i);
+            byte subblock[] = subblocks.get(i);
             if(includeLengths && i>0)
                 out.write(subblock.length);
             out.write(subblock);
diff --git a/src/main/java/org/apache/commons/sanselan/formats/gif/GifImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/gif/GifImageParser.java
index 09ffac2..aa2a72a 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/gif/GifImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/gif/GifImageParser.java
@@ -202,7 +202,7 @@
     protected GenericGifBlock readGenericGIFBlock(InputStream is, int code,
             byte first[]) throws IOException
     {
-        List subblocks = new ArrayList();
+        List<byte[]> subblocks = new ArrayList<byte[]>();
 
         if (first != null)
             subblocks.add(first);
@@ -229,11 +229,11 @@
     private final static int XMP_COMPLETE_CODE = (EXTENSION_CODE << 8)
             | XMP_EXTENSION;
 
-    private List readBlocks(GifHeaderInfo ghi, InputStream is,
-            boolean stopBeforeImageData, FormatCompliance formatCompliance)
+    private List<GifBlock> readBlocks(GifHeaderInfo ghi, InputStream is,
+                                      boolean stopBeforeImageData, FormatCompliance formatCompliance)
             throws ImageReadException, IOException
     {
-        List result = new ArrayList();
+        List<GifBlock> result = new ArrayList<GifBlock>();
 
         while (true)
         {
@@ -456,11 +456,11 @@
         }
     }
 
-    private GifBlock findBlock(List v, int code)
+    private GifBlock findBlock(List<GifBlock> v, int code)
     {
         for (int i = 0; i < v.size(); i++)
         {
-            GifBlock gifBlock = (GifBlock) v.get(i);
+            GifBlock gifBlock = v.get(i);
             if (gifBlock.blockCode == code)
                 return gifBlock;
         }
@@ -490,7 +490,7 @@
                 globalColorTable = readColorTable(is,
                         ghi.sizeOfGlobalColorTable, formatCompliance);
 
-            List blocks = readBlocks(ghi, is, stopBeforeImageData, formatCompliance);
+            List<GifBlock> blocks = readBlocks(ghi, is, stopBeforeImageData, formatCompliance);
 
             ImageContents result = new ImageContents(ghi, globalColorTable, blocks);
 
@@ -553,14 +553,14 @@
         return null;
     }
 
-    private List getComments(List v) throws IOException
+    private List<String> getComments(List<GifBlock> v) throws IOException
     {
-        List result = new ArrayList();
+        List<String> result = new ArrayList<String>();
         int code = 0x21fe;
 
         for (int i = 0; i < v.size(); i++)
         {
-            GifBlock block = (GifBlock) v.get(i);
+            GifBlock block = v.get(i);
             if (block.blockCode == code)
             {
                 byte bytes[] = ((GenericGifBlock) block).appendSubBlocks();
@@ -596,7 +596,7 @@
         int height = id.imageWidth;
         int width = id.imageHeight;
 
-        List Comments;
+        List<String> Comments;
 
         Comments = getComments(blocks.blocks);
 
@@ -656,7 +656,7 @@
             pw.println("gif.blocks: " + blocks.blocks.size());
             for (int i = 0; i < blocks.blocks.size(); i++)
             {
-                GifBlock gifBlock = (GifBlock) blocks.blocks.get(i);
+                GifBlock gifBlock = blocks.blocks.get(i);
                 this.debugNumber(pw, "\t" + i + " ("
                         + gifBlock.getClass().getName() + ")",
                         gifBlock.blockCode, 4);
@@ -1113,12 +1113,12 @@
             if (ghi.globalColorTableFlag)
                 readColorTable(is, ghi.sizeOfGlobalColorTable, formatCompliance);
 
-            List blocks = readBlocks(ghi, is, true, formatCompliance);
+            List<GifBlock> blocks = readBlocks(ghi, is, true, formatCompliance);
 
-            List result = new ArrayList();
+            List<String> result = new ArrayList<String>();
             for (int i = 0; i < blocks.size(); i++)
             {
-                GifBlock block = (GifBlock) blocks.get(i);
+                GifBlock block = blocks.get(i);
                 if (block.blockCode != XMP_COMPLETE_CODE)
                     continue;
 
@@ -1166,7 +1166,7 @@
                 return null;
             if (result.size() > 1)
                 throw new ImageReadException("More than one XMP Block in GIF.");
-            return (String) result.get(0);
+            return result.get(0);
 
         } finally
         {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/gif/ImageContents.java b/src/main/java/org/apache/commons/sanselan/formats/gif/ImageContents.java
index a97ba5a..72be276 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/gif/ImageContents.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/gif/ImageContents.java
@@ -22,10 +22,10 @@
 {
     public final GifHeaderInfo gifHeaderInfo;
 
-    public final List blocks;
+    public final List<GifBlock> blocks;
     public final byte globalColorTable[];
 
-    public ImageContents(GifHeaderInfo gifHeaderInfo, byte globalColorTable[], List blocks)
+    public ImageContents(GifHeaderInfo gifHeaderInfo, byte globalColorTable[], List<GifBlock> blocks)
     {
         this.gifHeaderInfo = gifHeaderInfo;
         this.globalColorTable = globalColorTable;
diff --git a/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsDecoder.java b/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsDecoder.java
index 8e156bc..fded579 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsDecoder.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsDecoder.java
@@ -428,10 +428,10 @@
         }
     }
 
-    public static List decodeAllImages(IcnsImageParser.IcnsElement[] icnsElements)
+    public static List<BufferedImage> decodeAllImages(IcnsImageParser.IcnsElement[] icnsElements)
             throws ImageReadException
     {
-        List result = new ArrayList();
+        List<BufferedImage> result = new ArrayList<BufferedImage>();
         for (int i = 0; i < icnsElements.length; i++)
         {
             IcnsImageParser.IcnsElement imageElement = icnsElements[i];
diff --git a/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsImageParser.java
index 0c3be5a..c47d1fa 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsImageParser.java
@@ -106,11 +106,11 @@
         }
 
         IcnsContents contents = readImage(byteSource);
-        List images = IcnsDecoder.decodeAllImages(contents.icnsElements);
+        List<BufferedImage> images = IcnsDecoder.decodeAllImages(contents.icnsElements);
         if (images.isEmpty())
             throw new ImageReadException("No icons in ICNS file");
-        BufferedImage image0 = (BufferedImage) images.get(0);
-        return new ImageInfo("Icns", 32, new ArrayList(), ImageFormat.IMAGE_FORMAT_ICNS,
+        BufferedImage image0 = images.get(0);
+        return new ImageInfo("Icns", 32, new ArrayList<String>(), ImageFormat.IMAGE_FORMAT_ICNS,
                 "ICNS Apple Icon Image", image0.getHeight(), "image/x-icns", images.size(),
                 0, 0, 0, 0, image0.getWidth(), false, true, false, ImageInfo.COLOR_TYPE_RGB,
                 ImageInfo.COMPRESSION_ALGORITHM_UNKNOWN);
@@ -136,10 +136,10 @@
         }
 
         IcnsContents contents = readImage(byteSource);
-        List images = IcnsDecoder.decodeAllImages(contents.icnsElements);
+        List<BufferedImage> images = IcnsDecoder.decodeAllImages(contents.icnsElements);
         if (images.isEmpty())
             throw new ImageReadException("No icons in ICNS file");
-        BufferedImage image0 = (BufferedImage) images.get(0);
+        BufferedImage image0 = images.get(0);
         return new Dimension(image0.getWidth(), image0.getHeight());
     }
 
@@ -246,7 +246,7 @@
             is = byteSource.getInputStream();
             IcnsHeader icnsHeader = readIcnsHeader(is);
 
-            List icnsElementList = new ArrayList();
+            List<IcnsElement> icnsElementList = new ArrayList<IcnsElement>();
             for (int remainingSize = icnsHeader.fileSize - 8;
                 remainingSize > 0; )
             {
@@ -257,7 +257,7 @@
 
             IcnsElement[] icnsElements = new IcnsElement[icnsElementList.size()];
             for (int i = 0; i < icnsElements.length; i++)
-                icnsElements[i] = (IcnsElement) icnsElementList.get(i);
+                icnsElements[i] = icnsElementList.get(i);
 
             return new IcnsContents(icnsHeader, icnsElements);
         }
@@ -288,14 +288,14 @@
             Map params) throws ImageReadException, IOException
     {
         IcnsContents icnsContents = readImage(byteSource);
-        List result = IcnsDecoder.decodeAllImages(icnsContents.icnsElements);
+        List<BufferedImage> result = IcnsDecoder.decodeAllImages(icnsContents.icnsElements);
         if (result.size() > 0)
-            return (BufferedImage) result.get(0);
+            return result.get(0);
         else
             throw new ImageReadException("No icons in ICNS file");
     }
 
-    public List getAllBufferedImages(ByteSource byteSource)
+    public List<BufferedImage> getAllBufferedImages(ByteSource byteSource)
             throws ImageReadException, IOException
     {
         IcnsContents icnsContents = readImage(byteSource);
diff --git a/src/main/java/org/apache/commons/sanselan/formats/ico/IcoImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/ico/IcoImageParser.java
index ec5ce5f..d222a6e 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/ico/IcoImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/ico/IcoImageParser.java
@@ -562,10 +562,10 @@
             throw new ImageReadException("No icons in ICO file");
     }
 
-    public List getAllBufferedImages(ByteSource byteSource)
+    public List<BufferedImage> getAllBufferedImages(ByteSource byteSource)
             throws ImageReadException, IOException
     {
-        List result = new ArrayList();
+        List<BufferedImage> result = new ArrayList<BufferedImage>();
         ImageContents contents = readImage(byteSource);
 
         FileHeader fileHeader = contents.fileHeader;
diff --git a/src/main/java/org/apache/commons/sanselan/formats/jpeg/JpegImageMetadata.java b/src/main/java/org/apache/commons/sanselan/formats/jpeg/JpegImageMetadata.java
index aaecb47..add4664 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/jpeg/JpegImageMetadata.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/jpeg/JpegImageMetadata.java
@@ -165,7 +165,7 @@
     }
 
     public List getItems() {
-        List result = new ArrayList();
+        List<Object> result = new ArrayList<Object>();
 
         if (null != exif)
             result.addAll(exif.getItems());
diff --git a/src/main/java/org/apache/commons/sanselan/formats/jpeg/decoder/JpegDecoder.java b/src/main/java/org/apache/commons/sanselan/formats/jpeg/decoder/JpegDecoder.java
index d320c89..e0eaee4 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/jpeg/decoder/JpegDecoder.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/jpeg/decoder/JpegDecoder.java
@@ -209,8 +209,7 @@
             DqtSegment dqtSegment = new DqtSegment(marker, segmentData);
             for (int i = 0; i < dqtSegment.quantizationTables.size(); i++)
             {
-                DqtSegment.QuantizationTable table = (DqtSegment.QuantizationTable)
-                        dqtSegment.quantizationTables.get(i);
+                DqtSegment.QuantizationTable table = dqtSegment.quantizationTables.get(i);
                 if (0 > table.destinationIdentifier ||
                         table.destinationIdentifier >= quantizationTables.length)
                     throw new ImageReadException("Invalid quantization table identifier " +
@@ -231,8 +230,7 @@
             DhtSegment dhtSegment = new DhtSegment(marker, segmentData);
             for (int i = 0; i < dhtSegment.huffmanTables.size(); i++)
             {
-                DhtSegment.HuffmanTable table = (DhtSegment.HuffmanTable)
-                        dhtSegment.huffmanTables.get(i);
+                DhtSegment.HuffmanTable table = dhtSegment.huffmanTables.get(i);
                 DhtSegment.HuffmanTable[] tables;
                 if (table.tableClass == 0)
                     tables = huffmanDCTables;
diff --git a/src/main/java/org/apache/commons/sanselan/formats/jpeg/iptc/IptcTypeLookup.java b/src/main/java/org/apache/commons/sanselan/formats/jpeg/iptc/IptcTypeLookup.java
index 50e0329..56ad1a5 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/jpeg/iptc/IptcTypeLookup.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/jpeg/iptc/IptcTypeLookup.java
@@ -22,7 +22,7 @@
 public abstract class IptcTypeLookup implements IptcConstants
 {
 
-    private static final Map IPTC_TYPE_MAP = new HashMap();
+    private static final Map<Integer, IptcType> IPTC_TYPE_MAP = new HashMap<Integer, IptcType>();
     static
     {
         for (int i = 0; i < IPTC_TYPES.length; i++)
@@ -38,6 +38,6 @@
         Integer key = new Integer(type);
         if (!IPTC_TYPE_MAP.containsKey(key))
             return IptcType.getUnknown(type);
-        return (IptcType) IPTC_TYPE_MAP.get(key);
+        return IPTC_TYPE_MAP.get(key);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/DhtSegment.java b/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/DhtSegment.java
index 763f48e..b1444e1 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/DhtSegment.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/DhtSegment.java
@@ -23,7 +23,7 @@
 
 public class DhtSegment extends Segment
 {
-    public final List huffmanTables = new ArrayList();
+    public final List<HuffmanTable> huffmanTables = new ArrayList<HuffmanTable>();
 
     public static class HuffmanTable
     {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/DqtSegment.java b/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/DqtSegment.java
index d1ed15b..734ac3c 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/DqtSegment.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/DqtSegment.java
@@ -25,7 +25,7 @@
 
 public class DqtSegment extends Segment
 {
-    public final List quantizationTables = new ArrayList();
+    public final List<QuantizationTable> quantizationTables = new ArrayList<QuantizationTable>();
 
     public static class QuantizationTable
     {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/jpeg/xmp/JpegRewriter.java b/src/main/java/org/apache/commons/sanselan/formats/jpeg/xmp/JpegRewriter.java
index a03bb69..10db048 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/jpeg/xmp/JpegRewriter.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/jpeg/xmp/JpegRewriter.java
@@ -53,9 +53,9 @@
     protected static class JFIFPieces
     {
         public final List pieces;
-        public final List segmentPieces;
+        public final List<JFIFPiece> segmentPieces;
 
-        public JFIFPieces(final List pieces, final List segmentPieces)
+        public JFIFPieces(final List pieces, final List<JFIFPiece> segmentPieces)
         {
             this.pieces = pieces;
             this.segmentPieces = segmentPieces;
@@ -172,7 +172,7 @@
     // , ImageWriteException
     {
         final List pieces = new ArrayList();
-        final List segmentPieces = new ArrayList();
+        final List<JFIFPiece> segmentPieces = new ArrayList<JFIFPiece>();
 
         JpegUtils.Visitor visitor = new JpegUtils.Visitor() {
             // return false to exit before reading image data.
@@ -276,13 +276,13 @@
         return result;
     }
 
-    protected List insertBeforeFirstAppSegments(List segments, List newSegments)
+    protected List<JFIFPiece> insertBeforeFirstAppSegments(List<JFIFPiece> segments, List<JFIFPiece> newSegments)
             throws ImageWriteException
     {
         int firstAppIndex = -1;
         for (int i = 0; i < segments.size(); i++)
         {
-            JFIFPiece piece = (JFIFPiece) segments.get(i);
+            JFIFPiece piece = segments.get(i);
             if (!(piece instanceof JFIFPieceSegment))
                 continue;
 
@@ -294,7 +294,7 @@
             }
         }
 
-        List result = new ArrayList(segments);
+        List<JFIFPiece> result = new ArrayList<JFIFPiece>(segments);
         if (firstAppIndex == -1)
             throw new ImageWriteException("JPEG file has no APP segments.");
         result.addAll(firstAppIndex, newSegments);
diff --git a/src/main/java/org/apache/commons/sanselan/formats/pcx/PcxImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/pcx/PcxImageParser.java
index e5fc4dc..9006d0e 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/pcx/PcxImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/pcx/PcxImageParser.java
@@ -110,7 +110,7 @@
         Dimension size = getImageSize(byteSource, params);
         int metricHDpi = (int) (pcxHeader.hDpi * 1000.0 / 2.54);
         int metricVDpi = (int) (pcxHeader.vDpi * 1000.0 / 2.54);
-        return new ImageInfo("PCX", pcxHeader.nPlanes * pcxHeader.bitsPerPixel, new ArrayList(),
+        return new ImageInfo("PCX", pcxHeader.nPlanes * pcxHeader.bitsPerPixel, new ArrayList<String>(),
                 ImageFormat.IMAGE_FORMAT_PCX, "ZSoft PCX Image", size.height, "image/x-pcx", 1,
                 metricVDpi, pcxHeader.vDpi / metricVDpi, metricHDpi, pcxHeader.hDpi / metricHDpi,
                 size.width, false, false,
diff --git a/src/main/java/org/apache/commons/sanselan/formats/png/PngImageInfo.java b/src/main/java/org/apache/commons/sanselan/formats/png/PngImageInfo.java
index cd3ba0f..58c0a6b 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/png/PngImageInfo.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/png/PngImageInfo.java
@@ -24,15 +24,15 @@
 
 public class PngImageInfo extends ImageInfo
 {
-    private final List textChunks;
+    private final List<PngText> textChunks;
 
     public PngImageInfo(String formatDetails, int bitsPerPixel,
-            List comments, ImageFormat format, String formatName,
+            List<String> comments, ImageFormat format, String formatName,
             int height, String mimeType, int numberOfImages,
             int physicalHeightDpi, float physicalHeightInch,
             int physicalWidthDpi, float physicalWidthInch, int width,
             boolean isProgressive, boolean isTransparent, boolean usesPalette,
-            int colorType, String compressionAlgorithm, final List textChunks)
+            int colorType, String compressionAlgorithm, final List<PngText> textChunks)
     {
         super(formatDetails, bitsPerPixel, comments, format, formatName,
                 height, mimeType, numberOfImages, physicalHeightDpi,
@@ -43,9 +43,9 @@
         this.textChunks = textChunks;
     }
 
-    public List getTextChunks()
+    public List<PngText> getTextChunks()
     {
-        return new ArrayList(textChunks);
+        return new ArrayList<PngText>(textChunks);
     }
 
 }
diff --git a/src/main/java/org/apache/commons/sanselan/formats/png/PngImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/png/PngImageParser.java
index bb53e90..bccd2f8 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/png/PngImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/png/PngImageParser.java
@@ -109,11 +109,11 @@
     /**
      * @return List of String-formatted chunk types, ie. "tRNs".
      */
-    public List getChuckTypes(InputStream is) throws ImageReadException, IOException {
-        List chunks = readChunks(is, null, false);
-        List chunkTypes = new ArrayList();
+    public List<String> getChuckTypes(InputStream is) throws ImageReadException, IOException {
+        List<PngChunk> chunks = readChunks(is, null, false);
+        List<String> chunkTypes = new ArrayList<String>();
         for (int i=0; i<chunks.size(); i++) {
-            PngChunk chunk = (PngChunk) chunks.get(i);
+            PngChunk chunk = chunks.get(i);
             chunkTypes.add(getChunkTypeName(chunk.chunkType));
         }
         return chunkTypes;
@@ -127,12 +127,13 @@
         {
             is = byteSource.getInputStream();
 
-            List chunks = null;
+            List<PngChunk> chunks = null;
 
             readSignature(is);
             chunks = readChunks(is, new int[] { chunkType, }, true);
             return chunks.size() > 0;
-        } finally
+        } 
+        finally
         {
             try
             {
@@ -161,10 +162,9 @@
         return false;
     }
 
-    private List readChunks(InputStream is, int chunkTypes[],
-            boolean returnAfterFirst) throws ImageReadException, IOException
+    private List<PngChunk> readChunks(InputStream is, int chunkTypes[], boolean returnAfterFirst) throws ImageReadException, IOException
     {
-        List result = new ArrayList();
+        List<PngChunk> result = new ArrayList<PngChunk>();
 
         while (true)
         {
@@ -239,7 +239,7 @@
 
     }
 
-    private List readChunks(ByteSource byteSource, int chunkTypes[],
+    private List<PngChunk> readChunks(ByteSource byteSource, int chunkTypes[],
             boolean returnAfterFirst) throws ImageReadException, IOException
     {
         InputStream is = null;
@@ -248,12 +248,11 @@
         {
             is = byteSource.getInputStream();
 
-            List chunks = null;
-
             readSignature(is);
-            chunks = readChunks(is, chunkTypes, returnAfterFirst);
-            return chunks;
-        } finally
+            
+            return readChunks(is, chunkTypes, returnAfterFirst);
+        }
+        finally
         {
             try
             {
@@ -270,7 +269,7 @@
     public byte[] getICCProfileBytes(ByteSource byteSource, Map params)
             throws ImageReadException, IOException
     {
-        List chunks = readChunks(byteSource, new int[] { iCCP, }, true);
+        List<PngChunk> chunks = readChunks(byteSource, new int[] { iCCP, }, true);
 
         if ((chunks == null) || (chunks.size() < 1))
         {
@@ -291,7 +290,7 @@
     public Dimension getImageSize(ByteSource byteSource, Map params)
             throws ImageReadException, IOException
     {
-        List chunks = readChunks(byteSource, new int[] { IHDR, }, true);
+        List<PngChunk> chunks = readChunks(byteSource, new int[] { IHDR, }, true);
 
         if ((chunks == null) || (chunks.size() < 1))
             throw new ImageReadException("Png: No chunks");
@@ -317,7 +316,7 @@
     public IImageMetadata getMetadata(ByteSource byteSource, Map params)
             throws ImageReadException, IOException
     {
-        List chunks = readChunks(byteSource, new int[] { tEXt, zTXt, }, true);
+        List<PngChunk> chunks = readChunks(byteSource, new int[] { tEXt, zTXt, }, true);
 
         if ((chunks == null) || (chunks.size() < 1))
             return null;
@@ -430,13 +429,13 @@
         throw new ImageReadException("PNG: unknown color type: " + colorType);
     }
 
-    private List filterChunks(List v, int type)
+    private List<PngChunk> filterChunks(List<PngChunk> v, int type)
     {
-        List result = new ArrayList();
+        List<PngChunk> result = new ArrayList<PngChunk>();
 
         for (int i = 0; i < v.size(); i++)
         {
-            PngChunk chunk = (PngChunk) v.get(i);
+            PngChunk chunk = v.get(i);
             if (chunk.chunkType == type)
                 result.add(chunk);
         }
@@ -523,8 +522,7 @@
     public ImageInfo getImageInfo(ByteSource byteSource, Map params)
             throws ImageReadException, IOException
     {
-        List chunks = readChunks(byteSource, new int[] { IHDR, pHYs, tEXt,
-                zTXt, tRNS, PLTE, iTXt, }, false);
+        List<PngChunk> chunks = readChunks(byteSource, new int[] { IHDR, pHYs, tEXt, zTXt, tRNS, PLTE, iTXt, }, false);
 
         // if(chunks!=null)
         // System.out.println("chunks: " + chunks.size());
@@ -532,7 +530,7 @@
         if ((chunks == null) || (chunks.size() < 1))
             throw new ImageReadException("PNG: no chunks");
 
-        List IHDRs = filterChunks(chunks, IHDR);
+        List<PngChunk> IHDRs = filterChunks(chunks, IHDR);
         if (IHDRs.size() != 1)
             throw new ImageReadException("PNG contains more than one Header");
 
@@ -541,11 +539,11 @@
 
         boolean isTransparent = false;
 
-        List tRNSs = filterChunks(chunks, tRNS);
+        List<PngChunk> tRNSs = filterChunks(chunks, tRNS);
         if (tRNSs.size() > 0)
         {
             isTransparent = true;
-            pngChunktRNS = (PngChunk) IHDRs.get(0);
+            pngChunktRNS = IHDRs.get(0);
         } else {
             // CE - Fix Alpha.
             isTransparent = hasAlphaChannel(pngChunkIHDR.colorType);
@@ -554,20 +552,20 @@
 
         PngChunkPhys pngChunkpHYs = null;
 
-        List pHYss = filterChunks(chunks, pHYs);
+        List<PngChunk> pHYss = filterChunks(chunks, pHYs);
         if (pHYss.size() > 1)
             throw new ImageReadException("PNG contains more than one pHYs: "
                     + pHYss.size());
         else if (pHYss.size() == 1)
             pngChunkpHYs = (PngChunkPhys) pHYss.get(0);
 
-        List tEXts = filterChunks(chunks, tEXt);
-        List zTXts = filterChunks(chunks, zTXt);
-        List iTXts = filterChunks(chunks, iTXt);
+        List<PngChunk> tEXts = filterChunks(chunks, tEXt);
+        List<PngChunk> zTXts = filterChunks(chunks, zTXt);
+        List<PngChunk> iTXts = filterChunks(chunks, iTXt);
 
         {
-            List comments = new ArrayList();
-            List textChunks = new ArrayList();
+            List<String> comments = new ArrayList<String>();
+            List<PngText> textChunks = new ArrayList<PngText>();
 
             for (int i = 0; i < tEXts.size(); i++)
             {
@@ -632,7 +630,7 @@
 
             boolean usesPalette = false;
 
-            List PLTEs = filterChunks(chunks, PLTE);
+            List<PngChunk> PLTEs = filterChunks(chunks, PLTE);
             if (PLTEs.size() > 1)
                 usesPalette = true;
 
@@ -661,14 +659,12 @@
 
             String compressionAlgorithm = ImageInfo.COMPRESSION_ALGORITHM_PNG_FILTER;
 
-            ImageInfo result = new PngImageInfo(FormatDetails, BitsPerPixel,
+            return new PngImageInfo(FormatDetails, BitsPerPixel,
                     comments, Format, FormatName, Height, MimeType,
                     NumberOfImages, PhysicalHeightDpi, PhysicalHeightInch,
                     PhysicalWidthDpi, PhysicalWidthInch, Width, isProgressive,
                     isTransparent, usesPalette, ColorType,
                     compressionAlgorithm, textChunks);
-
-            return result;
         }
     }
 
@@ -686,19 +682,19 @@
         // throw new ImageWriteException("Unknown parameter: " + firstKey);
         // }
 
-        List chunks = readChunks(byteSource, new int[] { IHDR, PLTE, IDAT,
+        List<PngChunk> chunks = readChunks(byteSource, new int[] { IHDR, PLTE, IDAT,
                 tRNS, iCCP, gAMA, sRGB, }, false);
 
         if ((chunks == null) || (chunks.size() < 1))
             throw new ImageReadException("PNG: no chunks");
 
-        List IHDRs = filterChunks(chunks, IHDR);
+        List<PngChunk> IHDRs = filterChunks(chunks, IHDR);
         if (IHDRs.size() != 1)
             throw new ImageReadException("PNG contains more than one Header");
 
         PngChunkIhdr pngChunkIHDR = (PngChunkIhdr) IHDRs.get(0);
 
-        List PLTEs = filterChunks(chunks, PLTE);
+        List<PngChunk> PLTEs = filterChunks(chunks, PLTE);
         if (PLTEs.size() > 1)
             throw new ImageReadException("PNG contains more than one Palette");
 
@@ -708,7 +704,7 @@
 
         // -----
 
-        List IDATs = filterChunks(chunks, IDAT);
+        List<PngChunk> IDATs = filterChunks(chunks, IDAT);
         if (IDATs.size() < 1)
             throw new ImageReadException("PNG missing image data");
 
@@ -727,10 +723,10 @@
 
         TransparencyFilter transparencyFilter = null;
 
-        List tRNSs = filterChunks(chunks, tRNS);
+        List<PngChunk> tRNSs = filterChunks(chunks, tRNS);
         if (tRNSs.size() > 0)
         {
-            PngChunk pngChunktRNS = (PngChunk) tRNSs.get(0);
+            PngChunk pngChunktRNS = tRNSs.get(0);
             transparencyFilter = getTransparencyFilter(pngChunkIHDR.colorType,
                     pngChunktRNS);
         }
@@ -738,9 +734,9 @@
         ICC_Profile icc_profile = null;
         GammaCorrection gammaCorrection = null;
         {
-            List sRGBs = filterChunks(chunks, sRGB);
-            List gAMAs = filterChunks(chunks, gAMA);
-            List iCCPs = filterChunks(chunks, iCCP);
+            List<PngChunk> sRGBs = filterChunks(chunks, sRGB);
+            List<PngChunk> gAMAs = filterChunks(chunks, gAMA);
+            List<PngChunk> iCCPs = filterChunks(chunks, iCCP);
             if (sRGBs.size() > 1)
                 throw new ImageReadException("PNG: unexpected sRGB chunk");
             if (gAMAs.size() > 1)
@@ -859,9 +855,9 @@
         imageInfo.toString(pw, "");
 
         {
-            List chunks = readChunks(byteSource, null, false);
+            List<PngChunk> chunks = readChunks(byteSource, null, false);
             {
-                List IHDRs = filterChunks(chunks, IHDR);
+                List<PngChunk> IHDRs = filterChunks(chunks, IHDR);
                 if (IHDRs.size() != 1)
                 {
                     if (debug)
@@ -880,7 +876,7 @@
 
             for (int i = 0; i < chunks.size(); i++)
             {
-                PngChunk chunk = (PngChunk) chunks.get(i);
+                PngChunk chunk = chunks.get(i);
                 printCharQuad(pw, "\t" + i + ": ", chunk.chunkType);
             }
         }
@@ -912,12 +908,12 @@
             throws ImageReadException, IOException
     {
 
-        List chunks = readChunks(byteSource, new int[] { iTXt, }, false);
+        List<PngChunk> chunks = readChunks(byteSource, new int[] { iTXt, }, false);
 
         if ((chunks == null) || (chunks.size() < 1))
             return null;
 
-        List xmpChunks = new ArrayList();
+        List<PngChunkItxt> xmpChunks = new ArrayList<PngChunkItxt>();
         for (int i = 0; i < chunks.size(); i++)
         {
             PngChunkItxt chunk = (PngChunkItxt) chunks.get(i);
@@ -932,7 +928,7 @@
             throw new ImageReadException(
                     "PNG contains more than one XMP chunk.");
 
-        PngChunkItxt chunk = (PngChunkItxt) xmpChunks.get(0);
+        PngChunkItxt chunk = xmpChunks.get(0);
         return chunk.getText();
     }
 
diff --git a/src/main/java/org/apache/commons/sanselan/formats/pnm/PnmImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/pnm/PnmImageParser.java
index 4c614b0..ddaf496 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/pnm/PnmImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/pnm/PnmImageParser.java
@@ -185,7 +185,7 @@
         if (info == null)
             throw new ImageReadException("PNM: Couldn't read Header");
 
-        List Comments = new ArrayList();
+        List<String> Comments = new ArrayList<String>();
 
         int BitsPerPixel = info.getBitDepth() * info.getNumComponents();
         ImageFormat Format = info.getImageType();
diff --git a/src/main/java/org/apache/commons/sanselan/formats/psd/PsdImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/psd/PsdImageParser.java
index 17bb1f9..c7127ed 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/psd/PsdImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/psd/PsdImageParser.java
@@ -173,8 +173,8 @@
         return result;
     }
 
-    private List readImageResourceBlocks(byte bytes[],
-            int imageResourceIDs[], int maxBlocksToRead)
+    private List<ImageResourceBlock> readImageResourceBlocks(byte bytes[],
+                                                             int imageResourceIDs[], int maxBlocksToRead)
             throws ImageReadException, IOException
     {
         return readImageResourceBlocks(new ByteArrayInputStream(bytes),
@@ -193,11 +193,11 @@
         return false;
     }
 
-    private List readImageResourceBlocks(InputStream is,
-            int imageResourceIDs[], int maxBlocksToRead, int available)
+    private List<ImageResourceBlock> readImageResourceBlocks(InputStream is,
+                                                             int imageResourceIDs[], int maxBlocksToRead, int available)
             throws ImageReadException, IOException
     {
-        List result = new ArrayList();
+        List<ImageResourceBlock> result = new ArrayList<ImageResourceBlock>();
 
         while (available > 0)
         {
@@ -253,8 +253,8 @@
         return result;
     }
 
-    private List readImageResourceBlocks(ByteSource byteSource,
-            int imageResourceIDs[], int maxBlocksToRead)
+    private List<ImageResourceBlock> readImageResourceBlocks(ByteSource byteSource,
+                                                             int imageResourceIDs[], int maxBlocksToRead)
             throws ImageReadException, IOException
     {
         InputStream is = null;
@@ -458,13 +458,13 @@
     public byte[] getICCProfileBytes(ByteSource byteSource, Map params)
             throws ImageReadException, IOException
     {
-        List blocks = readImageResourceBlocks(byteSource,
-                new int[] { IMAGE_RESOURCE_ID_ICC_PROFILE, }, 1);
+        List<ImageResourceBlock> blocks = readImageResourceBlocks(byteSource,
+                new int[]{IMAGE_RESOURCE_ID_ICC_PROFILE,}, 1);
 
         if ((blocks == null) || (blocks.size() < 1))
             return null;
 
-        ImageResourceBlock irb = (ImageResourceBlock) blocks.get(0);
+        ImageResourceBlock irb = blocks.get(0);
         byte bytes[] = irb.data;
         if ((bytes == null) || (bytes.length < 1))
             return null;
@@ -540,7 +540,7 @@
         int Width = header.Columns;
         int Height = header.Rows;
 
-        List Comments = new ArrayList();
+        List<String> Comments = new ArrayList<String>();
         // TODO: comments...
 
         int BitsPerPixel = header.Depth * getChannelsPerMode(header.Mode);
@@ -592,11 +592,11 @@
     }
 
     // TODO not used
-    private ImageResourceBlock findImageResourceBlock(List blocks, int ID)
+    private ImageResourceBlock findImageResourceBlock(List<ImageResourceBlock> blocks, int ID)
     {
         for (int i = 0; i < blocks.size(); i++)
         {
-            ImageResourceBlock block = (ImageResourceBlock) blocks.get(i);
+            ImageResourceBlock block = blocks.get(i);
 
             if (block.id == ID)
                 return block;
@@ -622,8 +622,8 @@
             imageContents.dump(pw);
             imageContents.header.dump(pw);
 
-            List blocks = readImageResourceBlocks(byteSource,
-            // fImageContents.ImageResources,
+            List<ImageResourceBlock> blocks = readImageResourceBlocks(byteSource,
+                    // fImageContents.ImageResources,
                     null, -1);
 
             pw.println("blocks.size(): " + blocks.size());
@@ -631,7 +631,7 @@
             // System.out.println("gif.blocks: " + blocks.blocks.size());
             for (int i = 0; i < blocks.size(); i++)
             {
-                ImageResourceBlock block = (ImageResourceBlock) blocks.get(i);
+                ImageResourceBlock block = blocks.get(i);
                 pw.println("\t" + i + " (" + Integer.toHexString(block.id)
                         + ", " + "'"
                         + new String(block.nameData)
@@ -676,8 +676,8 @@
         // GraphicControlExtension gce = (GraphicControlExtension) findBlock(
         // fImageContents.blocks, kGraphicControlExtension);
 
-        List blocks = readImageResourceBlocks(byteSource,
-        // fImageContents.ImageResources,
+        List<ImageResourceBlock> blocks = readImageResourceBlocks(byteSource,
+                // fImageContents.ImageResources,
                 null, -1);
 
         int width = header.Columns;
@@ -808,19 +808,19 @@
         if (header == null)
             throw new ImageReadException("PSD: Couldn't read Header");
 
-        List blocks = readImageResourceBlocks(byteSource,
-                new int[] { IMAGE_RESOURCE_ID_XMP, }, -1);
+        List<ImageResourceBlock> blocks = readImageResourceBlocks(byteSource,
+                new int[]{IMAGE_RESOURCE_ID_XMP,}, -1);
 
         if ((blocks == null) || (blocks.size() < 1))
             return null;
 
-        List xmpBlocks = new ArrayList();
+        List<ImageResourceBlock> xmpBlocks = new ArrayList<ImageResourceBlock>();
         if (false)
         {
             // TODO: for PSD 7 and later, verify "XMP" name.
             for (int i = 0; i < blocks.size(); i++)
             {
-                ImageResourceBlock block = (ImageResourceBlock) blocks.get(i);
+                ImageResourceBlock block = blocks.get(i);
                 if (!block.getName().equals(BLOCK_NAME_XMP))
                     continue;
                 xmpBlocks.add(block);
@@ -834,7 +834,7 @@
             throw new ImageReadException(
                     "PSD contains more than one XMP block.");
 
-        ImageResourceBlock block = (ImageResourceBlock) xmpBlocks.get(0);
+        ImageResourceBlock block = xmpBlocks.get(0);
 
         try
         {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffContents.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffContents.java
index a28263f..4bfedc4 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffContents.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffContents.java
@@ -27,9 +27,9 @@
 public class TiffContents
 {
     public final TiffHeader header;
-    public final List directories;
+    public final List<TiffDirectory> directories;
 
-    public TiffContents(TiffHeader tiffHeader, List directories)
+    public TiffContents(TiffHeader tiffHeader, List<TiffDirectory> directories)
     {
         this.header = tiffHeader;
         this.directories = directories;
@@ -43,14 +43,14 @@
 
         for (int i = 0; i < directories.size(); i++)
         {
-            TiffDirectory directory = (TiffDirectory) directories.get(i);
+            TiffDirectory directory = directories.get(i);
 
             result.add(directory);
 
-            List fields = directory.entries;
+            List<TiffField> fields = directory.entries;
             for (int j = 0; j < fields.size(); j++)
             {
-                TiffField field = (TiffField) fields.get(j);
+                TiffField field = fields.get(j);
                 TiffElement oversizeValue = field.getOversizeValueElement();
                 if (null != oversizeValue)
                     result.add(oversizeValue);
@@ -69,7 +69,7 @@
     {
         for (int i = 0; i < directories.size(); i++)
         {
-            TiffDirectory directory = (TiffDirectory) directories.get(i);
+            TiffDirectory directory = directories.get(i);
 
             TiffField field = directory.findField(tag);
             if (null != field)
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffDirectory.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffDirectory.java
index b1939cc..d358d81 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffDirectory.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffDirectory.java
@@ -45,7 +45,7 @@
         StringBuffer result = new StringBuffer();
         for (int i = 0; i < entries.size(); i++)
         {
-            TiffField entry = (TiffField) entries.get(i);
+            TiffField entry = entries.get(i);
 
             result.append("\t");
             result.append("[" + entryOffset + "]: ");
@@ -88,11 +88,11 @@
     }
 
     public final int type;
-    public final List entries;
+    public final List<TiffField> entries;
     //    public final int offset;
     public final int nextDirectoryOffset;
 
-    public TiffDirectory(int type, List entries, final int offset,
+    public TiffDirectory(int type, List<TiffField> entries, final int offset,
             int nextDirectoryOffset)
     {
         super(offset, TIFF_DIRECTORY_HEADER_LENGTH + entries.size()
@@ -103,16 +103,16 @@
         this.nextDirectoryOffset = nextDirectoryOffset;
     }
 
-    public List getDirectoryEntrys()
+    public List<TiffField> getDirectoryEntrys()
     {
-        return new ArrayList(entries);
+        return new ArrayList<TiffField>(entries);
     }
 
     public void dump()
     {
         for (int i = 0; i < entries.size(); i++)
         {
-            TiffField entry = (TiffField) entries.get(i);
+            TiffField entry = entries.get(i);
             entry.dump();
         }
 
@@ -166,7 +166,7 @@
 
         for (int i = 0; i < entries.size(); i++)
         {
-            TiffField field = (TiffField) entries.get(i);
+            TiffField field = entries.get(i);
             if (field.tag == tag.tag)
                 return field;
         }
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffField.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffField.java
index afc9281..1ceec67 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffField.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffField.java
@@ -118,7 +118,7 @@
     }
 
     private static TagInfo getTag(int directoryType, int tag,
-            List possibleMatches)
+            List<TagInfo> possibleMatches)
     {
         // Please keep this method in sync with TiffImageMetadata's findField()
 
@@ -133,7 +133,7 @@
         // first search for exact match.
         for (int i = 0; i < possibleMatches.size(); i++)
         {
-            TagInfo tagInfo = (TagInfo) possibleMatches.get(i);
+            TagInfo tagInfo = possibleMatches.get(i);
             if (tagInfo.directoryType == EXIF_DIRECTORY_UNKNOWN)
                 // pass
                 continue;
@@ -144,7 +144,7 @@
         // accept an inexact match.
         for (int i = 0; i < possibleMatches.size(); i++)
         {
-            TagInfo tagInfo = (TagInfo) possibleMatches.get(i);
+            TagInfo tagInfo = possibleMatches.get(i);
 
             if (tagInfo.directoryType == EXIF_DIRECTORY_UNKNOWN)
                 // pass
@@ -160,7 +160,7 @@
         // accept a wildcard match.
         for (int i = 0; i < possibleMatches.size(); i++)
         {
-            TagInfo tagInfo = (TagInfo) possibleMatches.get(i);
+            TagInfo tagInfo = possibleMatches.get(i);
 
             if (tagInfo.directoryType == EXIF_DIRECTORY_UNKNOWN)
                 return tagInfo;
@@ -251,7 +251,7 @@
     {
         Object key = new Integer(tag);
 
-        List possibleMatches = (List) ALL_TAG_MAP.get(key);
+        List<TagInfo> possibleMatches = ALL_TAG_MAP.get(key);
 
         if (null == possibleMatches)
         {
@@ -575,21 +575,21 @@
         return (String) o;
     }
 
-    private static final Map makeTagMap(TagInfo tags[],
-            boolean ignoreDuplicates, String name)
+    private static final Map<Object, List<TagInfo>> makeTagMap(TagInfo tags[],
+                                                               boolean ignoreDuplicates, String name)
     {
         // make sure to use the thread-safe version; this is shared state.
-        Map map = new Hashtable();
+        Map<Object, List<TagInfo>> map = new Hashtable<Object, List<TagInfo>>();
 
         for (int i = 0; i < tags.length; i++)
         {
             TagInfo tag = tags[i];
             Object key = new Integer(tag.tag);
 
-            List tagList = (List) map.get(key);
+            List<TagInfo> tagList = map.get(key);
             if (tagList == null)
             {
-                tagList = new ArrayList();
+                tagList = new ArrayList<TagInfo>();
                 map.put(key, tagList);
             }
             tagList.add(tag);
@@ -609,13 +609,13 @@
         return map;
     }
 
-    private static final Map GPS_TAG_MAP = makeTagMap(ALL_GPS_TAGS, false,
+    private static final Map<Object, List<TagInfo>> GPS_TAG_MAP = makeTagMap(ALL_GPS_TAGS, false,
             "GPS");
-    private static final Map TIFF_TAG_MAP = makeTagMap(ALL_TIFF_TAGS, false,
+    private static final Map<Object, List<TagInfo>> TIFF_TAG_MAP = makeTagMap(ALL_TIFF_TAGS, false,
             "TIFF");
-    private static final Map EXIF_TAG_MAP = makeTagMap(ALL_EXIF_TAGS, true,
+    private static final Map<Object, List<TagInfo>> EXIF_TAG_MAP = makeTagMap(ALL_EXIF_TAGS, true,
             "EXIF");
-    private static final Map ALL_TAG_MAP = makeTagMap(ALL_TAGS, true, "All");
+    private static final Map<Object, List<TagInfo>> ALL_TAG_MAP = makeTagMap(ALL_TAGS, true, "All");
 
     // static
     // {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffImageMetadata.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffImageMetadata.java
index cb2bc8b..f56db6e 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffImageMetadata.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffImageMetadata.java
@@ -41,23 +41,23 @@
             TiffDirectoryConstants
 {
     public final TiffContents contents;
-    private static final Map tagCounts = countTags(AllTagConstants.ALL_TAGS);
+    private static final Map<Object, Integer> tagCounts = countTags(AllTagConstants.ALL_TAGS);
 
     public TiffImageMetadata(final TiffContents contents)
     {
         this.contents = contents;
     }
 
-    private static final Map countTags(TagInfo tags[])
+    private static final Map<Object, Integer> countTags(TagInfo tags[])
     {
-        Map map = new Hashtable();
+        Map<Object, Integer> map = new Hashtable<Object, Integer>();
 
         for (int i = 0; i < tags.length; i++)
         {
             TagInfo tag = tags[i];
             Object key = new Integer(tag.tag);
 
-            Integer count = (Integer) map.get(key);
+            Integer count = map.get(key);
             if (count == null)
                 map.put(key, new Integer(1));
             else
@@ -67,9 +67,7 @@
         return map;
     }
 
-    public static class Directory extends ImageMetadata
-            implements
-                ImageMetadata.IImageMetadataItem
+    public static class Directory extends ImageMetadata implements ImageMetadata.IImageMetadataItem
     {
         //        private BufferedImage thumbnail = null;
 
@@ -104,7 +102,7 @@
             return directory.findField(tagInfo);
         }
 
-        public List getAllFields()
+        public List<TiffField> getAllFields()
         {
             return directory.getDirectoryEntrys();
         }
@@ -192,7 +190,7 @@
         return super.getItems();
     }
 
-    public List getItems()
+    public List<? extends IImageMetadataItem> getItems()
     {
         List result = new ArrayList();
 
@@ -259,7 +257,7 @@
     public TiffField findField(TagInfo tagInfo, boolean exactDirectoryMatch) throws ImageReadException
     {
         // Please keep this method in sync with TiffField's getTag()
-        Integer tagCount = (Integer)tagCounts.get(new Integer(tagInfo.tag));
+        Integer tagCount = tagCounts.get(new Integer(tagInfo.tag));
         int tagsMatching = tagCount == null ? 0 : tagCount.intValue();
 
         List directories = getDirectories();
@@ -321,9 +319,9 @@
         return null;
     }
 
-    public List getAllFields()
+    public List<TiffField> getAllFields()
     {
-        List result = new ArrayList();
+        List<TiffField> result = new ArrayList<TiffField>();
         List directories = getDirectories();
         for (int i = 0; i < directories.size(); i++)
         {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffImageParser.java
index fff5716..91fc477 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffImageParser.java
@@ -85,7 +85,7 @@
         FormatCompliance formatCompliance = FormatCompliance.getDefault();
         TiffContents contents = new TiffReader(isStrict(params))
                 .readFirstDirectory(byteSource, params, false, formatCompliance);
-        TiffDirectory directory = (TiffDirectory) contents.directories.get(0);
+        TiffDirectory directory = contents.directories.get(0);
 
         TiffField field = directory.findField(EXIF_TAG_ICC_PROFILE);
         if (null == field)
@@ -99,7 +99,7 @@
         FormatCompliance formatCompliance = FormatCompliance.getDefault();
         TiffContents contents = new TiffReader(isStrict(params))
                 .readFirstDirectory(byteSource, params, false, formatCompliance);
-        TiffDirectory directory = (TiffDirectory) contents.directories.get(0);
+        TiffDirectory directory = contents.directories.get(0);
 
         int width = directory.findField(TIFF_TAG_IMAGE_WIDTH).getIntValue();
         int height = directory.findField(TIFF_TAG_IMAGE_LENGTH).getIntValue();
@@ -124,21 +124,21 @@
         TiffContents contents = new TiffReader(isStrict(params)).readContents(
                 byteSource, params, formatCompliance);
 
-        List directories = contents.directories;
+        List<TiffDirectory> directories = contents.directories;
 
         TiffImageMetadata result = new TiffImageMetadata(contents);
 
         for (int i = 0; i < directories.size(); i++)
         {
-            TiffDirectory dir = (TiffDirectory) directories.get(i);
+            TiffDirectory dir = directories.get(i);
 
             TiffImageMetadata.Directory metadataDirectory = new TiffImageMetadata.Directory(dir);
 
-            List entries = dir.getDirectoryEntrys();
+            List<TiffField> entries = dir.getDirectoryEntrys();
 
             for (int j = 0; j < entries.size(); j++)
             {
-                TiffField entry = (TiffField) entries.get(j);
+                TiffField entry = entries.get(j);
                 metadataDirectory.add(entry);
             }
 
@@ -154,7 +154,7 @@
         FormatCompliance formatCompliance = FormatCompliance.getDefault();
         TiffContents contents = new TiffReader(isStrict(params))
                 .readDirectories(byteSource, false, formatCompliance);
-        TiffDirectory directory = (TiffDirectory) contents.directories.get(0);
+        TiffDirectory directory = contents.directories.get(0);
 
         TiffField widthField = directory.findField(TIFF_TAG_IMAGE_WIDTH, true);
         TiffField heightField = directory
@@ -233,11 +233,11 @@
 
         // -------------------
 
-        List comments = new ArrayList();
-        List entries = directory.entries;
+        List<String> comments = new ArrayList<String>();
+        List<TiffField> entries = directory.entries;
         for (int i = 0; i < entries.size(); i++)
         {
-            TiffField field = (TiffField) entries.get(i);
+            TiffField field = entries.get(i);
             String comment = field.toString();
             comments.add(comment);
         }
@@ -310,7 +310,7 @@
         FormatCompliance formatCompliance = FormatCompliance.getDefault();
         TiffContents contents = new TiffReader(isStrict(params))
                 .readDirectories(byteSource, false, formatCompliance);
-        TiffDirectory directory = (TiffDirectory) contents.directories.get(0);
+        TiffDirectory directory = contents.directories.get(0);
 
         TiffField xmpField = directory.findField(TIFF_TAG_XMP, false);
         if (xmpField == null)
@@ -354,17 +354,17 @@
                 TiffContents contents = new TiffReader(true).readContents(
                         byteSource, params, formatCompliance);
 
-                List directories = contents.directories;
+                List<TiffDirectory> directories = contents.directories;
 
                 if (directories == null)
                     return false;
 
                 for (int d = 0; d < directories.size(); d++)
                 {
-                    TiffDirectory directory = (TiffDirectory) directories
+                    TiffDirectory directory = directories
                             .get(d);
 
-                    List entries = directory.entries;
+                    List<TiffField> entries = directory.entries;
 
                     if (entries == null)
                         return false;
@@ -373,7 +373,7 @@
 
                     for (int i = 0; i < entries.size(); i++)
                     {
-                        TiffField field = (TiffField) entries.get(i);
+                        TiffField field = entries.get(i);
 
                         field.dump(pw, d + "");
                     }
@@ -405,17 +405,17 @@
         return formatCompliance;
     }
 
-    public List collectRawImageData(ByteSource byteSource, Map params)
+    public List<byte[]> collectRawImageData(ByteSource byteSource, Map params)
             throws ImageReadException, IOException
     {
         FormatCompliance formatCompliance = FormatCompliance.getDefault();
         TiffContents contents = new TiffReader(isStrict(params))
                 .readDirectories(byteSource, true, formatCompliance);
 
-        List result = new ArrayList();
+        List<byte[]> result = new ArrayList<byte[]>();
         for (int i = 0; i < contents.directories.size(); i++)
         {
-            TiffDirectory directory = (TiffDirectory) contents.directories
+            TiffDirectory directory = contents.directories
                     .get(i);
             List dataElements = directory.getTiffRawImageDataElements();
             for (int j = 0; j < dataElements.size(); j++)
@@ -436,22 +436,22 @@
         FormatCompliance formatCompliance = FormatCompliance.getDefault();
         TiffContents contents = new TiffReader(isStrict(params))
                 .readFirstDirectory(byteSource, params, true, formatCompliance);
-        TiffDirectory directory = (TiffDirectory) contents.directories.get(0);
+        TiffDirectory directory = contents.directories.get(0);
         BufferedImage result = directory.getTiffImage(params);
         if (null == result)
             throw new ImageReadException("TIFF does not contain an image.");
         return result;
     }
 
-    public List getAllBufferedImages(ByteSource byteSource)
+    public List<BufferedImage> getAllBufferedImages(ByteSource byteSource)
             throws ImageReadException, IOException
     {
         FormatCompliance formatCompliance = FormatCompliance.getDefault();
         TiffContents contents = new TiffReader(true).readDirectories(byteSource, true, formatCompliance);
-        List results = new ArrayList();
+        List<BufferedImage> results = new ArrayList<BufferedImage>();
         for (int i = 0; i < contents.directories.size(); i++)
         {
-            TiffDirectory directory = (TiffDirectory) contents.directories.get(i);
+            TiffDirectory directory = contents.directories.get(i);
             BufferedImage result = directory.getTiffImage(null);
             if (result != null)
             {
@@ -464,7 +464,7 @@
     protected BufferedImage getBufferedImage(TiffDirectory directory, Map params)
             throws ImageReadException, IOException
     {
-        List entries = directory.entries;
+        List<TiffField> entries = directory.entries;
 
         if (entries == null)
             throw new ImageReadException("TIFF missing entries");
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffReader.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffReader.java
index 440b17d..56949bd 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffReader.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffReader.java
@@ -97,14 +97,14 @@
         int offset = tiffHeader.offsetToFirstIFD;
         int dirType = TiffDirectory.DIRECTORY_TYPE_ROOT;
 
-        List visited = new ArrayList();
+        List<Number> visited = new ArrayList<Number>();
         readDirectory(byteSource, offset, dirType, formatCompliance, listener,
                 visited);
     }
 
     private boolean readDirectory(ByteSource byteSource, int offset,
             int dirType, FormatCompliance formatCompliance, Listener listener,
-            List visited) throws ImageReadException, IOException
+            List<Number> visited) throws ImageReadException, IOException
     {
         boolean ignoreNextDirectory = false;
         return readDirectory(byteSource, offset, dirType, formatCompliance,
@@ -113,7 +113,7 @@
 
     private boolean readDirectory(ByteSource byteSource, int offset,
             int dirType, FormatCompliance formatCompliance, Listener listener,
-            boolean ignoreNextDirectory, List visited)
+            boolean ignoreNextDirectory, List<Number> visited)
             throws ImageReadException, IOException
     {
         Number key = new Integer(offset);
@@ -138,7 +138,7 @@
             if (offset > 0)
                 is.skip(offset);
 
-            List fields = new ArrayList();
+            List<TiffField> fields = new ArrayList<TiffField>();
 
             if (offset >= byteSource.getLength())
             {
@@ -242,10 +242,10 @@
 
             if (listener.readOffsetDirectories())
             {
-                List fieldsToRemove = new ArrayList();
+                List<TiffField> fieldsToRemove = new ArrayList<TiffField>();
                 for (int j = 0; j < fields.size(); j++)
                 {
-                    TiffField entry = (TiffField) fields.get(j);
+                    TiffField entry = fields.get(j);
 
                     if (entry.tag == TiffConstants.EXIF_TAG_EXIF_OFFSET.tag
                             || entry.tag == TiffConstants.EXIF_TAG_GPSINFO.tag
@@ -321,8 +321,8 @@
     private static class Collector implements Listener
     {
         private TiffHeader tiffHeader = null;
-        private List directories = new ArrayList();
-        private List fields = new ArrayList();
+        private List<TiffDirectory> directories = new ArrayList<TiffDirectory>();
+        private List<TiffField> fields = new ArrayList<TiffField>();
         private final boolean readThumbnails;
 
         public Collector()
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterBase.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterBase.java
index b362cbb..c4c9c5a 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterBase.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterBase.java
@@ -62,7 +62,7 @@
     protected TiffOutputSummary validateDirectories(TiffOutputSet outputSet)
             throws ImageWriteException
     {
-        List directories = outputSet.getDirectories();
+        List<TiffOutputDirectory> directories = outputSet.getDirectories();
 
         if (1 > directories.size())
             throw new ImageWriteException("No directories.");
@@ -74,11 +74,11 @@
         TiffOutputField gpsDirectoryOffsetField = null;
         TiffOutputField interoperabilityDirectoryOffsetField = null;
 
-        List directoryIndices = new ArrayList();
-        Map directoryTypeMap = new HashMap();
+        List<Integer> directoryIndices = new ArrayList<Integer>();
+        Map<Integer, TiffOutputDirectory> directoryTypeMap = new HashMap<Integer, TiffOutputDirectory>();
         for (int i = 0; i < directories.size(); i++)
         {
-            TiffOutputDirectory directory = (TiffOutputDirectory) directories
+            TiffOutputDirectory directory = directories
                     .get(i);
             int dirType = directory.type;
             Integer key = new Integer(dirType);
@@ -124,7 +124,7 @@
                 // dirMap.put(arg0, arg1)
             }
 
-            HashSet fieldTags = new HashSet();
+            HashSet<Integer> fieldTags = new HashSet<Integer>();
             List fields = directory.getFields();
             for (int j = 0; j < fields.size(); j++)
             {
@@ -170,19 +170,19 @@
         TiffOutputDirectory previousDirectory = null;
         for (int i = 0; i < directoryIndices.size(); i++)
         {
-            Integer index = (Integer) directoryIndices.get(i);
+            Integer index = directoryIndices.get(i);
             if (index.intValue() != i)
                 throw new ImageWriteException("Missing directory: " + i + ".");
 
             // set up chain of directory references for "normal" directories.
-            TiffOutputDirectory directory = (TiffOutputDirectory) directoryTypeMap
+            TiffOutputDirectory directory = directoryTypeMap
                     .get(index);
             if (null != previousDirectory)
                 previousDirectory.setNextDirectory(directory);
             previousDirectory = directory;
         }
 
-        TiffOutputDirectory rootDirectory = (TiffOutputDirectory) directoryTypeMap
+        TiffOutputDirectory rootDirectory = directoryTypeMap
                 .get(new Integer(DIRECTORY_TYPE_ROOT));
 
         // prepare results
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java
index c45896d..984f119 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java
@@ -67,7 +67,7 @@
     //        }
     //    }
 
-    private void dumpElements(List elements) throws IOException
+    private void dumpElements(List<TiffElement> elements) throws IOException
     {
         //        try
         //        {
@@ -81,13 +81,13 @@
         //        }
     }
 
-    private void dumpElements(ByteSource byteSource, List elements)
+    private void dumpElements(ByteSource byteSource, List<TiffElement> elements)
             throws IOException
     {
         int last = TIFF_HEADER_SIZE;
         for (int i = 0; i < elements.size(); i++)
         {
-            TiffElement element = (TiffElement) elements.get(i);
+            TiffElement element = elements.get(i);
             if (element.offset > last)
             {
                 final int SLICE_SIZE = 32;
@@ -132,16 +132,16 @@
             List elements = new ArrayList();
             //            result.add(contents.header); // ?
 
-            List directories = contents.directories;
+            List<TiffDirectory> directories = contents.directories;
             for (int d = 0; d < directories.size(); d++)
             {
-                TiffDirectory directory = (TiffDirectory) directories.get(d);
+                TiffDirectory directory = directories.get(d);
                 elements.add(directory);
 
-                List fields = directory.getDirectoryEntrys();
+                List<TiffField> fields = directory.getDirectoryEntrys();
                 for (int f = 0; f < fields.size(); f++)
                 {
-                    TiffField field = (TiffField) fields.get(f);
+                    TiffField field = fields.get(f);
                     TiffElement oversizeValue = field.getOversizeValueElement();
                     if (oversizeValue != null)
                         elements.add(oversizeValue);
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputDirectory.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputDirectory.java
index 172de30..bb0f844 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputDirectory.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputDirectory.java
@@ -68,7 +68,7 @@
 
     public void removeField(int tag)
     {
-        List matches = new ArrayList();
+        List<TiffOutputField> matches = new ArrayList<TiffOutputField>();
         for (int i = 0; i < fields.size(); i++)
         {
             TiffOutputField field = (TiffOutputField) fields.get(i);
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputSet.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputSet.java
index 613e382..0d2c4a5 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputSet.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputSet.java
@@ -27,7 +27,7 @@
 public final class TiffOutputSet implements TiffConstants
 {
     public final int byteOrder;
-    private final List directories = new ArrayList();
+    private final List<TiffOutputDirectory> directories = new ArrayList<TiffOutputDirectory>();
 
     public TiffOutputSet()
     {
@@ -47,7 +47,7 @@
 
         for (int i = 0; i < directories.size(); i++)
         {
-            TiffOutputDirectory directory = (TiffOutputDirectory) directories
+            TiffOutputDirectory directory = directories
                     .get(i);
 
             result.addAll(directory.getOutputItems(outputSummary));
@@ -65,9 +65,9 @@
         directories.add(directory);
     }
 
-    public List getDirectories()
+    public List<TiffOutputDirectory> getDirectories()
     {
-        return new ArrayList(directories);
+        return new ArrayList<TiffOutputDirectory>(directories);
     }
 
     public TiffOutputDirectory getRootDirectory()
@@ -127,7 +127,7 @@
     {
         for (int i = 0; i < directories.size(); i++)
         {
-            TiffOutputDirectory directory = (TiffOutputDirectory) directories
+            TiffOutputDirectory directory = directories
                     .get(i);
             if (directory.type == directoryType)
                 return directory;
@@ -219,7 +219,7 @@
     {
         for (int i = 0; i < directories.size(); i++)
         {
-            TiffOutputDirectory directory = (TiffOutputDirectory) directories
+            TiffOutputDirectory directory = directories
                     .get(i);
             directory.removeField(tag);
         }
@@ -234,7 +234,7 @@
     {
         for (int i = 0; i < directories.size(); i++)
         {
-            TiffOutputDirectory directory = (TiffOutputDirectory) directories
+            TiffOutputDirectory directory = directories
                     .get(i);
             TiffOutputField field = directory.findField(tag);
             if (null != field)
@@ -301,7 +301,7 @@
 
         for (int i = 0; i < directories.size(); i++)
         {
-            TiffOutputDirectory directory = (TiffOutputDirectory) directories
+            TiffOutputDirectory directory = directories
                     .get(i);
             result.append(prefix);
             result.append("\t" + "directory " + i + ": "
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputSummary.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputSummary.java
index 5a8cfea..39174c3 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputSummary.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputSummary.java
@@ -27,10 +27,10 @@
 {
     public final int byteOrder;
     public final TiffOutputDirectory rootDirectory;
-    public final Map directoryTypeMap;
+    public final Map<Integer, TiffOutputDirectory> directoryTypeMap;
 
     public TiffOutputSummary(final int byteOrder,
-            final TiffOutputDirectory rootDirectory, final Map directoryTypeMap)
+            final TiffOutputDirectory rootDirectory, final Map<Integer, TiffOutputDirectory> directoryTypeMap)
     {
         this.byteOrder = byteOrder;
         this.rootDirectory = rootDirectory;
@@ -51,7 +51,7 @@
         }
     }
 
-    private List offsetItems = new ArrayList();
+    private List<OffsetItem> offsetItems = new ArrayList<OffsetItem>();
 
     public void add(final TiffOutputItem item,
             final TiffOutputField itemOffsetField)
@@ -63,7 +63,7 @@
     {
         for (int i = 0; i < offsetItems.size(); i++)
         {
-            OffsetItem offset = (OffsetItem) offsetItems.get(i);
+            OffsetItem offset = offsetItems.get(i);
 
             byte value[] = FIELD_TYPE_LONG.writeData(new int[]{
                 offset.item.getOffset(),
@@ -73,7 +73,7 @@
 
         for (int i = 0; i < imageDataItems.size(); i++)
         {
-            ImageDataOffsets imageDataInfo = (ImageDataOffsets) imageDataItems
+            ImageDataOffsets imageDataInfo = imageDataItems
                     .get(i);
 
             for (int j = 0; j < imageDataInfo.outputItems.length; j++)
@@ -87,7 +87,7 @@
         }
     }
 
-    private List imageDataItems = new ArrayList();
+    private List<ImageDataOffsets> imageDataItems = new ArrayList<ImageDataOffsets>();
 
     public void addTiffImageData(final ImageDataOffsets imageDataInfo)
     {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/wbmp/WbmpImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/wbmp/WbmpImageParser.java
index a0f8bb6..79e3214 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/wbmp/WbmpImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/wbmp/WbmpImageParser.java
@@ -88,7 +88,7 @@
             throws ImageReadException, IOException
     {
         WbmpHeader wbmpHeader = readWbmpHeader(byteSource);
-        return new ImageInfo("WBMP", 1, new ArrayList(),
+        return new ImageInfo("WBMP", 1, new ArrayList<String>(),
                 ImageFormat.IMAGE_FORMAT_WBMP,
                 "Wireless Application Protocol Bitmap",
                 wbmpHeader.height, "image/vnd.wap.wbmp", 1,
diff --git a/src/main/java/org/apache/commons/sanselan/formats/xbm/XbmImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/xbm/XbmImageParser.java
index 55dbe56..072393a 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/xbm/XbmImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/xbm/XbmImageParser.java
@@ -95,7 +95,7 @@
     {
         XbmHeader xbmHeader = readXbmHeader(byteSource);
         return new ImageInfo("XBM", 1,
-                new ArrayList(), ImageFormat.IMAGE_FORMAT_XBM,
+                new ArrayList<String>(), ImageFormat.IMAGE_FORMAT_XBM,
                 "X BitMap",
                 xbmHeader.height, "image/x-xbitmap", 1,
                 0, 0, 0, 0,
@@ -167,25 +167,25 @@
         try
         {
             is = byteSource.getInputStream();
-            Map defines = new HashMap();
+            Map<String, String> defines = new HashMap<String, String>();
             ByteArrayOutputStream preprocessedFile = BasicCParser.preprocess(
                     is, null, defines);
             int width = -1;
             int height = -1;
             int xHot = -1;
             int yHot = -1;
-            for (Iterator it = defines.entrySet().iterator(); it.hasNext();)
+            for (Iterator<Map.Entry<String,String>> it = defines.entrySet().iterator(); it.hasNext();)
             {
-                Map.Entry entry = (Map.Entry)it.next();
-                String name = (String)entry.getKey();
+                Map.Entry<String, String> entry = it.next();
+                String name = entry.getKey();
                 if (name.endsWith("_width"))
-                    width = Integer.parseInt((String)entry.getValue());
+                    width = Integer.parseInt(entry.getValue());
                 else if (name.endsWith("_height"))
-                    height = Integer.parseInt((String)entry.getValue());
+                    height = Integer.parseInt(entry.getValue());
                 else if (name.endsWith("_x_hot"))
-                    xHot = Integer.parseInt((String)entry.getValue());
+                    xHot = Integer.parseInt(entry.getValue());
                 else if (name.endsWith("_y_hot"))
-                    yHot = Integer.parseInt((String)entry.getValue());
+                    yHot = Integer.parseInt(entry.getValue());
             }
             if (width == -1)
                 throw new ImageReadException("width not found");
diff --git a/src/main/java/org/apache/commons/sanselan/formats/xpm/XpmImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/xpm/XpmImageParser.java
index 6306cda..38fdb71 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/xpm/XpmImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/xpm/XpmImageParser.java
@@ -53,7 +53,7 @@
 
 public class XpmImageParser extends ImageParser
 {
-    private static Map colorNames = null;
+    private static Map<String, Integer> colorNames = null;
 
     public XpmImageParser()
     {
@@ -74,7 +74,7 @@
             }
             reader = new BufferedReader(new InputStreamReader(rgbTxtStream,
                     "US-ASCII"));
-            Map colors = new HashMap();
+            Map<String, Integer> colors = new HashMap<String, Integer>();
             String line;
             while ((line = reader.readLine()) != null)
             {
@@ -159,10 +159,10 @@
         XpmHeader xpmHeader = readXpmHeader(byteSource);
         boolean isTransparent = false;
         int colorType = ImageInfo.COLOR_TYPE_BW;
-        for (Iterator it = xpmHeader.palette.entrySet().iterator(); it.hasNext();)
+        for (Iterator<Map.Entry<Object,PaletteEntry>> it = xpmHeader.palette.entrySet().iterator(); it.hasNext();)
         {
-            Map.Entry entry = (Map.Entry)it.next();
-            PaletteEntry paletteEntry = (PaletteEntry)entry.getValue();
+            Map.Entry<Object, PaletteEntry> entry = it.next();
+            PaletteEntry paletteEntry = entry.getValue();
             if ((paletteEntry.getBestARGB() & 0xff000000) != 0xff000000)
                 isTransparent = true;
             if (paletteEntry.haveColor)
@@ -172,7 +172,7 @@
                 colorType = ImageInfo.COLOR_TYPE_GRAYSCALE;
         }
         return new ImageInfo("XPM version 3", xpmHeader.numCharsPerPixel * 8,
-                new ArrayList(), ImageFormat.IMAGE_FORMAT_XPM,
+                new ArrayList<String>(), ImageFormat.IMAGE_FORMAT_XPM,
                 "X PixMap",
                 xpmHeader.height, "image/x-xpixmap", 1,
                 0, 0, 0, 0,
@@ -206,7 +206,7 @@
         int yHotSpot = -1;
         boolean xpmExt;
         
-        Map palette = new HashMap();
+        Map<Object, PaletteEntry> palette = new HashMap<Object, PaletteEntry>();
 
         public XpmHeader(int width, int height, int numColors,
                 int numCharsPerPixel, int xHotSpot, int yHotSpot,
@@ -416,7 +416,7 @@
             if (!loadColorNames())
                 return 0x00000000;
             if (colorNames.containsKey(color))
-                return ((Integer)colorNames.get(color)).intValue();
+                return (colorNames.get(color)).intValue();
             else
                 return 0x00000000;
         }
@@ -587,10 +587,10 @@
         if (xpmHeader.palette.size() <= (1 << 8))
         {
             int[] palette = new int[xpmHeader.palette.size()];
-            for (Iterator it = xpmHeader.palette.entrySet().iterator(); it.hasNext();)
+            for (Iterator<Map.Entry<Object,PaletteEntry>> it = xpmHeader.palette.entrySet().iterator(); it.hasNext();)
             {
-                Map.Entry entry = (Map.Entry)it.next();
-                PaletteEntry paletteEntry = (PaletteEntry)entry.getValue();
+                Map.Entry<Object, PaletteEntry> entry = it.next();
+                PaletteEntry paletteEntry = entry.getValue();
                 palette[paletteEntry.index] = paletteEntry.getBestARGB();
             }
             colorModel = new IndexColorModel(8, xpmHeader.palette.size(),
@@ -602,10 +602,10 @@
         else if (xpmHeader.palette.size() <= (1 << 16))
         {
             int[] palette = new int[xpmHeader.palette.size()];
-            for (Iterator it = xpmHeader.palette.entrySet().iterator(); it.hasNext();)
+            for (Iterator<Map.Entry<Object,PaletteEntry>> it = xpmHeader.palette.entrySet().iterator(); it.hasNext();)
             {
-                Map.Entry entry = (Map.Entry)it.next();
-                PaletteEntry paletteEntry = (PaletteEntry)entry.getValue();
+                Map.Entry<Object, PaletteEntry> entry = it.next();
+                PaletteEntry paletteEntry = entry.getValue();
                 palette[paletteEntry.index] = paletteEntry.getBestARGB();
             }
             colorModel = new IndexColorModel(16, xpmHeader.palette.size(),
@@ -641,7 +641,7 @@
             {
                 String index = row.substring(x*xpmHeader.numCharsPerPixel,
                         (x + 1)*xpmHeader.numCharsPerPixel);
-                PaletteEntry paletteEntry = (PaletteEntry) xpmHeader.palette.get(index);
+                PaletteEntry paletteEntry = xpmHeader.palette.get(index);
                 if (paletteEntry == null) {
                     throw new ImageReadException("No palette entry was defined " +
                             "for " + index);
diff --git a/src/main/java/org/apache/commons/sanselan/palette/MedianCutQuantizer.java b/src/main/java/org/apache/commons/sanselan/palette/MedianCutQuantizer.java
index 23f0ff8..873094f 100644
--- a/src/main/java/org/apache/commons/sanselan/palette/MedianCutQuantizer.java
+++ b/src/main/java/org/apache/commons/sanselan/palette/MedianCutQuantizer.java
@@ -74,7 +74,7 @@
         //        public final List children = new ArrayList();
         public int palette_index = -1;
 
-        public final List color_counts;
+        public final List<ColorCount> color_counts;
         public int min_red = Integer.MAX_VALUE;
         public int max_red = Integer.MIN_VALUE;
         public int min_green = Integer.MAX_VALUE;
@@ -92,7 +92,7 @@
         public final int max_diff;
         public final int diff_total;
 
-        public ColorGroup(final List color_counts) throws ImageWriteException
+        public ColorGroup(final List<ColorCount> color_counts) throws ImageWriteException
         {
             this.color_counts = color_counts;
 
@@ -101,7 +101,7 @@
 
             for (int i = 0; i < color_counts.size(); i++)
             {
-                ColorCount color = (ColorCount) color_counts.get(i);
+                ColorCount color = color_counts.get(i);
 
                 min_alpha = Math.min(min_alpha, color.alpha);
                 max_alpha = Math.max(max_alpha, color.alpha);
@@ -149,7 +149,7 @@
 
             for (int i = 0; i < color_counts.size(); i++)
             {
-                ColorCount color = (ColorCount) color_counts.get(i);
+                ColorCount color = color_counts.get(i);
 
                 count_total += color.count;
                 alpha_total += color.count * color.alpha;
@@ -183,9 +183,9 @@
 
     }
 
-    public Map groupColors1(BufferedImage image, int max, int mask)
+    public Map<Integer, ColorCount> groupColors1(BufferedImage image, int max, int mask)
     {
-        Map color_map = new HashMap();
+        Map<Integer, ColorCount> color_map = new HashMap<Integer, ColorCount>();
 
         int width = image.getWidth();
         int height = image.getHeight();
@@ -202,7 +202,7 @@
                     argb &= 0xffffff;
                 argb &= mask;
 
-                ColorCount color = (ColorCount) color_map
+                ColorCount color = color_map
                         .get(new Integer(argb));
                 if (color == null)
                 {
@@ -218,7 +218,7 @@
         return color_map;
     }
 
-    public Map groupColors(BufferedImage image, int max_colors)
+    public Map<Integer, ColorCount> groupColors(BufferedImage image, int max_colors)
     {
         int max = Integer.MAX_VALUE;
 
@@ -227,10 +227,9 @@
             int mask = 0xff & (0xff << i);
             mask = mask | (mask << 8) | (mask << 16) | (mask << 24);
 
-            Debug.debug("mask(" + i + ")", mask + " ("
-                    + Integer.toHexString(mask) + ")");
+            Debug.debug("mask(" + i + ")", mask + " (" + Integer.toHexString(mask) + ")");
 
-            Map result = groupColors1(image, max, mask);
+            Map<Integer, ColorCount> result = groupColors1(image, max, mask);
             if (result != null)
                 return result;
         }
@@ -240,7 +239,7 @@
     public Palette process(BufferedImage image, int max_colors, boolean verbose)
             throws ImageWriteException
     {
-        Map color_map = groupColors(image, max_colors);
+        Map<Integer, ColorCount> color_map = groupColors(image, max_colors);
 
         int discrete_colors = color_map.keySet().size();
         if (discrete_colors <= max_colors)
@@ -249,11 +248,11 @@
                 Debug.debug("lossless palette: " + discrete_colors);
 
             int palette[] = new int[discrete_colors];
-            List color_counts = new ArrayList(color_map.values());
+            List<ColorCount> color_counts = new ArrayList<ColorCount>(color_map.values());
 
             for (int i = 0; i < color_counts.size(); i++)
             {
-                ColorCount color_count = (ColorCount) color_counts.get(i);
+                ColorCount color_count = color_counts.get(i);
                 palette[i] = color_count.argb;
                 if (ignoreAlpha)
                     palette[i] |= 0xff000000;
@@ -265,18 +264,15 @@
         if (verbose)
             Debug.debug("discrete colors: " + discrete_colors);
 
-        List color_groups = new ArrayList();
-        ColorGroup root = new ColorGroup(new ArrayList(color_map.values()));
+        List<ColorGroup> color_groups = new ArrayList<ColorGroup>();
+        ColorGroup root = new ColorGroup(new ArrayList<ColorCount>(color_map.values()));
         {
             color_groups.add(root);
 
-            final Comparator comparator = new Comparator()
+            final Comparator<ColorGroup> comparator = new Comparator<ColorGroup>()
             {
-                public int compare(Object o1, Object o2)
+                public int compare(ColorGroup cg1, ColorGroup cg2)
                 {
-                    ColorGroup cg1 = (ColorGroup) o1;
-                    ColorGroup cg2 = (ColorGroup) o2;
-
                     if (cg1.max_diff == cg2.max_diff)
                         return cg2.diff_total - cg1.diff_total;
                     return cg2.max_diff - cg1.max_diff;
@@ -287,7 +283,7 @@
             {
                 Collections.sort(color_groups, comparator);
 
-                ColorGroup color_group = (ColorGroup) color_groups.get(0);
+                ColorGroup color_group = color_groups.get(0);
 
                 if (color_group.max_diff == 0)
                     break;
@@ -323,7 +319,7 @@
 
             for (int i = 0; i < color_groups.size(); i++)
             {
-                ColorGroup color_group = (ColorGroup) color_groups.get(i);
+                ColorGroup color_group = color_groups.get(i);
 
                 palette[i] = color_group.getMedianValue();
 
@@ -351,24 +347,19 @@
     private static final int GREEN = 2;
     private static final int BLUE = 3;
 
-    private void doCut(ColorGroup color_group, final int mode,
-            final List color_groups) throws ImageWriteException
+    private void doCut(ColorGroup color_group, final int mode, final List<ColorGroup> color_groups) throws ImageWriteException
     {
         int count_total = 0;
         for (int i = 0; i < color_group.color_counts.size(); i++)
         {
-            ColorCount color_count = (ColorCount) color_group.color_counts
-                    .get(i);
+            ColorCount color_count = color_group.color_counts.get(i);
             count_total += color_count.count;
         }
 
-        Comparator comparator = new Comparator()
+        Comparator<ColorCount> comparator = new Comparator<ColorCount>()
         {
-            public int compare(Object o1, Object o2)
+            public int compare(ColorCount c1, ColorCount c2)
             {
-                ColorCount c1 = (ColorCount) o1;
-                ColorCount c2 = (ColorCount) o2;
-
                 switch (mode)
                 {
                     case ALPHA :
@@ -391,8 +382,7 @@
         int median_index;
         for (median_index = 0; median_index < color_group.color_counts.size(); median_index++)
         {
-            ColorCount color_count = (ColorCount) color_group.color_counts
-                    .get(median_index);
+            ColorCount color_count = color_group.color_counts.get(median_index);
 
             new_count += color_count.count;
 
@@ -416,23 +406,20 @@
 
         color_groups.remove(color_group);
         {
-            List color_counts1 = new ArrayList(color_group.color_counts
-                    .subList(0, median_index + 1));
-            List color_counts2 = new ArrayList(color_group.color_counts
-                    .subList(median_index + 1, color_group.color_counts.size()));
+            List<ColorCount> color_counts1 = new ArrayList<ColorCount>(color_group.color_counts.subList(0, median_index + 1));
+            List<ColorCount> color_counts2 = new ArrayList<ColorCount>(color_group.color_counts.subList(median_index + 1, color_group.color_counts.size()));
 
             ColorGroup less, more;
             {
-                less = new ColorGroup(new ArrayList(color_counts1));
+                less = new ColorGroup(new ArrayList<ColorCount>(color_counts1));
                 color_groups.add(less);
             }
             {
-                more = new ColorGroup(new ArrayList(color_counts2));
+                more = new ColorGroup(new ArrayList<ColorCount>(color_counts2));
                 color_groups.add(more);
             }
 
-            ColorCount median_value = (ColorCount) color_group.color_counts
-                    .get(median_index);
+            ColorCount median_value = color_group.color_counts.get(median_index);
             int limit;
             switch (mode)
             {
@@ -512,9 +499,7 @@
 
             while (cg.cut != null)
             {
-                ColorGroup next = cg.cut.getColorGroup(rgb);
-
-                cg = next;
+                cg = cg.cut.getColorGroup(rgb);
             }
 
             return cg.palette_index;
diff --git a/src/main/java/org/apache/commons/sanselan/palette/PaletteFactory.java b/src/main/java/org/apache/commons/sanselan/palette/PaletteFactory.java
index be9e9f0..da851d8 100644
--- a/src/main/java/org/apache/commons/sanselan/palette/PaletteFactory.java
+++ b/src/main/java/org/apache/commons/sanselan/palette/PaletteFactory.java
@@ -200,8 +200,8 @@
 
     }
 
-    private List divideSubset2(int table[], ColorSpaceSubset subset,
-            int component, int precision)
+    private List<DivisionCandidate> divideSubset2(int table[], ColorSpaceSubset subset,
+                                                  int component, int precision)
     {
         if (debug)
             subset.dump("trying (" + component + "): ");
@@ -243,7 +243,7 @@
         DivisionCandidate dc2 = finishDivision(table, subset, component,
                 precision, sum2, slice2);
 
-        List result = new ArrayList();
+        List<DivisionCandidate> result = new ArrayList<DivisionCandidate>();
 
         if (dc1 != null)
             result.add(dc1);
@@ -256,7 +256,7 @@
     private DivisionCandidate divideSubset2(int table[],
             ColorSpaceSubset subset, int precision)
     {
-        List dcs = new ArrayList();
+        List<DivisionCandidate> dcs = new ArrayList<DivisionCandidate>();
 
         dcs.addAll(divideSubset2(table, subset, 0, precision));
         dcs.addAll(divideSubset2(table, subset, 1, precision));
@@ -268,7 +268,7 @@
 
         for (int i = 0; i < dcs.size(); i++)
         {
-            DivisionCandidate dc = (DivisionCandidate) dcs.get(i);
+            DivisionCandidate dc = dcs.get(i);
 
             ColorSpaceSubset first = dc.dst_a;
             ColorSpaceSubset second = dc.dst_b;
@@ -312,10 +312,10 @@
         }
     }
 
-    private List divide(List v, int desired_count, int table[],
-            int precision)
+    private List<ColorSpaceSubset> divide(List<ColorSpaceSubset> v, int desired_count, int table[],
+                                          int precision)
     {
-        List ignore = new ArrayList();
+        List<ColorSpaceSubset> ignore = new ArrayList<ColorSpaceSubset>();
 
         int count = 0;
         while (true)
@@ -331,7 +331,7 @@
 
             for (int i = 0; i < v.size(); i++)
             {
-                ColorSpaceSubset subset = (ColorSpaceSubset) v.get(i);
+                ColorSpaceSubset subset = v.get(i);
                 if (ignore.contains(subset))
                     continue;
                 int area = subset.total;
@@ -387,7 +387,7 @@
         int width = src.getWidth();
         int height = src.getHeight();
 
-        List subsets = new ArrayList();
+        List<ColorSpaceSubset> subsets = new ArrayList<ColorSpaceSubset>();
         ColorSpaceSubset all = new ColorSpaceSubset(width * height, precision);
         subsets.add(all);
 
@@ -426,7 +426,7 @@
 
         for (int i = 0; i < subsets.size(); i++)
         {
-            ColorSpaceSubset subset = (ColorSpaceSubset) subsets.get(i);
+            ColorSpaceSubset subset = subsets.get(i);
 
             subset.setAverageRGB(table);
 
@@ -442,7 +442,7 @@
     public SimplePalette makePaletteSimple(BufferedImage src, int max)
     // This is not efficient for large values of max, say, max > 256;
     {
-        Map map = new HashMap();
+        Map<String, String> map = new HashMap<String, String>();
         int rgbs[] = new int[max];
         int rgb_count = 0;
 
diff --git a/src/main/java/org/apache/commons/sanselan/palette/QuantizedPalette.java b/src/main/java/org/apache/commons/sanselan/palette/QuantizedPalette.java
index f2f20a7..1d72045 100644
--- a/src/main/java/org/apache/commons/sanselan/palette/QuantizedPalette.java
+++ b/src/main/java/org/apache/commons/sanselan/palette/QuantizedPalette.java
@@ -23,10 +23,10 @@
 public class QuantizedPalette extends Palette
 {
     private final int precision;
-    private final List subsets;
+    private final List<ColorSpaceSubset> subsets;
     private final ColorSpaceSubset straight[];
 
-    public QuantizedPalette(List subsets, int precision)
+    public QuantizedPalette(List<ColorSpaceSubset> subsets, int precision)
     {
         this.subsets = subsets;
         this.precision = precision;
@@ -36,7 +36,7 @@
 
             for (int i = 0; i < subsets.size(); i++)
             {
-                ColorSpaceSubset subset = (ColorSpaceSubset) subsets.get(i);
+                ColorSpaceSubset subset = subsets.get(i);
                 subset.setIndex(i);
 
                 for (int u = subset.mins[0]; u <= subset.maxs[0]; u++)
@@ -74,7 +74,7 @@
 
     public int getEntry(int index)
     {
-        ColorSpaceSubset subset = (ColorSpaceSubset) subsets.get(index);
+        ColorSpaceSubset subset = subsets.get(index);
         return subset.rgb;
     }