diff --git a/pom.xml b/pom.xml
index a6d0a35..134fea3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -70,6 +70,12 @@
       <artifactId>avalon-framework-api</artifactId>
       <version>4.3.1</version>
     </dependency>
+	<dependency>
+	    <groupId>commons-codec</groupId>
+	    <artifactId>commons-codec</artifactId>
+	    <version>1.11</version>
+	</dependency>
+    
     <!-- testing dependencies -->
     <dependency>
       <groupId>org.apache.fulcrum</groupId>
diff --git a/src/java/org/apache/fulcrum/crypto/DefaultCryptoService.java b/src/java/org/apache/fulcrum/crypto/DefaultCryptoService.java
index 4b47dcd..81c6628 100644
--- a/src/java/org/apache/fulcrum/crypto/DefaultCryptoService.java
+++ b/src/java/org/apache/fulcrum/crypto/DefaultCryptoService.java
@@ -21,7 +21,6 @@
 
 import java.security.NoSuchAlgorithmException;
 import java.util.HashMap;
-import java.util.Hashtable;
 
 import org.apache.avalon.framework.activity.Initializable;
 import org.apache.avalon.framework.configuration.Configurable;
@@ -46,10 +45,8 @@
  */
 public class DefaultCryptoService extends AbstractLogEnabled
 		implements CryptoService, Configurable, Initializable, ThreadSafe {
-	//
-	// SJM: removed Component and Contextualizable, Startable
-	//
 
+	
 	/** Key Prefix for our algorithms */
 	private static final String ALGORITHM = "algorithm";
 
@@ -60,7 +57,7 @@
 	private static final String DEFAULT_CLASS = "org.apache.fulcrum.crypto.provider.JavaCrypt";
 
 	/** Names of the registered algorithms and the wanted classes */
-	private HashMap<String, String> algos = null;
+	private HashMap<String, String> algos = new HashMap<>();
 
 	/**
 	 * Returns a CryptoAlgorithm Object which represents the requested crypto
@@ -83,9 +80,6 @@
 			throw new NoSuchAlgorithmException("TurbineCryptoService: No Algorithm for " + algo + " found");
 		}
 		try {
-			// @todo should be created via factory service.
-			// Just trying to get something to work.
-			// ca = (CryptoAlgorithm) factoryService.getInstance(cryptoClass);
 			ca = (CryptoAlgorithm) Class.forName(cryptoClass).newInstance();
 		} catch (Exception e) {
 			throw new NoSuchAlgorithmException(
@@ -95,6 +89,7 @@
 		return ca;
 	}
 
+
 	// ---------------- Avalon Lifecycle Methods ---------------------
 
 	/**
@@ -113,16 +108,13 @@
 		final Configuration algorithms = conf.getChild(ALGORITHM, false);
 		if (algorithms != null) {
 			Configuration[] nameVal = algorithms.getChildren();
-			for (int i = 0; i < nameVal.length; i++) {
-				String key = nameVal[i].getName();
-				String val = nameVal[i].getValue();
-				// getLogger.debug("Registered " + val
-				// + " for Crypto Algorithm " + key);
-				algos.put(key, val);
+			for ( Configuration entry : nameVal )
+			{
+				algos.put(entry.getName(), entry.getValue());
 			}
 		}
 	}
-
+	
 	/**
 	 * {@link org.apache.avalon.framework.activity.Initializable#initialize()}
 	 * 
diff --git a/src/java/org/apache/fulcrum/crypto/impl/Base64.java b/src/java/org/apache/fulcrum/crypto/impl/Base64.java
deleted file mode 100644
index 9606d29..0000000
--- a/src/java/org/apache/fulcrum/crypto/impl/Base64.java
+++ /dev/null
@@ -1,294 +0,0 @@
-package org.apache.fulcrum.crypto.impl;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * Base64 encoder/decoder taken from commons-codec. Copying
- * and wasting the code allows to minimize the dependencies.
- *
- * @author Siegfried Goeschl
- */
-public class Base64
-{
-
-    public Base64() {
-    }
-
-    private static boolean isBase64(byte octect) {
-        if(octect == 61)
-            return true;
-        return base64Alphabet[octect] != -1;
-    }
-
-    public static boolean isArrayByteBase64(byte arrayOctect[]) {
-        arrayOctect = discardWhitespace(arrayOctect);
-        int length = arrayOctect.length;
-        if(length == 0)
-            return true;
-        for(int i = 0; i < length; i++)
-            if(!isBase64(arrayOctect[i]))
-                return false;
-
-        return true;
-    }
-
-    public static byte[] encodeBase64(byte binaryData[]) {
-        return encodeBase64(binaryData, false);
-    }
-
-    public static byte[] encodeBase64Chunked(byte binaryData[]) {
-        return encodeBase64(binaryData, true);
-    }
-
-    public Object decode(Object pObject)
-        throws Exception {
-        if(!(pObject instanceof byte[]))
-            throw new Exception("Parameter supplied to Base64 decode is not a byte[]");
-        else
-            return decode((byte[])pObject);
-    }
-
-    public byte[] decode(byte pArray[]) {
-        return decodeBase64(pArray);
-    }
-
-    public static byte[] encodeBase64(byte binaryData[], boolean isChunked) {
-        int lengthDataBits = binaryData.length * 8;
-        int fewerThan24bits = lengthDataBits % 24;
-        int numberTriplets = lengthDataBits / 24;
-        byte encodedData[] = null;
-        int encodedDataLength = 0;
-        int nbrChunks = 0;
-        if(fewerThan24bits != 0)
-            encodedDataLength = (numberTriplets + 1) * 4;
-        else
-            encodedDataLength = numberTriplets * 4;
-        if(isChunked) {
-            nbrChunks = CHUNK_SEPARATOR.length != 0 ? (int)Math.ceil((float)encodedDataLength / 76F) : 0;
-            encodedDataLength += nbrChunks * CHUNK_SEPARATOR.length;
-        }
-        encodedData = new byte[encodedDataLength];
-        byte k = 0;
-        byte l = 0;
-        byte b1 = 0;
-        byte b2 = 0;
-        byte b3 = 0;
-        int encodedIndex = 0;
-        int dataIndex = 0;
-        int i = 0;
-        int nextSeparatorIndex = 76;
-        int chunksSoFar = 0;
-        for(i = 0; i < numberTriplets; i++) {
-            dataIndex = i * 3;
-            b1 = binaryData[dataIndex];
-            b2 = binaryData[dataIndex + 1];
-            b3 = binaryData[dataIndex + 2];
-            l = (byte)(b2 & 0xf);
-            k = (byte)(b1 & 3);
-            byte val1 = (b1 & 0xffffff80) != 0 ? (byte)(b1 >> 2 ^ 0xc0) : (byte)(b1 >> 2);
-            byte val2 = (b2 & 0xffffff80) != 0 ? (byte)(b2 >> 4 ^ 0xf0) : (byte)(b2 >> 4);
-            byte val3 = (b3 & 0xffffff80) != 0 ? (byte)(b3 >> 6 ^ 0xfc) : (byte)(b3 >> 6);
-            encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
-            encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | k << 4];
-            encodedData[encodedIndex + 2] = lookUpBase64Alphabet[l << 2 | val3];
-            encodedData[encodedIndex + 3] = lookUpBase64Alphabet[b3 & 0x3f];
-            encodedIndex += 4;
-            if(isChunked && encodedIndex == nextSeparatorIndex) {
-                System.arraycopy(CHUNK_SEPARATOR, 0, encodedData, encodedIndex, CHUNK_SEPARATOR.length);
-                chunksSoFar++;
-                nextSeparatorIndex = 76 * (chunksSoFar + 1) + chunksSoFar * CHUNK_SEPARATOR.length;
-                encodedIndex += CHUNK_SEPARATOR.length;
-            }
-        }
-
-        dataIndex = i * 3;
-        if(fewerThan24bits == 8) {
-            b1 = binaryData[dataIndex];
-            k = (byte)(b1 & 3);
-            byte val1 = (b1 & 0xffffff80) != 0 ? (byte)(b1 >> 2 ^ 0xc0) : (byte)(b1 >> 2);
-            encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
-            encodedData[encodedIndex + 1] = lookUpBase64Alphabet[k << 4];
-            encodedData[encodedIndex + 2] = 61;
-            encodedData[encodedIndex + 3] = 61;
-        } else
-        if(fewerThan24bits == 16) {
-            b1 = binaryData[dataIndex];
-            b2 = binaryData[dataIndex + 1];
-            l = (byte)(b2 & 0xf);
-            k = (byte)(b1 & 3);
-            byte val1 = (b1 & 0xffffff80) != 0 ? (byte)(b1 >> 2 ^ 0xc0) : (byte)(b1 >> 2);
-            byte val2 = (b2 & 0xffffff80) != 0 ? (byte)(b2 >> 4 ^ 0xf0) : (byte)(b2 >> 4);
-            encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
-            encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | k << 4];
-            encodedData[encodedIndex + 2] = lookUpBase64Alphabet[l << 2];
-            encodedData[encodedIndex + 3] = 61;
-        }
-        if(isChunked && chunksSoFar < nbrChunks)
-            System.arraycopy(CHUNK_SEPARATOR, 0, encodedData, encodedDataLength - CHUNK_SEPARATOR.length, CHUNK_SEPARATOR.length);
-        return encodedData;
-    }
-
-    public static byte[] decodeBase64(byte base64Data[]) {
-        base64Data = discardNonBase64(base64Data);
-        if(base64Data.length == 0)
-            return new byte[0];
-        int numberQuadruple = base64Data.length / 4;
-        byte decodedData[] = null;
-        byte b1 = 0;
-        byte b2 = 0;
-        byte b3 = 0;
-        byte b4 = 0;
-        byte marker0 = 0;
-        byte marker1 = 0;
-        int encodedIndex = 0;
-        int dataIndex = 0;
-        int lastData;
-        for(lastData = base64Data.length; base64Data[lastData - 1] == 61;)
-            if(--lastData == 0)
-                return new byte[0];
-
-        decodedData = new byte[lastData - numberQuadruple];
-        for(int i = 0; i < numberQuadruple; i++) {
-            dataIndex = i * 4;
-            marker0 = base64Data[dataIndex + 2];
-            marker1 = base64Data[dataIndex + 3];
-            b1 = base64Alphabet[base64Data[dataIndex]];
-            b2 = base64Alphabet[base64Data[dataIndex + 1]];
-            if(marker0 != 61 && marker1 != 61) {
-                b3 = base64Alphabet[marker0];
-                b4 = base64Alphabet[marker1];
-                decodedData[encodedIndex] = (byte)(b1 << 2 | b2 >> 4);
-                decodedData[encodedIndex + 1] = (byte)((b2 & 0xf) << 4 | b3 >> 2 & 0xf);
-                decodedData[encodedIndex + 2] = (byte)(b3 << 6 | b4);
-            } else
-            if(marker0 == 61)
-                decodedData[encodedIndex] = (byte)(b1 << 2 | b2 >> 4);
-            else
-            if(marker1 == 61) {
-                b3 = base64Alphabet[marker0];
-                decodedData[encodedIndex] = (byte)(b1 << 2 | b2 >> 4);
-                decodedData[encodedIndex + 1] = (byte)((b2 & 0xf) << 4 | b3 >> 2 & 0xf);
-            }
-            encodedIndex += 3;
-        }
-
-        return decodedData;
-    }
-
-    static byte[] discardWhitespace(byte data[]) {
-        byte groomedData[] = new byte[data.length];
-        int bytesCopied = 0;
-        int i = 0;
-        do
-            if(i < data.length) {
-                switch(data[i]) {
-                default:
-                    groomedData[bytesCopied++] = data[i];
-                    // fall through
-
-                case 9: // '\t'
-                case 10: // '\n'
-                case 13: // '\r'
-                case 32: // ' '
-                    i++;
-                    break;
-                }
-            } else {
-                byte packedData[] = new byte[bytesCopied];
-                System.arraycopy(groomedData, 0, packedData, 0, bytesCopied);
-                return packedData;
-            }
-        while(true);
-    }
-
-    static byte[] discardNonBase64(byte data[]) {
-        byte groomedData[] = new byte[data.length];
-        int bytesCopied = 0;
-        for(int i = 0; i < data.length; i++)
-            if(isBase64(data[i]))
-                groomedData[bytesCopied++] = data[i];
-
-        byte packedData[] = new byte[bytesCopied];
-        System.arraycopy(groomedData, 0, packedData, 0, bytesCopied);
-        return packedData;
-    }
-
-    public Object encode(Object pObject)
-        throws Exception {
-        if(!(pObject instanceof byte[]))
-            throw new Exception("Parameter supplied to Base64 encode is not a byte[]");
-        else
-            return encode((byte[])pObject);
-    }
-
-    public byte[] encode(byte pArray[]) {
-        return encodeBase64(pArray, false);
-    }
-
-    static final int CHUNK_SIZE = 76;
-    static final byte CHUNK_SEPARATOR[] = "\r\n".getBytes();
-    static final int BASELENGTH = 255;
-    static final int LOOKUPLENGTH = 64;
-    static final int EIGHTBIT = 8;
-    static final int SIXTEENBIT = 16;
-    static final int TWENTYFOURBITGROUP = 24;
-    static final int FOURBYTE = 4;
-    static final int SIGN = -128;
-    static final byte PAD = 61;
-    private static byte base64Alphabet[];
-    private static byte lookUpBase64Alphabet[];
-
-    static  {
-        base64Alphabet = new byte[255];
-        lookUpBase64Alphabet = new byte[64];
-        int i;
-        for(i = 0; i < 255; i++)
-            base64Alphabet[i] = -1;
-
-        for(i = 90; i >= 65; i--)
-            base64Alphabet[i] = (byte)(i - 65);
-
-        for(i = 122; i >= 97; i--)
-            base64Alphabet[i] = (byte)((i - 97) + 26);
-
-        for(i = 57; i >= 48; i--)
-            base64Alphabet[i] = (byte)((i - 48) + 52);
-
-        base64Alphabet[43] = 62;
-        base64Alphabet[47] = 63;
-        for(i = 0; i <= 25; i++)
-            lookUpBase64Alphabet[i] = (byte)(65 + i);
-
-        i = 26;
-        for(int j = 0; i <= 51; j++) {
-            lookUpBase64Alphabet[i] = (byte)(97 + j);
-            i++;
-        }
-
-        i = 52;
-        for(int j = 0; i <= 61; j++) {
-            lookUpBase64Alphabet[i] = (byte)(48 + j);
-            i++;
-        }
-
-        lookUpBase64Alphabet[62] = 43;
-        lookUpBase64Alphabet[63] = 47;
-    }
-}
diff --git a/src/java/org/apache/fulcrum/crypto/impl/UnixCrypt.java b/src/java/org/apache/fulcrum/crypto/impl/UnixCrypt.java
deleted file mode 100644
index 28f6291..0000000
--- a/src/java/org/apache/fulcrum/crypto/impl/UnixCrypt.java
+++ /dev/null
@@ -1,410 +0,0 @@
-package org.apache.fulcrum.crypto.impl;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.Random;
-
-/**
- * Unix crypt (3) algorithm implementation. The java
- * implementation was taken from the JetSpeed Portal project
- * (see org.apache.jetspeed.services.security.ldap.UnixCrypt).
- *
- * @author Siegfried Goeschl
- */
-public class UnixCrypt
-{
-    private static final char saltChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./".toCharArray();
-    private static final int ITERATIONS = 16;
-    private static final int con_salt[] = {
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 1, 2, 3,
-        4, 5, 6, 7, 8, 9, 10, 11, 5, 6,
-        7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
-        17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
-        27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
-        37, 32, 33, 34, 35, 36, 37, 38, 39, 40,
-        41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
-        51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
-        61, 62, 63, 0, 0, 0, 0, 0
-    };
-    private static final boolean shifts2[] = {
-        false, false, true, true, true, true, true, true, false, true,
-        true, true, true, true, true, false
-    };
-    private static final int skb[][] = {
-        {
-            0, 16, 0x20000000, 0x20000010, 0x10000, 0x10010, 0x20010000, 0x20010010, 2048, 2064,
-            0x20000800, 0x20000810, 0x10800, 0x10810, 0x20010800, 0x20010810, 32, 48, 0x20000020, 0x20000030,
-            0x10020, 0x10030, 0x20010020, 0x20010030, 2080, 2096, 0x20000820, 0x20000830, 0x10820, 0x10830,
-            0x20010820, 0x20010830, 0x80000, 0x80010, 0x20080000, 0x20080010, 0x90000, 0x90010, 0x20090000, 0x20090010,
-            0x80800, 0x80810, 0x20080800, 0x20080810, 0x90800, 0x90810, 0x20090800, 0x20090810, 0x80020, 0x80030,
-            0x20080020, 0x20080030, 0x90020, 0x90030, 0x20090020, 0x20090030, 0x80820, 0x80830, 0x20080820, 0x20080830,
-            0x90820, 0x90830, 0x20090820, 0x20090830
-        }, {
-            0, 0x2000000, 8192, 0x2002000, 0x200000, 0x2200000, 0x202000, 0x2202000, 4, 0x2000004,
-            8196, 0x2002004, 0x200004, 0x2200004, 0x202004, 0x2202004, 1024, 0x2000400, 9216, 0x2002400,
-            0x200400, 0x2200400, 0x202400, 0x2202400, 1028, 0x2000404, 9220, 0x2002404, 0x200404, 0x2200404,
-            0x202404, 0x2202404, 0x10000000, 0x12000000, 0x10002000, 0x12002000, 0x10200000, 0x12200000, 0x10202000, 0x12202000,
-            0x10000004, 0x12000004, 0x10002004, 0x12002004, 0x10200004, 0x12200004, 0x10202004, 0x12202004, 0x10000400, 0x12000400,
-            0x10002400, 0x12002400, 0x10200400, 0x12200400, 0x10202400, 0x12202400, 0x10000404, 0x12000404, 0x10002404, 0x12002404,
-            0x10200404, 0x12200404, 0x10202404, 0x12202404
-        }, {
-            0, 1, 0x40000, 0x40001, 0x1000000, 0x1000001, 0x1040000, 0x1040001, 2, 3,
-            0x40002, 0x40003, 0x1000002, 0x1000003, 0x1040002, 0x1040003, 512, 513, 0x40200, 0x40201,
-            0x1000200, 0x1000201, 0x1040200, 0x1040201, 514, 515, 0x40202, 0x40203, 0x1000202, 0x1000203,
-            0x1040202, 0x1040203, 0x8000000, 0x8000001, 0x8040000, 0x8040001, 0x9000000, 0x9000001, 0x9040000, 0x9040001,
-            0x8000002, 0x8000003, 0x8040002, 0x8040003, 0x9000002, 0x9000003, 0x9040002, 0x9040003, 0x8000200, 0x8000201,
-            0x8040200, 0x8040201, 0x9000200, 0x9000201, 0x9040200, 0x9040201, 0x8000202, 0x8000203, 0x8040202, 0x8040203,
-            0x9000202, 0x9000203, 0x9040202, 0x9040203
-        }, {
-            0, 0x100000, 256, 0x100100, 8, 0x100008, 264, 0x100108, 4096, 0x101000,
-            4352, 0x101100, 4104, 0x101008, 4360, 0x101108, 0x4000000, 0x4100000, 0x4000100, 0x4100100,
-            0x4000008, 0x4100008, 0x4000108, 0x4100108, 0x4001000, 0x4101000, 0x4001100, 0x4101100, 0x4001008, 0x4101008,
-            0x4001108, 0x4101108, 0x20000, 0x120000, 0x20100, 0x120100, 0x20008, 0x120008, 0x20108, 0x120108,
-            0x21000, 0x121000, 0x21100, 0x121100, 0x21008, 0x121008, 0x21108, 0x121108, 0x4020000, 0x4120000,
-            0x4020100, 0x4120100, 0x4020008, 0x4120008, 0x4020108, 0x4120108, 0x4021000, 0x4121000, 0x4021100, 0x4121100,
-            0x4021008, 0x4121008, 0x4021108, 0x4121108
-        }, {
-            0, 0x10000000, 0x10000, 0x10010000, 4, 0x10000004, 0x10004, 0x10010004, 0x20000000, 0x30000000,
-            0x20010000, 0x30010000, 0x20000004, 0x30000004, 0x20010004, 0x30010004, 0x100000, 0x10100000, 0x110000, 0x10110000,
-            0x100004, 0x10100004, 0x110004, 0x10110004, 0x20100000, 0x30100000, 0x20110000, 0x30110000, 0x20100004, 0x30100004,
-            0x20110004, 0x30110004, 4096, 0x10001000, 0x11000, 0x10011000, 4100, 0x10001004, 0x11004, 0x10011004,
-            0x20001000, 0x30001000, 0x20011000, 0x30011000, 0x20001004, 0x30001004, 0x20011004, 0x30011004, 0x101000, 0x10101000,
-            0x111000, 0x10111000, 0x101004, 0x10101004, 0x111004, 0x10111004, 0x20101000, 0x30101000, 0x20111000, 0x30111000,
-            0x20101004, 0x30101004, 0x20111004, 0x30111004
-        }, {
-            0, 0x8000000, 8, 0x8000008, 1024, 0x8000400, 1032, 0x8000408, 0x20000, 0x8020000,
-            0x20008, 0x8020008, 0x20400, 0x8020400, 0x20408, 0x8020408, 1, 0x8000001, 9, 0x8000009,
-            1025, 0x8000401, 1033, 0x8000409, 0x20001, 0x8020001, 0x20009, 0x8020009, 0x20401, 0x8020401,
-            0x20409, 0x8020409, 0x2000000, 0xa000000, 0x2000008, 0xa000008, 0x2000400, 0xa000400, 0x2000408, 0xa000408,
-            0x2020000, 0xa020000, 0x2020008, 0xa020008, 0x2020400, 0xa020400, 0x2020408, 0xa020408, 0x2000001, 0xa000001,
-            0x2000009, 0xa000009, 0x2000401, 0xa000401, 0x2000409, 0xa000409, 0x2020001, 0xa020001, 0x2020009, 0xa020009,
-            0x2020401, 0xa020401, 0x2020409, 0xa020409
-        }, {
-            0, 256, 0x80000, 0x80100, 0x1000000, 0x1000100, 0x1080000, 0x1080100, 16, 272,
-            0x80010, 0x80110, 0x1000010, 0x1000110, 0x1080010, 0x1080110, 0x200000, 0x200100, 0x280000, 0x280100,
-            0x1200000, 0x1200100, 0x1280000, 0x1280100, 0x200010, 0x200110, 0x280010, 0x280110, 0x1200010, 0x1200110,
-            0x1280010, 0x1280110, 512, 768, 0x80200, 0x80300, 0x1000200, 0x1000300, 0x1080200, 0x1080300,
-            528, 784, 0x80210, 0x80310, 0x1000210, 0x1000310, 0x1080210, 0x1080310, 0x200200, 0x200300,
-            0x280200, 0x280300, 0x1200200, 0x1200300, 0x1280200, 0x1280300, 0x200210, 0x200310, 0x280210, 0x280310,
-            0x1200210, 0x1200310, 0x1280210, 0x1280310
-        }, {
-            0, 0x4000000, 0x40000, 0x4040000, 2, 0x4000002, 0x40002, 0x4040002, 8192, 0x4002000,
-            0x42000, 0x4042000, 8194, 0x4002002, 0x42002, 0x4042002, 32, 0x4000020, 0x40020, 0x4040020,
-            34, 0x4000022, 0x40022, 0x4040022, 8224, 0x4002020, 0x42020, 0x4042020, 8226, 0x4002022,
-            0x42022, 0x4042022, 2048, 0x4000800, 0x40800, 0x4040800, 2050, 0x4000802, 0x40802, 0x4040802,
-            10240, 0x4002800, 0x42800, 0x4042800, 10242, 0x4002802, 0x42802, 0x4042802, 2080, 0x4000820,
-            0x40820, 0x4040820, 2082, 0x4000822, 0x40822, 0x4040822, 10272, 0x4002820, 0x42820, 0x4042820,
-            10274, 0x4002822, 0x42822, 0x4042822
-        }
-    };
-    private static final int SPtrans[][] = {
-        {
-            0x820200, 0x20000, 0x80800000, 0x80820200, 0x800000, 0x80020200, 0x80020000, 0x80800000, 0x80020200, 0x820200,
-            0x820000, 0x80000200, 0x80800200, 0x800000, 0, 0x80020000, 0x20000, 0x80000000, 0x800200, 0x20200,
-            0x80820200, 0x820000, 0x80000200, 0x800200, 0x80000000, 512, 0x20200, 0x80820000, 512, 0x80800200,
-            0x80820000, 0, 0, 0x80820200, 0x800200, 0x80020000, 0x820200, 0x20000, 0x80000200, 0x800200,
-            0x80820000, 512, 0x20200, 0x80800000, 0x80020200, 0x80000000, 0x80800000, 0x820000, 0x80820200, 0x20200,
-            0x820000, 0x80800200, 0x800000, 0x80000200, 0x80020000, 0, 0x20000, 0x800000, 0x80800200, 0x820200,
-            0x80000000, 0x80820000, 512, 0x80020200
-        }, {
-            0x10042004, 0, 0x42000, 0x10040000, 0x10000004, 8196, 0x10002000, 0x42000, 8192, 0x10040004,
-            4, 0x10002000, 0x40004, 0x10042000, 0x10040000, 4, 0x40000, 0x10002004, 0x10040004, 8192,
-            0x42004, 0x10000000, 0, 0x40004, 0x10002004, 0x42004, 0x10042000, 0x10000004, 0x10000000, 0x40000,
-            8196, 0x10042004, 0x40004, 0x10042000, 0x10002000, 0x42004, 0x10042004, 0x40004, 0x10000004, 0,
-            0x10000000, 8196, 0x40000, 0x10040004, 8192, 0x10000000, 0x42004, 0x10002004, 0x10042000, 8192,
-            0, 0x10000004, 4, 0x10042004, 0x42000, 0x10040000, 0x10040004, 0x40000, 8196, 0x10002000,
-            0x10002004, 4, 0x10040000, 0x42000
-        }, {
-            0x41000000, 0x1010040, 64, 0x41000040, 0x40010000, 0x1000000, 0x41000040, 0x10040, 0x1000040, 0x10000,
-            0x1010000, 0x40000000, 0x41010040, 0x40000040, 0x40000000, 0x41010000, 0, 0x40010000, 0x1010040, 64,
-            0x40000040, 0x41010040, 0x10000, 0x41000000, 0x41010000, 0x1000040, 0x40010040, 0x1010000, 0x10040, 0,
-            0x1000000, 0x40010040, 0x1010040, 64, 0x40000000, 0x10000, 0x40000040, 0x40010000, 0x1010000, 0x41000040,
-            0, 0x1010040, 0x10040, 0x41010000, 0x40010000, 0x1000000, 0x41010040, 0x40000000, 0x40010040, 0x41000000,
-            0x1000000, 0x41010040, 0x10000, 0x1000040, 0x41000040, 0x10040, 0x1000040, 0, 0x41010000, 0x40000040,
-            0x41000000, 0x40010040, 64, 0x1010000
-        }, {
-            0x100402, 0x4000400, 2, 0x4100402, 0, 0x4100000, 0x4000402, 0x100002, 0x4100400, 0x4000002,
-            0x4000000, 1026, 0x4000002, 0x100402, 0x100000, 0x4000000, 0x4100002, 0x100400, 1024, 2,
-            0x100400, 0x4000402, 0x4100000, 1024, 1026, 0, 0x100002, 0x4100400, 0x4000400, 0x4100002,
-            0x4100402, 0x100000, 0x4100002, 1026, 0x100000, 0x4000002, 0x100400, 0x4000400, 2, 0x4100000,
-            0x4000402, 0, 1024, 0x100002, 0, 0x4100002, 0x4100400, 1024, 0x4000000, 0x4100402,
-            0x100402, 0x100000, 0x4100402, 2, 0x4000400, 0x100402, 0x100002, 0x100400, 0x4100000, 0x4000402,
-            1026, 0x4000000, 0x4000002, 0x4100400
-        }, {
-            0x2000000, 16384, 256, 0x2004108, 0x2004008, 0x2000100, 16648, 0x2004000, 16384, 8,
-            0x2000008, 16640, 0x2000108, 0x2004008, 0x2004100, 0, 16640, 0x2000000, 16392, 264,
-            0x2000100, 16648, 0, 0x2000008, 8, 0x2000108, 0x2004108, 16392, 0x2004000, 256,
-            264, 0x2004100, 0x2004100, 0x2000108, 16392, 0x2004000, 16384, 8, 0x2000008, 0x2000100,
-            0x2000000, 16640, 0x2004108, 0, 16648, 0x2000000, 256, 16392, 0x2000108, 256,
-            0, 0x2004108, 0x2004008, 0x2004100, 264, 16384, 16640, 0x2004008, 0x2000100, 264,
-            8, 16648, 0x2004000, 0x2000008
-        }, {
-            0x20000010, 0x80010, 0, 0x20080800, 0x80010, 2048, 0x20000810, 0x80000, 2064, 0x20080810,
-            0x80800, 0x20000000, 0x20000800, 0x20000010, 0x20080000, 0x80810, 0x80000, 0x20000810, 0x20080010, 0,
-            2048, 16, 0x20080800, 0x20080010, 0x20080810, 0x20080000, 0x20000000, 2064, 16, 0x80800,
-            0x80810, 0x20000800, 2064, 0x20000000, 0x20000800, 0x80810, 0x20080800, 0x80010, 0, 0x20000800,
-            0x20000000, 2048, 0x20080010, 0x80000, 0x80010, 0x20080810, 0x80800, 16, 0x20080810, 0x80800,
-            0x80000, 0x20000810, 0x20000010, 0x20080000, 0x80810, 0, 2048, 0x20000010, 0x20000810, 0x20080800,
-            0x20080000, 2064, 16, 0x20080010
-        }, {
-            4096, 128, 0x400080, 0x400001, 0x401081, 4097, 4224, 0, 0x400000, 0x400081,
-            129, 0x401000, 1, 0x401080, 0x401000, 129, 0x400081, 4096, 4097, 0x401081,
-            0, 0x400080, 0x400001, 4224, 0x401001, 4225, 0x401080, 1, 4225, 0x401001,
-            128, 0x400000, 4225, 0x401000, 0x401001, 129, 4096, 128, 0x400000, 0x401001,
-            0x400081, 4225, 4224, 0, 128, 0x400001, 1, 0x400080, 0, 0x400081,
-            0x400080, 4224, 129, 4096, 0x401081, 0x400000, 0x401080, 1, 4097, 0x401081,
-            0x400001, 0x401080, 0x401000, 4097
-        }, {
-            0x8200020, 0x8208000, 32800, 0, 0x8008000, 0x200020, 0x8200000, 0x8208020, 32, 0x8000000,
-            0x208000, 32800, 0x208020, 0x8008020, 0x8000020, 0x8200000, 32768, 0x208020, 0x200020, 0x8008000,
-            0x8208020, 0x8000020, 0, 0x208000, 0x8000000, 0x200000, 0x8008020, 0x8200020, 0x200000, 32768,
-            0x8208000, 32, 0x200000, 32768, 0x8000020, 0x8208020, 32800, 0x8000000, 0, 0x208000,
-            0x8200020, 0x8008020, 0x8008000, 0x200020, 0x8208000, 32, 0x200020, 0x8008000, 0x8208020, 0x200000,
-            0x8200000, 0x8000020, 0x208000, 32800, 0x8008020, 0x8200000, 32, 0x8208000, 0x208020, 0,
-            0x8000000, 0x8200020, 32768, 0x208020
-        }
-    };
-    private static final int cov_2char[] = {
-        46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
-        56, 57, 65, 66, 67, 68, 69, 70, 71, 72,
-        73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
-        83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
-        99, 100, 101, 102, 103, 104, 105, 106, 107, 108,
-        109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
-        119, 120, 121, 122
-    };
-
-    private UnixCrypt() {}
-    
-    private static final int D_ENCRYPT(int L, int R, int S, int E0, int E1, int s[])
-    {
-        int v = R ^ R >>> 16;
-        int u = v & E0;
-        v &= E1;
-        u = u ^ u << 16 ^ R ^ s[S];
-        int t = v ^ v << 16 ^ R ^ s[S + 1];
-        t = t >>> 4 | t << 28;
-        L ^= SPtrans[1][t & 0x3f] | SPtrans[3][t >>> 8 & 0x3f] | SPtrans[5][t >>> 16 & 0x3f] | SPtrans[7][t >>> 24 & 0x3f] | SPtrans[0][u & 0x3f] | SPtrans[2][u >>> 8 & 0x3f] | SPtrans[4][u >>> 16 & 0x3f] | SPtrans[6][u >>> 24 & 0x3f];
-        return L;
-    }
-
-    private static final int HPERM_OP(int a, int n, int m)
-    {
-        int t = (a << 16 - n ^ a) & m;
-        a = a ^ t ^ t >>> 16 - n;
-        return a;
-    }
-
-    private static final void PERM_OP(int a, int b, int n, int m, int results[])
-    {
-        int t = (a >>> n ^ b) & m;
-        a ^= t << n;
-        b ^= t;
-        results[0] = a;
-        results[1] = b;
-    }
-
-    private static final int[] body(int schedule[], int Eswap0, int Eswap1)
-    {
-        int left = 0;
-        int right = 0;
-        int t = 0;
-        for(int j = 0; j < 25; j++)
-        {
-            for(int i = 0; i < 32; i += 4)
-            {
-                left = D_ENCRYPT(left, right, i, Eswap0, Eswap1, schedule);
-                right = D_ENCRYPT(right, left, i + 2, Eswap0, Eswap1, schedule);
-            }
-
-            t = left;
-            left = right;
-            right = t;
-        }
-
-        t = right;
-        right = left >>> 1 | left << 31;
-        left = t >>> 1 | t << 31;
-        left &= 0xffffffff;
-        right &= 0xffffffff;
-        int results[] = new int[2];
-        PERM_OP(right, left, 1, 0x55555555, results);
-        right = results[0];
-        left = results[1];
-        PERM_OP(left, right, 8, 0xff00ff, results);
-        left = results[0];
-        right = results[1];
-        PERM_OP(right, left, 2, 0x33333333, results);
-        right = results[0];
-        left = results[1];
-        PERM_OP(left, right, 16, 65535, results);
-        left = results[0];
-        right = results[1];
-        PERM_OP(right, left, 4, 0xf0f0f0f, results);
-        right = results[0];
-        left = results[1];
-        int out[] = new int[2];
-        out[0] = left;
-        out[1] = right;
-        return out;
-    }
-
-    private static final int byteToUnsigned(byte b)
-    {
-        int value = b;
-        return value < 0 ? value + 256 : value;
-    }
-
-    public static final String crypt(String original)
-    {
-        Random randomGenerator = new Random();
-        int numSaltChars = saltChars.length;
-        String salt = "" + saltChars[Math.abs(randomGenerator.nextInt() % numSaltChars)] + saltChars[Math.abs(randomGenerator.nextInt() % numSaltChars)];
-        return crypt(salt, original);
-    }
-
-    public static final String crypt(String salt, String original)
-    {
-        for(; salt.length() < 2; salt = salt + "A");
-        StringBuilder buffer = new StringBuilder("             ");
-        char charZero = salt.charAt(0);
-        char charOne = salt.charAt(1);
-        buffer.setCharAt(0, charZero);
-        buffer.setCharAt(1, charOne);
-        int Eswap0 = con_salt[charZero];
-        int Eswap1 = con_salt[charOne] << 4;
-        byte key[] = new byte[8];
-        for(int i = 0; i < key.length; i++)
-            key[i] = 0;
-
-        for(int i = 0; i < key.length && i < original.length(); i++)
-        {
-            int iChar = original.charAt(i);
-            key[i] = (byte)(iChar << 1);
-        }
-
-        int schedule[] = des_set_key(key);
-        int out[] = body(schedule, Eswap0, Eswap1);
-        byte b[] = new byte[9];
-        intToFourBytes(out[0], b, 0);
-        intToFourBytes(out[1], b, 4);
-        b[8] = 0;
-        int i = 2;
-        int y = 0;
-        int u = 128;
-        for(; i < 13; i++)
-        {
-            int j = 0;
-            int c = 0;
-            for(; j < 6; j++)
-            {
-                c <<= 1;
-                if((b[y] & u) != 0)
-                    c |= 0x1;
-                u >>>= 1;
-                if(u == 0)
-                {
-                    y++;
-                    u = 128;
-                }
-                buffer.setCharAt(i, (char) cov_2char[c]);
-            }
-
-        }
-
-        return buffer.toString();
-    }
-
-    private static int[] des_set_key(byte key[])
-    {
-        int schedule[] = new int[32];
-        int c = fourBytesToInt(key, 0);
-        int d = fourBytesToInt(key, 4);
-        int results[] = new int[2];
-        PERM_OP(d, c, 4, 0xf0f0f0f, results);
-        d = results[0];
-        c = results[1];
-        c = HPERM_OP(c, -2, 0xcccc0000);
-        d = HPERM_OP(d, -2, 0xcccc0000);
-        PERM_OP(d, c, 1, 0x55555555, results);
-        d = results[0];
-        c = results[1];
-        PERM_OP(c, d, 8, 0xff00ff, results);
-        c = results[0];
-        d = results[1];
-        PERM_OP(d, c, 1, 0x55555555, results);
-        d = results[0];
-        c = results[1];
-        d = (d & 0xff) << 16 | d & 0xff00 | (d & 0xff0000) >>> 16 | (c & 0xf0000000) >>> 4;
-        c &= 0xfffffff;
-        int j = 0;
-        for(int i = 0; i < 16; i++)
-        {
-            if(shifts2[i])
-            {
-                c = c >>> 2 | c << 26;
-                d = d >>> 2 | d << 26;
-            } else
-            {
-                c = c >>> 1 | c << 27;
-                d = d >>> 1 | d << 27;
-            }
-            c &= 0xfffffff;
-            d &= 0xfffffff;
-            int s = skb[0][c & 0x3f] | skb[1][c >>> 6 & 0x3 | c >>> 7 & 0x3c] | skb[2][c >>> 13 & 0xf | c >>> 14 & 0x30] | skb[3][c >>> 20 & 0x1 | c >>> 21 & 0x6 | c >>> 22 & 0x38];
-            int t = skb[4][d & 0x3f] | skb[5][d >>> 7 & 0x3 | d >>> 8 & 0x3c] | skb[6][d >>> 15 & 0x3f] | skb[7][d >>> 21 & 0xf | d >>> 22 & 0x30];
-            schedule[j++] = (t << 16 | s & 0xffff) & 0xffffffff;
-            s = s >>> 16 | t & 0xffff0000;
-            s = s << 4 | s >>> 28;
-            schedule[j++] = s & 0xffffffff;
-        }
-
-        return schedule;
-    }
-
-    private static int fourBytesToInt(byte b[], int offset)
-    {
-        int value = byteToUnsigned(b[offset++]);
-        value |= byteToUnsigned(b[offset++]) << 8;
-        value |= byteToUnsigned(b[offset++]) << 16;
-        value |= byteToUnsigned(b[offset++]) << 24;
-        return value;
-    }
-
-    private static final void intToFourBytes(int iValue, byte b[], int offset)
-    {
-        b[offset++] = (byte)(iValue & 0xff);
-        b[offset++] = (byte)(iValue >>> 8 & 0xff);
-        b[offset++] = (byte)(iValue >>> 16 & 0xff);
-        b[offset++] = (byte)(iValue >>> 24 & 0xff);
-    }
-
-    public static final boolean matches(String encryptedPassword, String enteredPassword)
-    {
-        String salt = encryptedPassword.substring(0, 3);
-        String newCrypt = crypt(salt, enteredPassword);
-        return newCrypt.equals(encryptedPassword);
-    }
-
-}
diff --git a/src/java/org/apache/fulcrum/crypto/provider/ClearCrypt.java b/src/java/org/apache/fulcrum/crypto/provider/ClearCrypt.java
index a9cba70..c3efdc2 100644
--- a/src/java/org/apache/fulcrum/crypto/provider/ClearCrypt.java
+++ b/src/java/org/apache/fulcrum/crypto/provider/ClearCrypt.java
@@ -1,6 +1,5 @@
 package org.apache.fulcrum.crypto.provider;
 
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,14 +19,12 @@
  * under the License.
  */
 
-
 import org.apache.fulcrum.crypto.CryptoAlgorithm;
 
 /**
- * This is a dummy for "cleartext" encryption. It goes through
- * the notions of the CryptoAlgorithm interface but actually does
- * nothing. It can be used as a replacement for the "encrypt = no"
- * setting in TurbineResources.
+ * This is a dummy for "cleartext" encryption. It goes through the notions of
+ * the CryptoAlgorithm interface but actually does nothing. It can be used as a
+ * replacement for the "encrypt = no" setting in TurbineResources.
  *
  * Can be used as the default crypto algorithm
  *
@@ -35,60 +32,44 @@
  * @version $Id$
  */
 
-public class ClearCrypt
-    implements CryptoAlgorithm
-{
-    /**
-     * C'tor
-     *
-     */
+public class ClearCrypt implements CryptoAlgorithm {
+	
+	/**
+	 * Constructor
+	 */
+	public ClearCrypt() {
+	}
 
-    public ClearCrypt()
-    {
-    }
+	/**
+	 * This class never uses an algorithm, so this is just a dummy.
+	 *
+	 * @param cipher Cipher (ignored)
+	 */
+	public void setCipher(String cipher) {
+		/* dummy */
+	}
 
-    /**
-     * This class never uses an algorithm, so this is
-     * just a dummy.
-     *
-     * @param cipher    Cipher (ignored)
-     */
+	/**
+	 * This class never uses a seed, so this is just a dummy.
+	 *
+	 * @param seed Seed (ignored)
+	 */
+	public void setSeed(String seed) {
+		/* dummy */
+	}
 
-    public void setCipher(String cipher)
-    {
-        /* dummy */
-    }
+	/**
+	 * encrypt the supplied string with the requested cipher
+	 *
+	 * @param value The value to be encrypted
+	 * @return The encrypted value
+	 * @throws Exception An Exception of the underlying implementation.
+	 */
+	public String encrypt(String value) throws Exception {
+		/*
+		 * Ultra-clever implementation. ;-)
+		 */
 
-    /**
-     * This class never uses a seed, so this is
-     * just a dummy.
-     *
-     * @param seed        Seed (ignored)
-     */
-
-    public void setSeed(String seed)
-    {
-        /* dummy */
-    }
-
-    /**
-     * encrypt the supplied string with the requested cipher
-     *
-     * @param value       The value to be encrypted
-     *
-     * @return The encrypted value
-     *
-     * @throws Exception An Exception of the underlying implementation.
-     *
-     */
-
-    public String encrypt(String value)
-        throws Exception
-    {
-        /*
-         * Ultra-clever implementation. ;-)
-         */
-
-        return value;
-    }
+		return value;
+	}
 }
diff --git a/src/java/org/apache/fulcrum/crypto/provider/JavaCrypt.java b/src/java/org/apache/fulcrum/crypto/provider/JavaCrypt.java
index 5972ddc..833c5e9 100644
--- a/src/java/org/apache/fulcrum/crypto/provider/JavaCrypt.java
+++ b/src/java/org/apache/fulcrum/crypto/provider/JavaCrypt.java
@@ -1,6 +1,5 @@
 package org.apache.fulcrum.crypto.provider;
 
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,23 +19,22 @@
  * under the License.
  */
 
-
 import java.security.MessageDigest;
 
+import org.apache.commons.codec.binary.Base64;
 import org.apache.fulcrum.crypto.CryptoAlgorithm;
-import org.apache.fulcrum.crypto.impl.Base64;
 
 /**
- * Implements the normal java.security.MessageDigest stream cipers.
- * Base64 strings returned by this provider are correctly padded to
- * multiples of four bytes. If you run into interoperability problems
- * with other languages, especially perl and the Digest::MD5 module,
- * note that the md5_base64 function from this package incorrectly drops
- * the pad bytes. Use the MIME::Base64 package instead.
+ * Implements the normal java.security.MessageDigest stream cipers. Base64
+ * strings returned by this provider are correctly padded to multiples of four
+ * bytes. If you run into interoperability problems with other languages,
+ * especially perl and the Digest::MD5 module, note that the md5_base64 function
+ * from this package incorrectly drops the pad bytes. Use the MIME::Base64
+ * package instead.
  *
- * If you upgrade from Turbine 2.1 and suddently your old stored passwords
- * no longer work, please take a look at the OldJavaCrypt provider for
- * bug-to-bug compatibility.
+ * If you upgrade from Turbine 2.1 and suddently your old stored passwords no
+ * longer work, please take a look at the OldJavaCrypt provider for bug-to-bug
+ * compatibility.
  *
  * This provider can be used as the default crypto algorithm provider.
  *
@@ -44,79 +42,62 @@
  * @version $Id$
  */
 
-public class JavaCrypt
-    implements CryptoAlgorithm
-{
+public class JavaCrypt implements CryptoAlgorithm {
 
-    /** The default cipher */
-    public static final String DEFAULT_CIPHER = "SHA";
+	/** The default cipher */
+	public static final String DEFAULT_CIPHER = "SHA";
 
-    /** The cipher to use for encryption */
-    private String cipher = null;
+	/** The cipher to use for encryption */
+	private String cipher = null;
 
+	/**
+	 * Constructo
+	 *
+	 */
+	public JavaCrypt() {
+		this.cipher = DEFAULT_CIPHER;
+	}
 
-    /**
-     * C'tor
-     *
-     */
+	/**
+	 * Setting the actual cipher requested. If not called, then the default cipher
+	 * (SHA) is used.
+	 *
+	 * This will never throw an error even if there is no provider for this cipher.
+	 * The error will be thrown by encrypt() (Fixme?)
+	 *
+	 * @param cipher The cipher to use.
+	 *
+	 */
+	public void setCipher(String cipher) {
+		this.cipher = cipher;
+	}
 
-    public JavaCrypt()
-    {
-        this.cipher = DEFAULT_CIPHER;
-    }
+	/**
+	 * This class never uses a seed, so this is just a dummy.
+	 *
+	 * @param seed Seed (ignored)
+	 *
+	 */
+	public void setSeed(String seed) {
+		/* dummy */
+	}
 
-    /**
-     * Setting the actual cipher requested. If not
-     * called, then the default cipher (SHA) is used.
-     *
-     * This will never throw an error even if there is no
-     * provider for this cipher. The error will be thrown
-     * by encrypt() (Fixme?)
-     *
-     * @param cipher     The cipher to use.
-     *
-     */
+	/**
+	 * encrypt the supplied string with the requested cipher
+	 *
+	 * @param value The value to be encrypted
+	 * @return The encrypted value
+	 * @throws Exception An Exception of the underlying implementation.
+	 */
+	public String encrypt(String value) throws Exception {
+		MessageDigest md = MessageDigest.getInstance(cipher);
 
-    public void setCipher(String cipher)
-    {
-        this.cipher = cipher;
-    }
+		// We need to use unicode here, to be independent of platform's
+		// default encoding. Thanks to SGawin for spotting this.
+		byte[] digest = md.digest(value.getBytes("UTF-8"));
 
-    /**
-     * This class never uses a seed, so this is
-     * just a dummy.
-     *
-     * @param seed        Seed (ignored)
-     *
-     */
-
-    public void setSeed(String seed)
-    {
-        /* dummy */
-    }
-
-    /**
-     * encrypt the supplied string with the requested cipher
-     *
-     * @param value       The value to be encrypted
-     *
-     * @return The encrypted value
-     *
-     * @throws Exception An Exception of the underlying implementation.
-     */
-
-    public String encrypt(String value)
-        throws Exception
-    {
-        MessageDigest md = MessageDigest.getInstance(cipher);
-
-        // We need to use unicode here, to be independent of platform's
-        // default encoding. Thanks to SGawin for spotting this.
-        byte[] digest = md.digest(value.getBytes("UTF-8"));
-
-        // Base64-encode the digest.
-        byte[] encodedDigest = Base64.encodeBase64(digest);
-        return (encodedDigest == null ? null :
-                new String(encodedDigest));
-    }
+		// Base64-encode the digest.
+		byte[] encodedDigest = Base64.encodeBase64(digest);
+		return (encodedDigest == null ? null : new String(encodedDigest, "UTF-8"));
+	}
 }
diff --git a/src/java/org/apache/fulcrum/crypto/provider/OldJavaCrypt.java b/src/java/org/apache/fulcrum/crypto/provider/OldJavaCrypt.java
index 6580443..baae850 100644
--- a/src/java/org/apache/fulcrum/crypto/provider/OldJavaCrypt.java
+++ b/src/java/org/apache/fulcrum/crypto/provider/OldJavaCrypt.java
@@ -1,6 +1,5 @@
 package org.apache.fulcrum.crypto.provider;
 
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,21 +19,20 @@
  * under the License.
  */
 
-
 import java.security.MessageDigest;
 
+import org.apache.commons.codec.binary.Base64;
 import org.apache.fulcrum.crypto.CryptoAlgorithm;
-import org.apache.fulcrum.crypto.impl.Base64;
 
 /**
- * This is the Message Digest Implementation of Turbine 2.1. It does
- * not pad the Base64 encryption of the Message Digests correctly but
- * truncates after 20 chars. This leads to interoperability problems
- * if you want to use e.g. database columns between two languages.
+ * This is the Message Digest Implementation of Turbine 2.1. It does not pad the
+ * Base64 encryption of the Message Digests correctly but truncates after 20
+ * chars. This leads to interoperability problems if you want to use e.g.
+ * database columns between two languages.
  *
- * If you upgrade an application from Turbine 2.1 and have already used
- * the Security Service with encrypted passwords and no way to rebuild
- * your databases, use this provider. It is bug-compatible.
+ * If you upgrade an application from Turbine 2.1 and have already used the
+ * Security Service with encrypted passwords and no way to rebuild your
+ * databases, use this provider. It is bug-compatible.
  *
  * DO NOT USE THIS PROVIDER FOR ANY NEW APPLICATION!
  *
@@ -44,82 +42,61 @@
  * @version $Id$
  */
 
-public class OldJavaCrypt
-    implements CryptoAlgorithm
-{
+public class OldJavaCrypt implements CryptoAlgorithm {
 
-    /** The default cipher */
-    public static final String DEFAULT_CIPHER = "SHA";
+	/** The default cipher */
+	public static final String DEFAULT_CIPHER = "SHA";
 
-    /** The cipher to use for encryption */
-    private String cipher = null;
+	/** The cipher to use for encryption */
+	private String cipher = null;
 
+	/**
+	 * Constructor
+	 */
+	public OldJavaCrypt() {
+		this.cipher = DEFAULT_CIPHER;
+	}
 
-    /**
-     * C'tor
-     *
-     */
+	/**
+	 * Setting the actual cipher requested. If not called, then the default cipher
+	 * (SHA) is used.
+	 *
+	 * This will never throw an error even if there is no provider for this cipher.
+	 * The error will be thrown by encrypt() (Fixme?)
+	 *
+	 * @param cipher The cipher to use.
+	 *
+	 */
+	public void setCipher(String cipher) {
+		this.cipher = cipher;
+	}
 
-    public OldJavaCrypt()
-    {
-        this.cipher = DEFAULT_CIPHER;
-    }
+	/**
+	 * This class never uses a seed, so this is just a dummy.
+	 *
+	 * @param seed Seed (ignored)
+	 *
+	 */
+	public void setSeed(String seed) {
+		/* dummy */
+	}
 
-    /**
-     * Setting the actual cipher requested. If not
-     * called, then the default cipher (SHA) is used.
-     *
-     * This will never throw an error even if there is no
-     * provider for this cipher. The error will be thrown
-     * by encrypt() (Fixme?)
-     *
-     * @param cipher     The cipher to use.
-     *
-     */
-
-    public void setCipher(String cipher)
-    {
-        this.cipher = cipher;
-    }
-
-    /**
-     * This class never uses a seed, so this is
-     * just a dummy.
-     *
-     * @param seed        Seed (ignored)
-     *
-     */
-
-    public void setSeed(String seed)
-    {
-        /* dummy */
-    }
-
-    /**
-     * encrypt the supplied string with the requested cipher
-     *
-     * @param value       The value to be encrypted
-     *
-     * @return The encrypted value
-     *
-     * @throws Exception An Exception of the underlying implementation.
-     */
-
-    public String encrypt(String value)
-        throws Exception
-    {
-        MessageDigest md = MessageDigest.getInstance(cipher);
-
-        // We need to use unicode here, to be independent of platform's
-        // default encoding. Thanks to SGawin for spotting this.
-
-        byte[] digest = md.digest(value.getBytes("UTF-8"));
-        byte[] base64 = Base64.encodeBase64(digest);
-        // from MD5 the digest has 16 bytes but for SHA1 it contains 20 bytes
-        // depending on the digest lenght the result is truncated
-        int len = (digest.length == 16 ? 20 : 24 );
-        byte[] result = new byte[len];
-        System.arraycopy(base64, 0, result, 0, result.length);
-        return new String(result);
-    }
+	/**
+	 * encrypt the supplied string with the requested cipher
+	 *
+	 * @param value The value to be encrypted
+	 * @return The encrypted value
+	 * @throws Exception An Exception of the underlying implementation.
+	 */
+	public String encrypt(String value) throws Exception {
+		MessageDigest md = MessageDigest.getInstance(cipher);
+		byte[] digest = md.digest(value.getBytes("UTF-8"));
+		byte[] base64 = Base64.encodeBase64(digest);
+		// from MD5 the digest has 16 bytes but for SHA1 it contains 20 bytes
+		// depending on the digest lenght the result is truncated
+		int len = (digest.length == 16 ? 20 : 24);
+		byte[] result = new byte[len];
+		System.arraycopy(base64, 0, result, 0, result.length);
+		return new String(result, "UTF-8");
+	}
 }
diff --git a/src/java/org/apache/fulcrum/crypto/provider/UnixCrypt.java b/src/java/org/apache/fulcrum/crypto/provider/UnixCrypt.java
index b28dd64..23ea97e 100644
--- a/src/java/org/apache/fulcrum/crypto/provider/UnixCrypt.java
+++ b/src/java/org/apache/fulcrum/crypto/provider/UnixCrypt.java
@@ -19,9 +19,7 @@
  * under the License.
  */
 
-
 import org.apache.fulcrum.crypto.CryptoAlgorithm;
-
 import java.util.Random;
 
 /**
@@ -31,78 +29,60 @@
  * @version $Id$
  */
 
-public class UnixCrypt
-    implements CryptoAlgorithm
-{
+public class UnixCrypt implements CryptoAlgorithm {
 
-    /** The seed to use */
-    private String seed = null;
+	/** The seed to use */
+	private String seed = null;
 
-    /** standard Unix crypt chars (64) */
-    private static final char[] SALT_CHARS =
-        (("abcdefghijklmnopqrstuvwxyz" +
-         "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./").toCharArray());
+	/** standard Unix crypt chars (64) */
+	private static final char[] SALT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./"
+			.toCharArray();
 
+	/**
+	 * Constructor
+	 */
+	public UnixCrypt() {
+	}
 
-    /**
-     * C'tor
-     *
-     */
+	/**
+	 * This class never uses anything but UnixCrypt, so it is just a dummy (Fixme:
+	 * Should we throw an exception if something is requested that we don't support?
+	 *
+	 * @param cipher Cipher (ignored)
+	 */
+	public void setCipher(String cipher) {
+		/* dummy */
+	}
 
-    public UnixCrypt()
-    {
-    }
+	/**
+	 * Setting the seed for the UnixCrypt algorithm. If a null value is supplied, or
+	 * no seed is set, then a random seed is used.
+	 *
+	 * @param seed The seed value to use.
+	 */
+	public void setSeed(String seed) {
+		this.seed = seed;
+	}
 
-    /**
-     * This class never uses anything but
-     * UnixCrypt, so it is just a dummy
-     * (Fixme: Should we throw an exception if
-     * something is requested that we don't support?
-     *
-     * @param cipher    Cipher (ignored)
-     */
+	/**
+	 * encrypt the supplied string with the requested cipher
+	 *
+	 * @param value The value to be encrypted
+	 * @return The encrypted value
+	 * @throws Exception An Exception of the underlying implementation.
+	 */
+	public String encrypt(String value) throws Exception {
 
-    public void setCipher(String cipher)
-    {
-        /* dummy */
-    }
+		if (seed == null) {
+			Random randomGenerator = new Random();
+			int numSaltChars = SALT_CHARS.length;
+			StringBuilder sb = new StringBuilder();
+			sb.append(SALT_CHARS[Math.abs(randomGenerator.nextInt() % numSaltChars)])
+					.append(SALT_CHARS[Math.abs(randomGenerator.nextInt() % numSaltChars)]).toString();
+			seed = sb.toString();
+		}
 
-    /**
-     * Setting the seed for the UnixCrypt
-     * algorithm. If a null value is supplied,
-     * or no seed is set, then a random seed is used.
-     *
-     * @param seed     The seed value to use.
-     */
-
-    public void setSeed(String seed)
-    {
-        this.seed = seed;
-    }
-
-    /**
-     * encrypt the supplied string with the requested cipher
-     *
-     * @param value       The value to be encrypted
-     * @return The encrypted value
-     * @throws Exception An Exception of the underlying implementation.
-     */
-    public String encrypt(String value)
-        throws Exception
-    {
-        if (seed == null)
-        {
-            Random randomGenerator = new java.util.Random();
-            int numSaltChars = SALT_CHARS.length;
-
-            seed = (new StringBuilder())
-                .append(SALT_CHARS[Math.abs(randomGenerator.nextInt()
-                                   % numSaltChars)])
-                .append(SALT_CHARS[Math.abs(randomGenerator.nextInt()
-                                   % numSaltChars)])
-                .toString();
-        }
-
-        return org.apache.fulcrum.crypto.impl.UnixCrypt.crypt(seed, value);
-    }
+		// use commons-codec to do the encryption
+		return org.apache.commons.codec.digest.UnixCrypt.crypt(value, seed);
+	}
 }
diff --git a/xdocs/changes.xml b/xdocs/changes.xml
index ce24433..81d7251 100644
--- a/xdocs/changes.xml
+++ b/xdocs/changes.xml
@@ -25,6 +25,18 @@
 
   <body>
     <release version="1.0.8-SNAPSHOT" date="as in SVN">
+       <action dev="painter" type="update">
+         Use commons-codec for basic encryption algorithms
+       </action>
+       <action dev="painter" type="update">
+         PMD report cleanup
+       </action>
+       <action dev="painter" type="update">
+         Update to yaafi 1.0.8
+       </action>
+       <action dev="painter" type="update">
+         Derive from Turbine parent POM 5
+       </action>
     </release>
     <release version="1.0.7" date="2009-09-10">
       <action dev="sgoeschl" type="update">
